summaryrefslogtreecommitdiffhomepage
path: root/shell
diff options
context:
space:
mode:
authorManuel Novoa III <mjn3@codepoet.org>2003-08-13 17:48:47 +0000
committerManuel Novoa III <mjn3@codepoet.org>2003-08-13 17:48:47 +0000
commit4456f25e8fa584fa0a72e0a64961e384e5de587f (patch)
treed1d726f82f70ad2f444552d33880db11f748b8f1 /shell
parent5b3c05637d41f25e3288680d5b2628d84b48397c (diff)
Rewrite timescmd() function to avoid the use of floating point and to
correct a bug in the seconds display where something like 65 seconds would be output as "1m65.000000s".
Diffstat (limited to 'shell')
-rw-r--r--shell/ash.c40
1 files changed, 24 insertions, 16 deletions
diff --git a/shell/ash.c b/shell/ash.c
index 74c33381a..547ad906b 100644
--- a/shell/ash.c
+++ b/shell/ash.c
@@ -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;
}