diff options
Diffstat (limited to 'addts.c')
-rw-r--r-- | addts.c | 78 |
1 files changed, 53 insertions, 25 deletions
@@ -8,21 +8,65 @@ static char default_fmt[] = "%Y-%m-%d %H:%M:%S: "; +enum mode { + PREFIX, + SUFFIX, + NMODE +}; + +enum state { + SINI, /* initial */ + SEOL, /* end of line */ + SLIN, /* Midle of line */ + STIM, /* Time to insert timestamp */ + NSTATE +}; + +enum alpha { + ACHR, + AEOL, + NALPHA +}; + +int prefix_trans[NSTATE][NALPHA] = { + /* ACHR AEOL */ + { STIM, SEOL }, /* SINI */ + { STIM, SEOL }, /* SEOL */ + { SLIN, SEOL }, /* SLIN */ + { SLIN, SEOL } /* STIM */ +}; + +int suffix_trans[NSTATE][NALPHA] = { + /* ACHR AEOL */ + { SLIN, SEOL }, /* SINI */ + { SLIN, SEOL }, /* SEOL */ + { SLIN, STIM }, /* SLIN */ + { SLIN, SEOL } /* STIM */ +}; + +static inline int +alpha(int c) +{ + return c == '\n' ? AEOL : ACHR; +} + int main(int argc, char **argv) { int c; char buf[512]; - int eol = 0; int utc_opt = 0; int append_opt = 0; int ws_opt = 0; - unsigned long ignore = 0; + int end_opt = 0; char *p; char *fmt = NULL; FILE *fp; - while ((c = getopt(argc, argv, "?af:i:uw:")) != EOF) { + enum state state = SINI; + int (*trans)[NALPHA] = prefix_trans; + + while ((c = getopt(argc, argv, "?af:suw:")) != EOF) { switch (c) { case 'a': append_opt = 1; @@ -30,15 +74,8 @@ main(int argc, char **argv) case 'f': fmt = optarg; break; - case 'i': - errno = 0; - ignore = strtoul(optarg, &p, 10); - if (errno || *p) { - fprintf(stderr, - "%s: -i argument is not a number\n", - argv[0]); - return 1; - } + case 's': + trans = suffix_trans; break; case 'u': utc_opt = 1; @@ -48,7 +85,8 @@ main(int argc, char **argv) break; default: if (optopt == 0) { - printf("usage: %s [-a] [-f FMT] [-i N] [-u] [OUT-FILE]\n", argv[0]); + printf("usage: %s [-asu] [-f FMT] [OUT-FILE]\n", + argv[0]); return 0; } return 1; @@ -84,18 +122,9 @@ main(int argc, char **argv) } setvbuf(fp, NULL, _IOLBF, 0); - if (ignore) - ignore--; - else - eol = 1; - while ((c = getchar()) != EOF) { - if (c == '\n') { - if (ignore) - ignore--; - else - eol = 1; - } else if (eol) { + state = trans[state][alpha(c)]; + if (state == STIM) { struct timeval tv; struct tm *tm; size_t sz; @@ -116,7 +145,6 @@ main(int argc, char **argv) start = p + 2; } fwrite(start, 1, sz, fp); - eol = 0; } fputc(c, fp); } |