AUSAM/source/S/pr.c
#
#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);
}