|
|
1.1 root 1: 0707070035051115131006640000030000040000011503200474064415100000500000003372t..c /* t..c : external declarations */
2:
3: # include "stdio.h"
4: # include "ctype.h"
5:
6: # define MAXLIN 250
7: # define MAXHEAD 44
8: # define MAXCOL 30
9: /* Do NOT make MAXCOL bigger with adjusting nregs[] in tr.c */
10: # define MAXCHS 2000
11: #define MAXLINLEN 300
12: # define MAXRPT 100
13: # define CLLEN 10
14: # define SHORTLINE 4
15: extern int nlin, ncol, iline, nclin, nslin;
16:
17: extern int (*style)[MAXHEAD];
18: extern char (*font)[MAXHEAD][2];
19: extern char (*csize)[MAXHEAD][4];
20: extern char (*vsize)[MAXHEAD][4];
21: extern char (*cll)[CLLEN];
22: extern int (*flags)[MAXHEAD];
23: # define ZEROW 001
24: # define HALFUP 002
25: # define CTOP 004
26: # define CDOWN 010
27: extern int stynum[];
28: extern int qcol;
29: extern int *doubled, *acase, *topat;
30: extern int F1, F2;
31: extern int (*lefline)[MAXHEAD];
32: extern int fullbot[];
33: extern char *instead[];
34: extern int expflg;
35: extern int ctrflg;
36: extern int evenflg;
37: extern int *evenup;
38: extern int boxflg;
39: extern int dboxflg;
40: extern int linsize;
41: extern int tab;
42: extern int pr1403;
43: extern int linsize, delim1, delim2;
44: extern int allflg;
45: extern int textflg;
46: extern int left1flg;
47: extern int rightl;
48: struct colstr {char *col, *rcol;};
49: extern struct colstr *table[];
50: extern char *cspace, *cstore;
51: extern char *exstore, *exlim, *exspace;
52: extern int *sep;
53: extern int *used, *lused, *rused;
54: extern int linestop[];
55: extern int leftover;
56: extern char *last, *ifile;
57: extern int texname;
58: extern int texct, texmax;
59: extern char texstr[];
60: extern int linstart;
61:
62:
63: extern FILE *tabin, *tabout;
64: # define CRIGHT 2
65: # define CLEFT 0
66: # define CMID 1
67: # define S1 31
68: # define S2 32
69: # define S3 33
70: # define TMP 38
71: #define S9 39
72: # define SF 35
73: # define SL 34
74: # define LSIZE 33
75: # define SIND 37
76: # define SVS 36
77: /* this refers to the relative position of lines */
78: # define LEFT 1
79: # define RIGHT 2
80: # define THRU 3
81: # define TOP 1
82: # define BOT 2
83: 0707070035051115121006640000030000040000010245650265271262100000500000001755t0.c /* t0.c: storage allocation */
84: #
85: # include "t..c"
86: int expflg = 0;
87: int ctrflg = 0;
88: int boxflg = 0;
89: int dboxflg = 0;
90: int tab = '\t';
91: int linsize;
92: int pr1403;
93: int delim1, delim2;
94: int evenflg;
95: int *evenup;
96: int F1 = 0;
97: int F2 = 0;
98: int allflg = 0;
99: int leftover = 0;
100: int textflg = 0;
101: int left1flg = 0;
102: int rightl = 0;
103: char *cstore, *cspace;
104: char *last;
105: struct colstr *table[MAXLIN];
106: int stynum[MAXLIN+1];
107: int fullbot[MAXLIN];
108: char *instead[MAXLIN];
109: int linestop[MAXLIN];
110: int (*style)[MAXHEAD];
111: char (*font)[MAXHEAD][2];
112: char (*csize)[MAXHEAD][4];
113: char (*vsize)[MAXHEAD][4];
114: int (*lefline)[MAXHEAD];
115: char (*cll)[CLLEN];
116: int (*flags)[MAXHEAD];
117: int qcol;
118: int *doubled, *acase, *topat;
119: int nslin, nclin;
120: int *sep;
121: int *used, *lused, *rused;
122: int nlin, ncol;
123: int iline = 1;
124: char *ifile = "Input";
125: int texname = 'a';
126: int texct = 0;
127: char texstr[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWYXZ0123456789";
128: int linstart;
129: char *exstore, *exlim, *exspace;
130: FILE *tabin /*= stdin */;
131: FILE *tabout /* = stdout */;
132: 0707070035051115001006640000510000040000011516610474064427500000500000003744t1.c /* t1.c: main control and input switching */
133: #
134: # include "t..c"
135: #include <signal.h>
136: # ifdef gcos
137: /* required by GCOS because file is passed to "tbl" by troff preprocessor */
138: # define _f1 _f
139: extern FILE *_f[];
140: # endif
141:
142: # ifdef unix
143: # define MACROS "/usr/lib/tmac.s"
144: # define PYMACS "/usr/lib/tmac.m"
145: # endif
146:
147: # ifdef gcos
148: # define MACROS "cc/troff/smac"
149: # define PYMACS "cc/troff/mmac"
150: # endif
151:
152: # define ever (;;)
153:
154: main(argc,argv)
155: char *argv[];
156: {
157: # ifdef unix
158: int badsig();
159: signal(SIGPIPE, badsig);
160: # endif
161: # ifdef gcos
162: if(!intss()) tabout = fopen("qq", "w"); /* default media code is type 5 */
163: # endif
164: exit(tbl(argc,argv));
165: }
166:
167:
168: tbl(argc,argv)
169: char *argv[];
170: {
171: char line[5120];
172: /*int x;*/
173: /*x=malloc((char *)0); uncomment when allocation breaks*/
174: /* required by GCOS because "stdout" is set by troff preprocessor */
175: tabin=stdin; tabout=stdout;
176: setinp(argc,argv);
177: while (gets1(line, sizeof(line)))
178: {
179: fprintf(tabout, "%s\n",line);
180: if (prefix(".TS", line))
181: tableput();
182: }
183: fclose(tabin);
184: return(0);
185: }
186: int sargc;
187: char **sargv;
188: setinp(argc,argv)
189: char **argv;
190: {
191: sargc = argc;
192: sargv = argv;
193: sargc--; sargv++;
194: if (sargc>0)
195: swapin();
196: }
197: swapin()
198: {
199: char *name;
200: while (sargc>0 && **sargv=='-')
201: {
202: if (match("-ms", *sargv))
203: {
204: *sargv = MACROS;
205: break;
206: }
207: if (match("-mm", *sargv))
208: {
209: *sargv = PYMACS;
210: break;
211: }
212: if (match("-TX", *sargv))
213: pr1403=1;
214: if (match("-", *sargv))
215: break;
216: sargc--; sargv++;
217: }
218: if (sargc<=0) return(0);
219: # ifdef unix
220: /* file closing is done by GCOS troff preprocessor */
221: if (tabin!=stdin) fclose(tabin);
222: # endif
223: if (match(*sargv, "-")){
224: tabin=stdin;
225: name = "-";
226: }
227: else{
228: tabin = fopen(ifile= *sargv, "r");
229: name = ifile;
230: }
231: iline=1;
232: # ifdef unix
233: /* file names are all put into f. by the GCOS troff preprocessor */
234: fprintf(tabout, ".ds f. %s\n",ifile);
235: fprintf(tabout, ".lf %d %s\n",iline, name);
236: # endif
237: if (tabin==NULL)
238: error("Can't open file");
239: sargc--;
240: sargv++;
241: return(1);
242: }
243: # ifdef unix
244: badsig()
245: {
246: signal(SIGPIPE, 1);
247: exit(0);
248: }
249: # endif
250: 0707070035051115101006640000030000040000010245670373132574500000500000000420t2.c /* t2.c: subroutine sequencing for one table */
251: # include "t..c"
252: tableput()
253: {
254: saveline();
255: savefill();
256: ifdivert();
257: cleanfc();
258: getcomm();
259: getspec();
260: gettbl();
261: getstop();
262: checkuse();
263: choochar();
264: maktab();
265: runout();
266: release();
267: rstofill();
268: endoff();
269: freearr();
270: restline();
271: }
272: 0707070035051112121006640000030000040000011516630474064445400000500000003265t3.c /* t3.c: interpret commands affecting whole table */
273: # include "t..c"
274: struct optstr {char *optnam; int *optadd;} options [] = {
275: "expand", &expflg,
276: "EXPAND", &expflg,
277: "center", &ctrflg,
278: "CENTER", &ctrflg,
279: "box", &boxflg,
280: "BOX", &boxflg,
281: "allbox", &allflg,
282: "ALLBOX", &allflg,
283: "doublebox", &dboxflg,
284: "DOUBLEBOX", &dboxflg,
285: "frame", &boxflg,
286: "FRAME", &boxflg,
287: "doubleframe", &dboxflg,
288: "DOUBLEFRAME", &dboxflg,
289: "tab", &tab,
290: "TAB", &tab,
291: "linesize", &linsize,
292: "LINESIZE", &linsize,
293: "delim", &delim1,
294: "DELIM", &delim1,
295: 0,0};
296: getcomm()
297: {
298: char line[200], *cp, nb[25], *t;
299: struct optstr *lp;
300: int c, ci, found;
301: for(lp= options; lp->optnam; lp++)
302: *(lp->optadd) = 0;
303: texname = texstr[texct=0];
304: tab = '\t';
305: printf(".nr %d \\n(.s\n", LSIZE);
306: gets1(line, sizeof(line));
307: /* see if this is a command line */
308: if (strchr(line,';') == NULL)
309: {
310: backrest(line);
311: return;
312: }
313: for(cp=line; (c = *cp) != ';'; cp++)
314: {
315: if (!letter(c)) continue;
316: found=0;
317: for(lp= options; lp->optadd; lp++)
318: {
319: if (prefix(lp->optnam, cp))
320: {
321: *(lp->optadd) = 1;
322: cp += strlen(lp->optnam);
323: if (letter(*cp))
324: error("Misspelled global option");
325: while (*cp==' ')cp++;
326: t=nb;
327: if ( *cp == '(')
328: while ((ci= *++cp) != ')')
329: *t++ = ci;
330: else cp--;
331: *t++ = 0; *t=0;
332: if (lp->optadd == &tab)
333: {
334: if (nb[0])
335: *(lp->optadd) = nb[0];
336: }
337: if (lp->optadd == &linsize)
338: printf(".nr %d %s\n", LSIZE, nb);
339: if (lp->optadd == &delim1)
340: {
341: delim1 = nb[0];
342: delim2 = nb[1];
343: }
344: found=1;
345: break;
346: }
347: }
348: if (!found)
349: error("Illegal option");
350: }
351: cp++;
352: backrest(cp);
353: return;
354: }
355: backrest(cp)
356: char *cp;
357: {
358: char *s;
359: for(s=cp; *s; s++);
360: un1getc('\n');
361: while (s>cp)
362: un1getc(*--s);
363: return;
364: }
365: 0707070035050264701006640000510000010000011371440455733744100000500000017000t4.c /* t4.c: read table specification */
366: # include "t..c"
367: int oncol;
368: getspec()
369: {
370: int icol, i;
371: qcol = findcol()+1;/* must allow one extra for line at right */
372: garray(qcol);
373: sep[-1]= -1;
374: for(icol=0; icol<qcol; icol++)
375: {
376: sep[icol]= -1;
377: evenup[icol]=0;
378: cll[icol][0]=0;
379: for(i=0; i<MAXHEAD; i++)
380: {
381: csize[icol][i][0]=0;
382: vsize[icol][i][0]=0;
383: font[icol][i][0] = lefline[icol][i] = 0;
384: flags[icol][i]=0;
385: style[icol][i]= 'l';
386: }
387: }
388: for(i=0;i<MAXHEAD;i++)
389: lefline[qcol][i]=0; /* fixes sample55 looping */
390: nclin=ncol=0;
391: oncol =0;
392: left1flg=rightl=0;
393: readspec();
394: fprintf(tabout, ".rm");
395: for(i=0; i<ncol; i++)
396: fprintf(tabout, " %2s", reg(i, CRIGHT));
397: fprintf(tabout, "\n");
398: }
399: readspec()
400: {
401: int icol, c, sawchar, stopc, i;
402: char sn[10], *snp, *temp;
403: sawchar=icol=0;
404: while (c=get1char())
405: {
406: switch(c)
407: {
408: default:
409: if (c != tab)
410: error("bad table specification character");
411: case ' ': /* note this is also case tab */
412: continue;
413: case '\n':
414: if(sawchar==0) continue;
415: case ',':
416: case '.': /* end of table specification */
417: ncol = max(ncol, icol);
418: if (lefline[ncol][nclin]>0) {ncol++; rightl++;};
419: if(sawchar)
420: nclin++;
421: if (nclin>=MAXHEAD)
422: error("too many lines in specification");
423: icol=0;
424: if (ncol==0 || nclin==0)
425: error("no specification");
426: if (c== '.')
427: {
428: while ((c=get1char()) && c != '\n')
429: if (c != ' ' && c != '\t')
430: error("dot not last character on format line");
431: /* fix up sep - default is 3 except at edge */
432: for(icol=0; icol<ncol; icol++)
433: if (sep[icol]<0)
434: sep[icol] = icol+1<ncol ? 3 : 2;
435: if (oncol == 0)
436: oncol = ncol;
437: else if (oncol +2 <ncol)
438: error("tried to widen table in T&, not allowed");
439: return;
440: }
441: sawchar=0;
442: continue;
443: case 'C': case 'S': case 'R': case 'N': case 'L': case 'A':
444: c += ('a'-'A');
445: case '_': if (c=='_') c= '-';
446: case '=': case '-':
447: case '^':
448: case 'c': case 's': case 'n': case 'r': case 'l': case 'a':
449: style[icol][nclin]=c;
450: if (c== 's' && icol<=0)
451: error("first column can not be S-type");
452: if (c=='s' && style[icol-1][nclin] == 'a')
453: {
454: fprintf(tabout, ".tm warning: can't span a-type cols, changed to l\n");
455: style[icol-1][nclin] = 'l';
456: }
457: if (c=='s' && style[icol-1][nclin] == 'n')
458: {
459: fprintf(tabout, ".tm warning: can't span n-type cols, changed to c\n");
460: style[icol-1][nclin] = 'c';
461: }
462: icol++;
463: if (c=='^' && nclin<=0)
464: error("first row can not contain vertical span");
465: if (icol>qcol)
466: error("too many columns in table");
467: sawchar=1;
468: continue;
469: case 'b': case 'i':
470: c += 'A'-'a';
471: case 'B': case 'I':
472: if (icol==0) continue;
473: snp=font[icol-1][nclin];
474: snp[0]= (c=='I' ? '2' : '3');
475: snp[1]=0;
476: continue;
477: case 't': case 'T':
478: if (icol>0)
479: flags[icol-1][nclin] |= CTOP;
480: continue;
481: case 'd': case 'D':
482: if (icol>0)
483: flags[icol-1][nclin] |= CDOWN;
484: continue;
485: case 'f': case 'F':
486: if (icol==0) continue;
487: snp=font[icol-1][nclin];
488: snp[0]=snp[1]=stopc=0;
489: for(i=0; i<2; i++)
490: {
491: c = get1char();
492: if (i==0 && c=='(')
493: {
494: stopc=')';
495: c = get1char();
496: }
497: if (c==0) break;
498: if (c==stopc) {stopc=0; break;}
499: if (stopc==0) if (c==' ' || c== tab ) break;
500: if (c=='\n' || c == '|'){un1getc(c); break;}
501: snp[i] = c;
502: if (c>= '0' && c<= '9') break;
503: }
504: if (stopc) if (get1char()!=stopc)
505: error("Nonterminated font name");
506: continue;
507: case 'P': case 'p':
508: if (icol<=0) continue;
509: temp = snp = csize[icol-1][nclin];
510: while (c = get1char())
511: {
512: if (c== ' ' || c== tab || c=='\n') break;
513: if (c=='-' || c == '+')
514: if (snp>temp)
515: break;
516: else
517: *snp++=c;
518: else
519: if (digit(c))
520: *snp++ = c;
521: else break;
522: if (snp-temp>4)
523: error("point size too large");
524: }
525: *snp = 0;
526: if (atoi(temp)>36)
527: error("point size unreasonable");
528: un1getc (c);
529: continue;
530: case 'V': case 'v':
531: if (icol<=0) continue;
532: temp = snp = vsize[icol-1][nclin];
533: while (c = get1char())
534: {
535: if (c== ' ' || c== tab || c=='\n') break;
536: if (c=='-' || c == '+')
537: if (snp>temp)
538: break;
539: else
540: *snp++=c;
541: else
542: if (digit(c))
543: *snp++ = c;
544: else break;
545: if (snp-temp>4)
546: error("vertical spacing value too large");
547: }
548: *snp=0;
549: un1getc(c);
550: continue;
551: case 'w': case 'W':
552: snp = cll [icol-1];
553: /* Dale Smith didn't like this check - possible to have two text blocks
554: of different widths now ....
555: if (*snp)
556: {
557: fprintf(tabout, "Ignored second width specification");
558: continue;
559: }
560: /* end commented out code ... */
561: stopc=0;
562: while (c = get1char())
563: {
564: if (snp==cll[icol-1] && c=='(')
565: {
566: stopc = ')';
567: continue;
568: }
569: if ( !stopc && (c>'9' || c< '0'))
570: break;
571: if (stopc && c== stopc)
572: break;
573: *snp++ =c;
574: }
575: *snp=0;
576: if (snp-cll[icol-1]>CLLEN)
577: error ("column width too long");
578: if (!stopc)
579: un1getc(c);
580: continue;
581: case 'e': case 'E':
582: if (icol<1) continue;
583: evenup[icol-1]=1;
584: evenflg=1;
585: continue;
586: case 'z': case 'Z': /* zero width-ignre width this item */
587: if (icol<1) continue;
588: flags[icol-1][nclin] |= ZEROW;
589: continue;
590: case 'u': case 'U': /* half line up */
591: if (icol<1) continue;
592: flags[icol-1][nclin] |= HALFUP;
593: continue;
594: case '0': case '1': case '2': case '3': case '4':
595: case '5': case '6': case '7': case '8': case '9':
596: sn[0] = c;
597: snp=sn+1;
598: while (digit(*snp++ = c = get1char()))
599: ;
600: un1getc(c);
601: sep[icol-1] = max(sep[icol-1], numb(sn));
602: continue;
603: case '|':
604: lefline[icol][nclin]++;
605: if (icol==0) left1flg=1;
606: continue;
607: }
608: }
609: error("EOF reading table specification");
610: }
611: findcol()
612: {
613: # define FLNLIM 200
614: /* this counts the number of columns and then puts the line back*/
615: char *s, line[FLNLIM+2], *p;
616: int c, n=0, inpar=0;
617: while ((c=get1char())!=EOF && c == ' ')
618: ;
619: if (c!='\n')
620: un1getc(c);
621: for(s=line; *s = c = get1char(); s++)
622: {
623: if (c==')') inpar=0;
624: if (inpar) continue;
625: if (c=='\n' || c == EOF || c == '.' || c==',')
626: break;
627: else if (c=='(')
628: inpar=1;
629: else
630: if (s>=line+FLNLIM)
631: error("too long spec line");
632: }
633: for(p=line; p<s; p++)
634: switch (c= *p)
635: {
636: case 'l': case 'r': case 'c': case 'n': case 'a': case 's':
637: case 'L': case 'R': case 'C': case 'N': case 'A': case 'S':
638: case '-': case '=': case '_':
639: n++;
640: }
641: while (p>=line)
642: un1getc(*p--);
643: return(n);
644: }
645: garray(qcol)
646: {
647: char * getcore();
648: style = (int (*)[]) getcore(MAXHEAD*qcol, sizeof(int));
649: evenup = (int *) getcore(qcol, sizeof(int));
650: lefline = (int (*)[]) getcore(MAXHEAD*(qcol+1), sizeof (int)); /*+1 for sample55 loop - others may need it too*/
651: font = (char (*)[][2]) getcore(MAXHEAD*qcol, 2);
652: csize = (char (*)[MAXHEAD][4]) getcore(MAXHEAD*qcol, 4);
653: vsize = (char (*)[MAXHEAD][4]) getcore(MAXHEAD*qcol, 4);
654: flags = (int (*)[]) getcore(MAXHEAD*qcol, sizeof(int));
655: cll = (char (*)[])getcore(qcol, CLLEN);
656: sep = (int *) getcore(qcol+1, sizeof(int));
657: sep++; /* sep[-1] must be legal */
658: used = (int *) getcore(qcol+1, sizeof(int));
659: lused = (int *) getcore(qcol+1, sizeof(int));
660: rused = (int *) getcore(qcol+1, sizeof(int));
661: doubled = (int *) getcore(qcol+1, sizeof(int));
662: acase = (int *) getcore(qcol+1, sizeof(int));
663: topat = (int *) getcore(qcol+1, sizeof(int));
664: }
665: char *
666: getcore(a,b)
667: {
668: char *x, *calloc();
669: x = calloc(a,b);
670: if (x==0)
671: error("Couldn't get memory");
672: return(x);
673: }
674: freearr()
675: {
676: cfree(style);
677: cfree(evenup);
678: cfree(lefline);
679: cfree(flags);
680: cfree(font);
681: cfree(csize);
682: cfree(vsize);
683: cfree(cll);
684: cfree(--sep); /* netnews says this should be --sep because incremented earlier! */
685: cfree(used);
686: cfree(lused);
687: cfree(rused);
688: cfree(doubled);
689: cfree(acase);
690: cfree(topat);
691: }
692: 0707070035051112061006640000510000040000010207410474064464000000500000006556t5.c /* t5.c: read data for table */
693: # include "t..c"
694: gettbl()
695: {
696: extern char *chspace();
697: extern char *maknew();
698: int icol, ch;
699: cstore=cspace= chspace();
700: textflg=0;
701: for (nlin=nslin=0; gets1(cstore, MAXCHS - (cstore-cspace)); nlin++)
702: {
703: stynum[nlin]=nslin;
704: if (prefix(".TE", cstore))
705: {
706: leftover=0;
707: break;
708: }
709: if (prefix(".TC", cstore) || prefix(".T&", cstore))
710: {
711: readspec();
712: nslin++;
713: }
714: if (nlin>=MAXLIN)
715: {
716: leftover=(int)cstore;
717: break;
718: }
719: fullbot[nlin]=0;
720: if (cstore[0] == '.' && !isdigit(cstore[1]))
721: {
722: instead[nlin] = cstore;
723: while (*cstore++);
724: continue;
725: }
726: else instead[nlin] = 0;
727: if (nodata(nlin))
728: {
729: if (ch = oneh(nlin))
730: fullbot[nlin]= ch;
731: table[nlin] = (struct colstr *) alocv((ncol+2)*sizeof(table[0][0]));
732: for(icol=0;icol<ncol;icol++){
733: table[nlin][icol].rcol = "";
734: table[nlin][icol].col = "";
735: }
736: nlin++;
737: nslin++;
738: fullbot[nlin] = 0;
739: instead[nlin] = (char *) 0;
740: }
741: table[nlin] = (struct colstr *) alocv((ncol+2)*sizeof(table[0][0]));
742: if (cstore[1]==0)
743: switch(cstore[0])
744: {
745: case '_': fullbot[nlin]= '-'; continue;
746: case '=': fullbot[nlin]= '='; continue;
747: }
748: stynum[nlin] = nslin;
749: nslin = min(nslin+1, nclin-1);
750: for (icol = 0; icol <ncol; icol++)
751: {
752: table[nlin][icol].col = cstore;
753: table[nlin][icol].rcol=0;
754: ch=1;
755: if (match(cstore, "T{")){ /* text follows */
756: table[nlin][icol].col =
757: (char *)gettext(cstore, nlin, icol,
758: font[icol][stynum[nlin]],
759: csize[icol][stynum[nlin]]);
760: }
761: else
762: {
763: for(; (ch= *cstore) != '\0' && ch != tab; cstore++)
764: ;
765: *cstore++ = '\0';
766: switch(ctype(nlin,icol)) /* numerical or alpha, subcol */
767: {
768: case 'n':
769: table[nlin][icol].rcol = maknew(table[nlin][icol].col);
770: break;
771: case 'a':
772: table[nlin][icol].rcol = table[nlin][icol].col;
773: table[nlin][icol].col = "";
774: break;
775: }
776: }
777: while (ctype(nlin,icol+1)== 's') /* spanning */
778: table[nlin][++icol].col = "";
779: if (ch == '\0') break;
780: }
781: while (++icol <ncol+2)
782: {
783: table[nlin][icol].col = "";
784: table [nlin][icol].rcol=0;
785: }
786: while (*cstore != '\0')
787: cstore++;
788: if (cstore-cspace + MAXLINLEN > MAXCHS)
789: cstore = cspace = chspace();
790: }
791: last = cstore;
792: permute();
793: if (textflg) untext();
794: return;
795: }
796: nodata(il)
797: {
798: int c;
799: for (c=0; c<ncol;c++)
800: {
801: switch(ctype(il,c))
802: {
803: case 'c': case 'n': case 'r': case 'l': case 's': case 'a':
804: return(0);
805: }
806: }
807: return(1);
808: }
809: oneh(lin)
810: {
811: int k, icol;
812: k = ctype(lin,0);
813: for(icol=1; icol<ncol; icol++)
814: {
815: if (k != ctype(lin,icol))
816: return(0);
817: }
818: return(k);
819: }
820: # define SPAN "\\^"
821: permute()
822: {
823: int irow, jcol, is;
824: char *start, *strig;
825: for(jcol=0; jcol<ncol; jcol++)
826: {
827: for(irow=1; irow<nlin; irow++)
828: {
829: if (vspand(irow,jcol,0))
830: {
831: is = prev(irow);
832: if (is<0)
833: error("Vertical spanning in first row not allowed");
834: start = table[is][jcol].col;
835: strig = table[is][jcol].rcol;
836: while (irow<nlin &&vspand(irow,jcol,0))
837: irow++;
838: table[--irow][jcol].col = start;
839: table[irow][jcol].rcol = strig;
840: while (is<irow)
841: {
842: table[is][jcol].rcol =0;
843: table[is][jcol].col= SPAN;
844: is = next(is);
845: }
846: }
847: }
848: }
849: }
850: vspand(ir,ij,ifform)
851: {
852: if (ir<0) return(0);
853: if (ir>=nlin)return(0);
854: if (instead[ir]) return(0);
855: if (ifform==0 && ctype(ir,ij)=='^') return(1);
856: if (table[ir][ij].rcol!=0) return(0);
857: if (fullbot[ir]) return(0);
858: return(vspen(table[ir][ij].col));
859: }
860: vspen(s)
861: char *s;
862: {
863: if (s==0) return(0);
864: if (!point(s)) return(0);
865: return(match(s, SPAN));
866: }
867: 0707070035051112041006640000030000040000010245600265271264300000500000014652t6.c /* t6.c: compute tab stops */
868: # define tx(a) (a>0 && a<128)
869: # include "t..c"
870: maktab()
871: {
872: # define FN(i,c) font[c][stynum[i]]
873: # define SZ(i,c) csize[c][stynum[i]]
874: /* define the tab stops of the table */
875: int icol, ilin, tsep, k, ik, vforml, il, text;
876: char *s;
877: for(icol=0; icol <ncol; icol++)
878: {
879: doubled[icol] = acase[icol] = 0;
880: fprintf(tabout, ".nr %2s 0\n", reg(icol,CRIGHT));
881: for(text=0; text<2; text++)
882: {
883: if (text)
884: fprintf(tabout, ".%2s\n.rm %2s\n", reg(icol, CRIGHT), reg(icol, CRIGHT));
885: for(ilin=0; ilin<nlin; ilin++)
886: {
887: if (instead[ilin]|| fullbot[ilin]) continue;
888: vforml=ilin;
889: for(il=prev(ilin); il>=0 && vspen(table[il][icol].col); il=prev(il))
890: vforml=il;
891: if (fspan(vforml,icol)) continue;
892: if (filler(table[ilin][icol].col)) continue;
893: if ((flags[icol][stynum[ilin]] & ZEROW) != 0) continue;
894: switch(ctype(vforml,icol))
895: {
896: case 'a':
897: acase[icol]=1;
898: s = table[ilin][icol].col;
899: if ((int)s>0 && (int)s<128 && text)
900: {
901: if (doubled[icol]==0)
902: fprintf(tabout, ".nr %d 0\n.nr %d 0\n",S1,S2);
903: doubled[icol]=1;
904: fprintf(tabout, ".if \\n(%c->\\n(%d .nr %d \\n(%c-\n",s,S2,S2,s);
905: }
906: case 'n':
907: if (table[ilin][icol].rcol!=0)
908: {
909: if (doubled[icol]==0 && text==0)
910: fprintf(tabout, ".nr %d 0\n.nr %d 0\n", S1, S2);
911: doubled[icol]=1;
912: if (real(s=table[ilin][icol].col) && !vspen(s))
913: {
914: if (tx((int)s) != text) continue;
915: fprintf(tabout, ".nr %d ", TMP);
916: wide(s, FN(vforml,icol), SZ(vforml,icol)); fprintf(tabout, "\n");
917: fprintf(tabout, ".if \\n(%d<\\n(%d .nr %d \\n(%d\n", S1, TMP, S1, TMP);
918: }
919: if (text==0 && real(s=table[ilin][icol].rcol) && !vspen(s) && !barent(s))
920: {
921: fprintf(tabout, ".nr %d \\w%c%s%c\n",TMP, F1, s, F1);
922: fprintf(tabout, ".if \\n(%d<\\n(%d .nr %d \\n(%d\n",S2,TMP,S2,TMP);
923: }
924: continue;
925: }
926: case 'r':
927: case 'c':
928: case 'l':
929: if (real(s=table[ilin][icol].col) && !vspen(s))
930: {
931: if (tx((int)s) != text) continue;
932: fprintf(tabout, ".nr %d ", TMP);
933: wide(s, FN(vforml,icol), SZ(vforml,icol)); fprintf(tabout, "\n");
934: fprintf(tabout, ".if \\n(%2s<\\n(%d .nr %2s \\n(%d\n", reg(icol,CRIGHT), TMP, reg(icol,CRIGHT), TMP);
935: }
936: }
937: }
938: }
939: if (acase[icol])
940: {
941: fprintf(tabout, ".if \\n(%d>=\\n(%2s .nr %2s \\n(%du+2n\n",S2,reg(icol,CRIGHT),reg(icol,CRIGHT),S2);
942: }
943: if (doubled[icol])
944: {
945: fprintf(tabout, ".nr %2s \\n(%d\n", reg(icol,CMID), S1);
946: fprintf(tabout, ".nr %d \\n(%2s+\\n(%d\n",TMP,reg(icol,CMID),S2);
947: fprintf(tabout, ".if \\n(%d>\\n(%2s .nr %2s \\n(%d\n",TMP,reg(icol,CRIGHT),reg(icol,CRIGHT),TMP);
948: 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);
949: }
950: if (cll[icol][0])
951: {
952: fprintf(tabout, ".nr %d %sn\n", TMP, cll[icol]);
953: fprintf(tabout, ".if \\n(%2s<\\n(%d .nr %2s \\n(%d\n",reg(icol,CRIGHT), TMP, reg(icol,CRIGHT), TMP);
954: }
955: for(ilin=0; ilin<nlin; ilin++)
956: if (k=lspan(ilin, icol))
957: {
958: s=table[ilin][icol-k].col;
959: if (!real(s) || barent(s) || vspen(s) ) continue;
960: fprintf(tabout, ".nr %d ", TMP);
961: wide(table[ilin][icol-k].col, FN(ilin,icol-k), SZ(ilin,icol-k));
962: for(ik=k; ik>=0; ik--)
963: {
964: fprintf(tabout, "-\\n(%2s",reg(icol-ik,CRIGHT));
965: if (!expflg && ik>0) fprintf(tabout, "-%dn", sep[icol-ik]);
966: }
967: fprintf(tabout, "\n");
968: fprintf(tabout, ".if \\n(%d>0 .nr %d \\n(%d/%d\n", TMP, TMP, TMP, k);
969: fprintf(tabout, ".if \\n(%d<0 .nr %d 0\n", TMP, TMP);
970: for(ik=1; ik<=k; ik++)
971: {
972: if (doubled[icol-k+ik])
973: fprintf(tabout, ".nr %2s +\\n(%d/2\n", reg(icol-k+ik,CMID), TMP);
974: fprintf(tabout, ".nr %2s +\\n(%d\n", reg(icol-k+ik,CRIGHT), TMP);
975: }
976: }
977: }
978: if (textflg) untext();
979: /* if even requested, make all columns widest width */
980: # define TMP1 S1
981: # define TMP2 S2
982: if (evenflg)
983: {
984: fprintf(tabout, ".nr %d 0\n", TMP);
985: for(icol=0; icol<ncol; icol++)
986: {
987: if (evenup[icol]==0) continue;
988: fprintf(tabout, ".if \\n(%2s>\\n(%d .nr %d \\n(%2s\n",
989: reg(icol,CRIGHT), TMP, TMP, reg(icol,CRIGHT));
990: }
991: for(icol=0; icol<ncol; icol++)
992: {
993: if (evenup[icol]==0)
994: /* if column not evened just retain old interval */
995: continue;
996: if (doubled[icol])
997: fprintf(tabout, ".nr %2s (100*\\n(%2s/\\n(%2s)*\\n(%d/100\n",
998: reg(icol,CMID), reg(icol,CMID), reg(icol,CRIGHT), TMP);
999: /* that nonsense with the 100's and parens tries
1000: to avoid overflow while proportionally shifting
1001: the middle of the number */
1002: fprintf(tabout, ".nr %2s \\n(%d\n", reg(icol,CRIGHT), TMP);
1003: }
1004: }
1005: /* now adjust for total table width */
1006: for(tsep=icol=0; icol<ncol; icol++)
1007: tsep+= sep[icol];
1008: if (expflg)
1009: {
1010: fprintf(tabout, ".nr %d 0", TMP);
1011: for(icol=0; icol<ncol; icol++)
1012: fprintf(tabout, "+\\n(%2s", reg(icol,CRIGHT));
1013: fprintf(tabout, "\n");
1014: fprintf(tabout, ".nr %d \\n(.l-\\n(%d\n", TMP, TMP);
1015: if (boxflg || dboxflg || allflg)
1016: /* tsep += 1; */ ;
1017: else
1018: tsep -= sep[ncol-1];
1019: fprintf(tabout, ".nr %d \\n(%d/%d\n", TMP, TMP, tsep);
1020: fprintf(tabout, ".if \\n(%d<0 .nr %d 0\n", TMP, TMP);
1021: }
1022: else
1023: fprintf(tabout, ".nr %d 1n\n", TMP);
1024: fprintf(tabout, ".nr %2s 0\n",reg(-1, CRIGHT));
1025: tsep= (boxflg || allflg || dboxflg || left1flg) ? 2 : 0;
1026: if (sep[-1] >= 0) tsep = sep[-1];
1027: for(icol=0; icol<ncol; icol++)
1028: {
1029: fprintf(tabout, ".nr %2s \\n(%2s+((%d*\\n(%d)/2)\n",reg(icol,CLEFT), reg(icol-1,CRIGHT), tsep, TMP);
1030: fprintf(tabout, ".nr %2s +\\n(%2s\n",reg(icol,CRIGHT), reg(icol,CLEFT));
1031: if (doubled[icol])
1032: {
1033: /* the next line is last-ditch effort to avoid zero field width */
1034: /*fprintf(tabout, ".if \\n(%2s=0 .nr %2s 1\n",reg(icol,CMID), reg(icol,CMID));*/
1035: fprintf(tabout, ".nr %2s +\\n(%2s\n", reg(icol,CMID), reg(icol,CLEFT));
1036: /* fprintf(tabout, ".if n .if \\n(%s%%24>0 .nr %s +12u\n",reg(icol,CMID), reg(icol,CMID)); */
1037: }
1038: tsep=sep[icol]*2;
1039: }
1040: if (rightl)
1041: fprintf(tabout, ".nr %s (\\n(%s+\\n(%s)/2\n",reg(ncol-1, CRIGHT), reg(ncol-1,CLEFT), reg(ncol-2,CRIGHT));
1042: fprintf(tabout, ".nr TW \\n(%2s\n", reg(ncol-1, CRIGHT));
1043: tsep = sep[ncol-1];
1044: if (boxflg || allflg || dboxflg)
1045: fprintf(tabout, ".nr TW +((%d*\\n(%d)/2)\n", tsep, TMP);
1046: fprintf(tabout,
1047: ".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);
1048: return;
1049: }
1050: wide(s, fn, size)
1051: char *s, *size, *fn;
1052: {
1053: if (point(s))
1054: {
1055: fprintf(tabout, "\\w%c", F1);
1056: if (*fn>0) putfont(fn);
1057: if (*size) putsize(size);
1058: fprintf(tabout, "%s", s);
1059: if (*fn>0) putfont("P");
1060: if (*size) putsize("0");
1061: fprintf(tabout, "%c",F1);
1062: }
1063: else
1064: fprintf(tabout, "\\n(%c-", s);
1065: }
1066: filler(s)
1067: char *s;
1068: {
1069: return (point(s) && s[0]=='\\' && s[1] == 'R');
1070: }
1071: 0707070035051115071006640000030000040000010245700265271264300000500000006174t7.c /* t7.c: control to write table entries */
1072: # include "t..c"
1073: # define realsplit ((ct=='a'||ct=='n') && table[ldata][c].rcol)
1074: runout()
1075: {
1076: int i;
1077: if (boxflg || allflg || dboxflg) need();
1078: if (ctrflg)
1079: {
1080: fprintf(tabout, ".nr #I \\n(.i\n");
1081: fprintf(tabout, ".in +(\\n(.lu-\\n(TWu-\\n(.iu)/2u\n");
1082: }
1083: fprintf(tabout, ".fc %c %c\n", F1, F2);
1084: fprintf(tabout, ".nr #T 0-1\n");
1085: deftail();
1086: for(i=0; i<nlin; i++)
1087: putline(i,i);
1088: if (leftover)
1089: yetmore();
1090: fprintf(tabout, ".fc\n");
1091: fprintf(tabout, ".nr T. 1\n");
1092: fprintf(tabout, ".T# 1\n");
1093: if (ctrflg)
1094: fprintf(tabout, ".in \\n(#Iu\n");
1095: }
1096: runtabs(lform, ldata)
1097: {
1098: int c, ct, vforml, lf;
1099: fprintf(tabout, ".ta ");
1100: for(c=0; c<ncol; c++)
1101: {
1102: vforml=lform;
1103: for(lf=prev(lform); lf>=0 && vspen(table[lf][c].col); lf=prev(lf))
1104: vforml=lf;
1105: if (fspan(vforml,c))
1106: continue;
1107: switch(ct=ctype(vforml,c))
1108: {
1109: case 'n':
1110: case 'a':
1111: if (table[ldata][c].rcol)
1112: if (lused[c]) /*Zero field width*/
1113: fprintf(tabout, "\\n(%2su ",reg(c,CMID));
1114: case 'c':
1115: case 'l':
1116: case 'r':
1117: if (realsplit? rused[c]: (used[c]+lused[c]))
1118: fprintf(tabout, "\\n(%2su ",reg(c,CRIGHT));
1119: continue;
1120: case 's':
1121: if (lspan(lform, c))
1122: fprintf(tabout, "\\n(%2su ", reg(c,CRIGHT));
1123: continue;
1124: }
1125: }
1126: fprintf(tabout, "\n");
1127: }
1128: ifline(s)
1129: char *s;
1130: {
1131: if (!point(s)) return(0);
1132: if (s[0] == '\\') s++;
1133: if (s[1] ) return(0);
1134: if (s[0] == '_') return('-');
1135: if (s[0] == '=') return('=');
1136: return(0);
1137: }
1138: need()
1139: {
1140: int texlin, horlin, i;
1141: for(texlin=horlin=i=0; i<nlin; i++)
1142: {
1143: if (fullbot[i]!=0)
1144: horlin++;
1145: else
1146: if (instead[i]!=0)
1147: continue;
1148: else
1149: texlin++;
1150: }
1151: fprintf(tabout, ".ne %dv+%dp\n",texlin,2*horlin);
1152: }
1153: deftail()
1154: {
1155: int i, c, lf, lwid;
1156: for(i=0; i<MAXHEAD; i++)
1157: if (linestop[i])
1158: fprintf(tabout, ".nr #%c 0-1\n", linestop[i]+'a'-1);
1159: fprintf(tabout, ".nr #a 0-1\n");
1160: fprintf(tabout, ".eo\n");
1161: fprintf(tabout, ".de T#\n");
1162: fprintf(tabout, ".nr 35 1m\n");
1163: fprintf(tabout, ".ds #d .d\n");
1164: fprintf(tabout, ".if \\(ts\\n(.z\\(ts\\(ts .ds #d nl\n");
1165: fprintf(tabout, ".mk ##\n");
1166: fprintf(tabout, ".nr ## -1v\n");
1167: fprintf(tabout, ".ls 1\n");
1168: for(i=0; i<MAXHEAD; i++)
1169: if (linestop[i])
1170: fprintf(tabout, ".if \\n(#T>=0 .nr #%c \\n(#T\n",linestop[i]+'a'-1);
1171: if (boxflg || allflg || dboxflg) /* bottom of table line */
1172: if (fullbot[nlin-1]==0)
1173: {
1174: if (!pr1403)
1175: fprintf(tabout, ".if \\n(T. .vs \\n(.vu-\\n(.sp\n");
1176: fprintf(tabout, ".if \\n(T. ");
1177: drawline(nlin,0,ncol, dboxflg ? '=' : '-',1,0);
1178: fprintf(tabout, "\n.if \\n(T. .vs\n");
1179: /* T. is really an argument to a macro but because of
1180: eqn we don't dare pass it as an argument and reference by $1 */
1181: }
1182: for(c=0; c<ncol; c++)
1183: {
1184: if ((lf=left(nlin-1,c, &lwid))>=0)
1185: {
1186: fprintf(tabout, ".if \\n(#%c>=0 .sp -1\n",linestop[lf]+'a'-1);
1187: fprintf(tabout, ".if \\n(#%c>=0 ", linestop[lf]+'a'-1);
1188: tohcol(c);
1189: drawvert(lf, nlin-1, c, lwid);
1190: fprintf(tabout, "\\h'|\\n(TWu'\n");
1191: }
1192: }
1193: if (boxflg || allflg || dboxflg) /* right hand line */
1194: {
1195: fprintf(tabout, ".if \\n(#a>=0 .sp -1\n");
1196: fprintf(tabout, ".if \\n(#a>=0 \\h'|\\n(TWu'");
1197: drawvert (0, nlin-1, ncol, dboxflg? 2 : 1);
1198: fprintf(tabout, "\n");
1199: }
1200: fprintf(tabout, ".ls\n");
1201: fprintf(tabout, "..\n");
1202: fprintf(tabout, ".ec\n");
1203: }
1204: 0707070035051115061006660000030000040000010245710406576507100000500000017553t8.c /* t8.c: write out one line of output table */
1205: # include "t..c"
1206: # define realsplit ((ct=='a'||ct=='n') && table[nl][c].rcol)
1207: int watchout;
1208: int once;
1209: putline(i, nl)
1210: /* i is line number for deciding format */
1211: /* nl is line number for finding data usually identical */
1212: {
1213: int c, lf, ct, form, lwid, vspf, ip, cmidx, exvspen, vforml;
1214: int vct, chfont, uphalf;
1215: char *s, *size, *fn;
1216: cmidx=watchout=vspf=exvspen=0;
1217: if (i==0) once=0;
1218: if (i==0 && ( allflg || boxflg || dboxflg))
1219: fullwide(0, dboxflg? '=' : '-');
1220: if (instead[nl]==0 && fullbot[nl] ==0)
1221: for(c=0; c<ncol; c++)
1222: {
1223: s = table[nl][c].col;
1224: if (s==0) continue;
1225: if (vspen(s))
1226: {
1227: for(ip=nl; ip<nlin; ip=next(ip))
1228: if (!vspen(s=table[ip][c].col)) break;
1229: if ((int)s>0 && (int)s<128)
1230: fprintf(tabout, ".ne \\n(%c|u+\\n(.Vu\n",s);
1231: continue;
1232: }
1233: if (point(s)) continue;
1234: fprintf(tabout, ".ne \\n(%c|u+\\n(.Vu\n",s);
1235: watchout=1;
1236: }
1237: if (linestop[nl])
1238: fprintf(tabout, ".mk #%c\n", linestop[nl]+'a'-1);
1239: lf = prev(nl);
1240: if (instead[nl])
1241: {
1242: puts(instead[nl]);
1243: return;
1244: }
1245: if (fullbot[nl])
1246: {
1247: switch (ct=fullbot[nl])
1248: {
1249: case '=':
1250: case '-':
1251: fullwide(nl,ct);
1252: }
1253: return;
1254: }
1255: for(c=0; c<ncol; c++)
1256: {
1257: if (instead[nl]==0 && fullbot[nl]==0)
1258: if (vspen(table[nl][c].col)) vspf=1;
1259: if (lf>=0)
1260: if (vspen(table[lf][c].col)) vspf=1;
1261: }
1262: if (vspf)
1263: {
1264: fprintf(tabout, ".nr #^ \\n(\\*(#du\n");
1265: fprintf(tabout, ".nr #- \\n(#^\n"); /* current line position relative to bottom */
1266: }
1267: vspf=0;
1268: chfont=0;
1269: for(c=0; c<ncol; c++)
1270: {
1271: s = table[nl][c].col;
1272: if (s==0) continue;
1273: chfont |= (int)(font[c][stynum[nl]]);
1274: if (point(s) ) continue;
1275: lf=prev(nl);
1276: if (lf>=0 && vspen(table[lf][c].col))
1277: fprintf(tabout, ".if (\\n(%c|+\\n(^%c-1v)>\\n(#- .nr #- +(\\n(%c|+\\n(^%c-\\n(#--1v)\n",s,'a'+c,s,'a'+c);
1278: else
1279: fprintf(tabout, ".if (\\n(%c|+\\n(#^-1v)>\\n(#- .nr #- +(\\n(%c|+\\n(#^-\\n(#--1v)\n",s,s);
1280: }
1281: if (allflg && once>0 )
1282: fullwide(i,'-');
1283: once=1;
1284: runtabs(i, nl);
1285: if (allh(i) && !pr1403)
1286: {
1287: fprintf(tabout, ".nr %d \\n(.v\n", SVS);
1288: fprintf(tabout, ".vs \\n(.vu-\\n(.sp\n");
1289: fprintf(tabout, ".nr 35 \\n(.vu\n");
1290: }
1291: else
1292: fprintf(tabout, ".nr 35 1m\n");
1293: if (chfont)
1294: fprintf(tabout, ".nr %2d \\n(.f\n", S1);
1295: fprintf(tabout, "\\&");
1296: vct = 0;
1297: for(c=0; c<ncol; c++)
1298: {
1299: uphalf=0;
1300: if (watchout==0 && i+1<nlin && (lf=left(i,c, &lwid))>=0)
1301: {
1302: tohcol(c);
1303: drawvert(lf, i, c, lwid);
1304: vct += 2;
1305: }
1306: if (rightl && c+1==ncol) continue;
1307: vforml=i;
1308: for(lf=prev(nl); lf>=0 && vspen(table[lf][c].col); lf=prev(lf))
1309: vforml= lf;
1310: form= ctype(vforml,c);
1311: if (form != 's')
1312: {
1313: ct = reg(c,CLEFT);
1314: if (form=='a') ct = reg(c,CMID);
1315: if (form=='n' && table[nl][c].rcol && lused[c]==0) ct= reg(c,CMID);
1316: fprintf(tabout, "\\h'|\\n(%2su'", ct);
1317: }
1318: s= table[nl][c].col;
1319: fn = font[c][stynum[vforml]];
1320: size = csize[c][stynum[vforml]];
1321: if (*size==0)size=0;
1322: if ((flags[c][stynum[nl]] & HALFUP)!=0 && pr1403 == 0)
1323: uphalf=1;
1324: switch(ct=ctype(vforml, c))
1325: {
1326: case 'n':
1327: case 'a':
1328: if (table[nl][c].rcol)
1329: {
1330: if (lused[c]) /*Zero field width*/
1331: {
1332: ip = prev(nl);
1333: if (ip>=0)
1334: if (vspen(table[ip][c].col))
1335: {
1336: if (exvspen==0)
1337: {
1338: fprintf(tabout, "\\v'-(\\n(\\*(#du-\\n(^%cu", c+'a');
1339: if (cmidx)
1340: fprintf(tabout, "-((\\n(#-u-\\n(^%cu)/2u)", c+'a');
1341: vct++;
1342: if (pr1403) /* must round to whole lines */
1343: fprintf(tabout, "/1v*1v");
1344: fprintf(tabout, "'");
1345: exvspen=1;
1346: }
1347: }
1348: fprintf(tabout, "%c%c",F1,F2);
1349: if (uphalf) fprintf(tabout, "\\u");
1350: puttext(s,fn,size);
1351: if (uphalf) fprintf(tabout, "\\d");
1352: fprintf(tabout, "%c",F1);
1353: }
1354: s= table[nl][c].rcol;
1355: form=1;
1356: break;
1357: }
1358: case 'c':
1359: form=3; break;
1360: case 'r':
1361: form=2; break;
1362: case 'l':
1363: form=1; break;
1364: case '-':
1365: case '=':
1366: if (real(table[nl][c].col))
1367: fprintf(stderr,"%s: line %d: Data ignored on table line %d\n", ifile, iline-1, i+1);
1368: makeline(i,c,ct);
1369: continue;
1370: default:
1371: continue;
1372: }
1373: if (realsplit ? rused[c]: used[c]) /*Zero field width*/
1374: {
1375: /* form: 1 left, 2 right, 3 center adjust */
1376: if (ifline(s))
1377: {
1378: makeline(i,c,ifline(s));
1379: continue;
1380: }
1381: if (filler(s))
1382: {
1383: fprintf(tabout, "\\l'|\\n(%2su\\&%s'", reg(c,CRIGHT), s+2);
1384: continue;
1385: }
1386: ip = prev(nl);
1387: cmidx = (flags[c][stynum[nl]] & (CTOP|CDOWN))==0;
1388: if (ip>=0)
1389: if (vspen(table[ip][c].col))
1390: {
1391: if (exvspen==0)
1392: {
1393: fprintf(tabout, "\\v'-(\\n(\\*(#du-\\n(^%cu", c+'a');
1394: if (cmidx)
1395: fprintf(tabout, "-((\\n(#-u-\\n(^%cu)/2u)", c+'a');
1396: vct++;
1397: if (pr1403) /* round to whole lines */
1398: fprintf(tabout, "/1v*1v");
1399: fprintf(tabout, "'");
1400: }
1401: }
1402: fprintf(tabout, "%c", F1);
1403: if (form!= 1)
1404: fprintf(tabout, "%c", F2);
1405: if (vspen(s))
1406: vspf=1;
1407: else
1408: {
1409: if (uphalf) fprintf(tabout, "\\u");
1410: puttext(s, fn, size);
1411: if (uphalf) fprintf(tabout, "\\d");
1412: }
1413: if (form !=2)
1414: fprintf(tabout, "%c", F2);
1415: fprintf(tabout, "%c", F1);
1416: }
1417: ip = prev(nl);
1418: if (ip>=0)
1419: if (vspen(table[ip][c].col))
1420: {
1421: exvspen = (c+1 < ncol) && vspen(table[ip][c+1].col) &&
1422: (topat[c] == topat[c+1]) &&
1423: (cmidx == (flags[c+1] [stynum[nl]]&(CTOP|CDOWN)==0)) && (left(i,c+1,&lwid)<0);
1424: if (exvspen==0)
1425: {
1426: fprintf(tabout, "\\v'(\\n(\\*(#du-\\n(^%cu", c+'a');
1427: if (cmidx)
1428: fprintf(tabout, "-((\\n(#-u-\\n(^%cu)/2u)", c+'a');
1429: vct++;
1430: if (pr1403) /* round to whole lines */
1431: fprintf(tabout, "/1v*1v");
1432: fprintf(tabout, "'");
1433: }
1434: }
1435: else
1436: exvspen=0;
1437: /* if lines need to be split for gcos here is the place for a backslash */
1438: if (vct > 7 && c < ncol)
1439: {
1440: fprintf(tabout, "\n.sp-1\n\\&");
1441: vct=0;
1442: }
1443: }
1444: fprintf(tabout, "\n");
1445: if (allh(i) && !pr1403) fprintf(tabout, ".vs \\n(%du\n", SVS);
1446: if (watchout)
1447: funnies(i,nl);
1448: if (vspf)
1449: {
1450: for(c=0; c<ncol; c++)
1451: if (vspen(table[nl][c].col) && (nl==0 || (lf=prev(nl))<0 || !vspen(table[lf][c].col)))
1452: {
1453: fprintf(tabout, ".nr ^%c \\n(#^u\n", 'a'+c);
1454: topat[c]=nl;
1455: }
1456: }
1457: }
1458: puttext(s,fn, size)
1459: char *s, *size, *fn;
1460: {
1461: if (point(s))
1462: {
1463: putfont(fn);
1464: putsize(size);
1465: fprintf(tabout, "%s",s);
1466: if (*fn>0) fprintf(tabout, "\\f\\n(%2d", S1);
1467: if (size!=0) putsize("0");
1468: }
1469: }
1470: funnies( stl, lin)
1471: {
1472: /* write out funny diverted things */
1473: int c, s, pl, lwid, dv, lf, ct;
1474: char *fn;
1475: fprintf(tabout, ".mk ##\n"); /* rmember current vertical position */
1476: fprintf(tabout, ".nr %d \\n(##\n", S1); /* bottom position */
1477: for(c=0; c<ncol; c++)
1478: {
1479: s = (int)table[lin][c].col;
1480: if (point(s)) continue;
1481: if (s==0) continue;
1482: fprintf(tabout, ".sp |\\n(##u-1v\n");
1483: fprintf(tabout, ".nr %d ", SIND);
1484: for(pl=stl; pl>=0 && !isalpha(ct=ctype(pl,c)); pl=prev(pl))
1485: ;
1486: switch (ct)
1487: {
1488: case 'n':
1489: case 'c':
1490: fprintf(tabout, "(\\n(%2su+\\n(%2su-\\n(%c-u)/2u\n",reg(c,CLEFT),reg(c-1+ctspan(lin,c),CRIGHT), s);
1491: break;
1492: case 'l':
1493: fprintf(tabout, "\\n(%2su\n",reg(c,CLEFT));
1494: break;
1495: case 'a':
1496: fprintf(tabout, "\\n(%2su\n",reg(c,CMID));
1497: break;
1498: case 'r':
1499: fprintf(tabout, "\\n(%2su-\\n(%c-u\n", reg(c,CRIGHT), s);
1500: break;
1501: }
1502: fprintf(tabout, ".in +\\n(%du\n", SIND);
1503: fn=font[c][stynum[stl]];
1504: putfont(fn);
1505: pl = prev(stl);
1506: if (stl>0 && pl>=0 && vspen(table[pl][c].col))
1507: {
1508: fprintf(tabout, ".sp |\\n(^%cu\n", 'a'+c);
1509: if ((flags[c][stynum[stl]]&(CTOP|CDOWN))==0)
1510: {
1511: fprintf(tabout, ".nr %d \\n(#-u-\\n(^%c-\\n(%c|+1v\n",TMP, 'a'+c, s);
1512: fprintf(tabout, ".if \\n(%d>0 .sp \\n(%du/2u", TMP, TMP);
1513: if (pr1403) /* round */
1514: fprintf(tabout, "/1v*1v");
1515: fprintf(tabout, "\n");
1516: }
1517: }
1518: fprintf(tabout, ".%c+\n",s);
1519: fprintf(tabout, ".in -\\n(%du\n", SIND);
1520: if (*fn>0) putfont("P");
1521: fprintf(tabout, ".mk %d\n", S2);
1522: fprintf(tabout, ".if \\n(%d>\\n(%d .nr %d \\n(%d\n", S2, S1, S1, S2);
1523: }
1524: fprintf(tabout, ".sp |\\n(%du\n", S1);
1525: for(c=dv=0; c<ncol; c++)
1526: {
1527: if (stl+1< nlin && (lf=left(stl,c,&lwid))>=0)
1528: {
1529: if (dv++ == 0)
1530: fprintf(tabout, ".sp -1\n");
1531: tohcol(c);
1532: dv++;
1533: drawvert(lf, stl, c, lwid);
1534: }
1535: }
1536: if (dv)
1537: fprintf(tabout,"\n");
1538: }
1539: putfont(fn)
1540: char *fn;
1541: {
1542: if (fn && *fn)
1543: fprintf(tabout, fn[1] ? "\\f(%.2s" : "\\f%.2s", fn);
1544: }
1545: putsize(s)
1546: char *s;
1547: {
1548: if (s && *s)
1549: fprintf(tabout, "\\s%s",s);
1550: }
1551: 0707070035051115051006640000030000040000010207610474064475300000500000002656t9.c /* t9.c: write lines for tables over 200 lines */
1552: # include "t..c"
1553: static useln;
1554: extern char *maknew();
1555: yetmore()
1556: {
1557: for(useln=0; useln<MAXLIN && table[useln]==0; useln++);
1558: if (useln>=MAXLIN)
1559: error("Wierd. No data in table.");
1560: table[0]=table[useln];
1561: for(useln=nlin-1; useln>=0 && (fullbot[useln] || instead[useln]); useln--);
1562: if (useln<0)
1563: error("Wierd. No real lines in table.");
1564: domore(leftover);
1565: while (gets1(cstore=cspace, MAXCHS) && domore(cstore))
1566: ;
1567: last =cstore;
1568: return;
1569: }
1570: domore(dataln)
1571: char *dataln;
1572: {
1573: int icol, ch;
1574: if (prefix(".TE", dataln))
1575: return(0);
1576: if (dataln[0] == '.' && !isdigit(dataln[1]))
1577: {
1578: puts(dataln);
1579: return(1);
1580: }
1581: fullbot[0]=0;
1582: instead[0]=(char *)0;
1583: if (dataln[1]==0)
1584: switch(dataln[0])
1585: {
1586: case '_': fullbot[0]= '-'; putline(useln,0); return(1);
1587: case '=': fullbot[0]= '='; putline(useln, 0); return(1);
1588: }
1589: for (icol = 0; icol <ncol; icol++)
1590: {
1591: table[0][icol].col = dataln;
1592: table[0][icol].rcol=0;
1593: for(; (ch= *dataln) != '\0' && ch != tab; dataln++)
1594: ;
1595: *dataln++ = '\0';
1596: switch(ctype(useln,icol))
1597: {
1598: case 'n':
1599: table[0][icol].rcol = maknew(table[0][icol].col);
1600: break;
1601: case 'a':
1602: table[0][icol].rcol = table[0][icol].col;
1603: table[0][icol].col= "";
1604: break;
1605: }
1606: while (ctype(useln,icol+1)== 's') /* spanning */
1607: table[0][++icol].col = "";
1608: if (ch == '\0') break;
1609: }
1610: while (++icol <ncol)
1611: table[0][icol].col = "";
1612: putline(useln,0);
1613: exstore=exspace; /* reuse space for numerical items */
1614: return(1);
1615: }
1616: 0707070035051115041006640000030000040000010207630474064504300000500000003071tb.c /* tb.c: check which entries exist, also storage allocation */
1617: # include "t..c"
1618: checkuse()
1619: {
1620: int i,c, k;
1621: for(c=0; c<ncol; c++)
1622: {
1623: used[c]=lused[c]=rused[c]=0;
1624: for(i=0; i<nlin; i++)
1625: {
1626: if (instead[i] || fullbot[i]) continue;
1627: k = ctype(i,c);
1628: if (k== '-' || k == '=') continue;
1629: if ((k=='n'||k=='a'))
1630: {
1631: rused[c]|= real(table[i][c].rcol);
1632: if( !real(table[i][c].rcol))
1633: used[c] |= real(table[i][c].col);
1634: if (table[i][c].rcol)
1635: lused[c] |= real(table[i][c].col);
1636: }
1637: else
1638: used[c] |= real(table[i][c].col);
1639: }
1640: }
1641: }
1642: real(s)
1643: char *s;
1644: {
1645: if (s==0) return(0);
1646: if (!point(s)) return(1);
1647: if (*s==0) return(0);
1648: return(1);
1649: }
1650: int spcount = 0;
1651: extern char * calloc();
1652: # define MAXVEC 20
1653: char *spvecs[MAXVEC];
1654: char *chspace()
1655: {
1656: char *pp;
1657: if (spvecs[spcount])
1658: return(spvecs[spcount++]);
1659: if (spcount>=MAXVEC)
1660: error("Too many characters in table");
1661: spvecs[spcount++]= pp = calloc(MAXCHS+MAXLINLEN,1);
1662: if (pp== (char *)-1 || pp == (char *)0)
1663: error("no space for characters");
1664: return(pp);
1665: }
1666: # define MAXPC 50
1667: char *thisvec;
1668: int tpcount = -1;
1669: char *tpvecs[MAXPC];
1670: int *alocv(n)
1671: int n;
1672: {
1673: int *tp, *q;
1674: if (tpcount<0 || thisvec+n > tpvecs[tpcount]+MAXCHS)
1675: {
1676: tpcount++;
1677: if (tpvecs[tpcount]==0)
1678: {
1679: tpvecs[tpcount] = calloc(MAXCHS,1);
1680: }
1681: thisvec = tpvecs[tpcount];
1682: if (thisvec == (char *)0)
1683: error("no space for vectors");
1684: }
1685: tp=(int *)thisvec;
1686: thisvec+=n;
1687: for(q=tp; q<(int *)thisvec; q++)
1688: *q=0;
1689: return(tp);
1690: }
1691: release()
1692: {
1693: /* give back unwanted space in some vectors */
1694: /* this should call free; it does not because
1695: alloc() is so buggy */
1696: spcount=0;
1697: tpcount= -1;
1698: exstore=0;
1699: }
1700: 0707070035051115031006640000030000040000010245750265271264600000500000002130tc.c /* tc.c: find character not in table to delimit fields */
1701: # include "t..c"
1702: choochar()
1703: {
1704: /* choose funny characters to delimit fields */
1705: int had[128], ilin,icol, k;
1706: char *s;
1707: for(icol=0; icol<128; icol++)
1708: had[icol]=0;
1709: F1 = F2 = 0;
1710: for(ilin=0;ilin<nlin;ilin++)
1711: {
1712: if (instead[ilin]) continue;
1713: if (fullbot[ilin]) continue;
1714: for(icol=0; icol<ncol; icol++)
1715: {
1716: k = ctype(ilin, icol);
1717: if (k==0 || k == '-' || k == '=')
1718: continue;
1719: s = table[ilin][icol].col;
1720: if (point(s))
1721: while (*s)
1722: had[*s++]=1;
1723: s=table[ilin][icol].rcol;
1724: if (point(s))
1725: while (*s)
1726: had[*s++]=1;
1727: }
1728: }
1729: /* choose first funny character */
1730: for(
1731: s="\002\003\005\006\007!%&#/?,:;<=>@`^~_{}+-*ABCDEFGHIJKMNOPQRSTUVWXYZabcdefgjkoqrstwxyz";
1732: *s; s++)
1733: {
1734: if (had[*s]==0)
1735: {
1736: F1= *s;
1737: had[F1]=1;
1738: break;
1739: }
1740: }
1741: /* choose second funny character */
1742: for(
1743: s="\002\003\005\006\007:_~^`@;,<=>#%&!/?{}+-*ABCDEFGHIJKMNOPQRSTUVWXZabcdefgjkoqrstuwxyz";
1744: *s; s++)
1745: {
1746: if (had[*s]==0)
1747: {
1748: F2= *s;
1749: break;
1750: }
1751: }
1752: if (F1==0 || F2==0)
1753: error("couldn't find characters to use for delimiters");
1754: return;
1755: }
1756: point(s)
1757: {
1758: return(s>= 128 || s<0);
1759: }
1760: 0707070035051115021006640000030000040000011516550474434145100000500000002144te.c /* te.c: error message control, input line count */
1761: # include "t..c"
1762: error(s)
1763: char *s;
1764: {
1765: fprintf(stderr, "\n%s: line %d: %s\n", ifile, iline, s);
1766: # ifdef unix
1767: fprintf(stderr, "tbl quits\n");
1768: exit(1);
1769: # endif
1770: # ifdef gcos
1771: fprintf(stderr, "run terminated due to error condition detected by tbl preprocessor\n");
1772: exit(0);
1773: # endif
1774: }
1775: char *gets1(s, size)
1776: char *s;
1777: int size;
1778: {
1779: char *p, *ns;
1780: int nbl = 0;
1781: iline++;
1782: ns = s;
1783: p=fgets(s,size,tabin);
1784: while (p==0)
1785: {
1786: if (swapin()==0)
1787: return(0);
1788: p = fgets(s,size,tabin);
1789: }
1790:
1791: while (*s) s++;
1792: s--;
1793: if (*s == '\n') *s-- =0;
1794: else error("input buffer too small");
1795: for(nbl=0; *s == '\\' && s>p; s--)
1796: nbl++;
1797: if (linstart && nbl % 2) /* fold escaped nl if in table */
1798: gets1(s+1, size - (s-ns));
1799:
1800: return(p);
1801: }
1802: # define BACKMAX 500
1803: char backup[BACKMAX];
1804: char *backp = backup;
1805: un1getc(c)
1806: {
1807: if (c=='\n')
1808: iline--;
1809: *backp++ = c;
1810: if (backp >= backup+BACKMAX)
1811: error("too much backup");
1812: }
1813: get1char()
1814: {
1815: int c;
1816: if (backp>backup)
1817: c = *--backp;
1818: else
1819: c=getc(tabin);
1820: if (c== EOF) /* EOF */
1821: {
1822: if (swapin() ==0)
1823: error("unexpected EOF");
1824: c = getc(tabin);
1825: }
1826: if (c== '\n')
1827: iline++;
1828: return(c);
1829: }
1830: 0707070035051115011006640000030000040000010245770446267321300000500000002207tf.c /* tf.c: save and restore fill mode around table */
1831: # include "t..c"
1832: savefill()
1833: {
1834: /* remembers various things: fill mode, vs, ps in mac 35 (SF) */
1835: fprintf(tabout, ".de %d\n",SF);
1836: fprintf(tabout, ".ps \\n(.s\n");
1837: fprintf(tabout, ".vs \\n(.vu\n");
1838: fprintf(tabout, ".in \\n(.iu\n");
1839: fprintf(tabout, ".if \\n(.u .fi\n");
1840: fprintf(tabout, ".if \\n(.j .ad\n");
1841: fprintf(tabout, ".if \\n(.j=0 .na\n");
1842: fprintf(tabout, "..\n");
1843: fprintf(tabout, ".nf\n");
1844: /* set obx offset if useful */
1845: fprintf(tabout, ".nr #~ 0\n");
1846: fprintf(tabout, ".if \\n(.T .if n .nr #~ 0.6n\n");
1847: }
1848: rstofill()
1849: {
1850: fprintf(tabout, ".%d\n",SF);
1851: }
1852: endoff()
1853: {
1854: int i;
1855: for(i=0; i<MAXHEAD; i++)
1856: if (linestop[i])
1857: fprintf(tabout, ".nr #%c 0\n", linestop[i]+'a'-1);
1858: for(i=0; i<texct; i++)
1859: fprintf(tabout, ".rm %c+\n",texstr[i]);
1860: fprintf(tabout, "%s\n", last);
1861: }
1862: ifdivert()
1863: {
1864: fprintf(tabout, ".ds #d .d\n");
1865: fprintf(tabout, ".if \\(ts\\n(.z\\(ts\\(ts .ds #d nl\n");
1866: }
1867: saveline()
1868: {
1869: fprintf(tabout, ".if \\n+(b.=1 .nr d. \\n(.c-\\n(c.-1\n");
1870: linstart=iline;
1871: }
1872: restline()
1873: {
1874: fprintf(tabout,".if \\n-(b.=0 .nr c. \\n(.c-\\n(d.-%d\n", iline-linstart);
1875: linstart = 0;
1876: }
1877: cleanfc()
1878: {
1879: fprintf(tabout, ".fc\n");
1880: }
1881: 0707070035051113651006640000510000040000010247370474434102600000500000003570tg.c /* tg.c: process included text blocks */
1882: # include "t..c"
1883: gettext(sp, ilin,icol, fn, sz)
1884: char *sp, *fn, *sz;
1885: {
1886: /* get a section of text */
1887: char line[4096];
1888: int oname;
1889: char *vs;
1890: if (texname==0) error("Too many text block diversions");
1891: if (textflg==0)
1892: {
1893: fprintf(tabout, ".nr %d \\n(.lu\n", SL); /* remember old line length */
1894: textflg=1;
1895: }
1896: fprintf(tabout, ".eo\n");
1897: fprintf(tabout, ".am %s\n", reg(icol,CRIGHT));
1898: fprintf(tabout, ".br\n");
1899: fprintf(tabout, ".di %c+\n", texname);
1900: rstofill();
1901: if (fn && *fn) fprintf(tabout, ".nr %d \\n(.f\n.ft %s\n", S1, fn);
1902: fprintf(tabout, ".ft \\n(.f\n"); /* protect font */
1903: vs = vsize[icol][stynum[ilin]];
1904: if ((sz && *sz) || (vs && *vs))
1905: {
1906: fprintf(tabout, ".nr %d \\n(.v\n", S9);
1907: if (vs==0 || *vs==0) vs= "\\n(.s+2";
1908: if (sz && *sz)
1909: fprintf(tabout, ".ps %s\n",sz);
1910: fprintf(tabout, ".vs %s\n",vs);
1911: fprintf(tabout, ".if \\n(%du>\\n(.vu .sp \\n(%du-\\n(.vu\n", S9,S9);
1912: }
1913: if (cll[icol][0])
1914: fprintf(tabout, ".ll %sn\n", cll[icol]);
1915: else
1916: fprintf(tabout, ".ll \\n(%du*%du/%du\n",SL,ctspan(ilin,icol),ncol+1);
1917: fprintf(tabout,".if \\n(.l<\\n(%2s .ll \\n(%2su\n", reg(icol,CRIGHT), reg(icol,CRIGHT));
1918: if (ctype(ilin,icol)=='a')
1919: fprintf(tabout, ".ll -2n\n");
1920: fprintf(tabout, ".in 0\n");
1921: while (gets1(line, sizeof(line)))
1922: {
1923: if (line[0]=='T' && line[1]=='}' && line[2]== tab) break;
1924: if (match("T}", line)) break;
1925: fprintf(tabout, "%s\n", line);
1926: }
1927: if (fn && *fn) fprintf(tabout, ".ft \\n(%d\n", S1);
1928: if (sz && *sz) fprintf(tabout, ".br\n.ps\n.vs\n");
1929: fprintf(tabout, ".br\n");
1930: fprintf(tabout, ".di\n");
1931: fprintf(tabout, ".nr %c| \\n(dn\n", texname);
1932: fprintf(tabout, ".nr %c- \\n(dl\n", texname);
1933: fprintf(tabout, "..\n");
1934: fprintf(tabout, ".ec \\\n");
1935: /* copy remainder of line */
1936: if (line[2])
1937: tcopy (sp, line+3);
1938: else
1939: *sp=0;
1940: oname=texname;
1941: texname = texstr[++texct];
1942: return(oname);
1943: }
1944: untext()
1945: {
1946: rstofill();
1947: fprintf(tabout, ".nf\n");
1948: fprintf(tabout, ".ll \\n(%du\n", SL);
1949: }
1950: 0707070035051114771006640000030000040000010246010265271266600000500000002004ti.c /* ti.c: classify line intersections */
1951: # include "t..c"
1952: /* determine local environment for intersections */
1953: interv(i,c)
1954: {
1955: int ku, kl;
1956: if (c>=ncol || c == 0)
1957: {
1958: if (dboxflg)
1959: {
1960: if (i==0) return(BOT);
1961: if (i>=nlin) return(TOP);
1962: return(THRU);
1963: }
1964: if (c>=ncol)
1965: return(0);
1966: }
1967: ku = i>0 ? lefdata(i-1,c) : 0;
1968: if (i+1 >= nlin && allh(i))
1969: kl=0;
1970: else
1971: kl = lefdata(allh(i) ? i+1 : i, c);
1972: if (ku==2 && kl==2) return(THRU);
1973: if (ku ==2) return(TOP);
1974: if (kl==BOT) return(2);
1975: return(0);
1976: }
1977: interh(i,c)
1978: {
1979: int kl, kr;
1980: if (fullbot[i]== '=' || (dboxflg && (i==0 || i>= nlin-1)))
1981: {
1982: if (c==ncol)
1983: return(LEFT);
1984: if (c==0)
1985: return(RIGHT);
1986: return(THRU);
1987: }
1988: if (i>=nlin) return(0);
1989: kl = c>0 ? thish (i,c-1) : 0;
1990: if (kl<=1 && i>0 && allh(up1(i)))
1991: kl = c>0 ? thish(up1(i),c-1) : 0;
1992: kr = thish(i,c);
1993: if (kr<=1 && i>0 && allh(up1(i)))
1994: kr = c>0 ? thish(up1(i), c) : 0;
1995: if (kl== '=' && kr == '=') return(THRU);
1996: if (kl== '=') return(LEFT);
1997: if (kr== '=') return(RIGHT);
1998: return(0);
1999: }
2000: up1(i)
2001: {
2002: i--;
2003: while (instead[i] && i>0) i--;
2004: return(i);
2005: }
2006: 0707070035051114761006640000030000040000010246020265271266600000500000002123tm.c /* tm.c: split numerical fields */
2007: # include "t..c"
2008: char *maknew(str)
2009: char *str;
2010: {
2011: /* make two numerical fields */
2012: extern char *chspace();
2013: int dpoint, c;
2014: char *p, *q, *ba;
2015: p = str;
2016: for (ba= 0; c = *str; str++)
2017: if (c == '\\' && *(str+1)== '&')
2018: ba=str;
2019: str=p;
2020: if (ba==0)
2021: {
2022: for (dpoint=0; *str; str++)
2023: {
2024: if (*str=='.' && !ineqn(str,p) &&
2025: (str>p && digit(*(str-1)) ||
2026: digit(*(str+1))))
2027: dpoint=(int)str;
2028: }
2029: if (dpoint==0)
2030: for(; str>p; str--)
2031: {
2032: if (digit( * (str-1) ) && !ineqn(str, p))
2033: break;
2034: }
2035: if (!dpoint && p==str) /* not numerical, don't split */
2036: return(0);
2037: if (dpoint) str=(char *)dpoint;
2038: }
2039: else
2040: str = ba;
2041: p =str;
2042: if (exstore ==0 || exstore >exlim)
2043: {
2044: exstore = exspace = chspace();
2045: exlim= exstore+MAXCHS;
2046: }
2047: q = exstore;
2048: while (*exstore++ = *str++);
2049: *p = 0;
2050: return(q);
2051: }
2052: ineqn (s, p)
2053: char *s, *p;
2054: {
2055: /* true if s is in a eqn within p */
2056: int ineq = 0, c;
2057: while (c = *p)
2058: {
2059: if (s == p)
2060: return(ineq);
2061: p++;
2062: if ((ineq == 0) && (c == delim1))
2063: ineq = 1;
2064: else
2065: if ((ineq == 1) && (c == delim2))
2066: ineq = 0;
2067: }
2068: return(0);
2069: }
2070: 0707070035051114751006640000030000040000010246030265271266700000500000001554tr.c # include "t..c"
2071: /* tr.c: number register allocation */
2072: char * nregs[] ={
2073: /* this array must have at least 3*qcol entries
2074: or illegal register names will result */
2075: "40","41","42","43","44","45","46","47","48","49",
2076: "50","51","52","53","54","55","56","57","58","59",
2077: "60","61","62","63","64","65","66","67","68","69",
2078: "70","71","72","73","74","75","76","77","78","79",
2079: "80","81","82","83","84","85","86","87","88","89",
2080: "90","91","92","93","94","95","96","97","4q","4r",
2081: "4s","4t","4u","4v","4w","4x","4y","4z","4;","4.",
2082: "4a","4b","4c","4d","4e","4f","4g","4h","4i","4j",
2083: "4k","4l","4m","4n","4o","4p","5a","5b","5c","5d",
2084: "5e","5f","5g","5h","5i","5j","5k","5l","5m","5n",
2085: "5o","5p","5q","5r","5s","5t","5u","5v","5w","5x",
2086: 0};
2087: char *
2088: reg(col, place)
2089: {
2090: if(sizeof(nregs) < 2*3*qcol)
2091: error("Too many columns for registers");
2092: return (nregs[qcol*place+col]);
2093: }
2094: 0707070035051114741006640000030000040000010246040265271266700000500000001243ts.c /* ts.c: minor string processing subroutines */
2095: match (s1, s2)
2096: char *s1, *s2;
2097: {
2098: while (*s1 == *s2)
2099: if (*s1++ == '\0')
2100: return(1);
2101: else
2102: s2++;
2103: return(0);
2104: }
2105: prefix(small, big)
2106: char *small, *big;
2107: {
2108: int c;
2109: while ((c= *small++) == *big++)
2110: if (c==0) return(1);
2111: return(c==0);
2112: }
2113: letter (ch)
2114: {
2115: if (ch >= 'a' && ch <= 'z')
2116: return(1);
2117: if (ch >= 'A' && ch <= 'Z')
2118: return(1);
2119: return(0);
2120: }
2121: numb(str)
2122: char *str;
2123: {
2124: /* convert to integer */
2125: int k;
2126: for (k=0; *str >= '0' && *str <= '9'; str++)
2127: k = k*10 + *str - '0';
2128: return(k);
2129: }
2130: digit(x)
2131: {
2132: return(x>= '0' && x<= '9');
2133: }
2134: max(a,b)
2135: {
2136: return( a>b ? a : b);
2137: }
2138: tcopy (s,t)
2139: char *s, *t;
2140: {
2141: while (*s++ = *t++);
2142: }
2143: 0707070035051114731006640000030000040000010246050265271267000000500000002651tt.c /* tt.c: subroutines for drawing horizontal lines */
2144: # include "t..c"
2145: ctype(il, ic)
2146: {
2147: if (instead[il])
2148: return(0);
2149: if (fullbot[il])
2150: return(0);
2151: il = stynum[il];
2152: return(style[ic][il]);
2153: }
2154: min(a,b)
2155: {
2156: return(a<b ? a : b);
2157: }
2158: fspan(i,c)
2159: {
2160: c++;
2161: return(c<ncol && ctype(i,c)=='s');
2162: }
2163: lspan(i,c)
2164: {
2165: int k;
2166: if (ctype(i,c) != 's') return(0);
2167: c++;
2168: if (c < ncol && ctype(i,c)== 's')
2169: return(0);
2170: for(k=0; ctype(i,--c) == 's'; k++);
2171: return(k);
2172: }
2173: ctspan(i,c)
2174: {
2175: int k;
2176: c++;
2177: for(k=1; c<ncol && ctype(i,c)=='s'; k++)
2178: c++;
2179: return(k);
2180: }
2181: tohcol(ic)
2182: {
2183: if (ic==0)
2184: fprintf(tabout, "\\h'|0'");
2185: else
2186: fprintf(tabout, "\\h'(|\\n(%2su+|\\n(%2su)/2u'", reg(ic,CLEFT), reg(ic-1,CRIGHT));
2187: }
2188: allh(i)
2189: {
2190: /* return true if every element in line i is horizontal */
2191: /* also at least one must be horizontl */
2192: int c, one, k;
2193: if (fullbot[i]) return(1);
2194: if (i>=nlin) return(dboxflg||boxflg);
2195: for(one=c=0; c<ncol; c++)
2196: {
2197: k = thish(i,c);
2198: if (k==0) return(0);
2199: if (k==1) continue;
2200: one=1;
2201: }
2202: return(one);
2203: }
2204: thish(i,c)
2205: {
2206: int t;
2207: char *s;
2208: struct colstr *pc;
2209: if (c<0)return(0);
2210: if (i<0) return(0);
2211: t = ctype(i,c);
2212: if (t=='_' || t == '-')
2213: return('-');
2214: if (t=='=')return('=');
2215: if (t=='^') return(1);
2216: if (fullbot[i] )
2217: return(fullbot[i]);
2218: if (t=='s') return(thish(i,c-1));
2219: if (t==0) return(1);
2220: pc = &table[i][c];
2221: s = (t=='a' ? pc->rcol : pc->col);
2222: if (s==0 || (point(s) && *s==0))
2223: return(1);
2224: if (vspen(s)) return(1);
2225: if (t=barent( s))
2226: return(t);
2227: return(0);
2228: }
2229: 0707070035051114721006640000030000040000010246060265271267000000500000010000tu.c /* tu.c: draws horizontal lines */
2230: # include "t..c"
2231: makeline(i,c,lintype)
2232: {
2233: int cr, type, shortl;
2234: type = thish(i,c);
2235: if (type==0) return;
2236: cr=c;
2237: shortl = (table[i][c].col[0]=='\\');
2238: if (c>0 && !shortl && thish(i,c-1) == type)return;
2239: if (shortl==0)
2240: for(cr=c; cr < ncol && (ctype(i,cr)=='s'||type==thish(i,cr)); cr++);
2241: else
2242: for(cr=c+1; cr<ncol && ctype(i,cr)=='s'; cr++);
2243: drawline(i, c, cr-1, lintype, 0, shortl);
2244: }
2245: fullwide(i, lintype)
2246: {
2247: int cr, cl;
2248: if (!pr1403)
2249: fprintf(tabout, ".nr %d \\n(.v\n.vs \\n(.vu-\\n(.sp\n", SVS);
2250: cr= 0;
2251: while (cr<ncol)
2252: {
2253: cl=cr;
2254: while (i>0 && vspand(prev(i),cl,1))
2255: cl++;
2256: for(cr=cl; cr<ncol; cr++)
2257: if (i>0 && vspand(prev(i),cr,1))
2258: break;
2259: if (cl<ncol)
2260: drawline(i,cl,(cr<ncol?cr-1:cr),lintype,1,0);
2261: }
2262: fprintf(tabout, "\n");
2263: if (!pr1403)
2264: fprintf(tabout, ".vs \\n(%du\n", SVS);
2265: }
2266:
2267: drawline(i, cl, cr, lintype, noheight, shortl)
2268: {
2269: char *exhr, *exhl, *lnch;
2270: int lcount, ln, linpos, oldpos, nodata;
2271: lcount=0;
2272: exhr=exhl= "";
2273: switch(lintype)
2274: {
2275: case '-': lcount=1;break;
2276: case '=': lcount = pr1403? 1 : 2; break;
2277: case SHORTLINE: lcount=1; break;
2278: }
2279: if (lcount<=0) return;
2280: nodata = cr-cl>=ncol || noheight || allh(i);
2281: if (!nodata)
2282: fprintf(tabout, "\\v'-.5m'");
2283: for(ln=oldpos=0; ln<lcount; ln++)
2284: {
2285: linpos = 2*ln - lcount +1;
2286: if (linpos != oldpos)
2287: fprintf(tabout, "\\v'%dp'", linpos-oldpos);
2288: oldpos=linpos;
2289: if (shortl==0)
2290: {
2291: tohcol(cl);
2292: if (lcount>1)
2293: {
2294: switch(interv(i,cl))
2295: {
2296: case TOP: exhl = ln==0 ? "1p" : "-1p"; break;
2297: case BOT: exhl = ln==1 ? "1p" : "-1p"; break;
2298: case THRU: exhl = "1p"; break;
2299: }
2300: if (exhl[0])
2301: fprintf(tabout, "\\h'%s'", exhl);
2302: }
2303: else if (lcount==1)
2304: {
2305: switch(interv(i,cl))
2306: {
2307: case TOP: case BOT: exhl = "-1p"; break;
2308: case THRU: exhl = "1p"; break;
2309: }
2310: if (exhl[0])
2311: fprintf(tabout, "\\h'%s'", exhl);
2312: }
2313: if (lcount>1)
2314: {
2315: switch(interv(i,cr+1))
2316: {
2317: case TOP: exhr = ln==0 ? "-1p" : "+1p"; break;
2318: case BOT: exhr = ln==1 ? "-1p" : "+1p"; break;
2319: case THRU: exhr = "-1p"; break;
2320: }
2321: }
2322: else if (lcount==1)
2323: {
2324: switch(interv(i,cr+1))
2325: {
2326: case TOP: case BOT: exhr = "+1p"; break;
2327: case THRU: exhr = "-1p"; break;
2328: }
2329: }
2330: }
2331: else
2332: fprintf(tabout, "\\h'|\\n(%2su'", reg(cl,CLEFT));
2333: fprintf(tabout, "\\s\\n(%d",LSIZE);
2334: if (linsize)
2335: fprintf(tabout, "\\v'-\\n(%dp/6u'", LSIZE);
2336: if (shortl)
2337: fprintf(tabout, "\\l'|\\n(%2su'", reg(cr,CRIGHT));
2338: else
2339: {
2340: lnch = "\\(ul";
2341: if (pr1403)
2342: lnch = lintype==2 ? "=" : "\\(ru";
2343: if (cr+1>=ncol)
2344: fprintf(tabout, "\\l'|\\n(TWu%s%s'", exhr,lnch);
2345: else
2346: fprintf(tabout, "\\l'(|\\n(%2su+|\\n(%2su)/2u%s%s'", reg(cr,CRIGHT),
2347: reg(cr+1,CLEFT), exhr, lnch);
2348: }
2349: if (linsize)
2350: fprintf(tabout, "\\v'\\n(%dp/6u'", LSIZE);
2351: fprintf(tabout, "\\s0");
2352: }
2353: if (oldpos!=0)
2354: fprintf(tabout, "\\v'%dp'", -oldpos);
2355: if (!nodata)
2356: fprintf(tabout, "\\v'+.5m'");
2357: }
2358: getstop()
2359: {
2360: int i,c,k,junk, stopp;
2361: stopp=1;
2362: for(i=0; i<MAXLIN; i++)
2363: linestop[i]=0;
2364: for(i=0; i<nlin; i++)
2365: for(c=0; c<ncol; c++)
2366: {
2367: k = left(i,c,&junk);
2368: if (k>=0 && linestop[k]==0)
2369: linestop[k]= ++stopp;
2370: }
2371: if (boxflg || allflg || dboxflg)
2372: linestop[0]=1;
2373: }
2374: left(i,c, lwidp)
2375: int *lwidp;
2376: {
2377: int kind, li, lj;
2378: /* returns -1 if no line to left */
2379: /* returns number of line where it starts */
2380: /* stores into lwid the kind of line */
2381: *lwidp=0;
2382: if (i<0) return(-1);
2383: kind = lefdata(i,c);
2384: if (kind==0) return(-1);
2385: if (i+1<nlin)
2386: if (lefdata(next(i),c)== kind) return(-1);
2387: while (i>=0 && lefdata(i,c)==kind)
2388: i=prev(li=i);
2389: if (prev(li)== -1) li=0;
2390: *lwidp=kind;
2391: for(lj= i+1; lj<li; lj++)
2392: if (instead[lj] && strcmp(instead[lj], ".TH")==0)
2393: return(li);
2394: for(i= i+1; i<li; i++)
2395: if (fullbot[i])
2396: li=i;
2397: return(li);
2398: }
2399: lefdata(i,c)
2400: {
2401: int ck;
2402: if (i>=nlin) i=nlin-1;
2403: if (ctype(i,c) == 's')
2404: {
2405: for(ck=c; ctype(i,ck)=='s'; ck--);
2406: if (thish(i,ck)==0)
2407: return(0);
2408: }
2409: i =stynum[i];
2410: i = lefline[c][i];
2411: if (i>0) return(i);
2412: if (dboxflg && c==0) return(2);
2413: if (allflg)return(1);
2414: if (boxflg && c==0) return(1);
2415: return(0);
2416: }
2417: next(i)
2418: {
2419: while (i+1 <nlin)
2420: {
2421: i++;
2422: if (!fullbot[i] && !instead[i]) break;
2423: }
2424: return(i);
2425: }
2426: prev(i)
2427: {
2428: while (--i >=0 && (fullbot[i] || instead[i]))
2429: ;
2430: return(i);
2431: }
2432: 0707070035051114711006640000030000040000010246070265271267100000500000005512tv.c /* tv.c: draw vertical lines */
2433: # include "t..c"
2434: drawvert(start,end, c, lwid)
2435: {
2436: char *exb=0, *ext=0;
2437: int tp=0, sl, ln, pos, epb, ept, vm;
2438: end++;
2439: vm='v';
2440: /* note: nr 35 has value of 1m outside of linesize */
2441: while (instead[end]) end++;
2442: for(ln=0; ln<lwid; ln++)
2443: {
2444: epb=ept=0;
2445: pos = 2*ln-lwid+1;
2446: if (pos!=tp) fprintf(tabout, "\\h'%dp'", pos-tp);
2447: tp = pos;
2448: if (end<nlin)
2449: {
2450: if (fullbot[end]|| (!instead[end] && allh(end)))
2451: epb=2;
2452: else
2453: switch (midbar(end,c))
2454: {
2455: case '-':
2456: exb = "1v-.5m"; break;
2457: case '=':
2458: exb = "1v-.5m";
2459: epb = 1; break;
2460: }
2461: }
2462: if (lwid>1)
2463: switch(interh(end, c))
2464: {
2465: case THRU: epb -= 1; break;
2466: case RIGHT: epb += (ln==0 ? 1 : -1); break;
2467: case LEFT: epb += (ln==1 ? 1 : -1); break;
2468: }
2469: if (lwid==1)
2470: switch(interh(end,c))
2471: {
2472: case THRU: epb -= 1; break;
2473: case RIGHT: case LEFT: epb += 1; break;
2474: }
2475: if (start>0)
2476: {
2477: sl = start-1;
2478: while (sl>=0 && instead[sl]) sl--;
2479: if (sl>=0 && (fullbot[sl] || allh(sl)))
2480: ept=0;
2481: else
2482: if (sl>=0)
2483: switch(midbar(sl,c))
2484: {
2485: case '-':
2486: ext = ".5m"; break;
2487: case '=':
2488: ext= ".5m"; ept = -1; break;
2489: default:
2490: vm = 'm'; break;
2491: }
2492: else
2493: ept = -4;
2494: }
2495: else if (start==0 && allh(0))
2496: {
2497: ept=0;
2498: vm = 'm';
2499: }
2500: if (lwid>1)
2501: switch(interh(start,c))
2502: {
2503: case THRU: ept += 1; break;
2504: case LEFT: ept += (ln==0 ? 1 : -1); break;
2505: case RIGHT: ept += (ln==1 ? 1 : -1); break;
2506: }
2507: else if (lwid==1)
2508: switch(interh(start,c))
2509: {
2510: case THRU: ept += 1; break;
2511: case LEFT: case RIGHT: ept -= 1; break;
2512: }
2513: if (exb)
2514: fprintf(tabout, "\\v'%s'", exb);
2515: if (epb)
2516: fprintf(tabout, "\\v'%dp'", epb);
2517: fprintf(tabout, "\\s\\n(%d",LSIZE);
2518: if (linsize)
2519: fprintf(tabout, "\\v'-\\n(%dp/6u'", LSIZE);
2520: fprintf(tabout, "\\h'-\\n(#~u'"); /* adjustment for T450 nroff boxes */
2521: fprintf(tabout, "\\L'|\\n(#%cu-%s", linestop[start]+'a'-1, vm=='v'? "1v" : "\\n(35u");
2522: if (ext)
2523: fprintf(tabout, "-(%s)",ext);
2524: if (exb)
2525: fprintf(tabout, "-(%s)", exb);
2526: pos = ept-epb;
2527: if (pos)
2528: fprintf(tabout, "%s%dp", pos>=0? "+" : "", pos);
2529: /* the string #d is either "nl" or ".d" depending
2530: on diversions; on GCOS not the same */
2531: fprintf(tabout, "'\\s0\\v'\\n(\\*(#du-\\n(#%cu+%s", linestop[start]+'a'-1,vm=='v' ? "1v" : "\\n(35u");
2532: if (ext)
2533: fprintf(tabout, "+%s",ext);
2534: if (ept)
2535: fprintf(tabout, "%s%dp", (-ept)>0 ? "+" : "", (-ept));
2536: fprintf(tabout, "'");
2537: if (linsize)
2538: fprintf(tabout, "\\v'\\n(%dp/6u'", LSIZE);
2539: }
2540: }
2541:
2542:
2543: midbar(i,c)
2544: {
2545: int k;
2546: k = midbcol(i,c);
2547: if (k==0 && c>0)
2548: k = midbcol(i, c-1);
2549: return(k);
2550: }
2551: midbcol(i,c)
2552: {
2553: int ct;
2554: while ( (ct=ctype(i,c)) == 's')
2555: c--;
2556: if (ct=='-' || ct == '=')
2557: return(ct);
2558: if (ct=barent(table[i][c].col))
2559: return(ct);
2560: return(0);
2561: }
2562:
2563: barent(s)
2564: char *s;
2565: {
2566: if (s==0) return (1);
2567: if (!point(s)) return(0);
2568: if (s[0]== '\\') s++;
2569: if (s[1]!= 0)
2570: return(0);
2571: switch(s[0])
2572: {
2573: case '_':
2574: return('-');
2575: case '=':
2576: return('=');
2577: }
2578: return(0);
2579: }
2580: 0707070035051114711006640000030000040000010246070265271267100001300000000000TRAILER!!! 0);
2581: }
2582:
2583: barent(s)
2584: char *s;
2585: {
2586: if (s==0) return (1);
2587: if (!point(s)) return(0);
2588: if (s[0]== '\\') s++;
2589: if (s[1]!= 0)
2590: return(0);
2591: switch(s[0])
2592: {
2593: case '_':
2594: return('-');
2595: case '=':
2596: return('=');
2597: }
2598: return(0);
2599: }
2600: 0707070
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.