xref: /freebsd/contrib/tcsh/sh.time.c (revision 45e5710b)
145e5710bSMark Peek /*
2c80476e4SDavid E. O'Brien  * sh.time.c: Shell time keeping and printing.
3c80476e4SDavid E. O'Brien  */
4c80476e4SDavid E. O'Brien /*-
5c80476e4SDavid E. O'Brien  * Copyright (c) 1980, 1991 The	Regents	of the University of California.
6c80476e4SDavid E. O'Brien  * All rights reserved.
7c80476e4SDavid E. O'Brien  *
8c80476e4SDavid E. O'Brien  * Redistribution and use in source and	binary forms, with or without
9c80476e4SDavid E. O'Brien  * modification, are permitted provided	that the following conditions
10c80476e4SDavid E. O'Brien  * are met:
11c80476e4SDavid E. O'Brien  * 1. Redistributions of source	code must retain the above copyright
12c80476e4SDavid E. O'Brien  *    notice, this list	of conditions and the following	disclaimer.
13c80476e4SDavid E. O'Brien  * 2. Redistributions in binary	form must reproduce the	above copyright
14c80476e4SDavid E. O'Brien  *    notice, this list	of conditions and the following	disclaimer in the
15c80476e4SDavid E. O'Brien  *    documentation and/or other materials provided with the distribution.
16c80476e4SDavid E. O'Brien  * 3. Neither the name of the University nor the names of its contributors
1729301572SMark Peek  *    may be used to endorse or	promote	products derived from this software
18c80476e4SDavid E. O'Brien  *    without specific prior written permission.
19c80476e4SDavid E. O'Brien  *
20c80476e4SDavid E. O'Brien  * THIS	SOFTWARE IS PROVIDED BY	THE REGENTS AND	CONTRIBUTORS ``AS IS'' AND
21c80476e4SDavid E. O'Brien  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22c80476e4SDavid E. O'Brien  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23c80476e4SDavid E. O'Brien  * ARE DISCLAIMED.  IN NO EVENT	SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
24c80476e4SDavid E. O'Brien  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR	CONSEQUENTIAL
25c80476e4SDavid E. O'Brien  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
26c80476e4SDavid E. O'Brien  * OR SERVICES;	LOSS OF	USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
27c80476e4SDavid E. O'Brien  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
28c80476e4SDavid E. O'Brien  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
29c80476e4SDavid E. O'Brien  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
30c80476e4SDavid E. O'Brien  * SUCH	DAMAGE.
31c80476e4SDavid E. O'Brien  */
32c80476e4SDavid E. O'Brien #include "sh.h"
33c80476e4SDavid E. O'Brien #ifdef SUNOS4
34c80476e4SDavid E. O'Brien # include <machine/param.h>
3545e5710bSMark Peek #endif /* SUNOS4 */
36c80476e4SDavid E. O'Brien 
37c80476e4SDavid E. O'Brien /*
38c80476e4SDavid E. O'Brien  * C Shell - routines handling process timing and niceing
39c80476e4SDavid E. O'Brien  */
40c80476e4SDavid E. O'Brien #ifdef BSDTIMES
41c80476e4SDavid E. O'Brien # ifndef RUSAGE_SELF
42c80476e4SDavid E. O'Brien #  define	RUSAGE_SELF	0
43c80476e4SDavid E. O'Brien #  define	RUSAGE_CHILDREN	-1
44c80476e4SDavid E. O'Brien # endif	/* RUSAGE_SELF */
45c80476e4SDavid E. O'Brien #else /* BSDTIMES */
46c80476e4SDavid E. O'Brien struct tms times0;
47c80476e4SDavid E. O'Brien #endif /* BSDTIMES */
48c80476e4SDavid E. O'Brien 
49c80476e4SDavid E. O'Brien #if !defined(BSDTIMES) && !defined(_SEQUENT_)
50c80476e4SDavid E. O'Brien # ifdef	POSIX
51c80476e4SDavid E. O'Brien static	void	pdtimet	(clock_t, clock_t);
52c80476e4SDavid E. O'Brien # else /* ! POSIX */
53c80476e4SDavid E. O'Brien static	void	pdtimet	(time_t, time_t);
54c80476e4SDavid E. O'Brien # endif	/* ! POSIX */
5545e5710bSMark Peek #else /* BSDTIMES || _SEQUENT_ */
56c80476e4SDavid E. O'Brien static	void	tvadd	(timeval_t *, timeval_t *);
5745e5710bSMark Peek static	void	pdeltat	(timeval_t *, timeval_t *);
58c80476e4SDavid E. O'Brien #endif /* BSDTIMES || _SEQUENT_	*/
59c80476e4SDavid E. O'Brien 
6045e5710bSMark Peek void
settimes(void)6145e5710bSMark Peek settimes(void)
62c80476e4SDavid E. O'Brien {
63c80476e4SDavid E. O'Brien #ifdef BSDTIMES
64c80476e4SDavid E. O'Brien     struct sysrusage ruch;
6545e5710bSMark Peek #ifdef convex
66c80476e4SDavid E. O'Brien     memset(&ru0, 0, sizeof(ru0));
67c80476e4SDavid E. O'Brien     memset(&ruch, 0, sizeof(ruch));
68c80476e4SDavid E. O'Brien #endif /* convex */
69c80476e4SDavid E. O'Brien 
70c80476e4SDavid E. O'Brien     (void) gettimeofday(&time0,	NULL);
71c80476e4SDavid E. O'Brien     (void) getrusage(RUSAGE_SELF, (struct rusage *) &ru0);
72c80476e4SDavid E. O'Brien     (void) getrusage(RUSAGE_CHILDREN, (struct rusage *) &ruch);
73c80476e4SDavid E. O'Brien     ruadd(&ru0,	&ruch);
74c80476e4SDavid E. O'Brien #else
75c80476e4SDavid E. O'Brien # ifdef	_SEQUENT_
76c80476e4SDavid E. O'Brien     struct process_stats ruch;
77c80476e4SDavid E. O'Brien 
78c80476e4SDavid E. O'Brien     (void) get_process_stats(&time0, PS_SELF, &ru0, &ruch);
79c80476e4SDavid E. O'Brien     ruadd(&ru0,	&ruch);
80c80476e4SDavid E. O'Brien # else	/* _SEQUENT_ */
81c80476e4SDavid E. O'Brien     seconds0 = time(NULL);
82c80476e4SDavid E. O'Brien     time0 = times(&times0);
83c80476e4SDavid E. O'Brien     times0.tms_stime +=	times0.tms_cstime;
84c80476e4SDavid E. O'Brien     times0.tms_utime +=	times0.tms_cutime;
858e66bd9eSDavid E. O'Brien     times0.tms_cstime =	0;
86c80476e4SDavid E. O'Brien     times0.tms_cutime =	0;
87c80476e4SDavid E. O'Brien # endif	/* _SEQUENT_ */
88c80476e4SDavid E. O'Brien #endif /* BSDTIMES */
89c80476e4SDavid E. O'Brien }
90c80476e4SDavid E. O'Brien 
91c80476e4SDavid E. O'Brien /*
92c80476e4SDavid E. O'Brien  * dotime is only called if it is truly	a builtin function and not a
93c80476e4SDavid E. O'Brien  * prefix to another command
94c80476e4SDavid E. O'Brien  */
95c80476e4SDavid E. O'Brien /*ARGSUSED*/
96c80476e4SDavid E. O'Brien void
dotime(Char ** v,struct command * c)97c80476e4SDavid E. O'Brien dotime(Char **v, struct command *c)
98c80476e4SDavid E. O'Brien {
99c80476e4SDavid E. O'Brien #ifdef BSDTIMES
100c80476e4SDavid E. O'Brien     timeval_t timedol;
10145e5710bSMark Peek     struct sysrusage ru1, ruch;
102c80476e4SDavid E. O'Brien #ifdef convex
103c80476e4SDavid E. O'Brien     memset(&ru1, 0, sizeof(ru1));
104c80476e4SDavid E. O'Brien     memset(&ruch, 0, sizeof(ruch));
105c80476e4SDavid E. O'Brien #endif /* convex */
106c80476e4SDavid E. O'Brien 
107c80476e4SDavid E. O'Brien     (void) getrusage(RUSAGE_SELF, (struct rusage *) &ru1);
108c80476e4SDavid E. O'Brien     (void) getrusage(RUSAGE_CHILDREN, (struct rusage *) &ruch);
109c80476e4SDavid E. O'Brien     ruadd(&ru1,	&ruch);
110c80476e4SDavid E. O'Brien     (void) gettimeofday(&timedol, NULL);
111c80476e4SDavid E. O'Brien     prusage(&ru0, &ru1,	&timedol, &time0);
112c80476e4SDavid E. O'Brien #else
113c80476e4SDavid E. O'Brien # ifdef	_SEQUENT_
114c80476e4SDavid E. O'Brien     timeval_t timedol;
115c80476e4SDavid E. O'Brien     struct process_stats ru1, ruch;
116c80476e4SDavid E. O'Brien 
117c80476e4SDavid E. O'Brien     (void) get_process_stats(&timedol, PS_SELF,	&ru1, &ruch);
118c80476e4SDavid E. O'Brien     ruadd(&ru1,	&ruch);
119c80476e4SDavid E. O'Brien     prusage(&ru0, &ru1,	&timedol, &time0);
120c80476e4SDavid E. O'Brien # else /* _SEQUENT_ */
121c80476e4SDavid E. O'Brien #  ifndef POSIX
122c80476e4SDavid E. O'Brien     time_t  timedol;
123c80476e4SDavid E. O'Brien #  else	/* POSIX */
124c80476e4SDavid E. O'Brien     clock_t timedol;
125c80476e4SDavid E. O'Brien #  endif /* POSIX */
126c80476e4SDavid E. O'Brien 
127c80476e4SDavid E. O'Brien     struct tms times_dol;
128c80476e4SDavid E. O'Brien 
129c80476e4SDavid E. O'Brien     timedol = times(&times_dol);
130c80476e4SDavid E. O'Brien     times_dol.tms_stime	+= times_dol.tms_cstime;
131c80476e4SDavid E. O'Brien     times_dol.tms_utime	+= times_dol.tms_cutime;
132c80476e4SDavid E. O'Brien     times_dol.tms_cstime = 0;
133c80476e4SDavid E. O'Brien     times_dol.tms_cutime = 0;
134c80476e4SDavid E. O'Brien     prusage(&times0, &times_dol, timedol, time0);
135c80476e4SDavid E. O'Brien # endif	/* _SEQUENT_ */
136c80476e4SDavid E. O'Brien #endif /* BSDTIMES */
137c80476e4SDavid E. O'Brien     USE(c);
138c80476e4SDavid E. O'Brien     USE(v);
139c80476e4SDavid E. O'Brien }
140c80476e4SDavid E. O'Brien 
141c80476e4SDavid E. O'Brien /*
142c80476e4SDavid E. O'Brien  * donice is only called when it on the	line by	itself or with a +- value
143c80476e4SDavid E. O'Brien  */
144c80476e4SDavid E. O'Brien /*ARGSUSED*/
145c80476e4SDavid E. O'Brien void
donice(Char ** v,struct command * c)146c80476e4SDavid E. O'Brien donice(Char **v, struct command *c)
147c80476e4SDavid E. O'Brien {
148c80476e4SDavid E. O'Brien     Char *cp;
149c80476e4SDavid E. O'Brien     int	    nval = 0;
15045e5710bSMark Peek 
151c80476e4SDavid E. O'Brien     USE(c);
15223338178SMark Peek     v++, cp = *v++;
153c80476e4SDavid E. O'Brien     if (cp == 0)
154c80476e4SDavid E. O'Brien 	nval = 4;
155c80476e4SDavid E. O'Brien     else if (*v	== 0 &&	any("+-", cp[0]))
156c80476e4SDavid E. O'Brien 	nval = getn(cp);
157c80476e4SDavid E. O'Brien #if defined(HAVE_SETPRIORITY) && defined(PRIO_PROCESS)
158c80476e4SDavid E. O'Brien     if (setpriority(PRIO_PROCESS, 0, nval) == -1 && errno)
159c80476e4SDavid E. O'Brien 	stderror(ERR_SYSTEM, "setpriority", strerror(errno));
160c80476e4SDavid E. O'Brien #else /* !HAVE_SETPRIORITY || !PRIO_PROCESS */
16123338178SMark Peek     (void) nice(nval);
1626767bd61SMark Peek #endif /* HAVE_SETPRIORITY && PRIO_PROCESS */
1636767bd61SMark Peek }
16423338178SMark Peek 
165c80476e4SDavid E. O'Brien #ifdef BSDTIMES
16623338178SMark Peek void
ruadd(struct sysrusage * ru,struct sysrusage * ru2)167c80476e4SDavid E. O'Brien ruadd(struct sysrusage *ru, struct sysrusage *ru2)
168c80476e4SDavid E. O'Brien {
169c80476e4SDavid E. O'Brien     tvadd(&ru->ru_utime, &ru2->ru_utime);
170c80476e4SDavid E. O'Brien     tvadd(&ru->ru_stime, &ru2->ru_stime);
17145e5710bSMark Peek #ifndef _OSD_POSIX
172c80476e4SDavid E. O'Brien     if (ru2->ru_maxrss > ru->ru_maxrss)
173c80476e4SDavid E. O'Brien 	ru->ru_maxrss =	ru2->ru_maxrss;
174c80476e4SDavid E. O'Brien 
17523338178SMark Peek     ru->ru_ixrss += ru2->ru_ixrss;
176c80476e4SDavid E. O'Brien     ru->ru_idrss += ru2->ru_idrss;
177c80476e4SDavid E. O'Brien     ru->ru_isrss += ru2->ru_isrss;
178c80476e4SDavid E. O'Brien     ru->ru_minflt += ru2->ru_minflt;
179c80476e4SDavid E. O'Brien     ru->ru_majflt += ru2->ru_majflt;
180c80476e4SDavid E. O'Brien     ru->ru_nswap += ru2->ru_nswap;
181c80476e4SDavid E. O'Brien     ru->ru_inblock += ru2->ru_inblock;
182c80476e4SDavid E. O'Brien     ru->ru_oublock += ru2->ru_oublock;
183c80476e4SDavid E. O'Brien     ru->ru_msgsnd += ru2->ru_msgsnd;
184c80476e4SDavid E. O'Brien     ru->ru_msgrcv += ru2->ru_msgrcv;
185c80476e4SDavid E. O'Brien     ru->ru_nsignals += ru2->ru_nsignals;
186c80476e4SDavid E. O'Brien     ru->ru_nvcsw += ru2->ru_nvcsw;
187c80476e4SDavid E. O'Brien     ru->ru_nivcsw += ru2->ru_nivcsw;
188c80476e4SDavid E. O'Brien #endif /*bs2000*/
189c80476e4SDavid E. O'Brien 
190c80476e4SDavid E. O'Brien # ifdef	convex
191c80476e4SDavid E. O'Brien     tvadd(&ru->ru_exutime, &ru2->ru_exutime);
19223338178SMark Peek     ru->ru_utotal += ru2->ru_utotal;
193c80476e4SDavid E. O'Brien     ru->ru_usamples += ru2->ru_usamples;
194c80476e4SDavid E. O'Brien     ru->ru_stotal += ru2->ru_stotal;
195c80476e4SDavid E. O'Brien     ru->ru_ssamples += ru2->ru_ssamples;
196c80476e4SDavid E. O'Brien # endif	/* convex */
197c80476e4SDavid E. O'Brien }
198c80476e4SDavid E. O'Brien 
199c80476e4SDavid E. O'Brien #else /* BSDTIMES */
200c80476e4SDavid E. O'Brien # ifdef	_SEQUENT_
201c80476e4SDavid E. O'Brien void
ruadd(struct process_stats * ru,struct process_stats * ru2)202c80476e4SDavid E. O'Brien ruadd(struct process_stats *ru, struct process_stats *ru2)
203c80476e4SDavid E. O'Brien {
204c80476e4SDavid E. O'Brien     tvadd(&ru->ps_utime, &ru2->ps_utime);
205c80476e4SDavid E. O'Brien     tvadd(&ru->ps_stime, &ru2->ps_stime);
20645e5710bSMark Peek     if (ru2->ps_maxrss > ru->ps_maxrss)
207c80476e4SDavid E. O'Brien 	ru->ps_maxrss =	ru2->ps_maxrss;
208c80476e4SDavid E. O'Brien 
209c80476e4SDavid E. O'Brien     ru->ps_pagein += ru2->ps_pagein;
210c80476e4SDavid E. O'Brien     ru->ps_reclaim += ru2->ps_reclaim;
211c80476e4SDavid E. O'Brien     ru->ps_zerofill += ru2->ps_zerofill;
212c80476e4SDavid E. O'Brien     ru->ps_pffincr += ru2->ps_pffincr;
213c80476e4SDavid E. O'Brien     ru->ps_pffdecr += ru2->ps_pffdecr;
214c80476e4SDavid E. O'Brien     ru->ps_swap	+= ru2->ps_swap;
215c80476e4SDavid E. O'Brien     ru->ps_syscall += ru2->ps_syscall;
216c80476e4SDavid E. O'Brien     ru->ps_volcsw += ru2->ps_volcsw;
217c80476e4SDavid E. O'Brien     ru->ps_involcsw += ru2->ps_involcsw;
218c80476e4SDavid E. O'Brien     ru->ps_signal += ru2->ps_signal;
219c80476e4SDavid E. O'Brien     ru->ps_lread += ru2->ps_lread;
220c80476e4SDavid E. O'Brien     ru->ps_lwrite += ru2->ps_lwrite;
221c80476e4SDavid E. O'Brien     ru->ps_bread += ru2->ps_bread;
222c80476e4SDavid E. O'Brien     ru->ps_bwrite += ru2->ps_bwrite;
223c80476e4SDavid E. O'Brien     ru->ps_phread += ru2->ps_phread;
224c80476e4SDavid E. O'Brien     ru->ps_phwrite += ru2->ps_phwrite;
225c80476e4SDavid E. O'Brien }
226c80476e4SDavid E. O'Brien 
227c80476e4SDavid E. O'Brien # endif	/* _SEQUENT_ */
228c80476e4SDavid E. O'Brien #endif /* BSDTIMES */
229c80476e4SDavid E. O'Brien 
230c80476e4SDavid E. O'Brien #ifdef BSDTIMES
231c80476e4SDavid E. O'Brien 
232c80476e4SDavid E. O'Brien /*
233c80476e4SDavid E. O'Brien  * PWP:	the LOG1024 and	pagetok	stuff taken from the top command,
234c80476e4SDavid E. O'Brien  * written by William LeFebvre
235c80476e4SDavid E. O'Brien  */
236c80476e4SDavid E. O'Brien /* Log base 2 of 1024 is 10 (2^10 == 1024) */
237c80476e4SDavid E. O'Brien #define	LOG1024		10
238c80476e4SDavid E. O'Brien 
239c80476e4SDavid E. O'Brien /* Convert clicks (kernel pages) to kbytes ... */
240c80476e4SDavid E. O'Brien /* If there is no PGSHIFT defined, assume it is	11 */
241c80476e4SDavid E. O'Brien /* Is this needed for compatability with some old flavor of 4.2	or 4.1?	*/
242c80476e4SDavid E. O'Brien #ifdef SUNOS4
243c80476e4SDavid E. O'Brien # ifndef PGSHIFT
244c80476e4SDavid E. O'Brien #  define pagetok(size)	  ((size) << 1)
245c80476e4SDavid E. O'Brien # else
246c80476e4SDavid E. O'Brien #  if PGSHIFT>10
247c80476e4SDavid E. O'Brien #   define pagetok(size)   ((size) << (PGSHIFT - LOG1024))
248c80476e4SDavid E. O'Brien #  else
249c80476e4SDavid E. O'Brien #   define pagetok(size)   ((size) >> (LOG1024 - PGSHIFT))
250c80476e4SDavid E. O'Brien #  endif
251c80476e4SDavid E. O'Brien # endif
252c80476e4SDavid E. O'Brien #endif
253c80476e4SDavid E. O'Brien 
254c80476e4SDavid E. O'Brien /*
255c80476e4SDavid E. O'Brien  * if any other	machines return	wierd values in	the ru_i* stuff, put
256c80476e4SDavid E. O'Brien  * the adjusting macro here:
257c80476e4SDavid E. O'Brien  */
258c80476e4SDavid E. O'Brien #ifdef SUNOS4
259c80476e4SDavid E. O'Brien # define IADJUST(i)	(pagetok(i)/2)
260c80476e4SDavid E. O'Brien #else /* SUNOS4	*/
261c80476e4SDavid E. O'Brien # ifdef	convex
262c80476e4SDavid E. O'Brien    /*
263c80476e4SDavid E. O'Brien     * convex has megabytes * CLK_TCK
264c80476e4SDavid E. O'Brien     * multiply by 100 since we use time	in 100ths of a second in prusage
265c80476e4SDavid E. O'Brien     */
266c80476e4SDavid E. O'Brien #  define IADJUST(i) (((i) << 10) / CLK_TCK * 100)
267c80476e4SDavid E. O'Brien # else /* convex */
268c80476e4SDavid E. O'Brien #  define IADJUST(i)	(i)
269c80476e4SDavid E. O'Brien # endif	/* convex */
270c80476e4SDavid E. O'Brien #endif /* SUNOS4 */
271c80476e4SDavid E. O'Brien 
272c80476e4SDavid E. O'Brien void
prusage(struct sysrusage * r0,struct sysrusage * r1,timeval_t * e,timeval_t * b)273c80476e4SDavid E. O'Brien prusage(struct sysrusage *r0, struct sysrusage *r1, timeval_t *e, timeval_t *b)
274c80476e4SDavid E. O'Brien 
275c80476e4SDavid E. O'Brien #else /* BSDTIMES */
276c80476e4SDavid E. O'Brien # ifdef	_SEQUENT_
27745e5710bSMark Peek void
278c80476e4SDavid E. O'Brien prusage(struct process_stats *r0, struct process_stats *r1, timeval_t e,
279c80476e4SDavid E. O'Brien 	timeval_t b)
280c80476e4SDavid E. O'Brien 
281c80476e4SDavid E. O'Brien # else /* _SEQUENT_ */
28245e5710bSMark Peek #  ifndef POSIX
28345e5710bSMark Peek void
284c80476e4SDavid E. O'Brien prusage(struct tms *bs, struct tms *es, time_t e, time_t b)
285c80476e4SDavid E. O'Brien #  else	/* POSIX */
286c80476e4SDavid E. O'Brien void
28745e5710bSMark Peek prusage(struct tms *bs, struct tms *es, clock_t e, clock_t b)
28845e5710bSMark Peek #  endif /* POSIX */
289c80476e4SDavid E. O'Brien # endif	/* _SEQUENT_ */
29045e5710bSMark Peek #endif /* BSDTIMES */
29145e5710bSMark Peek {
292c80476e4SDavid E. O'Brien     int ohaderr = haderr;
293c80476e4SDavid E. O'Brien #ifdef BSDTIMES
294c80476e4SDavid E. O'Brien     time_t t =
295c80476e4SDavid E. O'Brien     (r1->ru_utime.tv_sec - r0->ru_utime.tv_sec)	* 100 +
296c80476e4SDavid E. O'Brien     (r1->ru_utime.tv_usec - r0->ru_utime.tv_usec) / 10000 +
29723338178SMark Peek     (r1->ru_stime.tv_sec - r0->ru_stime.tv_sec)	* 100 +
298c80476e4SDavid E. O'Brien     (r1->ru_stime.tv_usec - r0->ru_stime.tv_usec) / 10000;
299c80476e4SDavid E. O'Brien 
300c80476e4SDavid E. O'Brien #else
301c80476e4SDavid E. O'Brien # ifdef	_SEQUENT_
302c80476e4SDavid E. O'Brien     time_t t =
303c80476e4SDavid E. O'Brien     (r1->ps_utime.tv_sec - r0->ps_utime.tv_sec)	* 100 +
304c80476e4SDavid E. O'Brien     (r1->ps_utime.tv_usec - r0->ps_utime.tv_usec) / 10000 +
30523338178SMark Peek     (r1->ps_stime.tv_sec - r0->ps_stime.tv_sec)	* 100 +
306c80476e4SDavid E. O'Brien     (r1->ps_stime.tv_usec - r0->ps_stime.tv_usec) / 10000;
307c80476e4SDavid E. O'Brien 
308c80476e4SDavid E. O'Brien # else /* _SEQUENT_ */
309c80476e4SDavid E. O'Brien #  ifndef POSIX
310c80476e4SDavid E. O'Brien     time_t t =	(es->tms_utime - bs->tms_utime +
311c80476e4SDavid E. O'Brien 			 es->tms_stime - bs->tms_stime)	* 100 /	HZ;
312c80476e4SDavid E. O'Brien 
31323338178SMark Peek #  else	/* POSIX */
314c80476e4SDavid E. O'Brien     clock_t t = (es->tms_utime	- bs->tms_utime	+
315c80476e4SDavid E. O'Brien 			  es->tms_stime	- bs->tms_stime) * 100 / clk_tck;
316c80476e4SDavid E. O'Brien 
31723338178SMark Peek #  endif /* POSIX */
318c80476e4SDavid E. O'Brien # endif	/* _SEQUENT_ */
319c80476e4SDavid E. O'Brien #endif /* BSDTIMES */
320c80476e4SDavid E. O'Brien 
321c80476e4SDavid E. O'Brien     const char *cp;
322c80476e4SDavid E. O'Brien     long i;
323c80476e4SDavid E. O'Brien     struct varent *vp = adrof(STRtime);
32423338178SMark Peek 
32523338178SMark Peek #ifdef BSDTIMES
32623338178SMark Peek # ifdef	convex
327c80476e4SDavid E. O'Brien     static struct system_information sysinfo;
328c80476e4SDavid E. O'Brien     long long memtmp;	/* let memory calculations exceede 2Gb */
329c80476e4SDavid E. O'Brien # endif	/* convex */
330c80476e4SDavid E. O'Brien     int	    ms = (int)
331c80476e4SDavid E. O'Brien     ((e->tv_sec	- b->tv_sec) * 100 + (e->tv_usec - b->tv_usec) / 10000);
332c80476e4SDavid E. O'Brien 
333c80476e4SDavid E. O'Brien     cp = "%Uu %Ss %E %P	%X+%Dk %I+%Oio %Fpf+%Ww";
334c80476e4SDavid E. O'Brien     haderr = 0;
335c80476e4SDavid E. O'Brien #else /* !BSDTIMES */
336c80476e4SDavid E. O'Brien # ifdef	_SEQUENT_
337c80476e4SDavid E. O'Brien     int	    ms = (int)
338c80476e4SDavid E. O'Brien     ((e->tv_sec	- b->tv_sec) * 100 + (e->tv_usec - b->tv_usec) / 10000);
339c80476e4SDavid E. O'Brien 
340c80476e4SDavid E. O'Brien     cp = "%Uu %Ss %E %P	%I+%Oio	%Fpf+%Ww";
341c80476e4SDavid E. O'Brien     haderr = 0;
342c80476e4SDavid E. O'Brien # else /* !_SEQUENT_ */
343c80476e4SDavid E. O'Brien #  ifndef POSIX
344c80476e4SDavid E. O'Brien     time_t ms = ((time_t)((e - b) / HZ) * 100) +
345c80476e4SDavid E. O'Brien 		 (time_t)(((e - b) % HZ) * 100) / HZ;
346c80476e4SDavid E. O'Brien #  else	/* POSIX */
347c80476e4SDavid E. O'Brien     clock_t ms = ((clock_t)((e - b) / clk_tck) * 100) +
348c80476e4SDavid E. O'Brien 		  (clock_t)(((e - b) % clk_tck) * 100) / clk_tck;
349c80476e4SDavid E. O'Brien #  endif /* POSIX */
350c80476e4SDavid E. O'Brien 
351c80476e4SDavid E. O'Brien     cp = "%Uu %Ss %E %P";
352c80476e4SDavid E. O'Brien     haderr = 0;
353c80476e4SDavid E. O'Brien 
354c80476e4SDavid E. O'Brien     /*
355c80476e4SDavid E. O'Brien      * the tms stuff is	not very precise, so we	fudge it.
356c80476e4SDavid E. O'Brien      * granularity fix:	can't be more than 100%
357c80476e4SDavid E. O'Brien      * this breaks in multi-processor systems...
358c80476e4SDavid E. O'Brien      * maybe I should take it out and let people see more then 100%
359c80476e4SDavid E. O'Brien      * utilizations.
360c80476e4SDavid E. O'Brien      */
361c80476e4SDavid E. O'Brien #  if 0
362c80476e4SDavid E. O'Brien     if (ms < t && ms !=	0)
363c80476e4SDavid E. O'Brien 	ms = t;
364c80476e4SDavid E. O'Brien #  endif
365c80476e4SDavid E. O'Brien # endif	/*! _SEQUENT_ */
366c80476e4SDavid E. O'Brien #endif /* !BSDTIMES */
367c80476e4SDavid E. O'Brien #ifdef TDEBUG
368c80476e4SDavid E. O'Brien     xprintf("es->tms_utime %lu bs->tms_utime %lu\n",
369c80476e4SDavid E. O'Brien 	    (unsigned long)es->tms_utime, (unsigned long)bs->tms_utime);
370c80476e4SDavid E. O'Brien     xprintf("es->tms_stime %lu bs->tms_stime %lu\n",
371c80476e4SDavid E. O'Brien 	    (unsigned long)es->tms_stime, (unsigned long)bs->tms_stime);
372c80476e4SDavid E. O'Brien     xprintf("ms	%llu e %p b %p\n", (unsigned long long)ms, e, b);
373c80476e4SDavid E. O'Brien     xprintf("t %llu\n", (unsigned long long)t);
374c80476e4SDavid E. O'Brien #endif /* TDEBUG */
375c80476e4SDavid E. O'Brien 
37629301572SMark Peek     if (vp && vp->vec && vp->vec[0] && vp->vec[1])
377c80476e4SDavid E. O'Brien 	cp = short2str(vp->vec[1]);
378c80476e4SDavid E. O'Brien     for	(; *cp;	cp++)
379c80476e4SDavid E. O'Brien 	if (*cp	!= '%')
380c80476e4SDavid E. O'Brien 	    xputchar(*cp);
381c80476e4SDavid E. O'Brien 	else if	(cp[1])
382c80476e4SDavid E. O'Brien 	    switch (*++cp) {
383c80476e4SDavid E. O'Brien 
384c80476e4SDavid E. O'Brien 	    case 'U':		/* user	CPU time used */
385c80476e4SDavid E. O'Brien #ifdef BSDTIMES
386c80476e4SDavid E. O'Brien 		pdeltat(&r1->ru_utime, &r0->ru_utime);
387c80476e4SDavid E. O'Brien #else
388c80476e4SDavid E. O'Brien # ifdef	_SEQUENT_
389c80476e4SDavid E. O'Brien 		pdeltat(&r1->ps_utime, &r0->ps_utime);
390c80476e4SDavid E. O'Brien # else /* _SEQUENT_ */
391c80476e4SDavid E. O'Brien #  ifndef POSIX
392c80476e4SDavid E. O'Brien 		pdtimet(es->tms_utime, bs->tms_utime);
393c80476e4SDavid E. O'Brien #  else	/* POSIX */
394c80476e4SDavid E. O'Brien 		pdtimet(es->tms_utime, bs->tms_utime);
395c80476e4SDavid E. O'Brien #  endif /* POSIX */
396c80476e4SDavid E. O'Brien # endif	/* _SEQUENT_ */
397c80476e4SDavid E. O'Brien #endif /* BSDTIMES */
398c80476e4SDavid E. O'Brien 		break;
399c80476e4SDavid E. O'Brien 
400c80476e4SDavid E. O'Brien 	    case 'S':		/* system CPU time used	*/
401c80476e4SDavid E. O'Brien #ifdef BSDTIMES
402c80476e4SDavid E. O'Brien 		pdeltat(&r1->ru_stime, &r0->ru_stime);
403c80476e4SDavid E. O'Brien #else
404c80476e4SDavid E. O'Brien # ifdef	_SEQUENT_
405c80476e4SDavid E. O'Brien 		pdeltat(&r1->ps_stime, &r0->ps_stime);
406c80476e4SDavid E. O'Brien # else /* _SEQUENT_ */
407c80476e4SDavid E. O'Brien #  ifndef POSIX
408c80476e4SDavid E. O'Brien 		pdtimet(es->tms_stime, bs->tms_stime);
409c80476e4SDavid E. O'Brien #  else	/* POSIX */
410c80476e4SDavid E. O'Brien 		pdtimet(es->tms_stime, bs->tms_stime);
411c80476e4SDavid E. O'Brien #  endif /* POSIX */
412c80476e4SDavid E. O'Brien # endif	/* _SEQUENT_ */
413c80476e4SDavid E. O'Brien #endif /* BSDTIMES */
414c80476e4SDavid E. O'Brien 		break;
415c80476e4SDavid E. O'Brien 
416c80476e4SDavid E. O'Brien 	    case 'E':		/* elapsed (wall-clock)	time */
417c80476e4SDavid E. O'Brien #ifdef BSDTIMES
418c80476e4SDavid E. O'Brien 		pcsecs((long) ms);
419c80476e4SDavid E. O'Brien #else /* BSDTIMES */
420c80476e4SDavid E. O'Brien 		pcsecs(ms);
421c80476e4SDavid E. O'Brien #endif /* BSDTIMES */
422c80476e4SDavid E. O'Brien 		break;
423c80476e4SDavid E. O'Brien 
424c80476e4SDavid E. O'Brien 	    case 'P':		/* percent time	spent running */
425c80476e4SDavid E. O'Brien 		/* check if the	process	did not	run */
426c80476e4SDavid E. O'Brien #ifdef convex
427c80476e4SDavid E. O'Brien 		/*
428c80476e4SDavid E. O'Brien 		 * scale the cpu %- ages by the	number of processors
429c80476e4SDavid E. O'Brien 		 * available on	this machine
430c80476e4SDavid E. O'Brien 		 */
431c80476e4SDavid E. O'Brien 		if ((sysinfo.cpu_count == 0) &&
432c80476e4SDavid E. O'Brien 		    (getsysinfo(SYSINFO_SIZE, &sysinfo)	< 0))
433c80476e4SDavid E. O'Brien 		    sysinfo.cpu_count =	1;
4348e66bd9eSDavid E. O'Brien 		    i =	(ms == 0) ? 0 :	(t * 1000.0 / (ms * sysinfo.cpu_count));
435c80476e4SDavid E. O'Brien #else /* convex	*/
436d9a02933SDavid E. O'Brien 		i = (ms	== 0) ?	0 : (long)(t * 1000.0 / ms);
437c80476e4SDavid E. O'Brien #endif /* convex */
438c80476e4SDavid E. O'Brien 		xprintf("%ld.%01ld%%", i / 10, i % 10);	/* nn.n% */
439c80476e4SDavid E. O'Brien 		break;
440c80476e4SDavid E. O'Brien 
441c80476e4SDavid E. O'Brien #ifdef BSDTIMES
442c80476e4SDavid E. O'Brien 	    case 'W':		/* number of swaps */
44323338178SMark Peek #ifdef _OSD_POSIX
44423338178SMark Peek 		i = 0;
44523338178SMark Peek #else
446c80476e4SDavid E. O'Brien 		i = r1->ru_nswap - r0->ru_nswap;
44723338178SMark Peek #endif
448c80476e4SDavid E. O'Brien 		xprintf("%ld", i);
449c80476e4SDavid E. O'Brien 		break;
450c80476e4SDavid E. O'Brien 
451c80476e4SDavid E. O'Brien #ifdef convex
452c80476e4SDavid E. O'Brien 	    case 'X':		/* (average) shared text size */
453c80476e4SDavid E. O'Brien 		memtmp = (t == 0 ? 0LL : IADJUST((long long)r1->ru_ixrss -
454c80476e4SDavid E. O'Brien 				 (long long)r0->ru_ixrss) /
455c80476e4SDavid E. O'Brien 			 (long long)t);
456c80476e4SDavid E. O'Brien 		xprintf("%lu", (unsigned long)memtmp);
457c80476e4SDavid E. O'Brien 		break;
458c80476e4SDavid E. O'Brien 
459c80476e4SDavid E. O'Brien 	    case 'D':		/* (average) unshared data size	*/
460c80476e4SDavid E. O'Brien 		memtmp = (t == 0 ? 0LL : IADJUST((long long)r1->ru_idrss +
461c80476e4SDavid E. O'Brien 				 (long long)r1->ru_isrss -
462c80476e4SDavid E. O'Brien 				 ((long	long)r0->ru_idrss +
463c80476e4SDavid E. O'Brien 				  (long	long)r0->ru_isrss)) /
464c80476e4SDavid E. O'Brien 			 (long long)t);
465c80476e4SDavid E. O'Brien 		xprintf("%lu", (unsigned long)memtmp);
466c80476e4SDavid E. O'Brien 		break;
467c80476e4SDavid E. O'Brien 
468c80476e4SDavid E. O'Brien 	    case 'K':		/* (average) total data	memory used  */
469c80476e4SDavid E. O'Brien 		memtmp = (t == 0 ? 0LL : IADJUST(((long	long)r1->ru_ixrss +
470c80476e4SDavid E. O'Brien 				  (long	long)r1->ru_isrss +
471c80476e4SDavid E. O'Brien 				  (long	long)r1->ru_idrss) -
472c80476e4SDavid E. O'Brien 				  ((long long)r0->ru_ixrss +
473c80476e4SDavid E. O'Brien 				   (long long)r0->ru_idrss +
474c80476e4SDavid E. O'Brien 				   (long long)r0->ru_isrss)) /
475c80476e4SDavid E. O'Brien 			 (long long)t);
476c80476e4SDavid E. O'Brien 		xprintf("%lu", (unsigned long)memtmp);
477c80476e4SDavid E. O'Brien 		break;
478c80476e4SDavid E. O'Brien #else /* !convex */
479c80476e4SDavid E. O'Brien 	    case 'X':		/* (average) shared text size */
48023338178SMark Peek #ifdef _OSD_POSIX
48123338178SMark Peek 		xprintf("0",0);
48223338178SMark Peek #else
483c80476e4SDavid E. O'Brien 		xprintf("%lld", (long long)(t == 0 ?	0L :
484c80476e4SDavid E. O'Brien 			IADJUST(r1->ru_ixrss - r0->ru_ixrss) / t));
48523338178SMark Peek #endif
486c80476e4SDavid E. O'Brien 		break;
487c80476e4SDavid E. O'Brien 
488c80476e4SDavid E. O'Brien 	    case 'D':		/* (average) unshared data size	*/
48923338178SMark Peek #ifdef _OSD_POSIX
49023338178SMark Peek 		xprintf("0",0);
49123338178SMark Peek #else
492c80476e4SDavid E. O'Brien 		xprintf("%lld", (long long)(t == 0 ?	0L :
493c80476e4SDavid E. O'Brien 			IADJUST(r1->ru_idrss + r1->ru_isrss -
494c80476e4SDavid E. O'Brien 				(r0->ru_idrss +	r0->ru_isrss)) / t));
49523338178SMark Peek #endif
496c80476e4SDavid E. O'Brien 		break;
497c80476e4SDavid E. O'Brien 
498c80476e4SDavid E. O'Brien 	    case 'K':		/* (average) total data	memory used  */
49923338178SMark Peek #ifdef _OSD_POSIX
50023338178SMark Peek 		xprintf("0",0);
50123338178SMark Peek #else
502c80476e4SDavid E. O'Brien 		xprintf("%lld", (long long)(t == 0 ? 0L :
503c80476e4SDavid E. O'Brien 			IADJUST((r1->ru_ixrss +	r1->ru_isrss + r1->ru_idrss) -
504c80476e4SDavid E. O'Brien 			   (r0->ru_ixrss + r0->ru_idrss	+ r0->ru_isrss)) / t));
50523338178SMark Peek #endif
506c80476e4SDavid E. O'Brien 		break;
507c80476e4SDavid E. O'Brien #endif /* convex */
508c80476e4SDavid E. O'Brien 	    case 'M':		/* max.	Resident Set Size */
509c80476e4SDavid E. O'Brien #ifdef SUNOS4
510c80476e4SDavid E. O'Brien 		xprintf("%ld", (long)pagetok(r1->ru_maxrss));
511c80476e4SDavid E. O'Brien #else
512c80476e4SDavid E. O'Brien # ifdef	convex
513c80476e4SDavid E. O'Brien 		xprintf("%ld", (long)(r1->ru_maxrss * 4L));
514c80476e4SDavid E. O'Brien # else /* !convex */
51523338178SMark Peek #  ifdef _OSD_POSIX
51623338178SMark Peek 		xprintf("0",0);
51723338178SMark Peek #  else
518c80476e4SDavid E. O'Brien 		xprintf("%ld", (long)r1->ru_maxrss);
51923338178SMark Peek #  endif
520c80476e4SDavid E. O'Brien # endif	/* convex */
521c80476e4SDavid E. O'Brien #endif /* SUNOS4 */
522c80476e4SDavid E. O'Brien 		break;
523c80476e4SDavid E. O'Brien 
524c80476e4SDavid E. O'Brien 	    case 'F':		/* page	faults */
52523338178SMark Peek #ifdef _OSD_POSIX
52623338178SMark Peek 		xprintf("0",0);
52723338178SMark Peek #else
528c80476e4SDavid E. O'Brien 		xprintf("%ld", (long)(r1->ru_majflt - r0->ru_majflt));
52923338178SMark Peek #endif
530c80476e4SDavid E. O'Brien 		break;
531c80476e4SDavid E. O'Brien 
532c80476e4SDavid E. O'Brien 	    case 'R':		/* page	reclaims */
53323338178SMark Peek #ifdef _OSD_POSIX
53423338178SMark Peek 		xprintf("0",0);
53523338178SMark Peek #else
536c80476e4SDavid E. O'Brien 		xprintf("%ld", (long)(r1->ru_minflt - r0->ru_minflt));
53723338178SMark Peek #endif
538c80476e4SDavid E. O'Brien 		break;
539c80476e4SDavid E. O'Brien 
540c80476e4SDavid E. O'Brien 	    case 'I':		/* FS blocks in	*/
54123338178SMark Peek #ifdef _OSD_POSIX
54223338178SMark Peek 		xprintf("0",0);
54323338178SMark Peek #else
544c80476e4SDavid E. O'Brien 		xprintf("%ld", (long)(r1->ru_inblock - r0->ru_inblock));
54523338178SMark Peek #endif
546c80476e4SDavid E. O'Brien 		break;
547c80476e4SDavid E. O'Brien 
548c80476e4SDavid E. O'Brien 	    case 'O':		/* FS blocks out */
54923338178SMark Peek #ifdef _OSD_POSIX
55023338178SMark Peek 		xprintf("0",0);
55123338178SMark Peek #else
552c80476e4SDavid E. O'Brien 		xprintf("%ld", (long)(r1->ru_oublock - r0->ru_oublock));
55323338178SMark Peek #endif
554c80476e4SDavid E. O'Brien 		break;
555c80476e4SDavid E. O'Brien 
556c80476e4SDavid E. O'Brien # ifdef	convex
557c80476e4SDavid E. O'Brien 	    case 'C':			/*  CPU	parallelization	factor */
558c80476e4SDavid E. O'Brien 		if (r1->ru_usamples	!= 0LL)	{
559c80476e4SDavid E. O'Brien 		    long long parr = ((r1->ru_utotal * 100LL) /
560c80476e4SDavid E. O'Brien 				      r1->ru_usamples);
561c80476e4SDavid E. O'Brien 		    xprintf("%d.%02d", (int)(parr/100), (int)(parr%100));
562c80476e4SDavid E. O'Brien 		} else
563c80476e4SDavid E. O'Brien 		    xprintf("?");
564c80476e4SDavid E. O'Brien 		break;
565c80476e4SDavid E. O'Brien # endif	/* convex */
566c80476e4SDavid E. O'Brien 	    case 'r':		/* PWP:	socket messages	recieved */
56723338178SMark Peek #ifdef _OSD_POSIX
56823338178SMark Peek 		xprintf("0",0);
56923338178SMark Peek #else
570c80476e4SDavid E. O'Brien 		xprintf("%ld", (long)(r1->ru_msgrcv - r0->ru_msgrcv));
57123338178SMark Peek #endif
572c80476e4SDavid E. O'Brien 		break;
573c80476e4SDavid E. O'Brien 
574c80476e4SDavid E. O'Brien 	    case 's':		/* PWP:	socket messages	sent */
57523338178SMark Peek #ifdef _OSD_POSIX
57623338178SMark Peek 		xprintf("0",0);
57723338178SMark Peek #else
578c80476e4SDavid E. O'Brien 		xprintf("%ld", (long)(r1->ru_msgsnd - r0->ru_msgsnd));
57923338178SMark Peek #endif
580c80476e4SDavid E. O'Brien 		break;
581c80476e4SDavid E. O'Brien 
582c80476e4SDavid E. O'Brien 	    case 'k':		/* PWP:	signals	received */
58323338178SMark Peek #ifdef _OSD_POSIX
58423338178SMark Peek 		xprintf("0",0);
58523338178SMark Peek #else
586c80476e4SDavid E. O'Brien 		xprintf("%ld", (long)(r1->ru_nsignals - r0->ru_nsignals));
58723338178SMark Peek #endif
588c80476e4SDavid E. O'Brien 		break;
589c80476e4SDavid E. O'Brien 
590c80476e4SDavid E. O'Brien 	    case 'w':		/* PWP:	voluntary context switches (waits) */
59123338178SMark Peek #ifdef _OSD_POSIX
59223338178SMark Peek 		xprintf("0",0);
59323338178SMark Peek #else
594c80476e4SDavid E. O'Brien 		xprintf("%ld", (long)(r1->ru_nvcsw - r0->ru_nvcsw));
59523338178SMark Peek #endif
596c80476e4SDavid E. O'Brien 		break;
597c80476e4SDavid E. O'Brien 
598c80476e4SDavid E. O'Brien 	    case 'c':		/* PWP:	involuntary context switches */
59923338178SMark Peek #ifdef _OSD_POSIX
60023338178SMark Peek 		xprintf("0",0);
60123338178SMark Peek #else
602c80476e4SDavid E. O'Brien 		xprintf("%ld", (long)(r1->ru_nivcsw - r0->ru_nivcsw));
60323338178SMark Peek #endif
604c80476e4SDavid E. O'Brien 		break;
605c80476e4SDavid E. O'Brien #else /* BSDTIMES */
606c80476e4SDavid E. O'Brien # ifdef	_SEQUENT_
607c80476e4SDavid E. O'Brien 	    case 'W':		/* number of swaps */
608c80476e4SDavid E. O'Brien 		i = r1->ps_swap	- r0->ps_swap;
609c80476e4SDavid E. O'Brien 		xprintf("%ld", (long)i);
610c80476e4SDavid E. O'Brien 		break;
611c80476e4SDavid E. O'Brien 
612c80476e4SDavid E. O'Brien 	    case 'M':
613c80476e4SDavid E. O'Brien 		xprintf("%ld", (long)r1->ps_maxrss);
614c80476e4SDavid E. O'Brien 		break;
615c80476e4SDavid E. O'Brien 
616c80476e4SDavid E. O'Brien 	    case 'F':
617c80476e4SDavid E. O'Brien 		xprintf("%ld", (long)(r1->ps_pagein - r0->ps_pagein));
618c80476e4SDavid E. O'Brien 		break;
619c80476e4SDavid E. O'Brien 
620c80476e4SDavid E. O'Brien 	    case 'R':
621c80476e4SDavid E. O'Brien 		xprintf("%ld", (long)(r1->ps_reclaim -	r0->ps_reclaim));
622c80476e4SDavid E. O'Brien 		break;
623c80476e4SDavid E. O'Brien 
624c80476e4SDavid E. O'Brien 	    case 'I':
625c80476e4SDavid E. O'Brien 		xprintf("%ld", (long)(r1->ps_bread - r0->ps_bread));
626c80476e4SDavid E. O'Brien 		break;
627c80476e4SDavid E. O'Brien 
628c80476e4SDavid E. O'Brien 	    case 'O':
629c80476e4SDavid E. O'Brien 		xprintf("%ld", (long)(r1->ps_bwrite - r0->ps_bwrite));
630c80476e4SDavid E. O'Brien 		break;
631c80476e4SDavid E. O'Brien 
632c80476e4SDavid E. O'Brien 	    case 'k':
633c80476e4SDavid E. O'Brien 		xprintf("%ld", (long)(r1->ps_signal - r0->ps_signal));
634c80476e4SDavid E. O'Brien 		break;
635c80476e4SDavid E. O'Brien 
636c80476e4SDavid E. O'Brien 	    case 'w':
637c80476e4SDavid E. O'Brien 		xprintf("%ld", (long)(r1->ps_volcsw - r0->ps_volcsw));
638c80476e4SDavid E. O'Brien 		break;
639c80476e4SDavid E. O'Brien 
640c80476e4SDavid E. O'Brien 	    case 'c':
641c80476e4SDavid E. O'Brien 		xprintf("%ld", r1->ps_involcsw - r0->ps_involcsw);
642c80476e4SDavid E. O'Brien 		break;
643c80476e4SDavid E. O'Brien 
644c80476e4SDavid E. O'Brien 	    case 'Z':
645c80476e4SDavid E. O'Brien 		xprintf("%ld", (long)(r1->ps_zerofill - r0->ps_zerofill));
646c80476e4SDavid E. O'Brien 		break;
647c80476e4SDavid E. O'Brien 
648c80476e4SDavid E. O'Brien 	    case 'i':
649c80476e4SDavid E. O'Brien 		xprintf("%ld", (long)(r1->ps_pffincr - r0->ps_pffincr));
650c80476e4SDavid E. O'Brien 		break;
651c80476e4SDavid E. O'Brien 
652c80476e4SDavid E. O'Brien 	    case 'd':
653c80476e4SDavid E. O'Brien 		xprintf("%ld", (long)(r1->ps_pffdecr - r0->ps_pffdecr));
654c80476e4SDavid E. O'Brien 		break;
655c80476e4SDavid E. O'Brien 
656c80476e4SDavid E. O'Brien 	    case 'Y':
657c80476e4SDavid E. O'Brien 		xprintf("%ld", (long)(r1->ps_syscall - r0->ps_syscall));
658c80476e4SDavid E. O'Brien 		break;
659c80476e4SDavid E. O'Brien 
660c80476e4SDavid E. O'Brien 	    case 'l':
661c80476e4SDavid E. O'Brien 		xprintf("%ld", (long)(r1->ps_lread - r0->ps_lread));
662c80476e4SDavid E. O'Brien 		break;
663c80476e4SDavid E. O'Brien 
664c80476e4SDavid E. O'Brien 	    case 'm':
665c80476e4SDavid E. O'Brien 		xprintf("%ld", (long)(r1->ps_lwrite - r0->ps_lwrite));
666c80476e4SDavid E. O'Brien 		break;
667c80476e4SDavid E. O'Brien 
668c80476e4SDavid E. O'Brien 	    case 'p':
669c80476e4SDavid E. O'Brien 		xprintf("%ld", (long)(r1->ps_phread - r0->ps_phread));
670c80476e4SDavid E. O'Brien 		break;
671c80476e4SDavid E. O'Brien 
672c80476e4SDavid E. O'Brien 	    case 'q':
673c80476e4SDavid E. O'Brien 		xprintf("%ld", (long)(r1->ps_phwrite - r0->ps_phwrite));
674c80476e4SDavid E. O'Brien 		break;
675c80476e4SDavid E. O'Brien # endif	/* _SEQUENT_ */
676c80476e4SDavid E. O'Brien #endif /* BSDTIMES */
677c80476e4SDavid E. O'Brien 	    default:
678c80476e4SDavid E. O'Brien 		break;
679c80476e4SDavid E. O'Brien 	    }
680c80476e4SDavid E. O'Brien     xputchar('\n');
681c80476e4SDavid E. O'Brien     haderr = ohaderr;
682c80476e4SDavid E. O'Brien }
683c80476e4SDavid E. O'Brien 
684c80476e4SDavid E. O'Brien #if defined(BSDTIMES) || defined(_SEQUENT_)
68545e5710bSMark Peek static void
pdeltat(timeval_t * t1,timeval_t * t0)686c80476e4SDavid E. O'Brien pdeltat(timeval_t *t1, timeval_t *t0)
687c80476e4SDavid E. O'Brien {
688c80476e4SDavid E. O'Brien     timeval_t td;
689c80476e4SDavid E. O'Brien 
690c80476e4SDavid E. O'Brien     tvsub(&td, t1, t0);
691c80476e4SDavid E. O'Brien     xprintf("%lld.%03ld", (long long)td.tv_sec, (long)td.tv_usec / 1000L);
692c80476e4SDavid E. O'Brien }
693c80476e4SDavid E. O'Brien 
69445e5710bSMark Peek static void
tvadd(timeval_t * tsum,timeval_t * t0)695c80476e4SDavid E. O'Brien tvadd(timeval_t *tsum, timeval_t *t0)
696c80476e4SDavid E. O'Brien {
697c80476e4SDavid E. O'Brien 
698c80476e4SDavid E. O'Brien     tsum->tv_sec += t0->tv_sec;
699c80476e4SDavid E. O'Brien     tsum->tv_usec += t0->tv_usec;
700c80476e4SDavid E. O'Brien     if (tsum->tv_usec >= 1000000)
701c80476e4SDavid E. O'Brien 	tsum->tv_sec++,	tsum->tv_usec -= 1000000;
702c80476e4SDavid E. O'Brien }
703c80476e4SDavid E. O'Brien 
70445e5710bSMark Peek void
tvsub(timeval_t * tdiff,timeval_t * t1,timeval_t * t0)705c80476e4SDavid E. O'Brien tvsub(timeval_t *tdiff, timeval_t *t1, timeval_t *t0)
706c80476e4SDavid E. O'Brien {
707c80476e4SDavid E. O'Brien 
708c80476e4SDavid E. O'Brien     tdiff->tv_sec = t1->tv_sec - t0->tv_sec;
709c80476e4SDavid E. O'Brien     tdiff->tv_usec = t1->tv_usec - t0->tv_usec;
710c80476e4SDavid E. O'Brien     if (tdiff->tv_usec < 0)
711c80476e4SDavid E. O'Brien 	tdiff->tv_sec--, tdiff->tv_usec	+= 1000000;
712c80476e4SDavid E. O'Brien }
713c80476e4SDavid E. O'Brien 
714c80476e4SDavid E. O'Brien #else /* !BSDTIMES && !_SEQUENT_ */
715c80476e4SDavid E. O'Brien static void
71645e5710bSMark Peek #ifndef	POSIX
pdtimet(time_t eval,time_t bval)717c80476e4SDavid E. O'Brien pdtimet(time_t eval, time_t bval)
718c80476e4SDavid E. O'Brien 
71945e5710bSMark Peek #else /* POSIX */
720c80476e4SDavid E. O'Brien pdtimet(clock_t eval, clock_t bval)
721c80476e4SDavid E. O'Brien 
722c80476e4SDavid E. O'Brien #endif /* POSIX	*/
723c80476e4SDavid E. O'Brien {
724c80476e4SDavid E. O'Brien #ifndef	POSIX
725c80476e4SDavid E. O'Brien     time_t  val;
726c80476e4SDavid E. O'Brien 
727c80476e4SDavid E. O'Brien #else /* POSIX */
728c80476e4SDavid E. O'Brien     clock_t val;
729c80476e4SDavid E. O'Brien 
730c80476e4SDavid E. O'Brien #endif /* POSIX	*/
731c80476e4SDavid E. O'Brien 
732c80476e4SDavid E. O'Brien #ifndef	POSIX
733c80476e4SDavid E. O'Brien     val	= (eval	- bval)	* 100 /	HZ;
734c80476e4SDavid E. O'Brien #else /* POSIX */
735c80476e4SDavid E. O'Brien     val	= (eval	- bval)	* 100 /	clk_tck;
736c80476e4SDavid E. O'Brien #endif /* POSIX	*/
737c80476e4SDavid E. O'Brien 
738c80476e4SDavid E. O'Brien     xprintf("%lld.%02ld", (long long)(val / 100),
739c80476e4SDavid E. O'Brien 	(long long)(val - (val / 100 * 100)));
740 }
741 #endif /* BSDTIMES || _SEQUENT_	*/
742