On Mon, Jul 04, 2022 at 11:15:24PM +0200, Claudio Jeker wrote: > On Mon, Jul 04, 2022 at 01:28:12PM -0500, Scott Cheloha wrote: > > Hi, > > > > Couple things: > > > > [...] > > I don't like the introduction of all these local variables that are just > hard to follow and need extra code pathes. Happy to rename roff to offset, > start_offset or something similar. Also moving the localtime call into > fmtfmt() is fine.
You need an "elapsed" variable to avoid overwriting "now" in the -i flag case to avoid calling clock_gettime(2) twice. We can get rid of "utc_start" and just reuse "now" for the initial value of CLOCK_REALTIME. How is this? Index: ts.c =================================================================== RCS file: /cvs/src/usr.bin/ts/ts.c,v retrieving revision 1.6 diff -u -p -r1.6 ts.c --- ts.c 4 Jul 2022 17:29:03 -0000 1.6 +++ ts.c 4 Jul 2022 22:06:56 -0000 @@ -32,7 +32,7 @@ static char *buf; static char *outbuf; static size_t bufsize; -static void fmtfmt(struct tm *, long); +static void fmtfmt(const struct timespec *); static void __dead usage(void); int @@ -40,8 +40,7 @@ main(int argc, char *argv[]) { int iflag, mflag, sflag; int ch, prev; - struct timespec roff, start, now; - struct tm *tm; + struct timespec elapsed, now, start, utc_offset; clockid_t clock = CLOCK_REALTIME; if (pledge("stdio", NULL) == -1) @@ -93,22 +92,25 @@ main(int argc, char *argv[]) if (setenv("TZ", "UTC", 1) == -1) err(1, "setenv UTC"); - clock_gettime(CLOCK_REALTIME, &roff); clock_gettime(clock, &start); - timespecsub(&roff, &start, &roff); + if (mflag) { + clock_gettime(CLOCK_REALTIME, &now); + timespecsub(&now, &start, &utc_offset); + } for (prev = '\n'; (ch = getchar()) != EOF; prev = ch) { if (prev == '\n') { clock_gettime(clock, &now); - if (iflag || sflag) - timespecsub(&now, &start, &now); - else if (mflag) - timespecadd(&now, &roff, &now); - if (iflag) - clock_gettime(clock, &start); - if ((tm = localtime(&now.tv_sec)) == NULL) - err(1, "localtime"); - fmtfmt(tm, now.tv_nsec); + if (iflag || sflag) { + timespecsub(&now, &start, &elapsed); + if (iflag) + start = now; + fmtfmt(&elapsed); + } else { + if (mflag) + timespecadd(&now, &utc_offset, &now); + fmtfmt(&now); + } } if (putchar(ch) == EOF) break; @@ -132,11 +134,15 @@ usage(void) * so you can format while you format */ static void -fmtfmt(struct tm *tm, long tv_nsec) +fmtfmt(const struct timespec *ts) { + struct tm *tm; char *f, ms[7]; - snprintf(ms, sizeof(ms), "%06ld", tv_nsec / 1000); + if ((tm = localtime(&ts->tv_sec)) == NULL) + err(1, "localtime"); + + snprintf(ms, sizeof(ms), "%06ld", ts->tv_nsec / 1000); strlcpy(buf, format, bufsize); f = buf;