V10/cmd/time.c

Compare this file to the similar file:
Show the results in this format:

/* time command */

#include <stdio.h>
#include <signal.h>
#include <sys/types.h>
#include <sys/times.h>
#include <sys/vtimes.h>

extern int errno;
extern char *sys_errlist[];
int	vflag = 0;
char	output[BUFSIZ];

#define	U	0001
#define	S	0002
#define	R	0004
#define	T	0010
#define	D	0020
#define	M	0040
#define	F	0100
#define	I	0200
#define	O	0400
#define	ALL	0777

#define	t(x)	(flags&x)

int	flags = U|S|R;
char	names[] = "usrtdmfio";

main(argc, argv)
char **argv;
{
	double x;
	int status;
	struct vtimes vt;
	time_t before, after;
	char buf[BUFSIZ];
	register char *p;
	register i, pid;

	setbuf(stderr, buf);
	if(argc>1 && argv[1][0]=='-') {
		flags = 0;
		for(flags=0; argc>1 && argv[1][0]=='-'; --argc, argv++)
			for(p=argv[1]+1; *p; p++) {
				if(*p == 'v')
					flags = ALL;
				else if((i=index(*p, names)) < 0)
					fprintf(stderr, "time: bad flag %c\n", *p);
				else
					flags |= 1<<i;
			}
	}
	if(argc <= 1) {
		fprintf(stderr, "usage: time [-usrtdmfio] [-v] cmd\n");
		exit(1);
	}
	time(&before);
	pid = fork();
	if(pid == -1) {
		perror("Try again");
		exit(1);
	}
	if(pid == 0) {
		execvp(argv[1], &argv[1]);
		fprintf(stderr, "%s: %s\n", argv[1], sys_errlist[errno]);
		exit(1);
	}
	signal(SIGINT, SIG_IGN);
	signal(SIGQUIT, SIG_IGN);
	while(wait(&status) != pid)
		;
	time(&after);
	vtimes((struct vtimes *)0, &vt);
	if((status&0377) != 0)
		fprintf(stderr,"Command terminated abnormally.\n");
	x = vt.vm_utime+vt.vm_stime;
	if(t(U))
		add("%.1fu", (double)vt.vm_utime/60);
	if(t(S))
		add("%.1fs", (double)vt.vm_stime/60);
	if(t(R))
		add("%dr", after-before);
	if(t(T))
		add("%.0ft", vt.vm_ixrss/2/x);
	if(t(D))
		add("%.0fd", vt.vm_idsrss/2/x);
	if(t(M))
		add("%dm", vt.vm_maxrss/2);
	if(t(F))
		add("%df", vt.vm_majflt);
	if(t(I))
		add("%di", vt.vm_inblk);
	if(t(O))
		add("%do", vt.vm_oublk);
	add("\t");
	for(i=1; i<argc; i++) {
		add("%s", argv[i]);
		if(i > 4) {
			add("...");
			break;
		}
	}
	fprintf(stderr, "%s\n", output);
	return (status&0377)? -1 : (status>>8)&0377;
}
add(a, b, c, d, e)
	char *a;
	int b, c, d, e;
{
	static beenhere=0;
	if(beenhere)
		strcat(output, " ");
	sprintf(output+strlen(output), a, b, c, d, e);
	beenhere++;
}
index(c, s)
	register char *s;
{
	register i;
	for(i=0; *s; i++, s++)
		if(*s == c)
			return i;
	return -1;
}