New NRO file 3 of 3 - (nf)
ron at trsvax.UUCP
ron at trsvax.UUCP
Fri Sep 16 13:30:47 AEST 1983
#N:trsvax:66500004:000:23000
trsvax!ron Sep 9 00:37:00 1983
--------------------------------------------------------------------------------
: Run this shell script with "sh" not "csh"
#! /bin/sh
PATH=:/bin:/usr/bin:/usr/ucb
export PATH
all=FALSE
if [ $1x = -ax ]; then
all=TRUE
fi
/bin/echo 'Extracting nrotxt.c'
sed 's/^X//' <<'//go.sysin dd *' >nrotxt.c
X/*
X * Text processing portion of NRO word processor
X *
X * Stephen L. Browning
X * 5723 North Parker Avenue
X * Indianapolis, Indiana 46220
X *
X * Modified and enhanced by:
X * Ron Light
X * 6016 Croftway Ct.
X * Ft. Worth, Tx. 76131
X */
X
X#include <stdio.h>
X#include "nro.h"
X
X
Xextern struct docctl dc;
Xextern struct page pg;
Xextern FILE *pout;
Xextern struct cout co;
Xextern struct macros mac;
Xextern struct file file[NFILES];
Xextern unsigned char disk;
Xextern unsigned char raw;
Xextern unsigned char *divertbuf;
Xextern unsigned char *divpnt;
Xstatic unsigned char lastflag = 0;
Xunsigned char inbuf[MAXLINE] = 0;
X
X
X
Xtext(p)
Xregister unsigned char *p;
X{
X register unsigned int i;
X unsigned char wrdbuf[MAXLINE];
X
X
X if(dc.literal)
X {
X put(p);
X --dc.literal;
X return;
X }
X
X if (isspace(*p) || iscr(*p))
X leadbl(p);
X
X expesc(p, wrdbuf);
X mask(p);
X checkul(p);
X
X if (dc.ceval > 0)
X {
X center(p);
X put(p);
X --dc.ceval;
X }
X else if (iscr(*p))
X put(p); /* all blank line */
X else if (dc.fill == NO)
X put(p); /* unfilled */
X else
X {
X while ((i = getwrd(p, wrdbuf)) > 0)
X {
X putwrd(wrdbuf);
X p += i;
X }
X }
X
X
X if(lastflag == 1)
X {
X i = co.outp - 1;
X
X while(isspace(co.outbuf[i]))
X co.outbuf[i--] = ' ';
X }
X
X lastflag = 0;
X}
X
X
X/*
X * insert bold face text
X */
X
Xbold(p0, p1)
Xregister unsigned char *p0, *p1;
X{
X register unsigned int i, j, k;
X
X
X j = 0;
X
X for (i = 0; j < MAXLINE - 1; ++i)
X {
X if(isterm(p0[i]))
X break;
X
X if (isalpha(p0[i]) || isdigit(p0[i]) || dc.cbold)
X {
X if(!iswhite(p0[i]))
X {
X p1[j++] = p0[i];
X p1[j++] = '\b';
X continue;
X }
X }
X
X p1[j++] = p0[i];
X }
X
X p1[j++] = '\n';
X p1[j] = EOS;
X strcpy(p0, p1);
X}
X
X
X
X
X/*
X * center a line by setting tival
X */
X
Xcenter(p)
Xregister unsigned char *p;
X{
X dc.tival = max((dc.rmval - width(p)) >> 1, 0);
X}
X
X
X/*
X * expand title buffer to include character string
X */
X
Xexpand(p0, c, s)
Xregister unsigned char *p0, *s;
Xregister unsigned char c;
X{
X register unsigned char *p, *q, *r;
X unsigned char tmp[MAXLINE];
X
X p = p0;
X q = tmp;
X
X while (*p != EOS)
X {
X if (*p == c)
X {
X r = s;
X
X while (*r != EOS)
X *q++ = *r++;
X }
X else
X *q++ = *p;
X
X ++p;
X }
X
X *q = EOS;
X strcpy(p0, tmp); /* copy it back */
X}
X
X
X/*
X * get field from title
X */
X
Xchar *getfield(p, q, delim)
Xregister unsigned char *p, *q;
Xregister unsigned char delim;
X{
X while (*p != delim && !isterm(*p))
X *q++ = *p++;
X
X *q = EOS;
X
X if (*p == delim)
X ++p;
X
X return (p);
X}
X
X
X
X/*
X * get non-blank word from p0 into p1.
X * return number of characters processed.
X */
X
Xgetwrd(p0, p1)
Xregister unsigned char *p0, *p1;
X{
X register unsigned int i, j;
X
X
X j =
X i = 0;
X
X while (isspace(*p0))
X {
X ++i;
X ++p0;
X }
X
X while (!isspace(*p0) && *p0)
X {
X if (isterm(*p0))
X break;
X
X *p1++ = *p0++;
X ++i;
X ++j;
X }
X
X *p1 = 0;
X
X if(!j)
X i = 0;
X
X return (i);
X}
X
X
X/*
X * convert integer to decimal ascii string
X */
X
Xitoda(value, p, size)
Xregister int value;
Xregister unsigned int size;
Xregister unsigned char *p;
X{
X if(dc.roman)
X {
X roman(value, p);
X return(strlen(p)+1);
X }
X
X sprintf(p, "%d", value);
X return (strlen(p) + 1);
X}
X
X
X/*
X * center title text into print buffer
X */
X
Xjustcntr(p, q, limit)
Xregister unsigned char *p, *q;
Xunsigned int limit[];
X{
X register unsigned int len;
X
X len = width(p);
X q = &q[(limit[RIGHT] + limit[LEFT] - len) >> 1];
X
X while (*p != EOS)
X *q++ = *p++;
X}
X
X
X
X/*
X * left justify title text into print buffer
X */
X
Xjustleft(p, q, limit)
Xregister unsigned char *p, *q;
Xregister unsigned int limit;
X{
X q = &q[limit];
X
X while (*p != EOS)
X *q++ = *p++;
X}
X
X
X/*
X * right justify title text into print buffer
X */
X
Xjustrite(p, q, limit)
Xregister unsigned char *p, *q;
Xregister unsigned int limit;
X{
X register unsigned int len;
X
X len = width(p);
X q = &q[limit - len];
X
X while (*p != EOS)
X *q++ = *p++;
X}
X
X
X
X
X/*
X * delete leading blanks, set tival
X */
X
Xleadbl(p)
Xregister unsigned char *p;
X{
X register unsigned int i, j;
X
X br();
X
X for (i = 0; ; ++i)
X if(!isspace(p[i]))
X break;
X
X if (!iscr(p[i]))
X dc.tival = i;
X
X if(i)
X {
X for (j = 0; p[i] != EOS; ++j)
X p[j] = p[i++];
X
X
X p[j] = EOS;
X }
X}
X
X
X
X/*
X * find minimum of two integer
X */
X
Xmin(v1, v2)
Xregister int v1, v2;
X{
X return ((v1 < v2) ? v1 : v2);
X}
X
X
X
X/*
X * find maximum of two integers
X */
X
Xmax(v1, v2)
Xregister int v1, v2;
X{
X return ((v1 > v2) ? v1 : v2);
X}
X
X
X
X/*
X * put out page footer
X */
X
Xpfoot()
X{
X if(dc.divert)
X return;
X
X dumpdivert();
X skip(pg.m3val);
X
X if (pg.m4val > 0)
X {
X if ((pg.curpag % 2) == 0)
X puttl(pg.efoot, pg.eflim, pg.curpag);
X else
X puttl(pg.ofoot, pg.oflim, pg.curpag);
X
X while(pg.lineno <= pg.plval)
X skip(1);
X }
X
X if(dc.divsav)
X {
X dc.divlin = dc.divsav;
X dc.divsav = 0;
X }
X
X/* pg.lineno = 0; */
X setbot();
X}
X
X
X
X/*
X * put out page header
X */
X
Xphead()
X{
X if(dc.divert)
X return;
X
X pg.curpag = pg.newpag;
X pg.lineno = 1;
X pg.eooset = (pg.curpag % 2) ? pg.oofset : pg.eofset;
X
X if (pg.curpag >= pg.frstpg && pg.curpag <= pg.lastpg)
X dc.prflg = TRUE;
X else
X dc.prflg = FALSE;
X
X ++pg.newpag;
X
X if (pg.m1val > 0)
X {
X skip(pg.m1val - 1);
X
X if ((pg.curpag % 2) == 0)
X puttl(pg.ehead, pg.ehlim, pg.curpag);
X else
X puttl(pg.ohead, pg.ohlim, pg.curpag);
X }
X
X skip(pg.m2val);
X setbot();
X}
X
X
X/*
X * print character with test for printer
X */
X
Xprchar(byte)
Xregister unsigned char byte;
X{
X register unsigned char c;
X static unsigned char last;
X
X if(dc.divert)
X c = byte;
X else
X c = byte & (unsigned) 0x7f;
X
X if(dc.divert)
X {
X *divpnt++ = c;
X *divpnt = EOS;
X
X if(iscr(c))
X ++dc.divlin;
X }
X#ifdef PRINT
X else if (co.lpr == TRUE)
X {
X if(dc.prflg == TRUE)
X {
X if(raw)
X {
X if(c != '\b');
X putc(c, xxxx);
X
X goto lok;
X }
X
X if(c == '\b')
X {
X fprintf(xxxx, "\b%c\b%c\b%c", last, last, last);
X return;
X }
X
X if(byte & 0x80)
X fprintf(xxxx, "_\b");
X
X putc(c, xxxx);
X last = c;
X }
Xlok:
X
X if(iscr(c))
X ++pg.lineno;
X else if(c == '\f')
X pg.lineno = 0;
X }
X#endif
X else
X {
X if(dc.prflg == TRUE)
X {
X if(raw)
X {
X if(c != '\b')
X putc(c, pout);
X
X goto vok;
X }
X
X if(c == '\b')
X {
X fprintf(pout, "\b%c", last);
X return;
X }
X
X if(byte & 0x80)
X fprintf(pout, "_\b%c", c);
X else
X putc(c, pout);
X
X last = c;
X }
X
Xvok:
X
X if(iscr(c))
X ++pg.lineno;
X else if(c == '\f')
X pg.lineno = 0;
X }
X}
X
X
X
X
X/*
X * put out line with proper spacing and indenting
X */
X
Xput(p)
Xregister unsigned char *p;
X{
X register unsigned int j;
X
X if (pg.lineno == 0 || pg.lineno > pg.bottom)
X phead();
X
X both();
X putlin(p, 1);
X reset();
X
X if(iscr(p[strlen(p) - 1]))
X {
X skip(min(dc.lsval - 1, pg.bottom+1 - pg.lineno));
X chkbot();
X }
X}
X
X
X/*
X * output a null terminated string to the output file
X */
X
Xputlin(q, flag)
Xregister unsigned char *q;
Xregister unsigned int flag;
X{
X register unsigned char *p = q;
X
X
X if(dc.aindex && !dc.divert)
X cindex(q);
X
X while (*q)
X {
X if(!dc.divert)
X {
X if(isspace(*q) && iscr(q[1]))
X {
X ++q;
X continue;
X }
X }
X
X prchar(*q++);
X }
X}
X
X
X
X/*
X * put out title or footer
X */
X
Xputtl(p, lim, pgno)
Xregister unsigned char *p;
Xregister unsigned int lim[];
Xregister unsigned int pgno;
X{
X register unsigned int i;
X unsigned char pn[80];
X unsigned char t[MAXLINE];
X unsigned char h[MAXLINE];
X register unsigned char delim;
X
X itoda(pgno, pn, 6);
X blank(h);
X delim = *p++;
X p = getfield(p, t, delim);
X expand(t, dc.pgchr, pn);
X justleft(t, h, lim[LEFT]);
X p = getfield(p, t, delim);
X expand(t, dc.pgchr, pn);
X justcntr(t, h, lim);
X p = getfield(p, t, delim);
X expand(t, dc.pgchr, pn);
X justrite(t, h, lim[RIGHT]);
X clobber(h);
X mask(h);
X
X if (strlen(h) > 1)
X ofset();
X
X putlin(h, 0);
X}
X
X
X
X/*
X * put out temporary title
X */
X
Xtitle(p, lim, pgno)
Xregister unsigned char *p;
Xregister unsigned int lim[];
Xregister unsigned int pgno;
X{
X register unsigned int i;
X unsigned char pn[80];
X unsigned char t[MAXLINE];
X unsigned char h[MAXLINE];
X register unsigned char delim;
X
X
X if (pg.lineno == 0 || pg.lineno > pg.bottom)
X phead();
X
X itoda(pgno, pn, 6);
X blank(h);
X delim = *p++;
X p = getfield(p, t, delim);
X expand(t, dc.pgchr, pn);
X justleft(t, h, lim[LEFT]);
X p = getfield(p, t, delim);
X expand(t, dc.pgchr, pn);
X justcntr(t, h, lim);
X p = getfield(p, t, delim);
X expand(t, dc.pgchr, pn);
X justrite(t, h, lim[RIGHT]);
X clobber(h);
X mask(h);
X ofset();
X checkul(h);
X putlin(h, 1);
X reset();
X skip(min(dc.lsval - 1, pg.bottom+1 - pg.lineno));
X chkbot();
X}
X
X
X
X
X/*
X * put out into indent field
X */
X
Xputin(p)
Xregister unsigned char *p;
X{
X register unsigned char *q;
X unsigned char pn[80];
X unsigned char t[MAXLINE];
X
X
X itoda(pg.curpag, pn, 6);
X expesc(skipbl(skipwd(p)), t);
X expand(t, dc.pgchr, pn);
X justleft(t, inbuf, 0);
X inbuf[dc.tival] = 0;
X mask(inbuf);
X checkul(inbuf);
X q = &inbuf[strlen(inbuf) - 1];
X
X if(*q == '\n')
X *q = 0;
X}
X
X
X
X/*
X * put word in output buffer
X */
X
Xputwrd(wrdbuf)
Xregister unsigned char *wrdbuf;
X{
X register int w, last, llval, nextra;
X register unsigned char c;
X
X w = width(wrdbuf);
X last = strlen(wrdbuf) + co.outp;
X llval = dc.rmval - dc.tival;
X
X if ((co.outp && ((co.outw + w) > llval)) || (last > MAXLINE))
X {
X last -= co.outp;
X
X if (dc.juval == YES)
X {
X nextra = llval - co.outw + 1;
X /*
X * Check whether last word was end of
X * sentence and modify counts so that
X * it is right justified.
X */
X if (isspace(co.outbuf[co.outp - 2]))
X {
X --co.outp;
X ++nextra;
X }
X
X spread(co.outbuf, co.outp - 1, nextra, co.outwds);
X
X if ((nextra > 0) && (co.outwds > 1))
X co.outp += (nextra - 1);
X }
X
X br();
X }
X
X strcpy(co.outbuf+co.outp, wrdbuf);
X co.outp = last;
X
X /* add additional space if end of sentence */
X c = wrdbuf[strlen(wrdbuf) - 1] & 0x7f;
X
X if(c == '"')
X c = wrdbuf[strlen(wrdbuf) - 2] & 0x7f;
X
X if(c == '.' || c == '?' || c == '!')
X {
X addspace();
X ++w;
X }
X
X addspace();
X co.outbuf[co.outp] = 0;
X co.outw += (w + 1);
X ++co.outwds;
X}
X
X
X/*
X * skips the number of lines specified by n.
X */
X
Xskip(n)
Xregister int n;
X{
X register int i;
X
X
X if (n > 0)
X {
X for (i = 0; i < n; ++i)
X prchar('\n');
X }
X}
X
X
X
X/*
X * spread words to justify right margin
X */
X
Xspread(p, outp, nextra, outwds)
Xunsigned char p[];
Xregister unsigned int outp, nextra, outwds;
X{
X register unsigned int i, j, nb, ne, nholes;
X
X
X if ((nextra <= 0) || (outwds <= 1))
X return;
X
X dc.sprdir = ~dc.sprdir;
X ne = nextra;
X nholes = outwds - 1; /* holes between words */
X i = outp - 1; /* last non-blank character */
X j = min(MAXLINE - 2, i + ne); /* leave room for CR, LF, EOS */
X
X while (i < j)
X {
X p[j] = p[i];
X
X if (isspace(p[i]))
X {
X if (dc.sprdir == 0)
X nb = (ne - 1)/nholes + 1;
X else
X nb = ne/nholes;
X
X ne -= nb;
X --nholes;
X
X for (; nb > 0; --nb)
X {
X --j;
X
X if(p[i] & 0x80)
X p[j] = ' ' | 0x80;
X else
X p[j] = ' ';
X }
X }
X
X --i;
X --j;
X }
X}
X
X
X
X/*
X * underline a line
X */
X
Xunderl(p0, p1)
Xregister unsigned char *p0, *p1;
X{
X register unsigned int i, j;
X register unsigned char byte;
X
X j = 0;
X
X for (i = 0; j < MAXLINE - 1; ++i)
X {
X if(isterm(p0[i]))
X break;
X
X byte = p0[i] & 0x7f;
X
X if (byte >= ' ' && byte <= '~')
X {
X if (isalpha(byte) || isdigit(byte) || dc.cuval > 0)
X {
X p1[j++] = byte | 0x80;
X continue;
X }
X }
X
X p1[j++] = p0[i];
X }
X
X p1[j++] = '\n';
X p1[j] = EOS;
X strcpy(p0, p1);
X}
X
X
X/*
X * compute width of character string
X */
X
Xwidth(s)
Xregister unsigned char *s;
X{
X register unsigned int w;
X
X w = 0;
X
X while (*s != EOS)
X {
X if(*s == '\b')
X ;
X else if (!iscr(*s))
X ++w;
X
X ++s;
X }
X
X return (w);
X}
X
X
X
X
X
X
X/*
X * Convert an integer into roman numerial for output
X */
X
Xstatic unsigned char tempbuf[25] = 0;
X
Xstruct roman
X{
X unsigned char rm[3];
X unsigned int rv;
X};
X
Xstruct roman romtab[] =
X{
X "M", 1000,
X "CM", 900,
X "D", 500,
X "CD", 400,
X "C", 100,
X "XC", 90,
X "L", 50,
X "XL", 40,
X "X", 10,
X "IX", 9,
X "V", 5,
X "IV", 4,
X "I", 1,
X 0, 0
X};
X
X
Xroman(value, minbuf)
Xregister unsigned int value;
Xregister unsigned char *minbuf;
X{
X register int i;
X
X
X tempbuf[0] = 0;
X
X for(i = 0; i < 13; ++i)
X {
X if(!value)
X break;
X
X value = romc(romtab[i].rm, romtab[i].rv, value);
X }
X
X if(dc.rlower)
X makelower();
X
X strcpy(minbuf, tempbuf);
X}
X
X
X
X
Xromc(token, max, value)
Xregister unsigned char *token;
Xregister unsigned int max, value;
X{
X while(value >= max)
X {
X value -= max;
X strcat(tempbuf, token);
X }
X
X return(value);
X}
X
X
X
Xmakelower()
X{
X register unsigned char *pnt = tempbuf;
X
X while(*pnt)
X {
X *pnt = tolower(*pnt);
X ++pnt;
X }
X}
X
X
X
X
X/*
X * get the current date and time
X *
X * NOTE: These routines are machine dependant.
X */
X
X#include <time.h>
X#define XTIME struct tm
X
Xunsigned long ITIME = 0;
Xstatic char *xmod[] =
X{
X "January",
X "February",
X "March",
X "April",
X "May",
X "June",
X "July",
X "August",
X "September",
X "October",
X "November",
X "December"
X};
X
X
X
X
Xgetdate(flag)
Xunsigned int flag;
X{
X static unsigned char dateb[30];
X register XTIME *tp;
X register unsigned char *xp;
X extern XTIME *localtime();
X
X
X
X time(&ITIME);
X tp = localtime(&ITIME);
X xp = xmod[tp->tm_mon];
X sprintf(dateb,"%s %d, 19%02d",xp,tp->tm_mday,tp->tm_year);
X
X if(flag)
X text(dateb);
X else
X return(dateb);
X}
X
X
X
Xcheckul(p)
Xregister unsigned char *p;
X{
X unsigned char h[MAXLINE];
X
X
X if (dc.ulval)
X {
X underl(p, h);
X --dc.ulval;
X }
X
X if (dc.cuval)
X {
X underl(p, h);
X lastflag = dc.cuval--;
X }
X
X if (dc.boval)
X {
X bold(p, h);
X
X if(--dc.boval == 0)
X dc.cbold = 0;
X }
X}
X
X
X
Xreset()
X{
X dc.tival = dc.inval;
X dc.rmval = dc.tmval;
X pg.offset = pg.tofset;
X}
X
X
Xdumpdivert()
X{
X register unsigned int temp;
X register unsigned char *q;
X unsigned char buff[MAXLINE];
X
X
X if(dc.divlin)
X {
X temp = pg.lineno;
X pg.lineno = 7; /* fake out bottom checker */
X dc.divert = 0;
X q = divertbuf;
X
X while(*q)
X {
X q = getl(q, buff);
X putlin(buff, 0);
X }
X
X pg.lineno = temp + dc.divlin;
X dc.divlin =
X dc.divsav =
X dc.divert = 0;
X divpnt = divertbuf;
X *divertbuf = 0;
X setbot();
X }
X}
X
X
X
Xboth()
X{
X register int i, j;
X
X ofset();
X
X if(inbuf[0])
X {
X i = width(inbuf);
X j = 0;
X
X while(inbuf[j])
X prchar(inbuf[j++]);
X
X inbuf[0] = 0;
X
X if(i < dc.tival)
X for(j = dc.tival - i; j > 0; --j)
X prchar(' ');
X }
X else
X for(j = 0; j < dc.tival; ++j)
X prchar(' ');
X}
X
X
X
Xofset()
X{
X register int j;
X
X for (j = 0; j < pg.offset; ++j)
X prchar(' ');
X
X
X for(j = 0; j < pg.eooset; ++j)
X prchar(' ');
X}
X
X
X
X
X
Xclobber(h)
Xregister unsigned char *h;
X{
X register int i;
X
X
X for (i = MAXLINE - 4; ; --i)
X {
X if(isspace(h[i]))
X h[i] = EOS;
X else
X break;
X }
X
X h[++i] = '\n';
X h[++i] = EOS;
X}
X
X
X
Xblank(h)
Xregister unsigned char *h;
X{
X register int i;
X
X for (i = 0; i < MAXLINE; ++i)
X h[i] = ' ';
X
X}
X
X
X
X
Xgetl(from, to)
Xregister unsigned char *from, *to;
X{
X while(*from)
X {
X *to++ = *from++;
X *to = 0;
X
X if(isterm(to[-1]))
X return(from);
X }
X
X return(from);
X}
X
X
X
Xaddspace()
X{
X if(dc.cuval || lastflag)
X co.outbuf[co.outp++] = ' ' | 0x80;
X else
X co.outbuf[co.outp++] = ' ';
X}
X
X
Xchkbot()
X{
X if(pg.lineno > pg.bottom)
X pfoot();
X}
//go.sysin dd *
made=TRUE
if [ $made = TRUE ]; then
/bin/chmod 664 nrotxt.c
/bin/echo -n ' '; /bin/ls -ld nrotxt.c
fi
/bin/echo 'Extracting nroindex.c'
sed 's/^X//' <<'//go.sysin dd *' >nroindex.c
X
X/*
X * Index page processor for NRO text processor
X *
X * Ron Light
X * 6016 Croftway Ct.
X * Ft. Worth, Tx. 76131
X */
X
X#include <stdio.h>
X#include "nro.h"
X
X
Xextern struct docctl dc;
Xextern struct page pg;
Xextern FILE *pout;
Xextern struct cout co;
Xextern struct macro smac;
Xextern struct file file[];
Xextern unsigned char newext[];
Xextern unsigned char *divertbuf;
Xextern unsigned char *divpnt;
Xstatic unsigned int symcnt = 0; /* index of current symbol */
Xstatic unsigned int symmax = 0;
Xstatic SYM *symbas = 0; /* pointer to base of symbol table */
Xstatic SYM *symprv = 0; /* pointer to previous symbol */
Xstatic SYM *symbeg = 0; /* pointer to begin of symbols */
X
X
X
X
X/*
X * Routine to check one entire line for any of the words
X * that may be in the index table.
X */
X
Xcindex(p)
Xregister unsigned char *p;
X{
X register unsigned char *q;
X register int i;
X register SYM *sp;
X unsigned char buff[MAXLINE];
X unsigned char wrdbuf[LNAME];
X
X move(buff, p);
X killcr(buff);
X q = buff;
X
X while((i = getwrd(q, wrdbuf)) > 0)
X {
X killpunc(wrdbuf);
X
X if(sp = locate(wrdbuf, AUTO))
X outref(sp);
X
X q += i;
X }
X}
X
X
X
X
X/*
X * Routine to add one word to the index table. If the word
X * is already present, then add the current page number to
X * the list.
X */
X
Xaddsym(p, flag, r)
Xregister unsigned char *p;
Xregister unsigned int flag, r;
X{
X register SYM *sp;
X unsigned char buff[LNAME];
X
X
X if(dc.indexx)
X {
X strncpy(buff, p, LNAME-1);
X killcr(buff);
X
X if(flag == AUTO)
X oneword(buff);
X
X if(sp = locate(buff, flag))
X {
X if(r)
X outref(sp);
X }
X else
X insert(buff, flag, r);
X }
X}
X
X
X
X
X/*
X
X locate --- locate a symbol in the symbol table
X
X locate(name, flag)
X char *name;
X int flag;
X
X returns a pointer to the symbol if found in the table. if not
X found, returns a null pointer. additionally sets up the index
X of the entry in the global variable "symcnt", and the pointer
X to the previous entry in the global variable "symprv".
X
X*/
X
X
Xstatic locate(name, flag)
Xregister unsigned char *name;
Xregister unsigned char flag;
X{
X register SYM *symcur, *symret;
X register int symcmp;
X
X
X symcnt = 0;
X symprv = SYMNUL;
X symret = SYMNUL;
X
X for (symcur = symbas; symcur != SYMNUL; symcur = symcur->nxtsym)
X {
X symcnt++;
X symcmp = strcmp(name, symcur->name);
X
X if (symcmp > 0) /* not there yet */
X {
X symprv = symcur; /* remember previous symbol */
X continue;
X }
X
X if (symcmp < 0) /* past it, not in table */
X break;
X
X symret = symcur; /* found it */
X break;
X }
X
X return(symret);
X}
X
X
X
X
X
X
X
X
X/*
X
X insert --- insert a new entry into the symbol table
X
X insert(name, flag, r)
X char *name;
X int flag, r;
X
X returns pointer to inserted entry, or a null pointer
X if one of the following occurs:
X 1. asked to insert a null name.
X 2. name already exists in table.
X 3. couldn't allocate memory for entry.
X
X*/
X
X
Xstatic insert(name, flag, r)
Xregister unsigned char *name;
Xregister unsigned int flag, r;
X{
X register SYM *symcur;
X
X
X if ((name[0] == '\0') || (locate(name, flag) != SYMNUL))
X return(SYMNUL);
X
X
X if(!(symcur = malloc(SYMSIZ))) /* space for entry */
X error("Can't allocate symbol space\n");
X else
X {
X if(!(symcur->name = malloc(strlen(name)+1)))
X error("Can't allocate name space\n");
X
X strcpy(symcur->name, name); /* put name in entry */
X symcur->flag = flag; /* auto/manual flag */
X symcur->nxtref = 0; /* no refferences yet */
X ++symmax;
X
X if (symprv == SYMNUL) /* first entry in list */
X {
X symcur->nxtsym = symbas;
X symbas = symcur;
X }
X else /* link into list */
X {
X symcur->nxtsym = symprv->nxtsym;
X symprv->nxtsym = symcur;
X }
X
X symcur->nxtref = 0;
X
X if(r)
X outref(symcur);
X }
X
X return(symcur);
X}
X
X
X
X
Xstatic outref(sp)
XSYM *sp;
X{
X REF *rp, *xp;
X
X
X /* check to see if we're on the same page */
X xp = sp->nxtref;
X
X while(xp)
X {
X if(xp->ipage == pg.curpag)
X return;
X else if(xp->nextref == 0)
X break;
X
X xp = xp->nextref;
X }
X
X if(rp = malloc(REFSIZ)) /* allocate some space */
X {
X rp->ipage = pg.curpag; /* store the page number */
X rp->nextref = 0; /* set end of refferences */
X }
X else
X error("Can't allocate reference memory\n");
X
X /* add refference to the linked list */
X if(sp->nxtref)
X xp->nextref = rp;
X else
X sp->nxtref = rp;
X}
X
X
X
X
X
X/*
X * Print out the index page
X */
Xpindex()
X{
X register REF *rp;
X register SYM *symcur = symbas;
X unsigned char buffy[LNAME];
X unsigned char buffx[200];
X unsigned char h[MAXLINE];
X
X if(!dc.indexx || !symcnt)
X return;
X
X dc.indexx =
X dc.aindex = 0;
X
X
X for(symcnt = 0; symcnt < symmax; symcnt++)
X {
X blank(h);
X sprintf(buffx, "%s", symcur->name);
X justleft(buffx, h, 0);
X buffx[0] = 0;
X rp = symcur->nxtref;
X
X while(rp)
X {
X sprintf(buffy, "%u,", rp->ipage);
X strcat(buffx, buffy);
X rp = rp->nextref;
X }
X
X buffx[strlen(buffx) - 1] = 0;
X justrite(buffx, h, dc.rmval - dc.inval);
X ifill(h);
X clobber(h);
X put(h);
X symcur = symcur->nxtsym;
X }
X}
X
X
X
Xifill(pnt)
Xregister unsigned char *pnt;
X{
X while(*pnt)
X {
X if(iswhite(*pnt) && iswhite(pnt[1]) && iswhite(pnt[2]))
X break;
X
X ++pnt;
X }
X
X while(*pnt && iswhite(*pnt))
X {
X *pnt = dc.ichr;
X ++pnt;
X }
X}
X
X
X
Xmask(pnt)
Xregister unsigned char *pnt;
X{
X while(*pnt)
X {
X *pnt &= 0x7f;
X ++pnt;
X }
X}
X
X
X
Xkillcr(p)
Xregister unsigned char *p;
X{
X register unsigned char *pnt = p;
X
X
X while(!isterm(*pnt))
X ++pnt;
X
X while(pnt > p)
X {
X if(!isalpha(*pnt) && !isdigit(*pnt))
X --pnt;
X else
X break;
X }
X
X *++pnt = 0;
X}
X
X
X
Xstatic oneword(pnt)
Xregister unsigned char *pnt;
X{
X unsigned char buff[LNAME];
X
X getwrd(pnt, buff);
X strcpy(pnt, buff);
X killpunc(pnt);
X}
X
X
X
Xstatic move(to, from)
Xregister unsigned char *to, *from;
X{
X register int i;
X
X
X for(i = 0; i < MAXLINE; ++i)
X {
X if(!(*from))
X break;
X
X if(iscr(*from))
X *to = ' ';
X else if(*from == '\b')
X {
X ++from;
X continue;
X }
X else
X *to = *from & 0x7f;
X
X ++to;
X ++from;
X }
X
X *to = 0;
X}
X
X
X
X
Xkillpunc(pnt)
Xregister unsigned char *pnt;
X{
X while(*pnt)
X {
X if(isalpha(*pnt) || isdigit(*pnt) || iswhite(*pnt)
X || *pnt == '-' || *pnt == '\'')
X ++pnt;
X else
X *pnt = 0;
X }
X}
//go.sysin dd *
made=TRUE
if [ $made = TRUE ]; then
/bin/chmod 664 nroindex.c
/bin/echo -n ' '; /bin/ls -ld nroindex.c
fi
--
More information about the Comp.sources.unix
mailing list