Relay-Version: version B 2.10 5/3/83; site utzoo.UUCP Posting-Version: version B 2.10.2 9/5/84; site yetti.UUCP Path: utzoo!utcs!mnetor!yetti!oz From: oz@yetti.UUCP (Ozan Yigit) Newsgroups: net.sources Subject: PROFF - Portable ROFF (2 of 5) Message-ID: <299@yetti.UUCP> Date: Mon, 13-Jan-86 23:59:06 EST Article-I.D.: yetti.299 Posted: Mon Jan 13 23:59:06 1986 Date-Received: Tue, 14-Jan-86 08:46:23 EST Reply-To: oz@yetti.UUCP (Ozan Yigit) Organization: York University Computer Science Lines: 2012 #!/bin/sh # This is a shell archive, meaning: # 1. Remove everything above the #!/bin/sh line. # 2. Save the resulting text in a file. # 3. Execute the file with /bin/sh (not csh) to create the files: # pinit.c # proff.c # proff.h # proff.pro # proff01.c # proff02.c # proffsym.new # This archive created: Mon Jan 13 23:54:09 1986 export PATH; PATH=/bin:$PATH echo shar: extracting "'pinit.c'" '(1236 characters)' if test -f 'pinit.c' then echo shar: over-writing existing file "'pinit.c'" fi sed 's/^X//' << \SHAR_EOF > 'pinit.c' X X X X X#include X#include X#include "proff.h" X#include "debug.h" X X/* X * finit - initialise parameters, set default values X * used by .reset command X * X */ Xfinit() X{ X int i; X X inval = 0; X rmval = PAGEWIDTH; X tival = 0; X lsval = 1; X fill = YES; X ceval = 0; X ulval = 0; X boval = 0; X cchar = '.'; X genesc = '_'; X tjust[0] = LEFT; X tjust[1] = CENTER; X tjust[2] = RIGHT; X bsval = 0; X rjust = YES; X ulblnk = BLANK; X X for (i = 0; i < INSIZE; i++) X if (i % 8 == 0) X tabs[i] = YES; X else X tabs[i] = NO; X X lineno = 0; X curpag = 0; X newpag = 1; X plval = PAGELEN; X m1val = 3; X m2val = 2; X m3val = 2; X m4val = 3; X bottom = plval - m3val - m4val; X ehead[0] = '\n'; X ehead[1] = EOS; X ohead[0] = '\n'; X ohead[1] = EOS; X efoot[0] = '\n'; X efoot[1] = EOS; X ofoot[0] = '\n'; X ofoot[1] = EOS; X ehlim[0] = inval; X ehlim[1] = rmval; X ohlim[0] = inval; X ohlim[1] = rmval; X eflim[0] = inval; X eflim[1] = rmval; X oflim[0] = inval; X oflim[1] = rmval; X verbose = NO; X stopx = 0; X frstpg = 0; X lastpg = HUGE; X print = YES; X offset = 0; X outp = 0; X outw = 0; X outwds = 0; X bp = -1; X for (i = 0; i < 26; i++) X nr[i] = 0; X X CEon = FALSE; X ULon = FALSE; X BDon = FALSE; X X onlyrunoff = FALSE; X roman = FALSE; X bolding = YES; X autopar = NO; X} X SHAR_EOF if test 1236 -ne "`wc -c 'pinit.c'`" then echo shar: error transmitting "'pinit.c'" '(should have been 1236 characters)' fi echo shar: extracting "'proff.c'" '(9150 characters)' if test -f 'proff.c' then echo shar: over-writing existing file "'proff.c'" fi sed 's/^X//' << \SHAR_EOF > 'proff.c' X X X Xchar *version = "v.1.1"; X X#include X#include X#include "debug.h" X#include "defs.h" X#include "lookup.h" X X X/* X * G L O B A L S X * X */ X#ifndef vms X#define globaldef X#endif X X /* next available char; init = 0 */ Xglobaldef int bp = -1; X /* pushed-back characters */ Xglobaldef char buf[BUFSIZE]; X /* stack of file descriptors */ Xglobaldef FILE *infile[NFILES]; X /* current file is infile[level] */ Xglobaldef int level; X /* stack of output file descriptors */ Xglobaldef FILE *outfile[NFILES]; X /* current output is outfile[olevel]; */ Xglobaldef int olevel; X /* current output file pointer */ Xglobaldef FILE *poutput; X /* number registers a..z */ Xglobaldef int nr[26] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, X 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; X /* system registers a..z */ Xglobaldef int sr[26] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, X 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; X /* last char position in outbuf; init = 0 */ Xglobaldef int outp = 0; X /* width of text currently in outbuf; init = 0 */ Xglobaldef int outw = 0; X /* number of words in outbuf; init = 0 */ Xglobaldef int outwds = 0; X /* lines to be filled collect here */ Xglobaldef char outbuf[MAXOUT]; X /* word in outbuf; init=0 */ X /* current output page number; init = 0 */ Xglobaldef int curpag = 0; X /* next output page number; init = 1 */ Xglobaldef int newpag = 1; X /* next line to be printed; init = 0 */ Xglobaldef int lineno = 0; X /* page length in lines; init = PAGELEN = 66 */ Xglobaldef int plval = PAGELEN; X /* page length save area */ Xglobaldef int savpl = PAGELEN; X /* margin before and including header */ Xglobaldef int m1val = 3; X /* margin after header */ Xglobaldef int m2val = 2; X /* margin after last text line */ Xglobaldef int m3val = 2; X /* bottom margin, including footer */ Xglobaldef int m4val = 3; X /* last live line on page, = plval-m3val-m4val */ Xglobaldef int bottom = PAGELEN - 5; X /* top of page title for even pages;init=NEWLINE */ Xglobaldef char ehead[MAXLINE]; X /* top of page title for odd pages;init=NEWLINE */ Xglobaldef char ohead[MAXLINE]; X /* left,right margins for even header;init=inval,rmval */ Xglobaldef int ehlim[2] = { 0, PAGEWIDTH }; X /* left,right margins for odd header;init=inval,rmval */ Xglobaldef int ohlim[2] = { 0, PAGEWIDTH }; X /* bot of page title for even pages;init=NEWLINE */ Xglobaldef char efoot[MAXLINE]; X /* bot of page title for odd pages;init=NEWLINE */ Xglobaldef char ofoot[MAXLINE]; X /* left,right margins for even footer;init=inval,rmval */ Xglobaldef int eflim[2] = { 0, PAGEWIDTH }; X /* left,right margins for odd footer;init=inval,rmval */ Xglobaldef int oflim[2] = { 0, PAGEWIDTH }; X /* flag for pausing between pages */ Xglobaldef int stopx = 0; X /* first page to begin printing with */ Xglobaldef int frstpg = 0; X /* last page to be printed */ Xglobaldef int lastpg = HUGE; X /* flag to indicate whether page should be printed */ Xglobaldef int print = YES; X /* number of blanks to offset page by; init = 0 */ Xglobaldef int offset = 0; X /* verbose option; init = NO */ Xglobaldef int verbose = NO; X /* bolding option; init = YES; */ Xglobaldef char bolding = YES; X /* fill if YES; init = YES */ Xglobaldef int fill = YES; X /* current line spacing; init = 1 */ Xglobaldef int lsval = 1; X /* current indent; >= 0; init = 0 */ Xglobaldef int inval = 0; X /* current right margin; init = PAGEWIDTH = 60 */ Xglobaldef int rmval = PAGEWIDTH; X /* current temporary indent; init = 0 */ Xglobaldef int tival = 0; X /* number of lines to center; init = 0 */ Xglobaldef int ceval = 0; X /* flag for continuous center */ Xglobaldef char CEon = FALSE; X /* number of lines to underline; init = 0 */ Xglobaldef int ulval = 0; X /* flag for continuous underline */ Xglobaldef char ULon = FALSE; X /* number of lines to boldface; init = 0 */ Xglobaldef int boval = 0; X /* flag for continuous bolding */ Xglobaldef char BDon = FALSE; X /* justification types for heads and foots; */ X /* init = LEFT, CENTER, RIGHT */ Xglobaldef int tjust[3] = { LEFT, CENTER, RIGHT }; X /* number of lines to blank suppress; init=0 */ Xglobaldef int bsval = 0; X /* right justify filled lines if YES; init=YES */ Xglobaldef int rjust = YES; X /* tab stops; init every 8 spaces */ Xglobaldef int tabs[INSIZE]; X /* line control character; init = PERIOD */ Xglobaldef char cchar = '.'; X /* universal escape - init = UNDERBAR */ Xglobaldef char genesc = '_'; X /* character used to underline a BLANK; init = BLANK */ Xglobaldef char ulblnk = ' '; X /* scratch arrays for use by various routines */ Xglobaldef char tbuf1[MAXLINE]; Xglobaldef char tbuf2[MAXLINE]; Xglobaldef char tbuf3[MAXLINE]; Xglobaldef char ttl[MAXLINE]; X /* flag to process runoff symbols only */ Xglobaldef char onlyrunoff = NO; X /* Flag to turn paging off */ Xglobaldef char paging = YES; X /* page number in roman numerals. Init = NO */ Xglobaldef char roman = NO; X /* autopar flag. Init = NO */ Xglobaldef char autopar = NO; X /* temporary indent value for autopar */ Xglobaldef int autoprv = 5; X /* hash tables for macros and variables */ Xglobaldef struct hashlist *macrotab[HASHMAX]; Xglobaldef struct hashlist *gentab[HASHMAX]; X /* linked list entries for contents */ Xglobaldef struct clist *chead = NULL; Xglobaldef struct clist *clast = NULL; X /* keep track of what is done - VERBOSE */ Xglobaldef int p_txtlines = 0; Xglobaldef int p_outlines = 0; Xglobaldef int p_outpages = 0; Xglobaldef int p_memoryus = 0; X X X X/* X * M A I N L I N E OF P R O F F X * X */ X Xmain(argc,argv) Xint argc; Xchar *argv[]; X{ X int i,j,val,type; X char *p,c; X FILE *fp; X X for (i = 1; i < argc; i++) { X p = argv[i]; X if (*p == '-') { X ++p; X if (isalpha(*p)) { X c = *p++; X switch(c) { X X/* verbose stats */ case 'v': X case 'V': X verbose = TRUE; X break; X/* runoff only */ case 'r': X case 'R': X onlyrunoff = TRUE; X break; X/* stop for page */ case 's': X case 'S': X stopx = 1; X break; X/* page offset */ case 'p': X case 'P': X if (*p == 'o' || *p == 'O') { X p++; X j = 0; X val = getval(p, &j, &type); X set(&offset, val, type, 0, 0, X rmval - 1); X } X else X usage(); X break; X/* include file */ case 'i': X case 'I': /* simulate .so */ X pbstr("\n"); X pbstr(p); X pbstr(".so "); X break; X X/* disable some */ case 'd': X case 'D': X switch (*p) { X X case 'b': X case 'B': X bolding = NO; X break; X case 'p': X case 'P': X paging = NO; X break; X default: X break; X } X break; X X/* garbage */ default: X usage(); X } X } X else X lastpg = atoi(p); X } X else if (*p == '+') { X p++; X if ((frstpg = atoi(p)) == 0) X usage(); X } X else X break; X } X if (i == argc) X usage(); X if ((fp = fopen(argv[i], "r")) == NULL) { X fprintf(stderr, "%s: cannot open.\n",argv[i]); X exit(1); X } X if (p = argv[++i]) { X if ((outfile[0] = fopen(p, "w")) == NULL) { X fprintf(stderr,"%s: cannot create.\n\n", p); X exit(1); X } X } X else X outfile[0] = stdout; X /* set output file level */ X olevel = 0; X poutput = outfile[0]; X /* X * some minor initialisation X */ X X for (i = 0; i < INSIZE; i++) X if (i % 8 == 0) X tabs[i] = YES; X else X tabs[i] = NO; X X ehead[0] = '\n'; X ehead[1] = EOS; X ohead[0] = '\n'; X ohead[1] = EOS; X efoot[0] = '\n'; X efoot[1] = EOS; X ofoot[0] = '\n'; X ofoot[1] = EOS; X X /* initialise contents linked list */ X X chead = (struct clist *) malloc(sizeof(struct clist)); X clast = chead; X p_memoryus += sizeof(struct clist); X X doroff(fp); X brk(); X if (plval <= 100 && (lineno > 0 | outp > 0)) X space(HUGE); X putchar('\n'); X X if(verbose) { X fprintf(stderr,"proff read in %6d textlines to produce\n", X p_txtlines); X fprintf(stderr," %6d lines\n", X p_outlines); X fprintf(stderr," %6d pages of formatted text.\n", X p_outpages); X fprintf(stderr,"\n%d bytes of memory was required\n", X p_memoryus); X fprintf(stderr,"for internal tables and lists.\n"); X } X#ifdef vms X exit(1); X#else X exit(0); X#endif X} SHAR_EOF if test 9150 -ne "`wc -c 'proff.c'`" then echo shar: error transmitting "'proff.c'" '(should have been 9150 characters)' fi echo shar: extracting "'proff.h'" '(4562 characters)' if test -f 'proff.h' then echo shar: over-writing existing file "'proff.h'" fi sed 's/^X//' << \SHAR_EOF > 'proff.h' X X X#include "defs.h" X#include "lookup.h" X X#ifdef vms X#define extern globalref X#endif X /* next available char; init = 0 */ Xextern int bp; X /* pushed-back characters */ Xextern char buf[BUFSIZE]; X /* stack of file descriptors */ Xextern FILE *infile[NFILES]; X /* current file is infile[level] */ Xextern int level; X /* stack of output file descriptors */ Xextern FILE *outfile[NFILES]; X /* current output file is outfile[olevel] */ Xextern int olevel; X /* current output file pointer */ Xextern FILE *poutput; X /* number registers a..z */ Xextern int nr[26]; X /* system registers a..z */ Xextern int nr[26]; X /* last char position in outbuf; init = 0 */ Xextern int outp; X /* width of text currently in outbuf; init = 0 */ Xextern int outw; X /* number of words in outbuf; init = 0 */ Xextern int outwds; X /* lines to be filled collect here */ Xextern char outbuf[MAXOUT]; X /* word in outbuf; init=0 */ X /* current output page number; init = 0 */ Xextern int curpag; X /* next output page number; init = 1 */ Xextern int newpag; X /* next line to be printed; init = 0 */ Xextern int lineno; X /* page length in lines; init = PAGELEN = 66 */ Xextern int plval; X /* page length save area */ Xextern int savpl; X /* margin before and including header */ Xextern int m1val; X /* margin after header */ Xextern int m2val; X /* margin after last text line */ Xextern int m3val; X /* bottom margin, including footer */ Xextern int m4val; X /* last live line on page, = plval-m3val-m4val */ Xextern int bottom; X /* top of page title for even pages;init=NEWLINE */ Xextern char ehead[MAXLINE]; X /* top of page title for odd pages;init=NEWLINE */ Xextern char ohead[MAXLINE]; X /* left,right margins for even header;init=inval,rmval */ Xextern int ehlim[2]; X /* left,right margins for odd header;init=inval,rmval */ Xextern int ohlim[2]; X /* bot of page title for even pages;init=NEWLINE */ Xextern char efoot[MAXLINE]; X /* bot of page title for odd pages;init=NEWLINE */ Xextern char ofoot[MAXLINE]; X /* left,right margins for even footer;init=inval,rmval */ Xextern int eflim[2]; X /* left,right margins for odd footer;init=inval,rmval */ Xextern int oflim[2]; X /* flag for pausing between pages */ Xextern int stopx; X /* first page to begin printing with */ Xextern int frstpg; X /* last page to be printed */ Xextern int lastpg; X /* flag to indicate whether page should be printed */ Xextern int print; X /* number of blanks to offset page by; init = 0 */ Xextern int offset; X /* verbose option; init = FALSE */ Xextern int verbose; X /* bolding option; init = YES; */ Xextern char bolding; X /* fill if YES; init = YES */ Xextern int fill; X /* current line spacing; init = 1 */ Xextern int lsval; X /* current indent; >= 0; init = 0 */ Xextern int inval; X /* current right margin; init = PAGEWIDTH = 60 */ Xextern int rmval; X /* current temporary indent; init = 0 */ Xextern int tival; X /* number of lines to center; init = 0 */ Xextern int ceval; X /* flag for continuous center */ Xextern char CEon; X /* number of lines to underline; init = 0 */ Xextern int ulval; X /* flag for continuous underline */ Xextern char ULon; X /* number of lines to boldface; init = 0 */ Xextern int boval; X /* flag for continuous bolding */ Xextern char BDon; X /* justification types for heads and foots; */ Xextern int tjust[3]; /* init = LEFT, CENTER, RIGHT */ X /* number of lines to blank suppress; init=0 */ Xextern int bsval; X /* right justify filled lines if YES; init=YES */ Xextern int rjust; X /* tab stops; init every 8 spaces */ Xextern int tabs[INSIZE]; X /* line control character; init = PERIOD */ Xextern char cchar; X /* universal escape - init = UNDERBAR */ Xextern char genesc; X /* character used to underline a BLANK; init = BLANK */ Xextern char ulblnk; X /* scratch arrays for use by various routines */ Xextern char tbuf1[MAXLINE]; Xextern char tbuf2[MAXLINE]; Xextern char tbuf3[MAXLINE]; Xextern char ttl[MAXLINE]; X /* flag to process runoff symbols only */ Xextern char onlyrunoff; X /* flag to turn paging off */ Xextern char paging; X /* page number in roman numerals. Init = NO */ Xextern char roman; X /* autopar flag. Init = NO */ Xextern char autopar; X /* temporary indent value for autopar */ Xextern int autoprv; X /* hash tables for macros and variables */ Xextern struct hashlist *macrotab[HASHMAX]; Xextern struct hashlist *gentab[HASHMAX]; X /* linked list entries for contents */ Xextern struct clist *chead; Xextern struct clist *clast; X /* keep track of the work - VERBOSE opt.*/ X Xextern int p_txtlines; Xextern int p_outlines; Xextern int p_outpages; Xextern int p_memoryus; X X#ifdef vms X#undef extern X#endif X SHAR_EOF if test 4562 -ne "`wc -c 'proff.h'`" then echo shar: error transmitting "'proff.h'" '(should have been 4562 characters)' fi echo shar: extracting "'proff.pro'" '(3302 characters)' if test -f 'proff.pro' then echo shar: over-writing existing file "'proff.pro'" fi sed 's/^X//' << \SHAR_EOF > 'proff.pro' X name %time cumsecs #call ms/call X _doesc 14.6 6.48 1929 3.36 X _ngetln 12.0 11.79 2004 2.65 X _dotabs 10.6 16.46 1118 4.18 X _getwrb 8.5 20.21 5493 0.68 X _put 8.4 23.91 1311 2.82 X _width 7.2 27.11 5060 0.63 X _dovar 6.7 30.05 1962 1.50 X cret 3.6 31.62 X csv 3.3 33.10 X _strcpy 3.3 34.57 X _spread 3.0 35.88 389 3.39 X _putwrd 1.8 36.69 4947 0.16 X mcount 1.7 37.44 X _strlen 1.6 38.14 X _leadbl 1.2 38.69 227 2.42 X _text 1.2 39.23 1118 0.48 X _getwrd 0.9 39.64 860 0.48 X _eval 0.9 40.03 95 4.04 X _puttl 0.9 40.41 74 5.18 X _hash 0.8 40.76 1827 0.19 X _getarg 0.7 41.06 861 0.35 X_docline 0.6 41.34 75 3.78 X_command 0.6 41.61 844 0.32 X _bold 0.5 41.84 33 7.07 X _malloc 0.4 42.03 X _putbak 0.4 42.21 3624 0.05 X_comtype 0.4 42.38 844 0.20 X _doroff 0.3 42.53 1 150.03 X _gfield 0.3 42.66 150 0.89 X _skipl 0.3 42.79 1623 0.08 X _brk 0.3 42.90 1073 0.10 X _strcmp 0.2 43.01 X _lookup 0.2 43.11 1053 0.10 X _pbstr 0.2 43.21 443 0.23 X_lexlook 0.2 43.31 716 0.14 X _write 0.2 43.41 X _subst 0.2 43.50 208 0.44 X _skipbl 0.2 43.57 1205 0.06 X__strout 0.2 43.63 X__flsbuf 0.2 43.70 X _jcopy 0.2 43.77 104 0.64 X _underl 0.1 43.83 15 3.89 X _read 0.1 43.88 X _set 0.1 43.91 409 0.09 X_strsave 0.1 43.95 191 0.17 X _atoi 0.1 43.98 X_install 0.1 44.01 58 0.50 X _getval 0.1 44.03 1 25.01 X _getnow 0.1 44.06 74 0.34 X _center 0.0 44.08 9 2.32 X _phead 0.0 44.10 37 0.45 X _main 0.0 44.11 1 16.67 X_sprintf 0.0 44.13 X _justfy 0.0 44.15 104 0.16 X_cvtroma 0.0 44.16 4 4.17 X _dodef 0.0 44.18 8 2.08 X _addstr 0.0 44.20 33 0.51 X _sbrk 0.0 44.21 X _itoc 0.0 44.23 83 0.20 X _close 0.0 44.24 X _fopen 0.0 44.24 X _space 0.0 44.24 219 0.00 X_fprintf 0.0 44.24 X _etext 0.0 44.24 X _gets 0.0 44.24 X _printf 0.0 44.24 X _pfoot 0.0 44.24 37 0.00 X__filbuf 0.0 44.24 X__doprnt 0.0 44.24 X pgen 0.0 44.24 X pfloat 0.0 44.24 X pscien 0.0 44.24 X_getpstr 0.0 44.24 X _finit 0.0 44.24 X _fflush 0.0 44.24 X__cleanu 0.0 44.24 X _fclose 0.0 44.24 X__endope 0.0 44.24 X__findio 0.0 44.24 X _remove 0.0 44.24 X_lexinst 0.0 44.24 X _free 0.0 44.24 X_realloc 0.0 44.24 X _isatty 0.0 44.24 X_monitor 0.0 44.24 X _stty 0.0 44.24 X _gtty 0.0 44.24 X _strcat 0.0 44.24 X _exit 0.0 44.24 X _usage 0.0 44.24 X _error 0.0 44.24 X _ctoi 0.0 44.24 1 0.00 X _creat 0.0 44.24 X _ioctl 0.0 44.24 X _lseek 0.0 44.24 X _open 0.0 44.24 X _profil 0.0 44.24 X _addset 0.0 44.24 8 0.00 X _save 0.0 44.24 4 0.00 X_restore 0.0 44.24 4 0.00 X cerror 0.0 44.24 X ldiv 0.0 44.24 X _map 0.0 44.24 4 0.00 X _prmpt 0.0 44.24 X _gettl 0.0 44.24 8 0.00 SHAR_EOF if test 3302 -ne "`wc -c 'proff.pro'`" then echo shar: error transmitting "'proff.pro'" '(should have been 3302 characters)' fi echo shar: extracting "'proff01.c'" '(11313 characters)' if test -f 'proff01.c' then echo shar: over-writing existing file "'proff01.c'" fi sed 's/^X//' << \SHAR_EOF > 'proff01.c' X X X X X#include X#include X#include "proff.h" X#include "debug.h" X X/* X * bold - bold face or overstrike a line X * X */ Xbold(buf,tbuf,size) Xchar buf[]; Xchar tbuf[]; Xint size; X{ X int i,j; X dprintf("bold "); X X j = 0; X for (i = 0; buf[i] != '\n' && j < size - 2; i++) { X tbuf[j] = buf[i]; X j++; X if (buf[i] != ' ' && buf[i] != '\t' && X buf[i] != BACKSPACE ) { X tbuf[j] = BACKSPACE; X tbuf[j+1] = tbuf[j-1]; X j += 2; X } X } X tbuf[j] = '\n'; X tbuf[j+1] = '\0'; X strcpy(buf,tbuf); X} X X/* X * brk - end current filled line X * X */ Xbrk() X{ X dprintf("brk "); X if (outp > 0) { X outbuf[outp] = '\n'; X outbuf[outp+1] = EOS; X put(outbuf); X } X outp = 0; X outw = 0; X outwds = 0; X} X X/* X * center - center a line by setting tival X * X */ Xcenter(buf) Xchar buf[]; X{ X int i; X X dprintf("center "); X X i = (rmval + tival - width(buf)) / 2; X tival = (i > 0) ? i : 0; X} X X/* X * doroff - format text in file fp X * X */ Xdoroff(fp) XFILE *fp; X{ X char inbuf[INSIZE]; X X infile[0] = fp; X for (level = 0; level > -1; level--) { X while (ngetln(inbuf, infile[level]) != EOF) { X if (inbuf[0] == cchar) /* a command */ X command(inbuf); X else { X#ifdef rainbow X if (biosb(2)) X exit(0); X#endif X text(inbuf); X p_txtlines++; X } X } X if (level > 0 && infile[level] > 0) { X fclose(infile[level]); X if (verbose) X fprintf(stderr," done.\n"); X } X } X} X X/* X * gettl - copy title from buf to ttl X * X * modifies lim X */ Xgettl(buf,ttl,lim) Xchar *buf; Xchar *ttl; Xint lim[]; X{ X while (!isspace(*buf)) X buf++; X while (isspace(*buf)) X buf++; X strcpy(ttl,buf); X lim[0] = inval; X lim[1] = rmval; X} X X/* X * getwrb - get a word INCLUDING the trailing blanks X * X */ Xint Xgetwrb(in,i,out) Xchar in[]; Xchar out[]; Xint *i; X{ X int j,k; X dprintf("getval "); X k = *i; X j = 0; X while (in[k] != EOS && in[k] != ' ' && X in[k] != '\t' && in[k] != '\n') { X out[j] = in[k]; X k++; X j++; X } X while (in[k] == ' ') { X out[j] = ' '; X k++; X j++; X } X *i = k; X out[j] = EOS; X return(j); X} X X X/* X * gfield - get next tab or title field X * X */ Xint Xgfield(buf, i, n, temp, delim) Xchar buf[]; Xint *i; Xint n; Xchar temp[]; Xchar delim; X{ X int j,k; X X dprintf("gfield "); X j = 0; X k = *i; X if (n > 0) { X if (buf[k] == delim) X k++; X while (buf[k] != delim && buf[k] != EOS && buf[k] != '\n' && X j <= n) { X temp[j] = buf[k]; X j++; X k++; X } X } X temp[j] = EOS; X while (buf[k] != delim && buf[k] != EOS && buf[k] != '\n') X k++; X *i = k; X return(j); X} X X/* X * jcopy - scopy without copying EOS X * X */ Xjcopy(from, i, to, j) Xchar from[]; Xchar to[]; Xint i; Xint j; X{ X int k1, k2; X dprintf("jcopy "); X X k1 = i; X k2 = j; X while (from[k1] != EOS) { X to[k2] = from[k1]; X k1++; X k2++; X } X} X X/* X * justfy - justifies string in its tab column X * */ Xjustfy(in, left, right, type, out) Xchar in[]; Xchar out[]; Xint left; Xint right; Xint type; X{ X int j,k, n; X X dprintf("justfy "); X n = width(in); X if (type == RIGHT) X jcopy(in, 0, out, right-n); X else if (type == CENTER) { X k = (right+left-n) / 2; X j = (k > left) ? k : left; X jcopy(in, 0, out, j); X } X else X jcopy(in, 0, out, left); X} X X/* X * leadbl - delete leading blanks, set tival X * X */ Xleadbl(buf) Xchar buf[]; X{ X int i, j; X X dprintf("leadbl "); X brk(); X for (i = 0; buf[i] == ' '; i++) /* find 1st non-blank */ X ; X if (buf[i] != '\n') X if (autopar) { X put("\n"); /* blank line */ X tival = inval + autoprv; X } X else X tival = inval + i; /* ??????????? */ X for (j = 0; buf[i] != EOS; j++) { /* move line to left */ X buf[j] = buf[i]; X i++; X } X buf[j] = EOS; X} X X/* X * ngetln - get next line from f into line X * X */ Xint Xngetln(line, f) Xchar line[]; XFILE *f; X{ X int c, i; X X for (i = 0; (c = (bp >= 0) ? buf[bp--] : getc(f)) != EOF; ) { X if (i < MAXLINE - 1) { X line[i++] = (char) c; X } X if (c == '\n' || c == '\r') X break; X } X line[i] = EOS; X if (i == 0 && c == EOF) X i = EOF; X#ifdef DEBUG X printf("ngetln: %s (line)\n",line); X#endif X return(i); X} X X/* X * pbstr - push string back onto input X * X */ Xpbstr(in) Xchar in[]; X{ X X int i; X X dprintf("pbstr "); X for (i = strlen(in) - 1; i >= 0; i--) X putbak(in[i]); X} X X/* X * pfoot - put out page footer X * X */ Xpfoot() X{ X X dprintf("pfoot "); X skipl(m3val); X if (m4val > 0) { X if (curpag % 2 == 1) X puttl(efoot, eflim, curpag); X else X puttl(ofoot, oflim, curpag); X } X if (print == YES) /* flush the page */ X { X putchar(PAGEJECT); /* ... */ X p_outpages++; X if (stopx > 0) /* -s, so flush ^L*/ X putchar('\n'); X } X} X X/* X * phead - put out page header X * X */ Xphead() X{ X dprintf("phead "); X X curpag = newpag; X if (curpag >= frstpg && curpag <= lastpg) X print = YES; X else X print = NO; X if(stopx > 0 && print == YES) X prmpt(&stopx); X newpag++; X if (m1val > 0) { X skipl(m1val-1); X if (curpag % 2 == 0) X puttl(ehead, ehlim, curpag); X else X puttl(ohead, ohlim, curpag); X } X skipl(m2val); X lineno = m1val + m2val + 1; X} X X/* X * prmpt - pause for paper insertion X * prompt if i == 1; increment i X * X */ Xprmpt(i) Xint *i; X{ X int junk,j; X static char bellst[2] = { BEL, EOS}; X X dprintf("prmpt "); X j = *i; X if (j == 1) X#ifdef rainbow X printf("%s\033[7minsert paper and type return\033[0m ",bellst); X#else X printf("%sinsert paper and type return ",bellst); X#endif X else X printf(bellst); X junk = getchar(); X *i = ++j; X} X X/* X * Put - put out line with proper spacing and indenting X * X */ Xput(buf) Xchar buf[]; X{ X register int i; X dprintf("put "); X if (lineno == 0 || lineno > bottom) X phead(); X X if ( print == YES ) { X if (buf[0] == '\n') { /* empty line.. */ X putchar('\n'); X p_outlines++; X } X else { X for ( i = 1 ; i <= offset ; i++ ) /* page offset */ X putchar(' '); X for ( i = 1 ; i <= tival ; i++ ) /* indenting */ X putchar(' '); X X while (*buf != '\0') { X putchar(*buf); X buf++; X } X p_outlines++; X } X } X X tival = inval; X skipl(((lsval-1 < bottom-lineno) ? lsval-1 : bottom-lineno)); X lineno += lsval; X X if (lineno > bottom) X pfoot(); X X} X X/* X * putbak - push character back onto input X * X */ Xputbak(c) Xchar c; X{ X dprintf("putbak "); X X bp++; X if (bp > BUFSIZE) X error("too many characters pushed back.\n"); X buf[bp] = c; X} X X X/* X * puttl - put out title line with optional page number & date X * X */ Xputtl(buf, lim, pageno) Xchar buf[]; Xint lim[]; Xint pageno; X{ X char chars[9],cdate[27]; X char rmstr[MAXTOK]; X char delim; X char *tp; X int j; X int nc, n, i, left, right, ncd; X X dprintf("puttl "); X if (print == NO) X return; X left = lim[0]; /* no more +1 here */ X right = lim[1]; /* no more +1 here */ X nc = itoc(pageno, chars, MAXCHARS); X if (roman) { X nc = cvtroman(chars,rmstr); X strcpy(chars,rmstr); X } X getnow(cdate); X ncd = strlen(cdate); X i = 0; X delim = buf[i]; X for (j = 0; j < right; j++) X ttl[j] = ' '; X n = 0; X do { X if (gfield(buf, &i, right-left, tbuf1, delim) > 0) { X subst(tbuf1, PAGENUM, tbuf2, chars, nc); X subst(tbuf2, CURRENTDATE, tbuf1, cdate, ncd); X justfy(tbuf1, left, right, tjust[n], ttl); X } X n++; /* update title counter */ X } X while (buf[i] != EOS && buf[i] != '\n' && n != 3); X X for( ; right >= 1 ; right--) X if( ttl[right-1] != ' ' ) X break; X ttl[right] = '\n'; X ttl[right+1] = EOS; X for (i = 1; i <= offset; i++) X putchar(' '); /* offset */ X tp = ttl; X while (*tp != '\0') { X putchar(*tp); X tp++; X } X p_outlines++; X} X X/* X * set - set parameter and check range X * X */ Xset(param, val, argtyp, defval, minval, maxval) Xint *param; Xint val; Xint argtyp; Xint defval; Xint minval; Xint maxval; X{ X int i; X dprintf("set "); X i = *param; X if (argtyp == '\n') /* defaulted */ X i = defval; X else if (argtyp == '+') /* relative +*/ X i += val; X else if (argtyp == '-') /* relative -*/ X i -= val; X else /* absolute */ X i = val; X i = (i < maxval) ? i : maxval; /* min */ X i = (i > minval) ? i : minval; /* max */ X *param = i; X} X X/* X* skipl - output n blank lines X* X*/ Xskipl(n) Xregister int n; X{ X register int i; X X dprintf("skip "); X if (print == YES) X for (i = 1; i <= n; i++) { X putchar('\n'); X p_outlines++; X } X} X X/* X * space - space n lines or to bottom of page X * X */ Xspace(n) Xint n; X{ X X dprintf("space "); X brk(); X if (lineno > bottom) X return; X if (lineno == 0) X phead(); X skipl(((n < bottom+1-lineno) ? n : bottom+1-lineno)); X lineno += n; X if (lineno > bottom) X pfoot(); X} X X/* X * spread - spread words to justify right margin X * X */ Xspread(buf, outp, nextra, outwds) Xchar buf[]; Xint outp; Xint nextra; Xint outwds; X{ X int dir = 0; X X register int i, j; X int nb, ne, nholes; X X dprintf("spread "); X if (nextra <= 0 || outwds <= 1) X return; X dir = 1 - dir; /* reverse previous direction */ X ne = nextra; X nholes = outwds - 1; X if (tival != inval && nholes > 1) X nholes--; X i = outp - 1; X j = (MAXOUT-2 < i+ne) ? MAXOUT-2 : i+ne; /* leave room for '\n', EOS */ X while (i < j) { X buf[j] = buf[i]; X if (buf[i] == ' ' && buf[i-1] != ' ') { X if (dir == 0) X nb = (ne-1) / nholes + 1; X else X nb = ne / nholes; X ne -= nb; X nholes--; X for ( ; nb > 0; nb--) { X j--; X buf[j] = ' '; X } X } X i--; X j--; X } X} X X/* X * subst - substitutes a string for a specified character X * X */ Xsubst(in, chr, out, subara, n) Xchar in[]; Xchar chr; Xchar out[]; Xchar subara[]; Xint n; X{ X register int i, j, k; X X dprintf("subst "); X j = 0; X for (i = 0; in[i] != EOS; i++) X if (in[i] == chr) X for (k = 0; k < n; k++) { X out[j] = subara[k]; X j++; X } X else { X out[j] = in[i]; X j++; X } X out[j] = EOS; X} X X/* X * Text process text lines X * X */ X Xtext(inbuf) Xchar inbuf[]; X{ X int i; X register int j; X char wrdbuf[INSIZE]; X X dovar(wrdbuf,inbuf); /* expand variables */ X strcpy(inbuf,wrdbuf); X doesc(inbuf, wrdbuf, INSIZE); /* expand escapes */ X dotabs(inbuf, wrdbuf, INSIZE); /* expand tabs */ X X if(inbuf[0] == ' ' || inbuf[0] == '\n') X leadbl(inbuf); /* move left, set tival */ X if(ulval > 0 || ULon) /* word underlining */ X { X underl(inbuf, wrdbuf, INSIZE); X ulval--; X } X if(boval > 0 || BDon) /* boldfacing */ X { X bold( inbuf, wrdbuf, INSIZE); X boval--; X } X if(ceval > 0 || CEon) /* centering */ X { X center(inbuf); X put(inbuf); X ceval--; X } X else if( inbuf[0] == '\n' ) /* all blank line */ X put(inbuf); X else if( fill == NO ) /* unfilled text */ X put(inbuf); X else /* filled text */ X { X i = strlen(inbuf) - 1; X inbuf[i] = ' '; X if( inbuf[i-1] == '.' ) X { X i++; X inbuf[i] = ' '; X } X inbuf[i+1] = EOS; X for( i = 0 ; getwrb(inbuf, &i, wrdbuf) > 0 ; ) X putwrd(wrdbuf); X } X} X X/* X * Underl underline words in a line X * X */ Xunderl(buf, tbuf, size) Xchar buf[]; Xchar tbuf[]; Xint size; X{ X int i, j; X X j = 0; X for(i = 0 ; buf[i] != '\n' && j < size - 2; i++) { X if( buf[i] != ' ' && buf[i] != BACKSPACE && buf[i] != '_' ) { X tbuf[j++] = '_'; X tbuf[j++] = BACKSPACE; X } X if( buf[i] == BLANK ) X tbuf[j++] = ulblnk; X else X tbuf[j++] = buf[i]; X } X X tbuf[j] = '\n'; X tbuf[j+1] = '\0'; X strcpy(buf, tbuf); X} X X/* X * width - compute width of character string X * X */ Xint Xwidth(buf) Xchar buf[]; X{ X int k,i; X X dprintf("width "); X k = 0; X for (i = 0; buf[i] != EOS; i++) X if (buf[i] == BACKSPACE) X k--; X else if (buf[i] >= ' ' && buf[i] <= '~') X k++; X return(k); X} X/* X * getnow - get the date from command line if present. X * if not specified, prompt user for it. X * X * (stub) X */ Xgetnow(date) Xchar date[]; X{ X dprintf("getnow "); X strcpy(date,"00-xxx-1900 00:00:00"); X} SHAR_EOF if test 11313 -ne "`wc -c 'proff01.c'`" then echo shar: error transmitting "'proff01.c'" '(should have been 11313 characters)' fi echo shar: extracting "'proff02.c'" '(2681 characters)' if test -f 'proff02.c' then echo shar: over-writing existing file "'proff02.c'" fi sed 's/^X//' << \SHAR_EOF > 'proff02.c' X X X X X#include X#include X#include "defs.h" X#include "debug.h" X X/* X * addset - put c in array[i], if it fits, increment i X * X */ Xint Xaddset(c,array,i,maxsize) Xchar c; Xchar array[]; Xint *i; Xint maxsize; X{ X int n,status = NO; X dprintf("addset "); X n = *i; X if (n <= maxsize - 1) { X array[n++] = c; X status = YES; X } X *i = n; X return(status); X} X X/* X * addstr - add string s to str[i] if it fits, increment i X * X */ Xint Xaddstr(s,str,i,maxsize) Xchar s[]; Xchar str[]; Xint *i; Xint maxsize; X{ X int k,j,status = NO; X X dprintf("addstr "); X j = *i; X if (j + strlen(s) <= maxsize - 1) { X for (k = 0; s[k] != EOS; k++) X str[j++] = s[k]; X status = YES; X } X *i = j; X return(status); X} X X/* X * ctoi - convert string at in[i] to integer, increment i X * X */ Xint Xctoi(in,i) Xchar in[]; Xint *i; X{ X int j,n,sign; X X dprintf("ctoi "); X n = 0; X for (j = *i; in[j] == ' ' || in[j] == '\t'; j++) X ; /* skip leading garbage */ X sign = 1; X if (in[j] == '+' || in[j] == '-') /* sign */ X sign = (in[j++] == '+') ? 1 : -1; X for (n = 0; in[j] >= '0' && in[j] <= '9'; j++) X n = 10 * n + in[j] - '0'; X *i = j; X return(sign * n); X} X X/* X * error - print message and terminate X * X */ Xerror(s) Xchar s[]; X{ X fprintf(stderr,"%s\n",s); X exit(1); X} X X/* X * getwrd - get non-blank word from in[i] into out, increment i X * X */ Xint Xgetwrd(in,i,out) Xchar in[]; Xint *i; Xchar out[]; X{ X int j,size = 0; X X for (j = *i; in[j] == '\t' || in[j] == ' '; j++) X ; /* skip leading garbage */ X while (in[j] != ' ' && in[j] != '\t' && X in[j] != EOS && in[j] != '\n') X out[size++] = in[j++]; X out[size++] = EOS; X *i = j; X#ifdef DEBUG X printf("getwrd: %s\n",out); X#endif X return(size); X} X/* X * skipbl - skip blanks, tabs at str[i], increment i X * X */ Xskipbl(str,i) Xchar str[]; Xint *i; X{ X int n; X dprintf("skipbl "); X n = *i; X while (str[n] == ' ' || str[n] == '\t') X n++; X *i = n; X} X X/* X * itoc - special version of itoa X * X */ Xint Xitoc(n,str,size) Xint n; Xchar str[]; Xint size; X{ X X int i,j,k,sign; X char c; X X dprintf("itoc "); X if ((sign = n) < 0) X n = -n; X i = 0; X do { X str[i++] = n % 10 + '0'; X } X while ((n /= 10) > 0 && i < size-2); X if (sign < 0 && i < size-1) X str[i++] = '-'; X str[i] = EOS; X /* X * reverse the string and plug it back in X * X */ X for (j = 0, k = strlen(str) - 1; j < k; j++, k--) { X c = str[j]; X str[j] = str[k]; X str[k] = c; X } X return(i); X} X X/* X * usage - obvious.. X * X */ Xusage() X{ X#ifdef rainbow X fprintf(stderr,"%s %s", X "usage: proff \033[7m[+n] [-n] [-v] [-ifile] [-s] [-pon]\033[0m", X "\033[1minfile\033[0m \033[7m[outfile]\033[0m\n"); X#else X fprintf(stderr, X "usage: proff [+n] [-n] [-v] [-ifile] [-s] [-pon] infile [outfile]"); X#endif X exit(0); X} SHAR_EOF echo shar: a missing newline was added to "'proff02.c'" if test 2681 -ne "`wc -c 'proff02.c'`" then echo shar: error transmitting "'proff02.c'" '(should have been 2681 characters)' fi echo shar: extracting "'proffsym.new'" '(3452 characters)' if test -f 'proffsym.new' then echo shar: over-writing existing file "'proffsym.new'" fi sed 's/^X//' << \SHAR_EOF > 'proffsym.new' X X! proff symbols X! flag value of 1 indicate X! a runoff-supported symbol X! feb. 1984 X! X! reset the formatter X! Xreset RESET X! X! bolding X! Xbd BD Xbold * X!disable_bolding DBO 1 Xdisablebolding DBO 1 Xdbo * 1 Xdb * X!enable_bolding EBO 1 Xenablebolding EBO 1 Xebo * 1 Xeb * X! X! new page & paging modes X! Xbp BP Xpage * 1 Xpg * 1 Xpaging PGI 1 Xpa * 1 Xnopaging NPA 1 Xnp * X! X! break X! Xbr BR 1 Xbreak * 1 X! Xbs BS X! X! setup control character X! Xcc CC Xcchar * X! X! centering X! Xce CE Xcenter * X! Xcu CU X! X! macro definitions X! Xde DE Xdefine * X! X! setup generic escape character X! Xec EC Xechar * X! X! even footers and headers X! Xef EF Xeh EH X! X! end macro definition X! X!en EN X! X! fill the lines X! Xfi FI Xf * 1 Xfill * 1 X! X! general footers and headers X! Xfo FO Xfooter * Xhe HE Xheader * X! X! indentation (permanent) X! Xin IN Xlm * 1 X!left_margin * 1 Xleftmargin * 1 X! X! justification X! Xju JU Xj * 1 Xjustify * 1 X! X! line spacing X! Xls LS Xspacing * 1 Xspc * 1 X! X! margin spacing X! Xm1 M1 Xm2 M2 Xm3 M3 Xm4 M4 X! X! test for page X! Xne NE Xneed * X!test_page * 1 Xtestpage * 1 Xtp * 1 X! X! disable fill X! Xnf NF 1 Xnofill * X!no_fill * 1 X! X! disable justification X! Xnj NJ 1 Xnojustify * X!no_justify * 1 X! X! number registers X! Xnr NR X! X! external output X! Xou OU Xoutput * Xoe OE Xoutend * X! X! odd footers and headers X! Xof OF Xoh OH X! X! page length X! Xpl PL Xps * 1 X!page_size * 1 Xpagesize * 1 X! X! page offset X! Xpo PO Xoffset * X! X! right margin X! Xrm RM 1 X!right_margin * 1 Xrightmargin * 1 X! X! external input (include) X! Xso SO Xsource * Xinclude * Xrequire * 1 Xreq * 1 X! X! skip line (blank lines) according to spacing X! sp is not the same as runoff sp X! Xsp SP Xskip * 1 Xs * 1 X! X! blank line X! X!blank BL 1 X!b * 1 X! X! space from top (or bottom) X! Xst ST Xskipto * X! X! temporary indent X! Xti TI Xleft * 1 X! X! underline X! Xul UL Xunderline * X! X! substitute (using reqular expresions) X! X!su SU X!subs * X!substitute * X!esu ESU X!enable_subs * X!dsu DSU X!disable_subs * X! X! save and restore of FSECT X! Xsv SAV Xsave * Xrs RST Xrestore * X! X! looping formatting for each variable X! X!for FOR X!foreach * X!enf ENF X!endfor * X! X! permanent symbol replacement X! Xlx LEX Xlex LEX X! X! ignore character X! Xig IG Xignore IG X! X! variable definition X! Xvs SET Xset * Xvg GET Xget * X! X! page numbering (roman or arabic) X! Xpn PN Xpagenumber * X! X! paragraphing X! Xap AP 1 Xautoparagraph * 1 Xna * Xnap NAP 1 X!no_autoparagraph * 1 Xnoautoparagraph * 1 X!paragraph PAR 1 X!p * 1 X!set_paragraph SPR 1 X!setparagraph * 1 X!spr * 1 X! X! X!comment COM 1 X! X! same as pagenumber X! X!display_number DNM 1 X!dnm * 1 X! X! entry into an index listing X! X!entry ENT 1 X!y * 1 X! X! entry into contents table X! Xcl CL Xcontline * Xpc PC Xprintcont * X! X! conditional formatting X! X!if CIF 1 X!else CELSE 1 X!endif CENDIF 1 X!ifnot CIFNOT 1 X! X! list generation X! X!list LST 1 X!end_list ELS 1 X!endlist ELS 1 X!els * 1 X!list_element LEM 1 X!listelement LEM 1 X!le * 1 X! X! literal mode (nf-nj-lm0-rm150) X! Xliteral LTR 1 Xlt * 1 X!end_literal ELT 1 Xendliteral ELT 1 Xel * 1 X! X! overstrike control X! X!enable_overstriking EOV 1 X!eov * 1 X!disable_overstriking DOV 1 X!dov * 1 X! X! repeat a string X! X!repeat REP 1 X!rpt * 1 X! X! flush right margin X! X!right RIG 1 X!r * 1 X! X! write out a special string X! Xwr WR Xwrite * X! X! end of definitions X SHAR_EOF if test 3452 -ne "`wc -c 'proffsym.new'`" then echo shar: error transmitting "'proffsym.new'" '(should have been 3452 characters)' fi # End of shell archive exit 0 -- Usenet: [decvax|allegra|linus|ihnp4]!utzoo!yetti!oz Bitnet: oz@[yusol|yuyetti] In the beginning, there was Word all right, except it wasn't fixed number of bits.