On Mon, Jul 04, 2022 at 01:28:12PM -0500, Scott Cheloha wrote:
> Hi,
>
> Couple things:
>
> - Use additional timespec variables to make our intent more obvious.
>
> Add "elapsed", "utc_offset", and "utc_start".
>
> "roff" is a confusing name, "utc_offset" is better.
>
> Yes, I know the clock is called CLOCK_REALTIME, but that's a
> historical accident. Ideally they would have called it CLOCK_UTC
> or CLOCK_UNIX. Sigh.
>
> - Before the loop, we only need to compute utc_offset in the -m flag
> case.
>
> - Before the loop, we only need to do two clock_gettime(2) calls in
> the -m flag case.
>
> - In the loop, we can use the new variables to help clarify what we're
> doing:
>
> + In the -i and -s flag cases we're using an elapsed time for the
> timestamp, so compute "elapsed".
>
> + In the default and -m cases we're using an absolute time for the
> timestamp, so (if necessary) compute "now".
>
> - We don't need to call clock_gettime(2) twice in the -i flag case.
> Just compute "elapsed" and then assign "now" to "start". Easy.
>
> - I think the pimp my ride joke is cute, but calling the function
> "print_timestamp()" is a bit more obvious. It also tells the
> reader that there's a side effect.
>
> - Because we always call localtime(3), we can move that call into
> print_timestamp() and just pass the timespec as argument.
>
> This makes it clearer where the nanosecond value is coming from,
> which in turn makes it clearer that the string "ms" will be exactly
> 6 bytes in length.
>
> I think "ms" stands for "microseconds", in which case a better name
> is "us" or "usecs", but that's outside the scope of this patch.
>
> --
>
> ok?
>
> 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 18:17:20 -0000
> @@ -32,7 +32,7 @@ static char *buf;
> static char *outbuf;
> static size_t bufsize;
>
> -static void fmtfmt(struct tm *, long);
> +static void print_timestamp(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, utc_start;
> clockid_t clock = CLOCK_REALTIME;
>
> if (pledge("stdio", NULL) == -1)
> @@ -93,22 +92,28 @@ 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 (clock != CLOCK_REALTIME) {
> + clock_gettime(clock, &start);
> + if (mflag) {
> + clock_gettime(CLOCK_REALTIME, &utc_start);
> + timespecsub(&utc_start, &start, &utc_offset);
> + }
> + } else
> + clock_gettime(CLOCK_REALTIME, &start);
>
> 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;
> + print_timestamp(&elapsed);
> + } else {
> + if (mflag)
> + timespecadd(&now, &utc_offset, &now);
> + print_timestamp(&now);
> + }
> }
> if (putchar(ch) == EOF)
> break;
> @@ -132,11 +137,15 @@ usage(void)
> * so you can format while you format
> */
> static void
> -fmtfmt(struct tm *tm, long tv_nsec)
> +print_timestamp(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;
>
>
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.
--
:wq Claudio