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

📄 pr.c

📁 unix v7是最后一个广泛发布的研究型UNIX版本
💻 C
字号:
/* *   print file with headings *  2+head+2+page[56]+5 */#include <stdio.h>#include <signal.h>#include <sys/types.h>#include <sys/stat.h>int	ncol	= 1;char	*header;int	col;int	icol;FILE	*file;char	*bufp;#define	BUFS	6720char	buffer[BUFS];	/* for multi-column output */char	obuf[BUFSIZ];#define	FF	014int	line;char	*colp[72];int	nofile;char	isclosed[10];FILE	*ifile[10];char	**lastarg;int	peekc;int	fpage;int	page;int	colw;int	nspace;int	width	= 72;int	length	= 66;int	plength = 61;int	margin	= 10;int	ntflg;int	mflg;int	tabc;char	*tty;int	mode;char	*ttyname();char	*ctime();main(argc, argv)char **argv;{	int nfdone;	int onintr();	setbuf(stdout, obuf);	if (signal(SIGINT, SIG_IGN) != SIG_IGN)		signal(SIGINT, onintr);	lastarg = &argv[argc-1];	fixtty();	for (nfdone=0; argc>1; argc--) {		argv++;		if (**argv == '-') {			switch (*++*argv) {			case 'h':				if (argc>=2) {					header = *++argv;					argc--;				}				continue;			case 't':				ntflg++;				continue;			case 'l':				length = atoi(++*argv);				continue;			case 'w':				width = atoi(++*argv);				continue;			case 's':				if (*++*argv)					tabc = **argv;				else					tabc = '\t';				continue;			case 'm':				mflg++;				continue;			default:				ncol = atoi(*argv);				continue;			}		} else if (**argv == '+') {			fpage = atoi(++*argv);		} else {			print(*argv, argv);			nfdone++;			if (mflg)				break;		}	}	if (nfdone==0)		print((char *)0, (char **)0);	done();}done(){	if (tty)		chmod(tty, mode);	exit(0);}onintr(){	if (tty)		chmod(tty, mode);	_exit(1);}fixtty(){	struct stat sbuf;	tty = ttyname(1);	if (tty == 0)		return;	stat(tty, &sbuf);	mode = sbuf.st_mode&0777;	chmod(tty, 0600);}print(fp, argp)char *fp;char **argp;{	extern char *sprintf();	struct stat sbuf;	register sncol;	register char *sheader;	register char *cbuf;	char linebuf[150], *cp;	if (ntflg)		margin = 0;	else		margin = 10;	if (length <= margin)		length = 66;	if (width <= 0)		width = 72;	if (ncol>72 || ncol>width) {		fprintf(stderr, "pr: No room for columns.\n");		done();	}	if (mflg) {		mopen(argp);		ncol = nofile;	}	colw = width/ncol;	sncol = ncol;	sheader = header;	plength = length-5;	if (ntflg)		plength = length;	if (--ncol<0)		ncol = 0;	if (mflg)		fp = 0;	if (fp) {		if((file=fopen(fp, "r"))==NULL) {			if (tty==NULL)				fprintf(stderr, "pr: can't open %s\n", fp);			ncol = sncol;			header = sheader;			return;		}		stat(fp, &sbuf);	} else {		file = stdin;		time(&sbuf.st_mtime);	}	if (header == 0)		header = fp?fp:"";	cbuf = ctime(&sbuf.st_mtime);	cbuf[16] = '\0';	cbuf[24] = '\0';	page = 1;	icol = 0;	colp[ncol] = bufp = buffer;	if (mflg==0)		nexbuf();	while (mflg&&nofile || (!mflg)&&tpgetc(ncol)>0) {		if (mflg==0) {			colp[ncol]--;			if (colp[ncol] < buffer)				colp[ncol] = &buffer[BUFS];		}		line = 0;		if (ntflg==0) {			sprintf(linebuf, "\n\n%s %s  %s Page %d\n\n\n",				cbuf+4, cbuf+20, header, page);			for(cp=linebuf;*cp;) put(*cp++);		}		putpage();		if (ntflg==0)			while(line<length)				put('\n');		page++;	}	fclose(file);	ncol = sncol;	header = sheader;}mopen(ap)char **ap;{	register char **p, *p1;	p = ap;	while((p1 = *p) && p++ <= lastarg) {		if((ifile[nofile]=fopen(p1, "r")) == NULL){			isclosed[nofile] = 1;			nofile--;		}		else			isclosed[nofile] = 0;		if(++nofile>=10) {			fprintf(stderr, "pr: Too many args\n");			done();		}	}}putpage(){	register int lastcol, i, c;	int j;	if (ncol==0) {		while (line<plength) {			while((c = tpgetc(0)) && c!='\n' && c!=FF)				putcp(c);			putcp('\n');			line++;			if (c==FF)				break;		}		return;	}	colp[0] = colp[ncol];	if (mflg==0) for (i=1; i<=ncol; i++) {		colp[i] = colp[i-1];		for (j = margin; j<length; j++)			while((c=tpgetc(i))!='\n')				if (c==0)					break;	}	while (line<plength) {		lastcol = colw;		for (i=0; i<ncol; i++) {			while ((c=pgetc(i)) && c!='\n')				if (col<lastcol || tabc!=0)					put(c);			if (c==0)				continue;			if (tabc)				put(tabc);			else while (col<lastcol)				put(' ');			lastcol += colw;		}		while ((c = pgetc(ncol)) && c!='\n')			put(c);		put('\n');	}}nexbuf(){	register int n;	register char *rbufp;	rbufp = bufp;	n = &buffer[BUFS] - rbufp;	if (n>512)		n = 512;	if(feof(file) ||	   (n=fread(rbufp,1,n,file)) <= 0){		fclose(file);		*rbufp = 0376;	}	else {		rbufp += n;		if (rbufp >= &buffer[BUFS])			rbufp = buffer;		*rbufp = 0375;	}	bufp = rbufp;}tpgetc(ai){	register char **p;	register int c, i;	i = ai;	if (mflg) {		if((c=getc(ifile[i])) == EOF) {			if (isclosed[i]==0) {				isclosed[i] = 1;				if (--nofile <= 0)					return(0);			}			return('\n');		}		if (c==FF && ncol>0)			c = '\n';		return(c);	}loop:	c = **(p = &colp[i]) & 0377;	if (c == 0375) {		nexbuf();		c = **p & 0377;	}	if (c == 0376)		return(0);	(*p)++;	if (*p >= &buffer[BUFS])		*p = buffer;	if (c==0)		goto loop;	return(c);}pgetc(i){	register int c;	if (peekc) {		c = peekc;		peekc = 0;	} else		c = tpgetc(i);	if (tabc)		return(c);	switch (c) {	case '\t':		icol++;		if ((icol&07) != 0)			peekc = '\t';		return(' ');	case '\n':		icol = 0;		break;	case 010:	case 033:		icol--;		break;	}	if (c >= ' ')		icol++;	return(c);}put(ac){	register int ns, c;	c = ac;	if (tabc) {		putcp(c);		if (c=='\n')			line++;		return;	}	switch (c) {	case ' ':		nspace++;		col++;		return;	case '\n':		col = 0;		nspace = 0;		line++;		break;	case 010:	case 033:		if (--col<0)			col = 0;		if (--nspace<0)			nspace = 0;	}	while(nspace) {		if (nspace>2 && col > (ns=((col-nspace)|07))) {			nspace = col-ns-1;			putcp('\t');		} else {			nspace--;			putcp(' ');		}	}	if (c >= ' ')		col++;	putcp(c);}putcp(c){	if (page >= fpage)		putchar(c);}

⌨️ 快捷键说明

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