Rewrite timescmd() function to avoid the use of floating point and to
authorManuel Novoa III <mjn3@codepoet.org>
Wed, 13 Aug 2003 17:48:47 +0000 (17:48 -0000)
committerManuel Novoa III <mjn3@codepoet.org>
Wed, 13 Aug 2003 17:48:47 +0000 (17:48 -0000)
correct a bug in the seconds display where something like  65 seconds
would be output as "1m65.000000s".

shell/ash.c

index 74c33381a3295928c2c20c91bb86d67744c76a73..547ad906b4ac59153b17486d6e6a7b4729767abe 100644 (file)
@@ -12417,27 +12417,35 @@ findvar(struct var **vpp, const char *name)
 }
 /*      $NetBSD: setmode.c,v 1.29 2003/01/15 23:58:03 kleink Exp $      */
 
-/*
- * Copyright (c) 1999 Herbert Xu <herbert@debian.org>
- * This code for the times builtin.
- */
-
 #include <sys/times.h>
 
-int timescmd(int ac, char **av) {
+static const unsigned char timescmd_str[] = {
+       ' ',  offsetof(struct tms, tms_utime),
+       '\n', offsetof(struct tms, tms_stime),
+       ' ',  offsetof(struct tms, tms_cutime),
+       '\n', offsetof(struct tms, tms_cstime),
+       0
+};
+
+static int timescmd(int ac, char **av)
+{
+       long int clk_tck, s, t;
+       const unsigned char *p;
        struct tms buf;
-       long int clk_tck = sysconf(_SC_CLK_TCK);
 
+       clk_tck = sysconf(_SC_CLK_TCK);
        times(&buf);
-       out1fmt("%dm%fs %dm%fs\n%dm%fs %dm%fs\n",
-              (int) (buf.tms_utime / clk_tck / 60),
-              ((double) buf.tms_utime) / clk_tck,
-              (int) (buf.tms_stime / clk_tck / 60),
-              ((double) buf.tms_stime) / clk_tck,
-              (int) (buf.tms_cutime / clk_tck / 60),
-              ((double) buf.tms_cutime) / clk_tck,
-              (int) (buf.tms_cstime / clk_tck / 60),
-              ((double) buf.tms_cstime) / clk_tck);
+
+       p = timescmd_str;
+       do {
+               t = *(clock_t *)(((char *) &buf) + p[1]);
+               s = t / clk_tck;
+               out1fmt("%ldm%ld.%.3lds%c",
+                       s/60, s%60,
+                       ((t - s * clk_tck) * 1000) / clk_tck,
+                       p[0]);
+       } while (*(p += 2));
+
        return 0;
 }