32V/usr/src/cmd/pg.c

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

#include <stdio.h>

#define NL '\n'
#define CLEAR 014
#define HOME 031
#define BACK 037
#define BUFMAX 16384
#define PAGMAX 64

int file;
int cp, hp;
int page[PAGMAX];
int eof;

char buf[BUFMAX];
int bptr, bnxt, bend;


#define incr(a,b) (a++, a&=b-1)
#define decr(a,b) (a--, a&=b-1)


main(argc,argv)
char *argv[];
{
	int n=1;
	if(argc<2)
		print();
	else {
		while(argv[n]!=-1) {
			if((file=open(argv[n],0))>=0) {
				print();
				close(file);
			} else	printf("dk: `%s' cannot open\n",argv[n]);
			n++;
		}
	}
}

print()
{
	register int nlc;
	char buf[2];

	hp=0; cp=0;
	bptr=bnxt=bend=0;
	putchar(CLEAR);
	for(;;) {
		setpage();
		nlc=0;
		putchar(BACK);
		while(nlc<20) {
			char c;
			c = readchar();
			if(eof)
				return;
			if(c==NL) nlc++;
			putchar(c);
		}
		while(read(2,buf,1)==1 && buf[0]!=NL) {
			switch(buf[0]) {
				case '/':
				case HOME:
					putchar(CLEAR);
					getpage(0);
					break;
				case '-':
				case BACK:
					getpage(-1);
					putchar(CLEAR);
					break;
				case '!':
					shell(); buf[0]=NL; break;
			}
		}
	}
}


#include <signal.h>
#define EOR '\n'
shell()
{
	int rc, status, unixpid;
	if( (unixpid=fork())==0 ) {
		close(0); dup(2);
		execl("/bin/sh", "sh", "-t", 0);
		exit(255);
	}
	else if(unixpid == -1)
		return(0);
	else{	signal(SIGINT,SIG_IGN); signal(SIGQUIT,SIG_IGN);
		while( (rc = wait(&status)) != unixpid && rc != -1 ) ;
		signal(SIGINT,SIG_DFL); signal(SIGQUIT,SIG_DFL);
		return(1);
	}
}

readchar()
{
	register char c;
	if(bnxt==bend)
		fillbuf();
	if(eof)
		return(-1);
	c=buf[bnxt];
	incr(bnxt,BUFMAX);
	return(c);
}

fillbuf()
{
	register int r;
	register int len;
	ensure();
	if(eof)
		return;
	r=read(file,&buf[bend],512);
	if(r==-1)
		return;
	bend += r; bend &= BUFMAX-1;
	if(r==0)
		eof++;
	return;
}

ensure()
{
	for(;;) {
		if(bptr<=bend)
			return(BUFMAX-bend-1);
		if(bptr-bend>=512)
			return(512);
		losepage();
	}
}

losepage()
{
	if(hp<cp)
		bptr=page[incr(hp,PAGMAX)];
}

setpage()
{
	incr(cp,PAGMAX);
	if(cp==hp)
		incr(hp,PAGMAX);
	page[cp]=bnxt;
}

getpage(i)
{
	if(i==0)
		cp=hp;
	else	if(cp!=hp)
			decr(cp,PAGMAX);
	bnxt=page[cp];
}