new copyright notice
[unix-history] / usr / src / bin / csh / time.c
CommitLineData
b79f4fa9
DF
1/*
2 * Copyright (c) 1980 Regents of the University of California.
094e80ed 3 * All rights reserved. The Berkeley Software License Agreement
b79f4fa9
DF
4 * specifies the terms and conditions for redistribution.
5 */
6
f6227721 7#ifndef lint
fad613b5 8static char *sccsid = "@(#)time.c 5.6 (Berkeley) %G%";
094e80ed 9#endif
35867765
BJ
10
11#include "sh.h"
12
13/*
14 * C Shell - routines handling process timing and niceing
15 */
35867765
BJ
16
17settimes()
18{
ea775389 19 struct rusage ruch;
35867765 20
35371dec
EW
21 (void) gettimeofday(&time0, (struct timezone *)0);
22 (void) getrusage(RUSAGE_SELF, &ru0);
23 (void) getrusage(RUSAGE_CHILDREN, &ruch);
ea775389 24 ruadd(&ru0, &ruch);
35867765
BJ
25}
26
27/*
28 * dotime is only called if it is truly a builtin function and not a
29 * prefix to another command
30 */
31dotime()
32{
ae3d9709 33 struct timeval timedol;
ea775389 34 struct rusage ru1, ruch;
35867765 35
35371dec
EW
36 (void) getrusage(RUSAGE_SELF, &ru1);
37 (void) getrusage(RUSAGE_CHILDREN, &ruch);
ea775389 38 ruadd(&ru1, &ruch);
35371dec 39 (void) gettimeofday(&timedol, (struct timezone *)0);
ae3d9709 40 prusage(&ru0, &ru1, &timedol, &time0);
35867765
BJ
41}
42
43/*
44 * donice is only called when it on the line by itself or with a +- value
45 */
46donice(v)
47 register char **v;
48{
49 register char *cp;
1ab62557 50 int nval;
35867765
BJ
51
52 v++, cp = *v++;
38474cb5 53 if (cp == 0)
1ab62557 54 nval = 4;
38474cb5 55 else if (*v == 0 && any(cp[0], "+-"))
1ab62557 56 nval = getn(cp);
8b948fd2 57 (void) setpriority(PRIO_PROCESS, 0, nval);
35867765
BJ
58}
59
ea775389
SL
60ruadd(ru, ru2)
61 register struct rusage *ru, *ru2;
35867765 62{
ea775389
SL
63 register long *lp, *lp2;
64 register int cnt;
65
66 tvadd(&ru->ru_utime, &ru2->ru_utime);
67 tvadd(&ru->ru_stime, &ru2->ru_stime);
68 if (ru2->ru_maxrss > ru->ru_maxrss)
69 ru->ru_maxrss = ru2->ru_maxrss;
70 cnt = &ru->ru_last - &ru->ru_first + 1;
71 lp = &ru->ru_first; lp2 = &ru2->ru_first;
72 do
73 *lp++ += *lp2++;
74 while (--cnt > 0);
35867765
BJ
75}
76
ae3d9709 77prusage(r0, r1, e, b)
ea775389 78 register struct rusage *r0, *r1;
ae3d9709 79 struct timeval *e, *b;
35867765
BJ
80{
81 register time_t t =
ea775389
SL
82 (r1->ru_utime.tv_sec-r0->ru_utime.tv_sec)*100+
83 (r1->ru_utime.tv_usec-r0->ru_utime.tv_usec)/10000+
84 (r1->ru_stime.tv_sec-r0->ru_stime.tv_sec)*100+
85 (r1->ru_stime.tv_usec-r0->ru_stime.tv_usec)/10000;
35867765 86 register char *cp;
1f7b623f 87 register long i;
35867765 88 register struct varent *vp = adrof("time");
1f7b623f 89 long ms =
ae3d9709 90 (e->tv_sec-b->tv_sec)*100 + (e->tv_usec-b->tv_usec)/10000;
35867765
BJ
91
92 cp = "%Uu %Ss %E %P %X+%Dk %I+%Oio %Fpf+%Ww";
93 if (vp && vp->vec[0] && vp->vec[1])
94 cp = vp->vec[1];
95 for (; *cp; cp++)
96 if (*cp != '%')
fad613b5 97 cshputchar(*cp);
35867765
BJ
98 else if (cp[1]) switch(*++cp) {
99
100 case 'U':
ea775389 101 pdeltat(&r1->ru_utime, &r0->ru_utime);
35867765
BJ
102 break;
103
104 case 'S':
ea775389 105 pdeltat(&r1->ru_stime, &r0->ru_stime);
35867765
BJ
106 break;
107
108 case 'E':
1f7b623f 109 psecs(ms / 100);
35867765
BJ
110 break;
111
112 case 'P':
ae3d9709 113 printf("%d%%", (int) (t*100 / ((ms ? ms : 1))));
35867765
BJ
114 break;
115
116 case 'W':
ea775389 117 i = r1->ru_nswap - r0->ru_nswap;
1f7b623f 118 printf("%ld", i);
35867765
BJ
119 break;
120
121 case 'X':
1f7b623f 122 printf("%ld", t == 0 ? 0L : (r1->ru_ixrss-r0->ru_ixrss)/t);
35867765
BJ
123 break;
124
125 case 'D':
1f7b623f 126 printf("%ld", t == 0 ? 0L :
ea775389 127 (r1->ru_idrss+r1->ru_isrss-(r0->ru_idrss+r0->ru_isrss))/t);
35867765
BJ
128 break;
129
130 case 'K':
1f7b623f 131 printf("%ld", t == 0 ? 0L :
ea775389
SL
132 ((r1->ru_ixrss+r1->ru_isrss+r1->ru_idrss) -
133 (r0->ru_ixrss+r0->ru_idrss+r0->ru_isrss))/t);
35867765
BJ
134 break;
135
136 case 'M':
1f7b623f 137 printf("%ld", r1->ru_maxrss/2);
35867765
BJ
138 break;
139
140 case 'F':
1f7b623f 141 printf("%ld", r1->ru_majflt-r0->ru_majflt);
35867765
BJ
142 break;
143
144 case 'R':
1f7b623f 145 printf("%ld", r1->ru_minflt-r0->ru_minflt);
35867765
BJ
146 break;
147
148 case 'I':
1f7b623f 149 printf("%ld", r1->ru_inblock-r0->ru_inblock);
35867765
BJ
150 break;
151
152 case 'O':
1f7b623f 153 printf("%ld", r1->ru_oublock-r0->ru_oublock);
35867765 154 break;
35867765 155 }
fad613b5 156 cshputchar('\n');
35867765 157}
ea775389
SL
158
159pdeltat(t1, t0)
160 struct timeval *t1, *t0;
161{
162 struct timeval td;
163
164 tvsub(&td, t1, t0);
165 printf("%d.%01d", td.tv_sec, td.tv_usec/100000);
166}
167
168tvadd(tsum, t0)
169 struct timeval *tsum, *t0;
170{
171
172 tsum->tv_sec += t0->tv_sec;
173 tsum->tv_usec += t0->tv_usec;
174 if (tsum->tv_usec > 1000000)
175 tsum->tv_sec++, tsum->tv_usec -= 1000000;
176}
177
178tvsub(tdiff, t1, t0)
179 struct timeval *tdiff, *t1, *t0;
180{
181
182 tdiff->tv_sec = t1->tv_sec - t0->tv_sec;
183 tdiff->tv_usec = t1->tv_usec - t0->tv_usec;
184 if (tdiff->tv_usec < 0)
185 tdiff->tv_sec--, tdiff->tv_usec += 1000000;
186}