home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Simtel MSDOS 1992 September
/
Simtel20_Sept92.cdr
/
msdos
/
printer
/
proff.arc
/
PROFF.C
< prev
next >
Wrap
Text File
|
1988-02-13
|
9KB
|
312 lines
char *version = "v.1.1";
#include <stdio.h>
#include <ctype.h>
#include "debug.h"
#include "defs.h"
#include "lookup.h"
/*
* G L O B A L S
*
*/
#ifndef vms
#define globaldef
#endif
/* next available char; init = 0 */
globaldef int bp = -1;
/* pushed-back characters */
globaldef char buf[BUFSIZE];
/* stack of file descriptors */
globaldef FILE *infile[NFILES];
/* current file is infile[level] */
globaldef int level;
/* stack of output file descriptors */
globaldef FILE *outfile[NFILES];
/* current output is outfile[olevel]; */
globaldef int olevel;
/* current output file pointer */
globaldef FILE *poutput;
/* number registers a..z */
globaldef int nr[26] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
/* system registers a..z */
globaldef int sr[26] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
/* last char position in outbuf; init = 0 */
globaldef int outp = 0;
/* width of text currently in outbuf; init = 0 */
globaldef int outw = 0;
/* number of words in outbuf; init = 0 */
globaldef int outwds = 0;
/* lines to be filled collect here */
globaldef char outbuf[MAXOUT];
/* word in outbuf; init=0 */
/* current output page number; init = 0 */
globaldef int curpag = 0;
/* next output page number; init = 1 */
globaldef int newpag = 1;
/* next line to be printed; init = 0 */
globaldef int lineno = 0;
/* page length in lines; init = PAGELEN = 66 */
globaldef int plval = PAGELEN;
/* page length save area */
globaldef int savpl = PAGELEN;
/* margin before and including header */
globaldef int m1val = 3;
/* margin after header */
globaldef int m2val = 2;
/* margin after last text line */
globaldef int m3val = 2;
/* bottom margin, including footer */
globaldef int m4val = 3;
/* last live line on page, = plval-m3val-m4val */
globaldef int bottom = PAGELEN - 5;
/* top of page title for even pages;init=NEWLINE */
globaldef char ehead[MAXLINE];
/* top of page title for odd pages;init=NEWLINE */
globaldef char ohead[MAXLINE];
/* left,right margins for even header;init=inval,rmval */
globaldef int ehlim[2] = { 0, PAGEWIDTH };
/* left,right margins for odd header;init=inval,rmval */
globaldef int ohlim[2] = { 0, PAGEWIDTH };
/* bot of page title for even pages;init=NEWLINE */
globaldef char efoot[MAXLINE];
/* bot of page title for odd pages;init=NEWLINE */
globaldef char ofoot[MAXLINE];
/* left,right margins for even footer;init=inval,rmval */
globaldef int eflim[2] = { 0, PAGEWIDTH };
/* left,right margins for odd footer;init=inval,rmval */
globaldef int oflim[2] = { 0, PAGEWIDTH };
/* flag for pausing between pages */
globaldef int stopx = 0;
/* first page to begin printing with */
globaldef int frstpg = 0;
/* last page to be printed */
globaldef int lastpg = HUGE;
/* flag to indicate whether page should be printed */
globaldef int print = YES;
/* number of blanks to offset page by; init = 0 */
globaldef int offset = 0;
/* verbose option; init = NO */
globaldef int verbose = NO;
/* bolding option; init = YES; */
globaldef char bolding = YES;
/* fill if YES; init = YES */
globaldef int fill = YES;
/* current line spacing; init = 1 */
globaldef int lsval = 1;
/* current indent; >= 0; init = 0 */
globaldef int inval = 0;
/* current right margin; init = PAGEWIDTH = 60 */
globaldef int rmval = PAGEWIDTH;
/* current temporary indent; init = 0 */
globaldef int tival = 0;
/* number of lines to center; init = 0 */
globaldef int ceval = 0;
/* flag for continuous center */
globaldef char CEon = FALSE;
/* number of lines to underline; init = 0 */
globaldef int ulval = 0;
/* flag for continuous underline */
globaldef char ULon = FALSE;
/* number of lines to boldface; init = 0 */
globaldef int boval = 0;
/* flag for continuous bolding */
globaldef char BDon = FALSE;
/* justification types for heads and foots; */
/* init = LEFT, CENTER, RIGHT */
globaldef int tjust[3] = { LEFT, CENTER, RIGHT };
/* number of lines to blank suppress; init=0 */
globaldef int bsval = 0;
/* right justify filled lines if YES; init=YES */
globaldef int rjust = YES;
/* tab stops; init every 8 spaces */
globaldef int tabs[INSIZE];
/* line control character; init = PERIOD */
globaldef char cchar = '.';
/* universal escape - init = UNDERBAR */
globaldef char genesc = '_';
/* character used to underline a BLANK; init = BLANK */
globaldef char ulblnk = ' ';
/* scratch arrays for use by various routines */
globaldef char tbuf1[MAXLINE];
globaldef char tbuf2[MAXLINE];
globaldef char tbuf3[MAXLINE];
globaldef char ttl[MAXLINE];
/* flag to process runoff symbols only */
globaldef char onlyrunoff = NO;
/* Flag to turn paging off */
globaldef char paging = YES;
/* page number in roman numerals. Init = NO */
globaldef char roman = NO;
/* autopar flag. Init = NO */
globaldef char autopar = NO;
/* temporary indent value for autopar */
globaldef int autoprv = 5;
/* hash tables for macros and variables */
globaldef struct hashlist *macrotab[HASHMAX];
globaldef struct hashlist *gentab[HASHMAX];
/* linked list entries for contents */
globaldef struct clist *chead = NULL;
globaldef struct clist *clast = NULL;
/* keep track of what is done - VERBOSE */
globaldef int p_txtlines = 0;
globaldef int p_outlines = 0;
globaldef int p_outpages = 0;
globaldef int p_memoryus = 0;
/*
* M A I N L I N E OF P R O F F
*
*/
main(argc,argv)
int argc;
char *argv[];
{
int i,j,val,type;
char *p,c;
FILE *fp;
for (i = 1; i < argc; i++) {
p = argv[i];
if (*p == '-') {
++p;
if (isalpha(*p)) {
c = *p++;
switch(c) {
/* verbose stats */ case 'v':
case 'V':
verbose = TRUE;
break;
/* runoff only */ case 'r':
case 'R':
onlyrunoff = TRUE;
break;
/* stop for page */ case 's':
case 'S':
stopx = 1;
break;
/* page offset */ case 'p':
case 'P':
if (*p == 'o' || *p == 'O') {
p++;
j = 0;
val = getval(p, &j, &type);
set(&offset, val, type, 0, 0,
rmval - 1);
}
else
usage();
break;
/* include file */ case 'i':
case 'I': /* simulate .so <filename> */
pbstr("\n");
pbstr(p);
pbstr(".so ");
break;
/* disable some */ case 'd':
case 'D':
switch (*p) {
case 'b':
case 'B':
bolding = NO;
break;
case 'p':
case 'P':
paging = NO;
break;
default:
break;
}
break;
/* garbage */ default:
usage();
}
}
else
lastpg = atoi(p);
}
else if (*p == '+') {
p++;
if ((frstpg = atoi(p)) == 0)
usage();
}
else
break;
}
if (i == argc)
usage();
if ((fp = fopen(argv[i], "r")) == NULL) {
fprintf(stderr, "%s: cannot open.\n",argv[i]);
exit(1);
}
if ((p = argv[++i]) != 0) {
if ((outfile[0] = fopen(p, "w")) == NULL) {
fprintf(stderr,"%s: cannot create.\n\n", p);
exit(1);
}
}
else
outfile[0] = stdout;
/* set output file level */
olevel = 0;
poutput = outfile[0];
/*
* some minor initialisation
*/
for (i = 0; i < INSIZE; i++)
if (i % 8 == 0)
tabs[i] = YES;
else
tabs[i] = NO;
ehead[0] = '\n';
ehead[1] = EOS;
ohead[0] = '\n';
ohead[1] = EOS;
efoot[0] = '\n';
efoot[1] = EOS;
ofoot[0] = '\n';
ofoot[1] = EOS;
/* initialise contents linked list */
chead = (struct clist *) malloc(sizeof(struct clist));
clast = chead;
p_memoryus += sizeof(struct clist);
doroff(fp);
lbrk();
if (plval <= 100 && (lineno > 0 | outp > 0))
space(HUGE);
putchar('\n');
if(verbose) {
fprintf(stderr,"proff read in %6d textlines to produce\n",
p_txtlines);
fprintf(stderr," %6d lines\n",
p_outlines);
fprintf(stderr," %6d pages of formatted text.\n",
p_outpages);
fprintf(stderr,"\n%d bytes of memory was required\n",
p_memoryus);
fprintf(stderr,"for internal tables and lists.\n");
}
#ifdef vms
exit(1);
#else
exit(0);
#endif
}