mirror of
git://git.code.sf.net/p/cdesktopenv/code
synced 2025-02-13 11:42:21 +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…
Reference in a new issue