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

📄 tail.c

📁 unix v7是最后一个广泛发布的研究型UNIX版本
💻 C
字号:
/* tail command  * *	tail where [file] *	where is +_n[type] *	- means n lines before end *	+ means nth line from beginning *	type 'b' means tail n blocks, not lines *	type 'c' means tail n characters *	Type 'r' means in lines in reverse order from end *	 (for -r, default is entire buffer )*/#include	<sys/types.h>#include	<sys/stat.h>#include	<errno.h>#define LBIN 4097struct	stat	statb;char bin[LBIN];int errno;main(argc,argv)char **argv;{	long n,di;	register i,j,k;	char *p;	int partial,piped,bylines,bkwds,fromend,lastnl;	char *arg;	lseek(0,(long)0,1);	piped = errno==ESPIPE;	arg = argv[1];	if(argc<=1 || *arg!='-'&&*arg!='+') {		arg = "-10l";		argc++;		argv--;	}	fromend = *arg=='-';	arg++;	n = 0;	while(digit(*arg))		n = n*10 + *arg++ - '0';	if(!fromend&&n>0)		n--;	if(argc>2) {		close(0);		if(open(argv[2],0)!=0) {			write(2,"tail: can't open ",17);			write(2,argv[2],strlen(argv[2]));			write(2,"\n",1);			exit(1);		}	}	bylines = 0; bkwds = 0;	switch(*arg) {	case 'b':		n <<= 9;		break;	case 'c':		break;	case 'r':		if(n==0) n = LBIN;		bkwds = 1; fromend = 1; bylines = 1;		break;	case '\0':	case 'l':		bylines = 1;		break;	default:		goto errcom;	}	if(fromend)		goto keep;			/*seek from beginning */	if(bylines) {		j = 0;		while(n-->0) {			do {				if(j--<=0) {					p = bin;					j = read(0,p,512);					if(j--<=0) exit(0);				}			} while(*p++ != '\n');		}		write(1,p,j);	} else  if(n>0) {		if(!piped)			fstat(0,&statb);		if(piped||(statb.st_mode&S_IFMT)==S_IFCHR)			while(n>0) {				i = n>512?512:n;				i = read(0,bin,i);				if(i<=0) exit(0);				n -= i;			}		else			lseek(0,n,0);	}copy:	while((i=read(0,bin,512))>0)		write(1,bin,i);	exit(0);			/*seek from end*/keep:	if(n<=0) exit(0);	if(!piped) {		fstat(0,&statb);		di = !bylines? n: LBIN-1;		if(statb.st_size > di)			lseek(0,-di,2);		if(!bylines)			goto copy;	}	partial = 1;	for(;;) {		i = 0;		do {			j = read(0,&bin[i],LBIN-i);			if(j<=0)				goto brka;			i += j;		} while(i<LBIN);		partial = 0;	}brka:	if(!bylines) {		k =		    n<=i ? i-n:		    partial ? 0:		    n>=LBIN ? i+1:		    i-n+LBIN;		k--;	} else {		if(bkwds && bin[i==0?LBIN-1:i-1]!='\n'){	/* force trailing newline */			bin[i]='\n';			if(++i>=LBIN) {i = 0; partial = 0;}		}		k = i;		j = 0;		do {			lastnl = k;			do {				if(--k<0) {					if(partial) {						if(bkwds) write(1,bin,lastnl+1);						goto brkb;					}					k = LBIN -1;				}			} while(bin[k]!='\n'&&k!=i);			if(bkwds && j>0){				if(k<lastnl) write(1,&bin[k+1],lastnl-k);				else {					write(1,&bin[k+1],LBIN-k-1);					write(1,bin,lastnl+1);				}			}		} while(j++<n&&k!=i);brkb:		if(bkwds) exit(0);		if(k==i) do {			if(++k>=LBIN)				k = 0;		} while(bin[k]!='\n'&&k!=i);	}	if(k<i)		write(1,&bin[k+1],i-k-1);	else {		write(1,&bin[k+1],LBIN-k-1);		write(1,bin,i);	}	exit(0);errcom:	write(2,"usage: tail +_n[lbcr] [file]\n",30);	exit(1);}digit(c){	return(c>='0'&&c<='9');}

⌨️ 快捷键说明

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