diff options
author | Manuel Novoa III <mjn3@codepoet.org> | 2003-08-13 21:48:47 +0400 |
---|---|---|
committer | Manuel Novoa III <mjn3@codepoet.org> | 2003-08-13 21:48:47 +0400 |
commit | 4456f25e8fa584fa0a72e0a64961e384e5de587f (patch) | |
tree | d1d726f82f70ad2f444552d33880db11f748b8f1 /shell | |
parent | 5b3c05637d41f25e3288680d5b2628d84b48397c (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.c | 40 |
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; } |