aboutsummaryrefslogtreecommitdiff
path: root/addts.c
diff options
context:
space:
mode:
Diffstat (limited to 'addts.c')
-rw-r--r--addts.c78
1 files changed, 53 insertions, 25 deletions
diff --git a/addts.c b/addts.c
index abd3c9a..07fae4f 100644
--- a/addts.c
+++ b/addts.c
@@ -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);
}

Return to:

Send suggestions and report system problems to the System administrator.