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".
This commit is contained in:
		
							
								
								
									
										42
									
								
								shell/ash.c
									
									
									
									
									
								
							
							
						
						
									
										42
									
								
								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 $      */ | /*      $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> | #include <sys/times.h> | ||||||
|  |  | ||||||
| int timescmd(int ac, char **av) { | static const unsigned char timescmd_str[] = { | ||||||
| 	struct tms buf; | 	' ',  offsetof(struct tms, tms_utime), | ||||||
| 	long int clk_tck = sysconf(_SC_CLK_TCK); | 	'\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; | ||||||
|  |  | ||||||
|  | 	clk_tck = sysconf(_SC_CLK_TCK); | ||||||
| 	times(&buf); | 	times(&buf); | ||||||
| 	out1fmt("%dm%fs %dm%fs\n%dm%fs %dm%fs\n", |  | ||||||
| 	       (int) (buf.tms_utime / clk_tck / 60), | 	p = timescmd_str; | ||||||
| 	       ((double) buf.tms_utime) / clk_tck, | 	do { | ||||||
| 	       (int) (buf.tms_stime / clk_tck / 60), | 		t = *(clock_t *)(((char *) &buf) + p[1]); | ||||||
| 	       ((double) buf.tms_stime) / clk_tck, | 		s = t / clk_tck; | ||||||
| 	       (int) (buf.tms_cutime / clk_tck / 60), | 		out1fmt("%ldm%ld.%.3lds%c", | ||||||
| 	       ((double) buf.tms_cutime) / clk_tck, | 			s/60, s%60, | ||||||
| 	       (int) (buf.tms_cstime / clk_tck / 60), | 			((t - s * clk_tck) * 1000) / clk_tck, | ||||||
| 	       ((double) buf.tms_cstime) / clk_tck); | 			p[0]); | ||||||
|  | 	} while (*(p += 2)); | ||||||
|  |  | ||||||
| 	return 0; | 	return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user