|
|
researchv10 Norman
0707070035051115131006640000030000040000011503200474064415100000500000003372t..c /* t..c : external declarations */
# include "stdio.h"
# include "ctype.h"
# define MAXLIN 250
# define MAXHEAD 44
# define MAXCOL 30
/* Do NOT make MAXCOL bigger with adjusting nregs[] in tr.c */
# define MAXCHS 2000
#define MAXLINLEN 300
# define MAXRPT 100
# define CLLEN 10
# define SHORTLINE 4
extern int nlin, ncol, iline, nclin, nslin;
extern int (*style)[MAXHEAD];
extern char (*font)[MAXHEAD][2];
extern char (*csize)[MAXHEAD][4];
extern char (*vsize)[MAXHEAD][4];
extern char (*cll)[CLLEN];
extern int (*flags)[MAXHEAD];
# define ZEROW 001
# define HALFUP 002
# define CTOP 004
# define CDOWN 010
extern int stynum[];
extern int qcol;
extern int *doubled, *acase, *topat;
extern int F1, F2;
extern int (*lefline)[MAXHEAD];
extern int fullbot[];
extern char *instead[];
extern int expflg;
extern int ctrflg;
extern int evenflg;
extern int *evenup;
extern int boxflg;
extern int dboxflg;
extern int linsize;
extern int tab;
extern int pr1403;
extern int linsize, delim1, delim2;
extern int allflg;
extern int textflg;
extern int left1flg;
extern int rightl;
struct colstr {char *col, *rcol;};
extern struct colstr *table[];
extern char *cspace, *cstore;
extern char *exstore, *exlim, *exspace;
extern int *sep;
extern int *used, *lused, *rused;
extern int linestop[];
extern int leftover;
extern char *last, *ifile;
extern int texname;
extern int texct, texmax;
extern char texstr[];
extern int linstart;
extern FILE *tabin, *tabout;
# define CRIGHT 2
# define CLEFT 0
# define CMID 1
# define S1 31
# define S2 32
# define S3 33
# define TMP 38
#define S9 39
# define SF 35
# define SL 34
# define LSIZE 33
# define SIND 37
# define SVS 36
/* this refers to the relative position of lines */
# define LEFT 1
# define RIGHT 2
# define THRU 3
# define TOP 1
# define BOT 2
0707070035051115121006640000030000040000010245650265271262100000500000001755t0.c /* t0.c: storage allocation */
#
# include "t..c"
int expflg = 0;
int ctrflg = 0;
int boxflg = 0;
int dboxflg = 0;
int tab = '\t';
int linsize;
int pr1403;
int delim1, delim2;
int evenflg;
int *evenup;
int F1 = 0;
int F2 = 0;
int allflg = 0;
int leftover = 0;
int textflg = 0;
int left1flg = 0;
int rightl = 0;
char *cstore, *cspace;
char *last;
struct colstr *table[MAXLIN];
int stynum[MAXLIN+1];
int fullbot[MAXLIN];
char *instead[MAXLIN];
int linestop[MAXLIN];
int (*style)[MAXHEAD];
char (*font)[MAXHEAD][2];
char (*csize)[MAXHEAD][4];
char (*vsize)[MAXHEAD][4];
int (*lefline)[MAXHEAD];
char (*cll)[CLLEN];
int (*flags)[MAXHEAD];
int qcol;
int *doubled, *acase, *topat;
int nslin, nclin;
int *sep;
int *used, *lused, *rused;
int nlin, ncol;
int iline = 1;
char *ifile = "Input";
int texname = 'a';
int texct = 0;
char texstr[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWYXZ0123456789";
int linstart;
char *exstore, *exlim, *exspace;
FILE *tabin /*= stdin */;
FILE *tabout /* = stdout */;
0707070035051115001006640000510000040000011516610474064427500000500000003744t1.c /* t1.c: main control and input switching */
#
# include "t..c"
#include <signal.h>
# ifdef gcos
/* required by GCOS because file is passed to "tbl" by troff preprocessor */
# define _f1 _f
extern FILE *_f[];
# endif
# ifdef unix
# define MACROS "/usr/lib/tmac.s"
# define PYMACS "/usr/lib/tmac.m"
# endif
# ifdef gcos
# define MACROS "cc/troff/smac"
# define PYMACS "cc/troff/mmac"
# endif
# define ever (;;)
main(argc,argv)
char *argv[];
{
# ifdef unix
int badsig();
signal(SIGPIPE, badsig);
# endif
# ifdef gcos
if(!intss()) tabout = fopen("qq", "w"); /* default media code is type 5 */
# endif
exit(tbl(argc,argv));
}
tbl(argc,argv)
char *argv[];
{
char line[5120];
/*int x;*/
/*x=malloc((char *)0); uncomment when allocation breaks*/
/* required by GCOS because "stdout" is set by troff preprocessor */
tabin=stdin; tabout=stdout;
setinp(argc,argv);
while (gets1(line, sizeof(line)))
{
fprintf(tabout, "%s\n",line);
if (prefix(".TS", line))
tableput();
}
fclose(tabin);
return(0);
}
int sargc;
char **sargv;
setinp(argc,argv)
char **argv;
{
sargc = argc;
sargv = argv;
sargc--; sargv++;
if (sargc>0)
swapin();
}
swapin()
{
char *name;
while (sargc>0 && **sargv=='-')
{
if (match("-ms", *sargv))
{
*sargv = MACROS;
break;
}
if (match("-mm", *sargv))
{
*sargv = PYMACS;
break;
}
if (match("-TX", *sargv))
pr1403=1;
if (match("-", *sargv))
break;
sargc--; sargv++;
}
if (sargc<=0) return(0);
# ifdef unix
/* file closing is done by GCOS troff preprocessor */
if (tabin!=stdin) fclose(tabin);
# endif
if (match(*sargv, "-")){
tabin=stdin;
name = "-";
}
else{
tabin = fopen(ifile= *sargv, "r");
name = ifile;
}
iline=1;
# ifdef unix
/* file names are all put into f. by the GCOS troff preprocessor */
fprintf(tabout, ".ds f. %s\n",ifile);
fprintf(tabout, ".lf %d %s\n",iline, name);
# endif
if (tabin==NULL)
error("Can't open file");
sargc--;
sargv++;
return(1);
}
# ifdef unix
badsig()
{
signal(SIGPIPE, 1);
exit(0);
}
# endif
0707070035051115101006640000030000040000010245670373132574500000500000000420t2.c /* t2.c: subroutine sequencing for one table */
# include "t..c"
tableput()
{
saveline();
savefill();
ifdivert();
cleanfc();
getcomm();
getspec();
gettbl();
getstop();
checkuse();
choochar();
maktab();
runout();
release();
rstofill();
endoff();
freearr();
restline();
}
0707070035051112121006640000030000040000011516630474064445400000500000003265t3.c /* t3.c: interpret commands affecting whole table */
# include "t..c"
struct optstr {char *optnam; int *optadd;} options [] = {
"expand", &expflg,
"EXPAND", &expflg,
"center", &ctrflg,
"CENTER", &ctrflg,
"box", &boxflg,
"BOX", &boxflg,
"allbox", &allflg,
"ALLBOX", &allflg,
"doublebox", &dboxflg,
"DOUBLEBOX", &dboxflg,
"frame", &boxflg,
"FRAME", &boxflg,
"doubleframe", &dboxflg,
"DOUBLEFRAME", &dboxflg,
"tab", &tab,
"TAB", &tab,
"linesize", &linsize,
"LINESIZE", &linsize,
"delim", &delim1,
"DELIM", &delim1,
0,0};
getcomm()
{
char line[200], *cp, nb[25], *t;
struct optstr *lp;
int c, ci, found;
for(lp= options; lp->optnam; lp++)
*(lp->optadd) = 0;
texname = texstr[texct=0];
tab = '\t';
printf(".nr %d \\n(.s\n", LSIZE);
gets1(line, sizeof(line));
/* see if this is a command line */
if (strchr(line,';') == NULL)
{
backrest(line);
return;
}
for(cp=line; (c = *cp) != ';'; cp++)
{
if (!letter(c)) continue;
found=0;
for(lp= options; lp->optadd; lp++)
{
if (prefix(lp->optnam, cp))
{
*(lp->optadd) = 1;
cp += strlen(lp->optnam);
if (letter(*cp))
error("Misspelled global option");
while (*cp==' ')cp++;
t=nb;
if ( *cp == '(')
while ((ci= *++cp) != ')')
*t++ = ci;
else cp--;
*t++ = 0; *t=0;
if (lp->optadd == &tab)
{
if (nb[0])
*(lp->optadd) = nb[0];
}
if (lp->optadd == &linsize)
printf(".nr %d %s\n", LSIZE, nb);
if (lp->optadd == &delim1)
{
delim1 = nb[0];
delim2 = nb[1];
}
found=1;
break;
}
}
if (!found)
error("Illegal option");
}
cp++;
backrest(cp);
return;
}
backrest(cp)
char *cp;
{
char *s;
for(s=cp; *s; s++);
un1getc('\n');
while (s>cp)
un1getc(*--s);
return;
}
0707070035050264701006640000510000010000011371440455733744100000500000017000t4.c /* t4.c: read table specification */
# include "t..c"
int oncol;
getspec()
{
int icol, i;
qcol = findcol()+1;/* must allow one extra for line at right */
garray(qcol);
sep[-1]= -1;
for(icol=0; icol<qcol; icol++)
{
sep[icol]= -1;
evenup[icol]=0;
cll[icol][0]=0;
for(i=0; i<MAXHEAD; i++)
{
csize[icol][i][0]=0;
vsize[icol][i][0]=0;
font[icol][i][0] = lefline[icol][i] = 0;
flags[icol][i]=0;
style[icol][i]= 'l';
}
}
for(i=0;i<MAXHEAD;i++)
lefline[qcol][i]=0; /* fixes sample55 looping */
nclin=ncol=0;
oncol =0;
left1flg=rightl=0;
readspec();
fprintf(tabout, ".rm");
for(i=0; i<ncol; i++)
fprintf(tabout, " %2s", reg(i, CRIGHT));
fprintf(tabout, "\n");
}
readspec()
{
int icol, c, sawchar, stopc, i;
char sn[10], *snp, *temp;
sawchar=icol=0;
while (c=get1char())
{
switch(c)
{
default:
if (c != tab)
error("bad table specification character");
case ' ': /* note this is also case tab */
continue;
case '\n':
if(sawchar==0) continue;
case ',':
case '.': /* end of table specification */
ncol = max(ncol, icol);
if (lefline[ncol][nclin]>0) {ncol++; rightl++;};
if(sawchar)
nclin++;
if (nclin>=MAXHEAD)
error("too many lines in specification");
icol=0;
if (ncol==0 || nclin==0)
error("no specification");
if (c== '.')
{
while ((c=get1char()) && c != '\n')
if (c != ' ' && c != '\t')
error("dot not last character on format line");
/* fix up sep - default is 3 except at edge */
for(icol=0; icol<ncol; icol++)
if (sep[icol]<0)
sep[icol] = icol+1<ncol ? 3 : 2;
if (oncol == 0)
oncol = ncol;
else if (oncol +2 <ncol)
error("tried to widen table in T&, not allowed");
return;
}
sawchar=0;
continue;
case 'C': case 'S': case 'R': case 'N': case 'L': case 'A':
c += ('a'-'A');
case '_': if (c=='_') c= '-';
case '=': case '-':
case '^':
case 'c': case 's': case 'n': case 'r': case 'l': case 'a':
style[icol][nclin]=c;
if (c== 's' && icol<=0)
error("first column can not be S-type");
if (c=='s' && style[icol-1][nclin] == 'a')
{
fprintf(tabout, ".tm warning: can't span a-type cols, changed to l\n");
style[icol-1][nclin] = 'l';
}
if (c=='s' && style[icol-1][nclin] == 'n')
{
fprintf(tabout, ".tm warning: can't span n-type cols, changed to c\n");
style[icol-1][nclin] = 'c';
}
icol++;
if (c=='^' && nclin<=0)
error("first row can not contain vertical span");
if (icol>qcol)
error("too many columns in table");
sawchar=1;
continue;
case 'b': case 'i':
c += 'A'-'a';
case 'B': case 'I':
if (icol==0) continue;
snp=font[icol-1][nclin];
snp[0]= (c=='I' ? '2' : '3');
snp[1]=0;
continue;
case 't': case 'T':
if (icol>0)
flags[icol-1][nclin] |= CTOP;
continue;
case 'd': case 'D':
if (icol>0)
flags[icol-1][nclin] |= CDOWN;
continue;
case 'f': case 'F':
if (icol==0) continue;
snp=font[icol-1][nclin];
snp[0]=snp[1]=stopc=0;
for(i=0; i<2; i++)
{
c = get1char();
if (i==0 && c=='(')
{
stopc=')';
c = get1char();
}
if (c==0) break;
if (c==stopc) {stopc=0; break;}
if (stopc==0) if (c==' ' || c== tab ) break;
if (c=='\n' || c == '|'){un1getc(c); break;}
snp[i] = c;
if (c>= '0' && c<= '9') break;
}
if (stopc) if (get1char()!=stopc)
error("Nonterminated font name");
continue;
case 'P': case 'p':
if (icol<=0) continue;
temp = snp = csize[icol-1][nclin];
while (c = get1char())
{
if (c== ' ' || c== tab || c=='\n') break;
if (c=='-' || c == '+')
if (snp>temp)
break;
else
*snp++=c;
else
if (digit(c))
*snp++ = c;
else break;
if (snp-temp>4)
error("point size too large");
}
*snp = 0;
if (atoi(temp)>36)
error("point size unreasonable");
un1getc (c);
continue;
case 'V': case 'v':
if (icol<=0) continue;
temp = snp = vsize[icol-1][nclin];
while (c = get1char())
{
if (c== ' ' || c== tab || c=='\n') break;
if (c=='-' || c == '+')
if (snp>temp)
break;
else
*snp++=c;
else
if (digit(c))
*snp++ = c;
else break;
if (snp-temp>4)
error("vertical spacing value too large");
}
*snp=0;
un1getc(c);
continue;
case 'w': case 'W':
snp = cll [icol-1];
/* Dale Smith didn't like this check - possible to have two text blocks
of different widths now ....
if (*snp)
{
fprintf(tabout, "Ignored second width specification");
continue;
}
/* end commented out code ... */
stopc=0;
while (c = get1char())
{
if (snp==cll[icol-1] && c=='(')
{
stopc = ')';
continue;
}
if ( !stopc && (c>'9' || c< '0'))
break;
if (stopc && c== stopc)
break;
*snp++ =c;
}
*snp=0;
if (snp-cll[icol-1]>CLLEN)
error ("column width too long");
if (!stopc)
un1getc(c);
continue;
case 'e': case 'E':
if (icol<1) continue;
evenup[icol-1]=1;
evenflg=1;
continue;
case 'z': case 'Z': /* zero width-ignre width this item */
if (icol<1) continue;
flags[icol-1][nclin] |= ZEROW;
continue;
case 'u': case 'U': /* half line up */
if (icol<1) continue;
flags[icol-1][nclin] |= HALFUP;
continue;
case '0': case '1': case '2': case '3': case '4':
case '5': case '6': case '7': case '8': case '9':
sn[0] = c;
snp=sn+1;
while (digit(*snp++ = c = get1char()))
;
un1getc(c);
sep[icol-1] = max(sep[icol-1], numb(sn));
continue;
case '|':
lefline[icol][nclin]++;
if (icol==0) left1flg=1;
continue;
}
}
error("EOF reading table specification");
}
findcol()
{
# define FLNLIM 200
/* this counts the number of columns and then puts the line back*/
char *s, line[FLNLIM+2], *p;
int c, n=0, inpar=0;
while ((c=get1char())!=EOF && c == ' ')
;
if (c!='\n')
un1getc(c);
for(s=line; *s = c = get1char(); s++)
{
if (c==')') inpar=0;
if (inpar) continue;
if (c=='\n' || c == EOF || c == '.' || c==',')
break;
else if (c=='(')
inpar=1;
else
if (s>=line+FLNLIM)
error("too long spec line");
}
for(p=line; p<s; p++)
switch (c= *p)
{
case 'l': case 'r': case 'c': case 'n': case 'a': case 's':
case 'L': case 'R': case 'C': case 'N': case 'A': case 'S':
case '-': case '=': case '_':
n++;
}
while (p>=line)
un1getc(*p--);
return(n);
}
garray(qcol)
{
char * getcore();
style = (int (*)[]) getcore(MAXHEAD*qcol, sizeof(int));
evenup = (int *) getcore(qcol, sizeof(int));
lefline = (int (*)[]) getcore(MAXHEAD*(qcol+1), sizeof (int)); /*+1 for sample55 loop - others may need it too*/
font = (char (*)[][2]) getcore(MAXHEAD*qcol, 2);
csize = (char (*)[MAXHEAD][4]) getcore(MAXHEAD*qcol, 4);
vsize = (char (*)[MAXHEAD][4]) getcore(MAXHEAD*qcol, 4);
flags = (int (*)[]) getcore(MAXHEAD*qcol, sizeof(int));
cll = (char (*)[])getcore(qcol, CLLEN);
sep = (int *) getcore(qcol+1, sizeof(int));
sep++; /* sep[-1] must be legal */
used = (int *) getcore(qcol+1, sizeof(int));
lused = (int *) getcore(qcol+1, sizeof(int));
rused = (int *) getcore(qcol+1, sizeof(int));
doubled = (int *) getcore(qcol+1, sizeof(int));
acase = (int *) getcore(qcol+1, sizeof(int));
topat = (int *) getcore(qcol+1, sizeof(int));
}
char *
getcore(a,b)
{
char *x, *calloc();
x = calloc(a,b);
if (x==0)
error("Couldn't get memory");
return(x);
}
freearr()
{
cfree(style);
cfree(evenup);
cfree(lefline);
cfree(flags);
cfree(font);
cfree(csize);
cfree(vsize);
cfree(cll);
cfree(--sep); /* netnews says this should be --sep because incremented earlier! */
cfree(used);
cfree(lused);
cfree(rused);
cfree(doubled);
cfree(acase);
cfree(topat);
}
0707070035051112061006640000510000040000010207410474064464000000500000006556t5.c /* t5.c: read data for table */
# include "t..c"
gettbl()
{
extern char *chspace();
extern char *maknew();
int icol, ch;
cstore=cspace= chspace();
textflg=0;
for (nlin=nslin=0; gets1(cstore, MAXCHS - (cstore-cspace)); nlin++)
{
stynum[nlin]=nslin;
if (prefix(".TE", cstore))
{
leftover=0;
break;
}
if (prefix(".TC", cstore) || prefix(".T&", cstore))
{
readspec();
nslin++;
}
if (nlin>=MAXLIN)
{
leftover=(int)cstore;
break;
}
fullbot[nlin]=0;
if (cstore[0] == '.' && !isdigit(cstore[1]))
{
instead[nlin] = cstore;
while (*cstore++);
continue;
}
else instead[nlin] = 0;
if (nodata(nlin))
{
if (ch = oneh(nlin))
fullbot[nlin]= ch;
table[nlin] = (struct colstr *) alocv((ncol+2)*sizeof(table[0][0]));
for(icol=0;icol<ncol;icol++){
table[nlin][icol].rcol = "";
table[nlin][icol].col = "";
}
nlin++;
nslin++;
fullbot[nlin] = 0;
instead[nlin] = (char *) 0;
}
table[nlin] = (struct colstr *) alocv((ncol+2)*sizeof(table[0][0]));
if (cstore[1]==0)
switch(cstore[0])
{
case '_': fullbot[nlin]= '-'; continue;
case '=': fullbot[nlin]= '='; continue;
}
stynum[nlin] = nslin;
nslin = min(nslin+1, nclin-1);
for (icol = 0; icol <ncol; icol++)
{
table[nlin][icol].col = cstore;
table[nlin][icol].rcol=0;
ch=1;
if (match(cstore, "T{")){ /* text follows */
table[nlin][icol].col =
(char *)gettext(cstore, nlin, icol,
font[icol][stynum[nlin]],
csize[icol][stynum[nlin]]);
}
else
{
for(; (ch= *cstore) != '\0' && ch != tab; cstore++)
;
*cstore++ = '\0';
switch(ctype(nlin,icol)) /* numerical or alpha, subcol */
{
case 'n':
table[nlin][icol].rcol = maknew(table[nlin][icol].col);
break;
case 'a':
table[nlin][icol].rcol = table[nlin][icol].col;
table[nlin][icol].col = "";
break;
}
}
while (ctype(nlin,icol+1)== 's') /* spanning */
table[nlin][++icol].col = "";
if (ch == '\0') break;
}
while (++icol <ncol+2)
{
table[nlin][icol].col = "";
table [nlin][icol].rcol=0;
}
while (*cstore != '\0')
cstore++;
if (cstore-cspace + MAXLINLEN > MAXCHS)
cstore = cspace = chspace();
}
last = cstore;
permute();
if (textflg) untext();
return;
}
nodata(il)
{
int c;
for (c=0; c<ncol;c++)
{
switch(ctype(il,c))
{
case 'c': case 'n': case 'r': case 'l': case 's': case 'a':
return(0);
}
}
return(1);
}
oneh(lin)
{
int k, icol;
k = ctype(lin,0);
for(icol=1; icol<ncol; icol++)
{
if (k != ctype(lin,icol))
return(0);
}
return(k);
}
# define SPAN "\\^"
permute()
{
int irow, jcol, is;
char *start, *strig;
for(jcol=0; jcol<ncol; jcol++)
{
for(irow=1; irow<nlin; irow++)
{
if (vspand(irow,jcol,0))
{
is = prev(irow);
if (is<0)
error("Vertical spanning in first row not allowed");
start = table[is][jcol].col;
strig = table[is][jcol].rcol;
while (irow<nlin &&vspand(irow,jcol,0))
irow++;
table[--irow][jcol].col = start;
table[irow][jcol].rcol = strig;
while (is<irow)
{
table[is][jcol].rcol =0;
table[is][jcol].col= SPAN;
is = next(is);
}
}
}
}
}
vspand(ir,ij,ifform)
{
if (ir<0) return(0);
if (ir>=nlin)return(0);
if (instead[ir]) return(0);
if (ifform==0 && ctype(ir,ij)=='^') return(1);
if (table[ir][ij].rcol!=0) return(0);
if (fullbot[ir]) return(0);
return(vspen(table[ir][ij].col));
}
vspen(s)
char *s;
{
if (s==0) return(0);
if (!point(s)) return(0);
return(match(s, SPAN));
}
0707070035051112041006640000030000040000010245600265271264300000500000014652t6.c /* t6.c: compute tab stops */
# define tx(a) (a>0 && a<128)
# include "t..c"
maktab()
{
# define FN(i,c) font[c][stynum[i]]
# define SZ(i,c) csize[c][stynum[i]]
/* define the tab stops of the table */
int icol, ilin, tsep, k, ik, vforml, il, text;
char *s;
for(icol=0; icol <ncol; icol++)
{
doubled[icol] = acase[icol] = 0;
fprintf(tabout, ".nr %2s 0\n", reg(icol,CRIGHT));
for(text=0; text<2; text++)
{
if (text)
fprintf(tabout, ".%2s\n.rm %2s\n", reg(icol, CRIGHT), reg(icol, CRIGHT));
for(ilin=0; ilin<nlin; ilin++)
{
if (instead[ilin]|| fullbot[ilin]) continue;
vforml=ilin;
for(il=prev(ilin); il>=0 && vspen(table[il][icol].col); il=prev(il))
vforml=il;
if (fspan(vforml,icol)) continue;
if (filler(table[ilin][icol].col)) continue;
if ((flags[icol][stynum[ilin]] & ZEROW) != 0) continue;
switch(ctype(vforml,icol))
{
case 'a':
acase[icol]=1;
s = table[ilin][icol].col;
if ((int)s>0 && (int)s<128 && text)
{
if (doubled[icol]==0)
fprintf(tabout, ".nr %d 0\n.nr %d 0\n",S1,S2);
doubled[icol]=1;
fprintf(tabout, ".if \\n(%c->\\n(%d .nr %d \\n(%c-\n",s,S2,S2,s);
}
case 'n':
if (table[ilin][icol].rcol!=0)
{
if (doubled[icol]==0 && text==0)
fprintf(tabout, ".nr %d 0\n.nr %d 0\n", S1, S2);
doubled[icol]=1;
if (real(s=table[ilin][icol].col) && !vspen(s))
{
if (tx((int)s) != text) continue;
fprintf(tabout, ".nr %d ", TMP);
wide(s, FN(vforml,icol), SZ(vforml,icol)); fprintf(tabout, "\n");
fprintf(tabout, ".if \\n(%d<\\n(%d .nr %d \\n(%d\n", S1, TMP, S1, TMP);
}
if (text==0 && real(s=table[ilin][icol].rcol) && !vspen(s) && !barent(s))
{
fprintf(tabout, ".nr %d \\w%c%s%c\n",TMP, F1, s, F1);
fprintf(tabout, ".if \\n(%d<\\n(%d .nr %d \\n(%d\n",S2,TMP,S2,TMP);
}
continue;
}
case 'r':
case 'c':
case 'l':
if (real(s=table[ilin][icol].col) && !vspen(s))
{
if (tx((int)s) != text) continue;
fprintf(tabout, ".nr %d ", TMP);
wide(s, FN(vforml,icol), SZ(vforml,icol)); fprintf(tabout, "\n");
fprintf(tabout, ".if \\n(%2s<\\n(%d .nr %2s \\n(%d\n", reg(icol,CRIGHT), TMP, reg(icol,CRIGHT), TMP);
}
}
}
}
if (acase[icol])
{
fprintf(tabout, ".if \\n(%d>=\\n(%2s .nr %2s \\n(%du+2n\n",S2,reg(icol,CRIGHT),reg(icol,CRIGHT),S2);
}
if (doubled[icol])
{
fprintf(tabout, ".nr %2s \\n(%d\n", reg(icol,CMID), S1);
fprintf(tabout, ".nr %d \\n(%2s+\\n(%d\n",TMP,reg(icol,CMID),S2);
fprintf(tabout, ".if \\n(%d>\\n(%2s .nr %2s \\n(%d\n",TMP,reg(icol,CRIGHT),reg(icol,CRIGHT),TMP);
fprintf(tabout, ".if \\n(%d<\\n(%2s .nr %2s +(\\n(%2s-\\n(%d)/2\n",TMP,reg(icol,CRIGHT),reg(icol,CMID),reg(icol,CRIGHT),TMP);
}
if (cll[icol][0])
{
fprintf(tabout, ".nr %d %sn\n", TMP, cll[icol]);
fprintf(tabout, ".if \\n(%2s<\\n(%d .nr %2s \\n(%d\n",reg(icol,CRIGHT), TMP, reg(icol,CRIGHT), TMP);
}
for(ilin=0; ilin<nlin; ilin++)
if (k=lspan(ilin, icol))
{
s=table[ilin][icol-k].col;
if (!real(s) || barent(s) || vspen(s) ) continue;
fprintf(tabout, ".nr %d ", TMP);
wide(table[ilin][icol-k].col, FN(ilin,icol-k), SZ(ilin,icol-k));
for(ik=k; ik>=0; ik--)
{
fprintf(tabout, "-\\n(%2s",reg(icol-ik,CRIGHT));
if (!expflg && ik>0) fprintf(tabout, "-%dn", sep[icol-ik]);
}
fprintf(tabout, "\n");
fprintf(tabout, ".if \\n(%d>0 .nr %d \\n(%d/%d\n", TMP, TMP, TMP, k);
fprintf(tabout, ".if \\n(%d<0 .nr %d 0\n", TMP, TMP);
for(ik=1; ik<=k; ik++)
{
if (doubled[icol-k+ik])
fprintf(tabout, ".nr %2s +\\n(%d/2\n", reg(icol-k+ik,CMID), TMP);
fprintf(tabout, ".nr %2s +\\n(%d\n", reg(icol-k+ik,CRIGHT), TMP);
}
}
}
if (textflg) untext();
/* if even requested, make all columns widest width */
# define TMP1 S1
# define TMP2 S2
if (evenflg)
{
fprintf(tabout, ".nr %d 0\n", TMP);
for(icol=0; icol<ncol; icol++)
{
if (evenup[icol]==0) continue;
fprintf(tabout, ".if \\n(%2s>\\n(%d .nr %d \\n(%2s\n",
reg(icol,CRIGHT), TMP, TMP, reg(icol,CRIGHT));
}
for(icol=0; icol<ncol; icol++)
{
if (evenup[icol]==0)
/* if column not evened just retain old interval */
continue;
if (doubled[icol])
fprintf(tabout, ".nr %2s (100*\\n(%2s/\\n(%2s)*\\n(%d/100\n",
reg(icol,CMID), reg(icol,CMID), reg(icol,CRIGHT), TMP);
/* that nonsense with the 100's and parens tries
to avoid overflow while proportionally shifting
the middle of the number */
fprintf(tabout, ".nr %2s \\n(%d\n", reg(icol,CRIGHT), TMP);
}
}
/* now adjust for total table width */
for(tsep=icol=0; icol<ncol; icol++)
tsep+= sep[icol];
if (expflg)
{
fprintf(tabout, ".nr %d 0", TMP);
for(icol=0; icol<ncol; icol++)
fprintf(tabout, "+\\n(%2s", reg(icol,CRIGHT));
fprintf(tabout, "\n");
fprintf(tabout, ".nr %d \\n(.l-\\n(%d\n", TMP, TMP);
if (boxflg || dboxflg || allflg)
/* tsep += 1; */ ;
else
tsep -= sep[ncol-1];
fprintf(tabout, ".nr %d \\n(%d/%d\n", TMP, TMP, tsep);
fprintf(tabout, ".if \\n(%d<0 .nr %d 0\n", TMP, TMP);
}
else
fprintf(tabout, ".nr %d 1n\n", TMP);
fprintf(tabout, ".nr %2s 0\n",reg(-1, CRIGHT));
tsep= (boxflg || allflg || dboxflg || left1flg) ? 2 : 0;
if (sep[-1] >= 0) tsep = sep[-1];
for(icol=0; icol<ncol; icol++)
{
fprintf(tabout, ".nr %2s \\n(%2s+((%d*\\n(%d)/2)\n",reg(icol,CLEFT), reg(icol-1,CRIGHT), tsep, TMP);
fprintf(tabout, ".nr %2s +\\n(%2s\n",reg(icol,CRIGHT), reg(icol,CLEFT));
if (doubled[icol])
{
/* the next line is last-ditch effort to avoid zero field width */
/*fprintf(tabout, ".if \\n(%2s=0 .nr %2s 1\n",reg(icol,CMID), reg(icol,CMID));*/
fprintf(tabout, ".nr %2s +\\n(%2s\n", reg(icol,CMID), reg(icol,CLEFT));
/* fprintf(tabout, ".if n .if \\n(%s%%24>0 .nr %s +12u\n",reg(icol,CMID), reg(icol,CMID)); */
}
tsep=sep[icol]*2;
}
if (rightl)
fprintf(tabout, ".nr %s (\\n(%s+\\n(%s)/2\n",reg(ncol-1, CRIGHT), reg(ncol-1,CLEFT), reg(ncol-2,CRIGHT));
fprintf(tabout, ".nr TW \\n(%2s\n", reg(ncol-1, CRIGHT));
tsep = sep[ncol-1];
if (boxflg || allflg || dboxflg)
fprintf(tabout, ".nr TW +((%d*\\n(%d)/2)\n", tsep, TMP);
fprintf(tabout,
".if t .if (\\n(TW+\\n(.o)>7.65i .tm Table at line %d file %s is too wide - \\n(TW units\n", iline-1, ifile);
return;
}
wide(s, fn, size)
char *s, *size, *fn;
{
if (point(s))
{
fprintf(tabout, "\\w%c", F1);
if (*fn>0) putfont(fn);
if (*size) putsize(size);
fprintf(tabout, "%s", s);
if (*fn>0) putfont("P");
if (*size) putsize("0");
fprintf(tabout, "%c",F1);
}
else
fprintf(tabout, "\\n(%c-", s);
}
filler(s)
char *s;
{
return (point(s) && s[0]=='\\' && s[1] == 'R');
}
0707070035051115071006640000030000040000010245700265271264300000500000006174t7.c /* t7.c: control to write table entries */
# include "t..c"
# define realsplit ((ct=='a'||ct=='n') && table[ldata][c].rcol)
runout()
{
int i;
if (boxflg || allflg || dboxflg) need();
if (ctrflg)
{
fprintf(tabout, ".nr #I \\n(.i\n");
fprintf(tabout, ".in +(\\n(.lu-\\n(TWu-\\n(.iu)/2u\n");
}
fprintf(tabout, ".fc %c %c\n", F1, F2);
fprintf(tabout, ".nr #T 0-1\n");
deftail();
for(i=0; i<nlin; i++)
putline(i,i);
if (leftover)
yetmore();
fprintf(tabout, ".fc\n");
fprintf(tabout, ".nr T. 1\n");
fprintf(tabout, ".T# 1\n");
if (ctrflg)
fprintf(tabout, ".in \\n(#Iu\n");
}
runtabs(lform, ldata)
{
int c, ct, vforml, lf;
fprintf(tabout, ".ta ");
for(c=0; c<ncol; c++)
{
vforml=lform;
for(lf=prev(lform); lf>=0 && vspen(table[lf][c].col); lf=prev(lf))
vforml=lf;
if (fspan(vforml,c))
continue;
switch(ct=ctype(vforml,c))
{
case 'n':
case 'a':
if (table[ldata][c].rcol)
if (lused[c]) /*Zero field width*/
fprintf(tabout, "\\n(%2su ",reg(c,CMID));
case 'c':
case 'l':
case 'r':
if (realsplit? rused[c]: (used[c]+lused[c]))
fprintf(tabout, "\\n(%2su ",reg(c,CRIGHT));
continue;
case 's':
if (lspan(lform, c))
fprintf(tabout, "\\n(%2su ", reg(c,CRIGHT));
continue;
}
}
fprintf(tabout, "\n");
}
ifline(s)
char *s;
{
if (!point(s)) return(0);
if (s[0] == '\\') s++;
if (s[1] ) return(0);
if (s[0] == '_') return('-');
if (s[0] == '=') return('=');
return(0);
}
need()
{
int texlin, horlin, i;
for(texlin=horlin=i=0; i<nlin; i++)
{
if (fullbot[i]!=0)
horlin++;
else
if (instead[i]!=0)
continue;
else
texlin++;
}
fprintf(tabout, ".ne %dv+%dp\n",texlin,2*horlin);
}
deftail()
{
int i, c, lf, lwid;
for(i=0; i<MAXHEAD; i++)
if (linestop[i])
fprintf(tabout, ".nr #%c 0-1\n", linestop[i]+'a'-1);
fprintf(tabout, ".nr #a 0-1\n");
fprintf(tabout, ".eo\n");
fprintf(tabout, ".de T#\n");
fprintf(tabout, ".nr 35 1m\n");
fprintf(tabout, ".ds #d .d\n");
fprintf(tabout, ".if \\(ts\\n(.z\\(ts\\(ts .ds #d nl\n");
fprintf(tabout, ".mk ##\n");
fprintf(tabout, ".nr ## -1v\n");
fprintf(tabout, ".ls 1\n");
for(i=0; i<MAXHEAD; i++)
if (linestop[i])
fprintf(tabout, ".if \\n(#T>=0 .nr #%c \\n(#T\n",linestop[i]+'a'-1);
if (boxflg || allflg || dboxflg) /* bottom of table line */
if (fullbot[nlin-1]==0)
{
if (!pr1403)
fprintf(tabout, ".if \\n(T. .vs \\n(.vu-\\n(.sp\n");
fprintf(tabout, ".if \\n(T. ");
drawline(nlin,0,ncol, dboxflg ? '=' : '-',1,0);
fprintf(tabout, "\n.if \\n(T. .vs\n");
/* T. is really an argument to a macro but because of
eqn we don't dare pass it as an argument and reference by $1 */
}
for(c=0; c<ncol; c++)
{
if ((lf=left(nlin-1,c, &lwid))>=0)
{
fprintf(tabout, ".if \\n(#%c>=0 .sp -1\n",linestop[lf]+'a'-1);
fprintf(tabout, ".if \\n(#%c>=0 ", linestop[lf]+'a'-1);
tohcol(c);
drawvert(lf, nlin-1, c, lwid);
fprintf(tabout, "\\h'|\\n(TWu'\n");
}
}
if (boxflg || allflg || dboxflg) /* right hand line */
{
fprintf(tabout, ".if \\n(#a>=0 .sp -1\n");
fprintf(tabout, ".if \\n(#a>=0 \\h'|\\n(TWu'");
drawvert (0, nlin-1, ncol, dboxflg? 2 : 1);
fprintf(tabout, "\n");
}
fprintf(tabout, ".ls\n");
fprintf(tabout, "..\n");
fprintf(tabout, ".ec\n");
}
0707070035051115061006660000030000040000010245710406576507100000500000017553t8.c /* t8.c: write out one line of output table */
# include "t..c"
# define realsplit ((ct=='a'||ct=='n') && table[nl][c].rcol)
int watchout;
int once;
putline(i, nl)
/* i is line number for deciding format */
/* nl is line number for finding data usually identical */
{
int c, lf, ct, form, lwid, vspf, ip, cmidx, exvspen, vforml;
int vct, chfont, uphalf;
char *s, *size, *fn;
cmidx=watchout=vspf=exvspen=0;
if (i==0) once=0;
if (i==0 && ( allflg || boxflg || dboxflg))
fullwide(0, dboxflg? '=' : '-');
if (instead[nl]==0 && fullbot[nl] ==0)
for(c=0; c<ncol; c++)
{
s = table[nl][c].col;
if (s==0) continue;
if (vspen(s))
{
for(ip=nl; ip<nlin; ip=next(ip))
if (!vspen(s=table[ip][c].col)) break;
if ((int)s>0 && (int)s<128)
fprintf(tabout, ".ne \\n(%c|u+\\n(.Vu\n",s);
continue;
}
if (point(s)) continue;
fprintf(tabout, ".ne \\n(%c|u+\\n(.Vu\n",s);
watchout=1;
}
if (linestop[nl])
fprintf(tabout, ".mk #%c\n", linestop[nl]+'a'-1);
lf = prev(nl);
if (instead[nl])
{
puts(instead[nl]);
return;
}
if (fullbot[nl])
{
switch (ct=fullbot[nl])
{
case '=':
case '-':
fullwide(nl,ct);
}
return;
}
for(c=0; c<ncol; c++)
{
if (instead[nl]==0 && fullbot[nl]==0)
if (vspen(table[nl][c].col)) vspf=1;
if (lf>=0)
if (vspen(table[lf][c].col)) vspf=1;
}
if (vspf)
{
fprintf(tabout, ".nr #^ \\n(\\*(#du\n");
fprintf(tabout, ".nr #- \\n(#^\n"); /* current line position relative to bottom */
}
vspf=0;
chfont=0;
for(c=0; c<ncol; c++)
{
s = table[nl][c].col;
if (s==0) continue;
chfont |= (int)(font[c][stynum[nl]]);
if (point(s) ) continue;
lf=prev(nl);
if (lf>=0 && vspen(table[lf][c].col))
fprintf(tabout, ".if (\\n(%c|+\\n(^%c-1v)>\\n(#- .nr #- +(\\n(%c|+\\n(^%c-\\n(#--1v)\n",s,'a'+c,s,'a'+c);
else
fprintf(tabout, ".if (\\n(%c|+\\n(#^-1v)>\\n(#- .nr #- +(\\n(%c|+\\n(#^-\\n(#--1v)\n",s,s);
}
if (allflg && once>0 )
fullwide(i,'-');
once=1;
runtabs(i, nl);
if (allh(i) && !pr1403)
{
fprintf(tabout, ".nr %d \\n(.v\n", SVS);
fprintf(tabout, ".vs \\n(.vu-\\n(.sp\n");
fprintf(tabout, ".nr 35 \\n(.vu\n");
}
else
fprintf(tabout, ".nr 35 1m\n");
if (chfont)
fprintf(tabout, ".nr %2d \\n(.f\n", S1);
fprintf(tabout, "\\&");
vct = 0;
for(c=0; c<ncol; c++)
{
uphalf=0;
if (watchout==0 && i+1<nlin && (lf=left(i,c, &lwid))>=0)
{
tohcol(c);
drawvert(lf, i, c, lwid);
vct += 2;
}
if (rightl && c+1==ncol) continue;
vforml=i;
for(lf=prev(nl); lf>=0 && vspen(table[lf][c].col); lf=prev(lf))
vforml= lf;
form= ctype(vforml,c);
if (form != 's')
{
ct = reg(c,CLEFT);
if (form=='a') ct = reg(c,CMID);
if (form=='n' && table[nl][c].rcol && lused[c]==0) ct= reg(c,CMID);
fprintf(tabout, "\\h'|\\n(%2su'", ct);
}
s= table[nl][c].col;
fn = font[c][stynum[vforml]];
size = csize[c][stynum[vforml]];
if (*size==0)size=0;
if ((flags[c][stynum[nl]] & HALFUP)!=0 && pr1403 == 0)
uphalf=1;
switch(ct=ctype(vforml, c))
{
case 'n':
case 'a':
if (table[nl][c].rcol)
{
if (lused[c]) /*Zero field width*/
{
ip = prev(nl);
if (ip>=0)
if (vspen(table[ip][c].col))
{
if (exvspen==0)
{
fprintf(tabout, "\\v'-(\\n(\\*(#du-\\n(^%cu", c+'a');
if (cmidx)
fprintf(tabout, "-((\\n(#-u-\\n(^%cu)/2u)", c+'a');
vct++;
if (pr1403) /* must round to whole lines */
fprintf(tabout, "/1v*1v");
fprintf(tabout, "'");
exvspen=1;
}
}
fprintf(tabout, "%c%c",F1,F2);
if (uphalf) fprintf(tabout, "\\u");
puttext(s,fn,size);
if (uphalf) fprintf(tabout, "\\d");
fprintf(tabout, "%c",F1);
}
s= table[nl][c].rcol;
form=1;
break;
}
case 'c':
form=3; break;
case 'r':
form=2; break;
case 'l':
form=1; break;
case '-':
case '=':
if (real(table[nl][c].col))
fprintf(stderr,"%s: line %d: Data ignored on table line %d\n", ifile, iline-1, i+1);
makeline(i,c,ct);
continue;
default:
continue;
}
if (realsplit ? rused[c]: used[c]) /*Zero field width*/
{
/* form: 1 left, 2 right, 3 center adjust */
if (ifline(s))
{
makeline(i,c,ifline(s));
continue;
}
if (filler(s))
{
fprintf(tabout, "\\l'|\\n(%2su\\&%s'", reg(c,CRIGHT), s+2);
continue;
}
ip = prev(nl);
cmidx = (flags[c][stynum[nl]] & (CTOP|CDOWN))==0;
if (ip>=0)
if (vspen(table[ip][c].col))
{
if (exvspen==0)
{
fprintf(tabout, "\\v'-(\\n(\\*(#du-\\n(^%cu", c+'a');
if (cmidx)
fprintf(tabout, "-((\\n(#-u-\\n(^%cu)/2u)", c+'a');
vct++;
if (pr1403) /* round to whole lines */
fprintf(tabout, "/1v*1v");
fprintf(tabout, "'");
}
}
fprintf(tabout, "%c", F1);
if (form!= 1)
fprintf(tabout, "%c", F2);
if (vspen(s))
vspf=1;
else
{
if (uphalf) fprintf(tabout, "\\u");
puttext(s, fn, size);
if (uphalf) fprintf(tabout, "\\d");
}
if (form !=2)
fprintf(tabout, "%c", F2);
fprintf(tabout, "%c", F1);
}
ip = prev(nl);
if (ip>=0)
if (vspen(table[ip][c].col))
{
exvspen = (c+1 < ncol) && vspen(table[ip][c+1].col) &&
(topat[c] == topat[c+1]) &&
(cmidx == (flags[c+1] [stynum[nl]]&(CTOP|CDOWN)==0)) && (left(i,c+1,&lwid)<0);
if (exvspen==0)
{
fprintf(tabout, "\\v'(\\n(\\*(#du-\\n(^%cu", c+'a');
if (cmidx)
fprintf(tabout, "-((\\n(#-u-\\n(^%cu)/2u)", c+'a');
vct++;
if (pr1403) /* round to whole lines */
fprintf(tabout, "/1v*1v");
fprintf(tabout, "'");
}
}
else
exvspen=0;
/* if lines need to be split for gcos here is the place for a backslash */
if (vct > 7 && c < ncol)
{
fprintf(tabout, "\n.sp-1\n\\&");
vct=0;
}
}
fprintf(tabout, "\n");
if (allh(i) && !pr1403) fprintf(tabout, ".vs \\n(%du\n", SVS);
if (watchout)
funnies(i,nl);
if (vspf)
{
for(c=0; c<ncol; c++)
if (vspen(table[nl][c].col) && (nl==0 || (lf=prev(nl))<0 || !vspen(table[lf][c].col)))
{
fprintf(tabout, ".nr ^%c \\n(#^u\n", 'a'+c);
topat[c]=nl;
}
}
}
puttext(s,fn, size)
char *s, *size, *fn;
{
if (point(s))
{
putfont(fn);
putsize(size);
fprintf(tabout, "%s",s);
if (*fn>0) fprintf(tabout, "\\f\\n(%2d", S1);
if (size!=0) putsize("0");
}
}
funnies( stl, lin)
{
/* write out funny diverted things */
int c, s, pl, lwid, dv, lf, ct;
char *fn;
fprintf(tabout, ".mk ##\n"); /* rmember current vertical position */
fprintf(tabout, ".nr %d \\n(##\n", S1); /* bottom position */
for(c=0; c<ncol; c++)
{
s = (int)table[lin][c].col;
if (point(s)) continue;
if (s==0) continue;
fprintf(tabout, ".sp |\\n(##u-1v\n");
fprintf(tabout, ".nr %d ", SIND);
for(pl=stl; pl>=0 && !isalpha(ct=ctype(pl,c)); pl=prev(pl))
;
switch (ct)
{
case 'n':
case 'c':
fprintf(tabout, "(\\n(%2su+\\n(%2su-\\n(%c-u)/2u\n",reg(c,CLEFT),reg(c-1+ctspan(lin,c),CRIGHT), s);
break;
case 'l':
fprintf(tabout, "\\n(%2su\n",reg(c,CLEFT));
break;
case 'a':
fprintf(tabout, "\\n(%2su\n",reg(c,CMID));
break;
case 'r':
fprintf(tabout, "\\n(%2su-\\n(%c-u\n", reg(c,CRIGHT), s);
break;
}
fprintf(tabout, ".in +\\n(%du\n", SIND);
fn=font[c][stynum[stl]];
putfont(fn);
pl = prev(stl);
if (stl>0 && pl>=0 && vspen(table[pl][c].col))
{
fprintf(tabout, ".sp |\\n(^%cu\n", 'a'+c);
if ((flags[c][stynum[stl]]&(CTOP|CDOWN))==0)
{
fprintf(tabout, ".nr %d \\n(#-u-\\n(^%c-\\n(%c|+1v\n",TMP, 'a'+c, s);
fprintf(tabout, ".if \\n(%d>0 .sp \\n(%du/2u", TMP, TMP);
if (pr1403) /* round */
fprintf(tabout, "/1v*1v");
fprintf(tabout, "\n");
}
}
fprintf(tabout, ".%c+\n",s);
fprintf(tabout, ".in -\\n(%du\n", SIND);
if (*fn>0) putfont("P");
fprintf(tabout, ".mk %d\n", S2);
fprintf(tabout, ".if \\n(%d>\\n(%d .nr %d \\n(%d\n", S2, S1, S1, S2);
}
fprintf(tabout, ".sp |\\n(%du\n", S1);
for(c=dv=0; c<ncol; c++)
{
if (stl+1< nlin && (lf=left(stl,c,&lwid))>=0)
{
if (dv++ == 0)
fprintf(tabout, ".sp -1\n");
tohcol(c);
dv++;
drawvert(lf, stl, c, lwid);
}
}
if (dv)
fprintf(tabout,"\n");
}
putfont(fn)
char *fn;
{
if (fn && *fn)
fprintf(tabout, fn[1] ? "\\f(%.2s" : "\\f%.2s", fn);
}
putsize(s)
char *s;
{
if (s && *s)
fprintf(tabout, "\\s%s",s);
}
0707070035051115051006640000030000040000010207610474064475300000500000002656t9.c /* t9.c: write lines for tables over 200 lines */
# include "t..c"
static useln;
extern char *maknew();
yetmore()
{
for(useln=0; useln<MAXLIN && table[useln]==0; useln++);
if (useln>=MAXLIN)
error("Wierd. No data in table.");
table[0]=table[useln];
for(useln=nlin-1; useln>=0 && (fullbot[useln] || instead[useln]); useln--);
if (useln<0)
error("Wierd. No real lines in table.");
domore(leftover);
while (gets1(cstore=cspace, MAXCHS) && domore(cstore))
;
last =cstore;
return;
}
domore(dataln)
char *dataln;
{
int icol, ch;
if (prefix(".TE", dataln))
return(0);
if (dataln[0] == '.' && !isdigit(dataln[1]))
{
puts(dataln);
return(1);
}
fullbot[0]=0;
instead[0]=(char *)0;
if (dataln[1]==0)
switch(dataln[0])
{
case '_': fullbot[0]= '-'; putline(useln,0); return(1);
case '=': fullbot[0]= '='; putline(useln, 0); return(1);
}
for (icol = 0; icol <ncol; icol++)
{
table[0][icol].col = dataln;
table[0][icol].rcol=0;
for(; (ch= *dataln) != '\0' && ch != tab; dataln++)
;
*dataln++ = '\0';
switch(ctype(useln,icol))
{
case 'n':
table[0][icol].rcol = maknew(table[0][icol].col);
break;
case 'a':
table[0][icol].rcol = table[0][icol].col;
table[0][icol].col= "";
break;
}
while (ctype(useln,icol+1)== 's') /* spanning */
table[0][++icol].col = "";
if (ch == '\0') break;
}
while (++icol <ncol)
table[0][icol].col = "";
putline(useln,0);
exstore=exspace; /* reuse space for numerical items */
return(1);
}
0707070035051115041006640000030000040000010207630474064504300000500000003071tb.c /* tb.c: check which entries exist, also storage allocation */
# include "t..c"
checkuse()
{
int i,c, k;
for(c=0; c<ncol; c++)
{
used[c]=lused[c]=rused[c]=0;
for(i=0; i<nlin; i++)
{
if (instead[i] || fullbot[i]) continue;
k = ctype(i,c);
if (k== '-' || k == '=') continue;
if ((k=='n'||k=='a'))
{
rused[c]|= real(table[i][c].rcol);
if( !real(table[i][c].rcol))
used[c] |= real(table[i][c].col);
if (table[i][c].rcol)
lused[c] |= real(table[i][c].col);
}
else
used[c] |= real(table[i][c].col);
}
}
}
real(s)
char *s;
{
if (s==0) return(0);
if (!point(s)) return(1);
if (*s==0) return(0);
return(1);
}
int spcount = 0;
extern char * calloc();
# define MAXVEC 20
char *spvecs[MAXVEC];
char *chspace()
{
char *pp;
if (spvecs[spcount])
return(spvecs[spcount++]);
if (spcount>=MAXVEC)
error("Too many characters in table");
spvecs[spcount++]= pp = calloc(MAXCHS+MAXLINLEN,1);
if (pp== (char *)-1 || pp == (char *)0)
error("no space for characters");
return(pp);
}
# define MAXPC 50
char *thisvec;
int tpcount = -1;
char *tpvecs[MAXPC];
int *alocv(n)
int n;
{
int *tp, *q;
if (tpcount<0 || thisvec+n > tpvecs[tpcount]+MAXCHS)
{
tpcount++;
if (tpvecs[tpcount]==0)
{
tpvecs[tpcount] = calloc(MAXCHS,1);
}
thisvec = tpvecs[tpcount];
if (thisvec == (char *)0)
error("no space for vectors");
}
tp=(int *)thisvec;
thisvec+=n;
for(q=tp; q<(int *)thisvec; q++)
*q=0;
return(tp);
}
release()
{
/* give back unwanted space in some vectors */
/* this should call free; it does not because
alloc() is so buggy */
spcount=0;
tpcount= -1;
exstore=0;
}
0707070035051115031006640000030000040000010245750265271264600000500000002130tc.c /* tc.c: find character not in table to delimit fields */
# include "t..c"
choochar()
{
/* choose funny characters to delimit fields */
int had[128], ilin,icol, k;
char *s;
for(icol=0; icol<128; icol++)
had[icol]=0;
F1 = F2 = 0;
for(ilin=0;ilin<nlin;ilin++)
{
if (instead[ilin]) continue;
if (fullbot[ilin]) continue;
for(icol=0; icol<ncol; icol++)
{
k = ctype(ilin, icol);
if (k==0 || k == '-' || k == '=')
continue;
s = table[ilin][icol].col;
if (point(s))
while (*s)
had[*s++]=1;
s=table[ilin][icol].rcol;
if (point(s))
while (*s)
had[*s++]=1;
}
}
/* choose first funny character */
for(
s="\002\003\005\006\007!%&#/?,:;<=>@`^~_{}+-*ABCDEFGHIJKMNOPQRSTUVWXYZabcdefgjkoqrstwxyz";
*s; s++)
{
if (had[*s]==0)
{
F1= *s;
had[F1]=1;
break;
}
}
/* choose second funny character */
for(
s="\002\003\005\006\007:_~^`@;,<=>#%&!/?{}+-*ABCDEFGHIJKMNOPQRSTUVWXZabcdefgjkoqrstuwxyz";
*s; s++)
{
if (had[*s]==0)
{
F2= *s;
break;
}
}
if (F1==0 || F2==0)
error("couldn't find characters to use for delimiters");
return;
}
point(s)
{
return(s>= 128 || s<0);
}
0707070035051115021006640000030000040000011516550474434145100000500000002144te.c /* te.c: error message control, input line count */
# include "t..c"
error(s)
char *s;
{
fprintf(stderr, "\n%s: line %d: %s\n", ifile, iline, s);
# ifdef unix
fprintf(stderr, "tbl quits\n");
exit(1);
# endif
# ifdef gcos
fprintf(stderr, "run terminated due to error condition detected by tbl preprocessor\n");
exit(0);
# endif
}
char *gets1(s, size)
char *s;
int size;
{
char *p, *ns;
int nbl = 0;
iline++;
ns = s;
p=fgets(s,size,tabin);
while (p==0)
{
if (swapin()==0)
return(0);
p = fgets(s,size,tabin);
}
while (*s) s++;
s--;
if (*s == '\n') *s-- =0;
else error("input buffer too small");
for(nbl=0; *s == '\\' && s>p; s--)
nbl++;
if (linstart && nbl % 2) /* fold escaped nl if in table */
gets1(s+1, size - (s-ns));
return(p);
}
# define BACKMAX 500
char backup[BACKMAX];
char *backp = backup;
un1getc(c)
{
if (c=='\n')
iline--;
*backp++ = c;
if (backp >= backup+BACKMAX)
error("too much backup");
}
get1char()
{
int c;
if (backp>backup)
c = *--backp;
else
c=getc(tabin);
if (c== EOF) /* EOF */
{
if (swapin() ==0)
error("unexpected EOF");
c = getc(tabin);
}
if (c== '\n')
iline++;
return(c);
}
0707070035051115011006640000030000040000010245770446267321300000500000002207tf.c /* tf.c: save and restore fill mode around table */
# include "t..c"
savefill()
{
/* remembers various things: fill mode, vs, ps in mac 35 (SF) */
fprintf(tabout, ".de %d\n",SF);
fprintf(tabout, ".ps \\n(.s\n");
fprintf(tabout, ".vs \\n(.vu\n");
fprintf(tabout, ".in \\n(.iu\n");
fprintf(tabout, ".if \\n(.u .fi\n");
fprintf(tabout, ".if \\n(.j .ad\n");
fprintf(tabout, ".if \\n(.j=0 .na\n");
fprintf(tabout, "..\n");
fprintf(tabout, ".nf\n");
/* set obx offset if useful */
fprintf(tabout, ".nr #~ 0\n");
fprintf(tabout, ".if \\n(.T .if n .nr #~ 0.6n\n");
}
rstofill()
{
fprintf(tabout, ".%d\n",SF);
}
endoff()
{
int i;
for(i=0; i<MAXHEAD; i++)
if (linestop[i])
fprintf(tabout, ".nr #%c 0\n", linestop[i]+'a'-1);
for(i=0; i<texct; i++)
fprintf(tabout, ".rm %c+\n",texstr[i]);
fprintf(tabout, "%s\n", last);
}
ifdivert()
{
fprintf(tabout, ".ds #d .d\n");
fprintf(tabout, ".if \\(ts\\n(.z\\(ts\\(ts .ds #d nl\n");
}
saveline()
{
fprintf(tabout, ".if \\n+(b.=1 .nr d. \\n(.c-\\n(c.-1\n");
linstart=iline;
}
restline()
{
fprintf(tabout,".if \\n-(b.=0 .nr c. \\n(.c-\\n(d.-%d\n", iline-linstart);
linstart = 0;
}
cleanfc()
{
fprintf(tabout, ".fc\n");
}
0707070035051113651006640000510000040000010247370474434102600000500000003570tg.c /* tg.c: process included text blocks */
# include "t..c"
gettext(sp, ilin,icol, fn, sz)
char *sp, *fn, *sz;
{
/* get a section of text */
char line[4096];
int oname;
char *vs;
if (texname==0) error("Too many text block diversions");
if (textflg==0)
{
fprintf(tabout, ".nr %d \\n(.lu\n", SL); /* remember old line length */
textflg=1;
}
fprintf(tabout, ".eo\n");
fprintf(tabout, ".am %s\n", reg(icol,CRIGHT));
fprintf(tabout, ".br\n");
fprintf(tabout, ".di %c+\n", texname);
rstofill();
if (fn && *fn) fprintf(tabout, ".nr %d \\n(.f\n.ft %s\n", S1, fn);
fprintf(tabout, ".ft \\n(.f\n"); /* protect font */
vs = vsize[icol][stynum[ilin]];
if ((sz && *sz) || (vs && *vs))
{
fprintf(tabout, ".nr %d \\n(.v\n", S9);
if (vs==0 || *vs==0) vs= "\\n(.s+2";
if (sz && *sz)
fprintf(tabout, ".ps %s\n",sz);
fprintf(tabout, ".vs %s\n",vs);
fprintf(tabout, ".if \\n(%du>\\n(.vu .sp \\n(%du-\\n(.vu\n", S9,S9);
}
if (cll[icol][0])
fprintf(tabout, ".ll %sn\n", cll[icol]);
else
fprintf(tabout, ".ll \\n(%du*%du/%du\n",SL,ctspan(ilin,icol),ncol+1);
fprintf(tabout,".if \\n(.l<\\n(%2s .ll \\n(%2su\n", reg(icol,CRIGHT), reg(icol,CRIGHT));
if (ctype(ilin,icol)=='a')
fprintf(tabout, ".ll -2n\n");
fprintf(tabout, ".in 0\n");
while (gets1(line, sizeof(line)))
{
if (line[0]=='T' && line[1]=='}' && line[2]== tab) break;
if (match("T}", line)) break;
fprintf(tabout, "%s\n", line);
}
if (fn && *fn) fprintf(tabout, ".ft \\n(%d\n", S1);
if (sz && *sz) fprintf(tabout, ".br\n.ps\n.vs\n");
fprintf(tabout, ".br\n");
fprintf(tabout, ".di\n");
fprintf(tabout, ".nr %c| \\n(dn\n", texname);
fprintf(tabout, ".nr %c- \\n(dl\n", texname);
fprintf(tabout, "..\n");
fprintf(tabout, ".ec \\\n");
/* copy remainder of line */
if (line[2])
tcopy (sp, line+3);
else
*sp=0;
oname=texname;
texname = texstr[++texct];
return(oname);
}
untext()
{
rstofill();
fprintf(tabout, ".nf\n");
fprintf(tabout, ".ll \\n(%du\n", SL);
}
0707070035051114771006640000030000040000010246010265271266600000500000002004ti.c /* ti.c: classify line intersections */
# include "t..c"
/* determine local environment for intersections */
interv(i,c)
{
int ku, kl;
if (c>=ncol || c == 0)
{
if (dboxflg)
{
if (i==0) return(BOT);
if (i>=nlin) return(TOP);
return(THRU);
}
if (c>=ncol)
return(0);
}
ku = i>0 ? lefdata(i-1,c) : 0;
if (i+1 >= nlin && allh(i))
kl=0;
else
kl = lefdata(allh(i) ? i+1 : i, c);
if (ku==2 && kl==2) return(THRU);
if (ku ==2) return(TOP);
if (kl==BOT) return(2);
return(0);
}
interh(i,c)
{
int kl, kr;
if (fullbot[i]== '=' || (dboxflg && (i==0 || i>= nlin-1)))
{
if (c==ncol)
return(LEFT);
if (c==0)
return(RIGHT);
return(THRU);
}
if (i>=nlin) return(0);
kl = c>0 ? thish (i,c-1) : 0;
if (kl<=1 && i>0 && allh(up1(i)))
kl = c>0 ? thish(up1(i),c-1) : 0;
kr = thish(i,c);
if (kr<=1 && i>0 && allh(up1(i)))
kr = c>0 ? thish(up1(i), c) : 0;
if (kl== '=' && kr == '=') return(THRU);
if (kl== '=') return(LEFT);
if (kr== '=') return(RIGHT);
return(0);
}
up1(i)
{
i--;
while (instead[i] && i>0) i--;
return(i);
}
0707070035051114761006640000030000040000010246020265271266600000500000002123tm.c /* tm.c: split numerical fields */
# include "t..c"
char *maknew(str)
char *str;
{
/* make two numerical fields */
extern char *chspace();
int dpoint, c;
char *p, *q, *ba;
p = str;
for (ba= 0; c = *str; str++)
if (c == '\\' && *(str+1)== '&')
ba=str;
str=p;
if (ba==0)
{
for (dpoint=0; *str; str++)
{
if (*str=='.' && !ineqn(str,p) &&
(str>p && digit(*(str-1)) ||
digit(*(str+1))))
dpoint=(int)str;
}
if (dpoint==0)
for(; str>p; str--)
{
if (digit( * (str-1) ) && !ineqn(str, p))
break;
}
if (!dpoint && p==str) /* not numerical, don't split */
return(0);
if (dpoint) str=(char *)dpoint;
}
else
str = ba;
p =str;
if (exstore ==0 || exstore >exlim)
{
exstore = exspace = chspace();
exlim= exstore+MAXCHS;
}
q = exstore;
while (*exstore++ = *str++);
*p = 0;
return(q);
}
ineqn (s, p)
char *s, *p;
{
/* true if s is in a eqn within p */
int ineq = 0, c;
while (c = *p)
{
if (s == p)
return(ineq);
p++;
if ((ineq == 0) && (c == delim1))
ineq = 1;
else
if ((ineq == 1) && (c == delim2))
ineq = 0;
}
return(0);
}
0707070035051114751006640000030000040000010246030265271266700000500000001554tr.c # include "t..c"
/* tr.c: number register allocation */
char * nregs[] ={
/* this array must have at least 3*qcol entries
or illegal register names will result */
"40","41","42","43","44","45","46","47","48","49",
"50","51","52","53","54","55","56","57","58","59",
"60","61","62","63","64","65","66","67","68","69",
"70","71","72","73","74","75","76","77","78","79",
"80","81","82","83","84","85","86","87","88","89",
"90","91","92","93","94","95","96","97","4q","4r",
"4s","4t","4u","4v","4w","4x","4y","4z","4;","4.",
"4a","4b","4c","4d","4e","4f","4g","4h","4i","4j",
"4k","4l","4m","4n","4o","4p","5a","5b","5c","5d",
"5e","5f","5g","5h","5i","5j","5k","5l","5m","5n",
"5o","5p","5q","5r","5s","5t","5u","5v","5w","5x",
0};
char *
reg(col, place)
{
if(sizeof(nregs) < 2*3*qcol)
error("Too many columns for registers");
return (nregs[qcol*place+col]);
}
0707070035051114741006640000030000040000010246040265271266700000500000001243ts.c /* ts.c: minor string processing subroutines */
match (s1, s2)
char *s1, *s2;
{
while (*s1 == *s2)
if (*s1++ == '\0')
return(1);
else
s2++;
return(0);
}
prefix(small, big)
char *small, *big;
{
int c;
while ((c= *small++) == *big++)
if (c==0) return(1);
return(c==0);
}
letter (ch)
{
if (ch >= 'a' && ch <= 'z')
return(1);
if (ch >= 'A' && ch <= 'Z')
return(1);
return(0);
}
numb(str)
char *str;
{
/* convert to integer */
int k;
for (k=0; *str >= '0' && *str <= '9'; str++)
k = k*10 + *str - '0';
return(k);
}
digit(x)
{
return(x>= '0' && x<= '9');
}
max(a,b)
{
return( a>b ? a : b);
}
tcopy (s,t)
char *s, *t;
{
while (*s++ = *t++);
}
0707070035051114731006640000030000040000010246050265271267000000500000002651tt.c /* tt.c: subroutines for drawing horizontal lines */
# include "t..c"
ctype(il, ic)
{
if (instead[il])
return(0);
if (fullbot[il])
return(0);
il = stynum[il];
return(style[ic][il]);
}
min(a,b)
{
return(a<b ? a : b);
}
fspan(i,c)
{
c++;
return(c<ncol && ctype(i,c)=='s');
}
lspan(i,c)
{
int k;
if (ctype(i,c) != 's') return(0);
c++;
if (c < ncol && ctype(i,c)== 's')
return(0);
for(k=0; ctype(i,--c) == 's'; k++);
return(k);
}
ctspan(i,c)
{
int k;
c++;
for(k=1; c<ncol && ctype(i,c)=='s'; k++)
c++;
return(k);
}
tohcol(ic)
{
if (ic==0)
fprintf(tabout, "\\h'|0'");
else
fprintf(tabout, "\\h'(|\\n(%2su+|\\n(%2su)/2u'", reg(ic,CLEFT), reg(ic-1,CRIGHT));
}
allh(i)
{
/* return true if every element in line i is horizontal */
/* also at least one must be horizontl */
int c, one, k;
if (fullbot[i]) return(1);
if (i>=nlin) return(dboxflg||boxflg);
for(one=c=0; c<ncol; c++)
{
k = thish(i,c);
if (k==0) return(0);
if (k==1) continue;
one=1;
}
return(one);
}
thish(i,c)
{
int t;
char *s;
struct colstr *pc;
if (c<0)return(0);
if (i<0) return(0);
t = ctype(i,c);
if (t=='_' || t == '-')
return('-');
if (t=='=')return('=');
if (t=='^') return(1);
if (fullbot[i] )
return(fullbot[i]);
if (t=='s') return(thish(i,c-1));
if (t==0) return(1);
pc = &table[i][c];
s = (t=='a' ? pc->rcol : pc->col);
if (s==0 || (point(s) && *s==0))
return(1);
if (vspen(s)) return(1);
if (t=barent( s))
return(t);
return(0);
}
0707070035051114721006640000030000040000010246060265271267000000500000010000tu.c /* tu.c: draws horizontal lines */
# include "t..c"
makeline(i,c,lintype)
{
int cr, type, shortl;
type = thish(i,c);
if (type==0) return;
cr=c;
shortl = (table[i][c].col[0]=='\\');
if (c>0 && !shortl && thish(i,c-1) == type)return;
if (shortl==0)
for(cr=c; cr < ncol && (ctype(i,cr)=='s'||type==thish(i,cr)); cr++);
else
for(cr=c+1; cr<ncol && ctype(i,cr)=='s'; cr++);
drawline(i, c, cr-1, lintype, 0, shortl);
}
fullwide(i, lintype)
{
int cr, cl;
if (!pr1403)
fprintf(tabout, ".nr %d \\n(.v\n.vs \\n(.vu-\\n(.sp\n", SVS);
cr= 0;
while (cr<ncol)
{
cl=cr;
while (i>0 && vspand(prev(i),cl,1))
cl++;
for(cr=cl; cr<ncol; cr++)
if (i>0 && vspand(prev(i),cr,1))
break;
if (cl<ncol)
drawline(i,cl,(cr<ncol?cr-1:cr),lintype,1,0);
}
fprintf(tabout, "\n");
if (!pr1403)
fprintf(tabout, ".vs \\n(%du\n", SVS);
}
drawline(i, cl, cr, lintype, noheight, shortl)
{
char *exhr, *exhl, *lnch;
int lcount, ln, linpos, oldpos, nodata;
lcount=0;
exhr=exhl= "";
switch(lintype)
{
case '-': lcount=1;break;
case '=': lcount = pr1403? 1 : 2; break;
case SHORTLINE: lcount=1; break;
}
if (lcount<=0) return;
nodata = cr-cl>=ncol || noheight || allh(i);
if (!nodata)
fprintf(tabout, "\\v'-.5m'");
for(ln=oldpos=0; ln<lcount; ln++)
{
linpos = 2*ln - lcount +1;
if (linpos != oldpos)
fprintf(tabout, "\\v'%dp'", linpos-oldpos);
oldpos=linpos;
if (shortl==0)
{
tohcol(cl);
if (lcount>1)
{
switch(interv(i,cl))
{
case TOP: exhl = ln==0 ? "1p" : "-1p"; break;
case BOT: exhl = ln==1 ? "1p" : "-1p"; break;
case THRU: exhl = "1p"; break;
}
if (exhl[0])
fprintf(tabout, "\\h'%s'", exhl);
}
else if (lcount==1)
{
switch(interv(i,cl))
{
case TOP: case BOT: exhl = "-1p"; break;
case THRU: exhl = "1p"; break;
}
if (exhl[0])
fprintf(tabout, "\\h'%s'", exhl);
}
if (lcount>1)
{
switch(interv(i,cr+1))
{
case TOP: exhr = ln==0 ? "-1p" : "+1p"; break;
case BOT: exhr = ln==1 ? "-1p" : "+1p"; break;
case THRU: exhr = "-1p"; break;
}
}
else if (lcount==1)
{
switch(interv(i,cr+1))
{
case TOP: case BOT: exhr = "+1p"; break;
case THRU: exhr = "-1p"; break;
}
}
}
else
fprintf(tabout, "\\h'|\\n(%2su'", reg(cl,CLEFT));
fprintf(tabout, "\\s\\n(%d",LSIZE);
if (linsize)
fprintf(tabout, "\\v'-\\n(%dp/6u'", LSIZE);
if (shortl)
fprintf(tabout, "\\l'|\\n(%2su'", reg(cr,CRIGHT));
else
{
lnch = "\\(ul";
if (pr1403)
lnch = lintype==2 ? "=" : "\\(ru";
if (cr+1>=ncol)
fprintf(tabout, "\\l'|\\n(TWu%s%s'", exhr,lnch);
else
fprintf(tabout, "\\l'(|\\n(%2su+|\\n(%2su)/2u%s%s'", reg(cr,CRIGHT),
reg(cr+1,CLEFT), exhr, lnch);
}
if (linsize)
fprintf(tabout, "\\v'\\n(%dp/6u'", LSIZE);
fprintf(tabout, "\\s0");
}
if (oldpos!=0)
fprintf(tabout, "\\v'%dp'", -oldpos);
if (!nodata)
fprintf(tabout, "\\v'+.5m'");
}
getstop()
{
int i,c,k,junk, stopp;
stopp=1;
for(i=0; i<MAXLIN; i++)
linestop[i]=0;
for(i=0; i<nlin; i++)
for(c=0; c<ncol; c++)
{
k = left(i,c,&junk);
if (k>=0 && linestop[k]==0)
linestop[k]= ++stopp;
}
if (boxflg || allflg || dboxflg)
linestop[0]=1;
}
left(i,c, lwidp)
int *lwidp;
{
int kind, li, lj;
/* returns -1 if no line to left */
/* returns number of line where it starts */
/* stores into lwid the kind of line */
*lwidp=0;
if (i<0) return(-1);
kind = lefdata(i,c);
if (kind==0) return(-1);
if (i+1<nlin)
if (lefdata(next(i),c)== kind) return(-1);
while (i>=0 && lefdata(i,c)==kind)
i=prev(li=i);
if (prev(li)== -1) li=0;
*lwidp=kind;
for(lj= i+1; lj<li; lj++)
if (instead[lj] && strcmp(instead[lj], ".TH")==0)
return(li);
for(i= i+1; i<li; i++)
if (fullbot[i])
li=i;
return(li);
}
lefdata(i,c)
{
int ck;
if (i>=nlin) i=nlin-1;
if (ctype(i,c) == 's')
{
for(ck=c; ctype(i,ck)=='s'; ck--);
if (thish(i,ck)==0)
return(0);
}
i =stynum[i];
i = lefline[c][i];
if (i>0) return(i);
if (dboxflg && c==0) return(2);
if (allflg)return(1);
if (boxflg && c==0) return(1);
return(0);
}
next(i)
{
while (i+1 <nlin)
{
i++;
if (!fullbot[i] && !instead[i]) break;
}
return(i);
}
prev(i)
{
while (--i >=0 && (fullbot[i] || instead[i]))
;
return(i);
}
0707070035051114711006640000030000040000010246070265271267100000500000005512tv.c /* tv.c: draw vertical lines */
# include "t..c"
drawvert(start,end, c, lwid)
{
char *exb=0, *ext=0;
int tp=0, sl, ln, pos, epb, ept, vm;
end++;
vm='v';
/* note: nr 35 has value of 1m outside of linesize */
while (instead[end]) end++;
for(ln=0; ln<lwid; ln++)
{
epb=ept=0;
pos = 2*ln-lwid+1;
if (pos!=tp) fprintf(tabout, "\\h'%dp'", pos-tp);
tp = pos;
if (end<nlin)
{
if (fullbot[end]|| (!instead[end] && allh(end)))
epb=2;
else
switch (midbar(end,c))
{
case '-':
exb = "1v-.5m"; break;
case '=':
exb = "1v-.5m";
epb = 1; break;
}
}
if (lwid>1)
switch(interh(end, c))
{
case THRU: epb -= 1; break;
case RIGHT: epb += (ln==0 ? 1 : -1); break;
case LEFT: epb += (ln==1 ? 1 : -1); break;
}
if (lwid==1)
switch(interh(end,c))
{
case THRU: epb -= 1; break;
case RIGHT: case LEFT: epb += 1; break;
}
if (start>0)
{
sl = start-1;
while (sl>=0 && instead[sl]) sl--;
if (sl>=0 && (fullbot[sl] || allh(sl)))
ept=0;
else
if (sl>=0)
switch(midbar(sl,c))
{
case '-':
ext = ".5m"; break;
case '=':
ext= ".5m"; ept = -1; break;
default:
vm = 'm'; break;
}
else
ept = -4;
}
else if (start==0 && allh(0))
{
ept=0;
vm = 'm';
}
if (lwid>1)
switch(interh(start,c))
{
case THRU: ept += 1; break;
case LEFT: ept += (ln==0 ? 1 : -1); break;
case RIGHT: ept += (ln==1 ? 1 : -1); break;
}
else if (lwid==1)
switch(interh(start,c))
{
case THRU: ept += 1; break;
case LEFT: case RIGHT: ept -= 1; break;
}
if (exb)
fprintf(tabout, "\\v'%s'", exb);
if (epb)
fprintf(tabout, "\\v'%dp'", epb);
fprintf(tabout, "\\s\\n(%d",LSIZE);
if (linsize)
fprintf(tabout, "\\v'-\\n(%dp/6u'", LSIZE);
fprintf(tabout, "\\h'-\\n(#~u'"); /* adjustment for T450 nroff boxes */
fprintf(tabout, "\\L'|\\n(#%cu-%s", linestop[start]+'a'-1, vm=='v'? "1v" : "\\n(35u");
if (ext)
fprintf(tabout, "-(%s)",ext);
if (exb)
fprintf(tabout, "-(%s)", exb);
pos = ept-epb;
if (pos)
fprintf(tabout, "%s%dp", pos>=0? "+" : "", pos);
/* the string #d is either "nl" or ".d" depending
on diversions; on GCOS not the same */
fprintf(tabout, "'\\s0\\v'\\n(\\*(#du-\\n(#%cu+%s", linestop[start]+'a'-1,vm=='v' ? "1v" : "\\n(35u");
if (ext)
fprintf(tabout, "+%s",ext);
if (ept)
fprintf(tabout, "%s%dp", (-ept)>0 ? "+" : "", (-ept));
fprintf(tabout, "'");
if (linsize)
fprintf(tabout, "\\v'\\n(%dp/6u'", LSIZE);
}
}
midbar(i,c)
{
int k;
k = midbcol(i,c);
if (k==0 && c>0)
k = midbcol(i, c-1);
return(k);
}
midbcol(i,c)
{
int ct;
while ( (ct=ctype(i,c)) == 's')
c--;
if (ct=='-' || ct == '=')
return(ct);
if (ct=barent(table[i][c].col))
return(ct);
return(0);
}
barent(s)
char *s;
{
if (s==0) return (1);
if (!point(s)) return(0);
if (s[0]== '\\') s++;
if (s[1]!= 0)
return(0);
switch(s[0])
{
case '_':
return('-');
case '=':
return('=');
}
return(0);
}
0707070035051114711006640000030000040000010246070265271267100001300000000000TRAILER!!! 0);
}
barent(s)
char *s;
{
if (s==0) return (1);
if (!point(s)) return(0);
if (s[0]== '\\') s++;
if (s[1]!= 0)
return(0);
switch(s[0])
{
case '_':
return('-');
case '=':
return('=');
}
return(0);
}
0707070
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.