f5d9cfdb4399d65771f3223a5a13e2c248bfb4dc
14 //#define BUFFER_SIZE 4096
15 #define BUFFER_SIZE 256
19 #define CEIL(x, y) (((x) + (y) - 1) / (y))
20 #define MIN(x, y) (((x) < (y)) ? (x) : (y))
21 #define MAX(x, y) (((x) > (y)) ? (x) : (y))
30 #define VERBOSE(level, statement...) do { if (level <= verbose) { statement; } } while(0)
34 char *progname
= NULL
;
41 FILE *fd
= ret
? stderr
: stdout
;
42 fprintf (fd
, "usage: %s\n", progname
);
43 fprintf (fd
, " -h : help message\n");
44 fprintf (fd
, " -v : verbose level (%d)\n", verbose
);
51 int main (int argc
, char *argv
[])
53 char buffer
[BUFFER_SIZE
+ 1] = {0};
60 while ((c
= getopt(argc
, argv
, "hv:")) != EOF
) {
63 verbose
= atoi (optarg
);
66 VERBOSE (INFO
, usage (0));
69 VERBOSE (ERROR
, usage (1));
72 if (argc
- optind
!= 0) {
73 VERBOSE (ERROR
, fprintf (stderr
, "%s: invalid option -- %s\n", progname
, argv
[optind
]));
74 VERBOSE (ERROR
, usage (1));
77 /* read from input stream */
78 while ((n
= read (STDIN_FILENO
, pt
, BUFFER_SIZE
- (pt
- buffer
))) != 0) {
79 VERBOSE (DEBUG
, fprintf (stdout
, "read %d bytes\n", n
));
82 /* look for end of line */
83 for (i
= 0, j
= 0; i
< n
; i
++) {
84 if (buffer
[i
] == '\n') {
86 VERBOSE (DEBUG
, fprintf (stdout
, "line(%d): %s\n", j
, buffer
+ j
));
93 for (i
= 0; i
< n
- j
; i
++) {
94 buffer
[i
] = buffer
[i
+ j
];
97 for (i
= n
- j
; i
< BUFFER_SIZE
; i
++) {
103 /* check that nothing is left behind */
105 VERBOSE (DEBUG
, fprintf (stdout
, "last\n"));
106 VERBOSE (DEBUG
, fprintf (stdout
, "line(%d): %s\n", j
, buffer
+ j
));
112 // test: calc.exe -h | awk '/usage:/ { rc=1 } END { exit (1-rc) }'
113 // test: calc.exe -_ 2> /dev/null | awk 'END { if (NR == 0) { exit(0) } else exit (1) }'
114 // test: calc.exe -_ 2>&1 | awk '/usage:/ { rc=1 } END { exit (1-rc) }'
115 // test: echo "foo\nbar\nfoobar" | calc.exe -v3
117 /* vim: set ts=4 sw=4 et: */