mirror of
				git://git.code.sf.net/p/cdesktopenv/code
				synced 2025-03-09 15:50:02 +00:00 
			
		
		
		
	Refactor the new 'times' builtin; zero-pad seconds (re: 65d363fd)
				
					
				
			The output format is now identical to mksh's except for
the locale-dependent radix point ('.' or ',').
src/cmd/ksh93/bltins/misc.c:
- Output format tweak: pad seconds with initial zero if < 10.
- Use "too many operands" (e_toomanyops) error msg from 3ba4900e
  if there are operands, instead of "bad syntax" (e_badsyntax).
- Consolidate repetitive calculating and printing code
  into print_times().
- Get rid of some excessive variables.
src/cmd/ksh93/tests/builtins.sh:
- Update regression tests to match the above.
src/cmd/ksh93/data/builtins.c:
- Update sh_opttimes[] version string.
			
			
This commit is contained in:
		
							parent
							
								
									57ff4676eb
								
							
						
					
					
						commit
						5c677a4c6c
					
				
					 3 changed files with 22 additions and 43 deletions
				
			
		| 
						 | 
					@ -464,55 +464,34 @@ int    b_jobs(register int n,char *argv[],Shbltin_t *context)
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
 * times command
 | 
					 * times command
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					static void print_times(clock_t uticks, clock_t sticks, Shbltin_t *context)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						int clk_tck = context->shp->gd->lim.clk_tck;
 | 
				
			||||||
 | 
						double utime = (double)uticks / clk_tck, stime = (double)sticks / clk_tck;
 | 
				
			||||||
 | 
						sfprintf(sfstdout, "%dm%05.2fs %dm%05.2fs\n",
 | 
				
			||||||
 | 
							(int)floor(utime / 60), fmod(utime, 60),
 | 
				
			||||||
 | 
							(int)floor(stime / 60), fmod(stime, 60));
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
int	b_times(int argc, char *argv[], Shbltin_t *context)
 | 
					int	b_times(int argc, char *argv[], Shbltin_t *context)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	Shell_t *shp = context->shp;
 | 
					 | 
				
			||||||
	const char *cmd = argv[0];
 | 
					 | 
				
			||||||
	struct tms cpu_times;
 | 
						struct tms cpu_times;
 | 
				
			||||||
	clock_t rv;
 | 
						/* No options or operands are supported, except --man, etc. */
 | 
				
			||||||
	double utime, stime, utime_min, utime_sec, stime_min, stime_sec;
 | 
						if (argc = optget(argv, sh_opttimes)) switch (argc)
 | 
				
			||||||
 | 
					 | 
				
			||||||
	while (argc = optget(argv, sh_opttimes)) switch (argc)
 | 
					 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
	    case ':':
 | 
						    case ':':
 | 
				
			||||||
		errormsg(SH_DICT, 2, "%s", opt_info.arg);
 | 
							errormsg(SH_DICT, 2, "%s", opt_info.arg);
 | 
				
			||||||
		break;
 | 
							errormsg(SH_DICT, ERROR_usage(2), "%s", optusage((char*)0));
 | 
				
			||||||
	    case '?':
 | 
						    default:
 | 
				
			||||||
		errormsg(SH_DICT, ERROR_usage(0), "%s", opt_info.arg);
 | 
							errormsg(SH_DICT, ERROR_usage(0), "%s", opt_info.arg);
 | 
				
			||||||
		return(2);
 | 
							return(2);
 | 
				
			||||||
	    default:
 | 
					 | 
				
			||||||
		break;
 | 
					 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if (error_info.errors)
 | 
						if (argv[opt_info.index])
 | 
				
			||||||
		errormsg(SH_DICT, ERROR_usage(2), "%s", optusage((char*)0));
 | 
							errormsg(SH_DICT, ERROR_exit(2), e_toomanyops);
 | 
				
			||||||
 | 
						/* Get & print the times */
 | 
				
			||||||
	argv += opt_info.index;
 | 
						if (times(&cpu_times) == (clock_t)-1)
 | 
				
			||||||
	if (*argv)
 | 
							errormsg(SH_DICT, ERROR_exit(1), "times(3) failed: %s", strerror(errno));
 | 
				
			||||||
		errormsg(SH_DICT, ERROR_exit(3), e_badsyntax);
 | 
						print_times(cpu_times.tms_utime, cpu_times.tms_stime, context);
 | 
				
			||||||
 | 
						print_times(cpu_times.tms_cutime, cpu_times.tms_cstime, context);
 | 
				
			||||||
	rv = times(&cpu_times);
 | 
					 | 
				
			||||||
	if (rv == (clock_t)-1)
 | 
					 | 
				
			||||||
		errormsg(SH_DICT, ERROR_exit(2), "times(3) failed: errno %d: %s",
 | 
					 | 
				
			||||||
			 errno, strerror(errno));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	/* First line: user and system times used by the shell */
 | 
					 | 
				
			||||||
	utime = (double)cpu_times.tms_utime / shp->gd->lim.clk_tck;
 | 
					 | 
				
			||||||
	utime_min = floor(utime / 60);
 | 
					 | 
				
			||||||
	utime_sec = fmod(utime, 60);
 | 
					 | 
				
			||||||
	stime = (double)cpu_times.tms_stime / shp->gd->lim.clk_tck;
 | 
					 | 
				
			||||||
	stime_min = floor(stime / 60);
 | 
					 | 
				
			||||||
	stime_sec = fmod(stime, 60);
 | 
					 | 
				
			||||||
	sfprintf(sfstdout, "%dm%.2fs %dm%.2fs\n", (int)utime_min, utime_sec, (int)stime_min, stime_sec);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	/* Second line: same for the shell's child processes */
 | 
					 | 
				
			||||||
	utime = (double)cpu_times.tms_cutime / shp->gd->lim.clk_tck;
 | 
					 | 
				
			||||||
	utime_min = floor(utime / 60);
 | 
					 | 
				
			||||||
	utime_sec = fmod(utime, 60);
 | 
					 | 
				
			||||||
	stime = (double)cpu_times.tms_cstime / shp->gd->lim.clk_tck;
 | 
					 | 
				
			||||||
	stime_min = floor(stime / 60);
 | 
					 | 
				
			||||||
	stime_sec = fmod(stime, 60);
 | 
					 | 
				
			||||||
	sfprintf(sfstdout, "%dm%.2fs %dm%.2fs\n", (int)utime_min, utime_sec, (int)stime_min, stime_sec);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	return(0);
 | 
						return(0);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1836,7 +1836,7 @@ USAGE_LICENSE
 | 
				
			||||||
;
 | 
					;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const char sh_opttimes[] =
 | 
					const char sh_opttimes[] =
 | 
				
			||||||
"[-1c?@(#)$Id: times (ksh93) 2020-06-06 $\n]"
 | 
					"[-1c?@(#)$Id: times (ksh93) 2020-06-24 $\n]"
 | 
				
			||||||
"[+NAME?times - display CPU usage by the shell and child processes]"
 | 
					"[+NAME?times - display CPU usage by the shell and child processes]"
 | 
				
			||||||
"[+DESCRIPTION?\btimes\b displays the accumulated user and system CPU times, "
 | 
					"[+DESCRIPTION?\btimes\b displays the accumulated user and system CPU times, "
 | 
				
			||||||
"one line with the times used by the shell and another with those used by "
 | 
					"one line with the times used by the shell and another with those used by "
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -671,11 +671,11 @@ fi
 | 
				
			||||||
# ======
 | 
					# ======
 | 
				
			||||||
# 'times' builtin
 | 
					# 'times' builtin
 | 
				
			||||||
 | 
					
 | 
				
			||||||
expect=$'0m0.0[0-9]s 0m0.0[0-9]s\n0m0.00s 0m0.00s'
 | 
					expect=$'0m00.0[0-9]s 0m00.0[0-9]s\n0m00.00s 0m00.00s'
 | 
				
			||||||
actual=$("$SHELL" -c times)
 | 
					actual=$("$SHELL" -c times)
 | 
				
			||||||
[[ $actual == $expect ]] || err_exit "times output: expected $(printf %q "$expect"), got $(printf %q "$actual"))"
 | 
					[[ $actual == $expect ]] || err_exit "times output: expected $(printf %q "$expect"), got $(printf %q "$actual"))"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
expect=$'*: times: incorrect syntax'
 | 
					expect=$'*: times: too many operands'
 | 
				
			||||||
actual=$(set +x; eval 'times Extra Args' 2>&1)
 | 
					actual=$(set +x; eval 'times Extra Args' 2>&1)
 | 
				
			||||||
[[ $actual == $expect ]] || err_exit "times with args: expected $(printf %q "$expect"), got $(printf %q "$actual"))"
 | 
					[[ $actual == $expect ]] || err_exit "times with args: expected $(printf %q "$expect"), got $(printf %q "$actual"))"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue