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