diff options
Diffstat (limited to 'addts.c')
-rw-r--r-- | addts.c | 125 |
1 files changed, 125 insertions, 0 deletions
@@ -0,0 +1,125 @@ +#include <stdlib.h> +#include <stdio.h> +#include <unistd.h> +#include <string.h> +#include <errno.h> +#include <time.h> +#include <sys/time.h> + +static char default_fmt[] = "%Y-%m-%d %H:%M:%S: "; + +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; + char *p; + char *fmt = NULL; + FILE *fp; + + while ((c = getopt(argc, argv, "?af:i:uw:")) != EOF) { + switch (c) { + case 'a': + append_opt = 1; + break; + 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; + } + break; + case 'u': + utc_opt = 1; + break; + case 'w': + ws_opt = optarg[0]; + break; + default: + if (optopt == 0) { + printf("usage: %s [-a] [-f FMT] [-i N] [-u] [OUT-FILE]\n", argv[0]); + return 0; + } + return 1; + } + } + + if (fmt) { + if (ws_opt) { + for (p = fmt; *p; p++) + if (*p == ws_opt) + *p = ' '; + } + } else + fmt = default_fmt; + + argc -= optind; + argv += optind; + + switch (argc) { + case 0: + fp = stdout; + break; + case 1: + fp = fopen(argv[0], append_opt ? "a" : "w"); + if (!fp) { + perror(argv[0]); + return 1; + } + break; + default: + fprintf(stderr, "%s: too many arguments\n", argv[0]); + return 1; + } + 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) { + struct timeval tv; + struct tm *tm; + size_t sz; + char *start, *p; + + gettimeofday(&tv, NULL); + tm = (utc_opt ? gmtime : localtime)(&tv.tv_sec); + sz = strftime(buf, sizeof(buf), fmt, tm); + if (sz == 0 || sz == sizeof(buf)) { + strcpy(buf, "[OVERFLOW]: "); + sz = strlen(buf); + } + start = buf; + while ((p = strstr(start, "%@")) != NULL) { + fwrite(start, 1, p - start, fp); + fprintf(fp, "%06d", tv.tv_usec); + sz -= p - start + 2; + start = p + 2; + } + fwrite(start, 1, sz, fp); + eol = 0; + } + fputc(c, fp); + } + fclose(fp); + return 0; +} |