s/qmail 4.3.20
Next generation secure email transport
Loading...
Searching...
No Matches
columnt.c
Go to the documentation of this file.
1#include <unistd.h>
2#include "alloc.h"
3#include "logmsg.h"
4#include "buffer.h"
5#include "stralloc.h"
6#include "exit.h"
7#include "readclose.h"
8#include "qmail.h"
9
10#define WHO "columnt"
11
13buffer bo = BUFFER_INIT(write,1,outbuf,sizeof(outbuf));
14
15void nomem() { logmsg(WHO,111,FATAL,"out of memory"); }
16void die_read() { logmsg(WHO,110,ERROR,"unable to read input: "); }
17void die_write() { logmsg(WHO,110,ERROR,"unable to write output: "); }
18
19stralloc file = {0};
20int *width;
21int maxfield = 0;
22
23void nothing()
24{
25 ;
26}
27
29{
30 if (buffer_put(&bo,"\n",1) == -1) die_write();
31}
32
33void maxfield_check(int fieldnum,char *buf,int len)
34{
35 if (fieldnum > maxfield) maxfield = fieldnum;
36}
37
38void width_check(int fieldnum,char *buf,int len)
39{
40 if (len > width[fieldnum]) width[fieldnum] = len;
41}
42
44{
45 int i;
46
47 width = (int *) alloc((maxfield + 1) * sizeof(int));
48 if (!width) nomem();
49 for (i = 0; i <= maxfield; ++i)
50 width[i] = 0;
51}
52
53void printfield(int fieldnum,char *buf,int len)
54{
55 int i;
56
57 if (fieldnum < maxfield)
58 for (i = len; i < width[fieldnum]; ++i)
59 if (buffer_put(&bo," ",1) == -1) die_write();
60
61 if (buffer_put(&bo,buf,len) == -1) die_write();
62
63 if (fieldnum < maxfield)
64 if (buffer_put(&bo," ",2) == -1) die_write();
65}
66
67void split(void (*dofield)(), void (*doline)())
68{
69 int i;
70 int j;
71 int fieldpos;
72 int fieldnum;
73
74 for (j = i = 0; j < file.len; ++j)
75 if (file.s[j] == '\n') {
76 fieldnum = 0;
77 for (;;) {
78 while ((file.s[i] == ' ') || (file.s[i] == '\t')) ++i;
79 if (i == j) break;
80 fieldpos = i;
81 while ((file.s[i] != ' ') && (file.s[i] != '\t') && (file.s[i] != '\n')) ++i;
82 dofield(fieldnum++,file.s + fieldpos,i - fieldpos);
83 }
84 doline();
85 i = j + 1;
86 }
87}
88
89int main()
90{
91 if (readclose_append(0,&file,BUFSIZE_MESS) == -1) die_read();
92 if (!file.len) _exit(0);
93 if (file.s[file.len - 1] != '\n')
94 if (!stralloc_append(&file,"\n")) nomem();
95
97 width_init();
100
101 if (buffer_flush(&bo) == -1) die_write();
102 _exit(0);
103}
void maxfield_check(int fieldnum, char *buf, int len)
Definition: columnt.c:33
int * width
Definition: columnt.c:20
void printline()
Definition: columnt.c:28
void die_write()
Definition: columnt.c:17
char outbuf[BUFSIZE_MESS]
Definition: columnt.c:12
void nomem()
Definition: columnt.c:15
void nothing()
Definition: columnt.c:23
void die_read()
Definition: columnt.c:16
stralloc file
Definition: columnt.c:19
int maxfield
Definition: columnt.c:21
void width_init()
Definition: columnt.c:43
buffer bo
Definition: columnt.c:13
#define WHO
Definition: columnt.c:10
int main()
Definition: columnt.c:89
void printfield(int fieldnum, char *buf, int len)
Definition: columnt.c:53
void width_check(int fieldnum, char *buf, int len)
Definition: columnt.c:38
void split(void(*dofield)(), void(*doline)())
Definition: columnt.c:67
void _exit(int)
char buf[100+FMT_ULONG]
Definition: hier.c:11
int
Definition: qmail-mrtg.c:27
int j
Definition: qmail-send.c:926
#define BUFSIZE_MESS
Definition: qmail.h:7
void write()