⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ac.c

📁 Version 6 Unix 核心源代码 Version 6 Unix 核心源代码
💻 C
字号:
#/* * acct [ -w wtmp ] [ -d ] [ -p people ] */#define	TSIZE	30#define	USIZE	200struct {	char	name[8];	char	tty;	char	fill1;	float	time;	int	fill2;} ibuf;struct ubuf {	char	name[8];	float	utime;} ubuf[USIZE];struct tbuf {	struct	ubuf	*userp;	float	ttime;} tbuf[TSIZE];char	*wtmp;int	pflag, byday;double	dtime;double	midnight;double	lastime;double	day	1440.;int	pcount;char	**pptr;int	montab[] { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31,		31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };char	*monasc[] {	"Jan",	"Feb",	"Mar",	"Apr",	"May",	"Jun",	"Jul",	"Aug",	"Sep",	"Oct",	"Nov",	"Dec"};main(argc, argv) char **argv;{	int c, fl;	register i;	register char *ip;	extern fin;	int f;	wtmp = "/usr/adm/wtmp";	while (--argc > 0 && **++argv == '-')	switch(*++*argv) {	case 'd':		byday++;		continue;	case 'w':		if (--argc>0)			wtmp = *++argv;		continue;	case 'p':		pflag++;		continue;	}	pcount = argc;	pptr = argv;	if (fopen(wtmp, &fin) < 0) {		printf("No %s\n", wtmp);		return;	}	for(;;) {		ip = &ibuf;		for (i=0; i<16; i++) {			if ((c=getc(&fin)) < 0)				goto brk;			*ip++ = c;		}		fl = 0;		for (i=0; i<8; i++) {			c = ibuf.name[i];			if ('0'<=c&&c<='9'||'a'<=c&&c<='z'||'A'<=c&&c<='Z') {				if (fl)					goto skip;				continue;			}			if (c==' ' || c=='\0') {				fl++;				ibuf.name[i] = '\0';			} else				goto skip;		}		loop();    skip:;	}    brk:	ibuf.name[0] = '\0';	ibuf.tty = '~';	time(&ibuf.time);	loop();	print();}loop(){	double ltod();	register i;	register struct tbuf *tp;	register struct ubuf *up;	if (ibuf.fill1||ibuf.fill2)		return;	ibuf.time = ltod(&ibuf.time)/60.;	if(ibuf.tty == '|') {		dtime = ibuf.time;		return;	}	if(ibuf.tty == '}') {		if(dtime == 0.)			return;		for(tp = tbuf; tp < &tbuf[TSIZE]; tp++)			tp->ttime =+ ibuf.time-dtime;		dtime = 0.;		return;	}	if (lastime>ibuf.time || lastime+(1.5*day)<ibuf.time)		midnight = 0.0;	if (midnight==0.0)		newday();	lastime = ibuf.time;	if (byday && ibuf.time > midnight) {		upall(1);		print();		newday();		for (up=ubuf; up < &ubuf[USIZE]; up++)			up->utime = 0.0;	}	if (ibuf.tty == '~') {		ibuf.name[0] = '\0';		upall(0);		return;	}	if ((i = ibuf.tty) >= 'a')		i =- 'a' - '9';	i =- '0';	if (i<0 || i>=TSIZE)		i = TSIZE-1;	tp = &tbuf[i];	update(tp, 0);}print(){	int i;	float ttime, t;	ttime = 0.0;	for (i=0; i<USIZE; i++) {		if(!among(i))			continue;		t = ubuf[i].utime;		if (t>0.0)			ttime =+ t;		if (pflag && ubuf[i].utime > 0.0) {			printf("\t%-8.8s%6.2f\n",			    ubuf[i].name, ubuf[i].utime/60.);		}	}	if (ttime > 0.0) {		pdate();		printf("\ttotal%9.2f\n", ttime/60.);	}}upall(f){	register struct tbuf *tp;	for (tp=tbuf; tp < &tbuf[TSIZE]; tp++)		update(tp, f);}update(tp, f)struct tbuf *tp;{	int i, j;	struct ubuf *up;	double t, t1;	if (f)		t = midnight;	else		t = ibuf.time;	if (tp->userp) {		t1 = t - tp->ttime;		if (t1>0.0 && t1 < 1.5*day)			tp->userp->utime =+ t1;	}	tp->ttime = t;	if (f)		return;	if (ibuf.name[0]=='\0') {		tp->userp = 0;		return;	}	for (up=ubuf; up < &ubuf[USIZE]; up++) {		if (up->name[0] == '\0')			break;		for (j=0; j<8 && up->name[j]==ibuf.name[j]; j++);		if (j>=8)			break;	}	for (j=0; j<8; j++)		up->name[j] = ibuf.name[j];	tp->userp = up;}among(i){	register j, k;	register char *p;	if (pcount==0)		return(1);	for (j=0; j<pcount; j++) {		p = pptr[j];		for (k=0; k<8; k++) {			if (*p == ubuf[i].name[k]) {				if (*p++ == '\0')					return(1);			} else				break;		}	}	return(0);}newday(){	if(midnight == 0.)		midnight = 240.;	while (midnight <= ibuf.time)		midnight =+ day;}pdate(){	register days, mons, yrs;	double year, tim;	if (byday==0)		return;	yrs = 2;	tim = 0.0;	for(;;) {		year = 365. * day;		if(yrs%4 == 0)			year =+ day;		if(tim+year > midnight)			break;		yrs++;		tim =+ year;	}	days = (midnight-tim-720.)/day;	montab[1] = 28;	if(yrs%4 == 0)		montab[1]++;	for (mons=0; montab[mons]<=days; mons++)		days =- montab[mons];	mons =% 12;	printf("%s %2d", monasc[mons], days+1);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -