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