AUSAM/source/S/pr.c

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

#
#include <local-system>
/*
 *   print file with headings
 *  2+head+2+page[PAGESIZE-10]+5
 *
 *	additional flags by dave h:
 *
 *	-f:		use form feed rather than new lines
 *			to take a new page (save time & space)
 *
 *	-pn:		page 1 is renumbered "n"
 *
 *	-b string:	specify a subtitle to be printed
 *			instead of blank line after title
 *
 *	also, funny flags are now ignored
 */ 

int ncol 1;
char *header;
int col;
int icol;
int file;
char *bufp;
int maxbufs;
int bufs;
extern end[];
char *buffer end;
#define	FF	014
int line;
char *colp[72];
int nofile;
char isclosed[10];
int peekc;
int fpage;
int page;
int colw;
int nspace;
int width 72;
int length PAGESIZE;	/* defined in local-system */ 
#define DEFMARGIN 10		/* default margin size */
int plength PAGESIZE-DEFMARGIN+5;
int margin DEFMARGIN;
int ntflg;
int mflg;
int tabc;
char *tty;
int mode;
int form;	/* daveh */ 
int pinit 1;	/* daveh */ 
char *subhdr "";	/* daveh */ 
extern long time();

struct inode
{
	int dev;
	int inum;
	int flags;
	char nlink;
	char uid;
	char gid;
	char siz0;
	int size;
	int ptr[8];
	long atime;
	long mtime;
};

main(argc, argv)
char **argv;
{
	int nfdone;
	int onintr();
	extern fout;


	tty = "/dev/ttyx";
	fout = dup(1);
	close(1);
	if((signal(2, 1)&01) == 0)
		signal(2, onintr);
	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 = getn(++*argv);
				continue;

			case 'w':
				width = getn(++*argv);
				continue;

			case 's':
				if(*++*argv)
					tabc = **argv;
				else
					tabc = '\t';
				continue;

			case 'm':
				mflg++;
				continue;

			case 'f':	/* daveh */ 
				form++;
				continue;

			case 'b':	/* daveh */ 
				if(argc >= 2)
				{
					subhdr = *++argv;
					argc--;
				}
				continue;

			case 'p':	/* daveh */ 
				pinit = getn(++*argv);
				continue;

			default:
				if(**argv >= '0' && **argv <= '9')
					ncol = getn(*argv);	/* daveh */ 
				continue;
			}
		}
		else if(**argv == '+')
		{
			fpage = getn(++*argv);
		}
		else
		{
			print(*argv, argv);
			nfdone++;
			if(mflg)
				break;
		}
	}
	if(nfdone == 0)
		print(0);
	flush();
	onintr();
}

onintr()
{

	chmod(tty, mode);
	exit(0);
}

fixtty()
{
	struct inode sbuf;
	extern fout;


	tty[8] = ttyn(fout);
	fstat(fout, &sbuf);
	mode = sbuf.flags&0777;
	chmod(tty, 0600);
}

print(fp, argp)
char *fp;
char **argp;
{
	struct inode sbuf;
	register int sncol, sheader;
	register char *cbuf;
	extern fout;


	if(ntflg)
		margin = 0;
	if(length <= margin)
		length = PAGESIZE;
	if(width <= 0)
		width = 72;
	if(ncol > width)
	{
		prints(2, "Too many columns.\n");
		exit(1);
	}
	bufs = length*width + 259*2;
	if( bufs > maxbufs )
	{
		/* allocate more space */
		if(brk(end + bufs) == -1)
		{
			perror("Buffer alloc");
			exit(1);
		}
		maxbufs = bufs;
	}
	if(mflg)
	{
		mopen(argp);
		ncol = nofile;
	}
	colw = width/ncol;
	width = colw * ncol;
	sncol = ncol;
	sheader = header;
	plength = length-5;
	if(ntflg)
		plength = length;
	if(--ncol < 0)
		ncol = 0;
	if(mflg)
		fp = 0;
	if(fp)
	{
		file = open(fp, 0);
		if(file == -1)
		{
			perror(fp);
			return;
		}
		fstat(file, &sbuf);
	}
	else
	{
		file = 0;
		sbuf.mtime = time();
	}
	if(header == 0)
		header = fp;
	cbuf = ctime(sbuf.mtime);
	cbuf[16] = '\0';
	cbuf[24] = '\0';
	page = pinit;	/* daveh */ 
	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)
		{
			puts(" \n\n");
			puts(cbuf+4);
			puts(" ");
			puts(cbuf+20);
			puts("  ");
			puts(header);
			puts(" Page ");
			putd(page);
			puts("\n");
			puts(subhdr);
			puts("\n\n");	/* daveh */ 
		}
		putpage();
		if(ntflg == 0 && form == 0)	/* daveh */ 
			while(line < length)
				put('\n');
		if(form)
			putcp(FF);	/* prdl */ 
		page++;
	}
	if(file)
		close(file);
	ncol = sncol;
	header = sheader;
}

mopen(ap)
char **ap;
{
	register char **p, *p1;


	p = ap;
	while((p1 = *p++) && p1 != -1)
	{
		isclosed[nofile] = fopen(p1, &buffer[2*259*nofile]);
		if(isclosed[nofile] == -1)
		{
			perror(p1);
			nofile--;
		}
		if(++nofile >= 10)
		{
			write(2, "Too many args.\n", 15);
			exit(1);
		}
	}
}

putpage()
{
	register int lastcol, i, c;
	int j;


	if(ncol == 0)
	{
		while(line < plength)
		{
			while((c = tpgetc(0)) && c != '\n' && c != FF)
				putcp(c);
			if(c == 0 && form)
				return;	/* prdl */ 
			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 && ntflg)
				return;
			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((n = read(file, rbufp, n)) <= 0)
		*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(&buffer[2*259*i])) < 0)
		{
			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);
}

puts(as)
char *as;
{
	register int c;
	register char *s;


	if((s = as) == 0)
		return;
	while(c = *s++)
		put(c);
}

putd(an)
{
	register int a, n;


	n = an;
	if(a = n/10)
		putd(a);
	put(n%10+'0');
}

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);
}

getn(ap)
char *ap;
{
	register int n, c;
	register char *p;


	p = ap;
	n = 0;
	while((c = *p++) >= '0' && c <= '9')
		n = n*10+c-'0';
	return(n);
}

putcp(c)
{
	if(page >= fpage)
		putchar(c);
}