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

📄 vpsf.c

📁 操作系统SunOS 4.1.3版本的源码
💻 C
字号:
/* * Copyright (c) 1983 Regents of the University of California. * All rights reserved.  The Berkeley software License Agreement * specifies the terms and conditions for redistribution. */#ifndef lintstatic char sccsid[] = "@(#)vpsf.c 1.1 92/07/30 SMI"; /* from UCB 5.1 5/15/85 */#endif not lint/* * Versatec printer filter * 	make wide listings by placing pages side by side */#include <stdio.h>#include <sys/vcmd.h>#define	LINELN 440#define	PAGELN  86#define	LMARG   10int	pltmode[] = {VPLOT};int	prtmode[] = {VPRINT};char	screen[PAGELN][LINELN];char	ul[PAGELN][LINELN];char	anyul[PAGELN];int	origin;		/* first column of a page */int	origin_ind;	/* origin plus indent */int	outline;	/* current line number */int	outcol;		/* current column number */int	npages;int	width = 106;	/* default page width */int	length = 86;	/* default page length */int	indent = 0;	/* default indent */int	literal;char	*name;		/* user's login name */char	*host;		/* user's machine name */char	*acctfile;	/* accounting information file */main(argc, argv)	int argc;	char *argv[];{	register int i;	while (--argc) {		if (*(*++argv) == '-') {			switch (argv[0][1]) {			case 'n':				argc--;				name = *++argv;				break;			case 'h':				argc--;				host = *++argv;				break;			case 'w':				if ((i = atoi(&argv[0][2])) > 0 && i <= LINELN)					width = i;				break;			case 'l':				if ((i = atoi(&argv[0][2])) > 0 && i <= PAGELN)					length = i;				break;			case 'i':				if ((i = atoi(&argv[0][2])) >= 0 &&				    i < LINELN - 1)					indent = i;				break;			case 'c':	/* Print input without throwing away					   control chars and without putting					   in page breaks. */				literal++;				break;			}		} else			acctfile = *argv;	}	indent += literal ? 1 : LMARG;	if (indent >= width)		indent = width - 1;	/*	 * input file is open on file descriptor 0.	 * vp should be open on file descriptor 1.	 * The error log file is open on file descriptor 2.	 */	ioctl(1, VSETSTATE, prtmode);	process();	/*	 * Put out an extra null to ensure versatec will get an even	 * number of good characters.	 */	putchar('\0');	if (ferror(stdout))		exit(1);	if (name && acctfile && access(acctfile, 02) >= 0 &&	    freopen(acctfile, "a", stdout) != NULL) {		if (host)			printf("%7.2f\t%s:%s\n", (float)npages, host, name);		else			printf("%7.2f\t%s\n", (float)npages, name);	}	exit(0);	/* NOTREACHED */}set_up(){	clear(screen, sizeof(screen));	origin = 0;	origin_ind = outcol = origin + indent;	outline = 0;	cutmark(origin);}process(){	register int c;	set_up();	while ((c = getchar()) != EOF)		switch (c) {		case ' ':			outcol++;			break;		case '\t':			outcol = ((outcol - origin_ind) | 07) + origin_ind + 1;			break;		case '\b':			if (outcol > origin_ind)				outcol--;			break;		case '\r':			outcol = origin_ind;			break;		case '\f':			outline = length;			/* fall into ... */		case '\n':			if (++outline >= length) {				origin += width + 1; 				origin_ind += width + 1;				cutmark(origin);				if (origin + width + 1 >= LINELN) {					oflush();					break;				}				outline = 0;			}			outcol = origin_ind;			break;		default:			outchar(c);			break;		}	if (outline || origin) {		cutmark(origin + width + 1);		oflush();	}	printf("\n\n\n\n\n");}outchar(c)	register int c;{	register char *cp;	register int d;	if (!literal && (c < 040 || c >= 0177))		return;	if (outcol >= origin + width + 1) {		outcol++;		return;	}	cp = &screen[outline][outcol];	d = *cp;	if (d != ' ') {		if (d == '_' || c == '_') {			if (c == d) {				outcol++;				return;			}			if (anyul[outline] == 0)				clear(ul[outline], LINELN);			anyul[outline] = 1;			ul[outline][outcol] = 0377;			if (c == '_')				c = d;		}	}	*cp = c;	outcol++;}oflush(){	register char *cp, *dp;	register int i, j, oc, dc, c;	npages++;	putchar('\n');	for (i = 0; i < length; i++)		putline(i);	for (i = 0; i < LINELN; i++)		putchar('_');	putchar('\n');	set_up();}clear(cp, i)	register char *cp;	register int i;{	if (i > 0)		do			*cp++ = ' ';		while (--i);}cutmark(o)	register int o;{	register int i;	screen[0][o] = '|';	screen[1][o] = '|';	screen[length - 1][o] = '|';	screen[length - 2][o] = '|';}putline(n)	register int n;{	register char *cp;	register int j;	fwrite(screen[n], sizeof(char), sizeof(screen[0]), stdout);	if (anyul[n]) {		putchar('\n');		putchar('\0');		fflush(stdout);		ioctl(1, VSETSTATE, pltmode);		cp = ul[n];		j = LINELN;		do {			putchar(*cp & 0377);			putchar(*cp++ & 0377);		} while (--j);		fflush(stdout);		ioctl(1, VSETSTATE, prtmode);	} else		putchar('\n');	if (ferror(stdout))		exit(1);}

⌨️ 快捷键说明

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