|
|
1.1 root 1: #include <ctype.h>
2: #include <sys/types.h>
3: #include <sys/stat.h>
4: #include "tdef.h"
5: extern
6: #include "d.h"
7: extern
8: #include "v.h"
9: #ifdef NROFF
10: extern
11: #include "tw.h"
12: #endif
13: #include "s.h"
14: #include <setjmp.h>
15: jmp_buf sjbuf;
16: #include <sgtty.h>
17: /*
18: troff1.c
19:
20: consume options, initialization, main loop,
21: input routines, escape function calling
22: */
23:
24: #include "ext.h"
25:
26: char *sprintf();
27: tchar inchar[LNSIZE], *pinchar = inchar; /* XXX */
28: filep ipl[NSO];
29: long offl[NSO];
30: long ioff;
31: char *ttyp;
32: extern struct contab {
33: int rq;
34: union {
35: int (*f)();
36: unsigned mx;
37: } x;
38: } contab[NM];
39:
40: main(argc, argv)
41: int argc;
42: char **argv;
43: {
44: register char *p, *q;
45: register j;
46: tchar i;
47: extern catch(), kcatch();
48: int oargc;
49: char **oargv;
50:
51: signal(SIGHUP, catch);
52: if (signal(SIGINT, catch) == SIG_IGN) {
53: signal(SIGHUP, SIG_IGN);
54: signal(SIGINT, SIG_IGN);
55: signal(SIGQUIT, SIG_IGN);
56: }
57: signal(SIGPIPE, catch);
58: signal(SIGTERM, kcatch);
59: oargc = argc;
60: oargv = argv;
61: init0();
62: options:
63: while (--argc > 0 && (++argv)[0][0] == '-')
64: switch (argv[0][1]) {
65:
66: case 'F': /* switch font tables from default */
67: if (argv[0][2] != '\0') {
68: strcpy(termtab, &argv[0][2]);
69: strcpy(fontfile, &argv[0][2]);
70: } else {
71: argv++; argc--;
72: strcpy(termtab, argv[0]);
73: strcpy(fontfile, argv[0]);
74: }
75: continue;
76: case 0:
77: goto start;
78: case 'i':
79: stdi++;
80: continue;
81: case 'q':
82: quiet++;
83: if (gtty(0, &ttys) >= 0)
84: ttysave = ttys.sg_flags;
85: continue;
86: case 'n':
87: npn = ctoi(&argv[0][2]);
88: continue;
89: case 'u': /* set emboldening amount */
90: bdtab[3] = ctoi(&argv[0][2]);
91: if (bdtab[3] < 0 || bdtab[3] > 50)
92: bdtab[3] = 0;
93: continue;
94: case 's':
95: if (!(stop = ctoi(&argv[0][2])))
96: stop++;
97: continue;
98: case 'r':
99: eibuf = sprintf(ibuf+strlen(ibuf), ".nr %c %s\n",
100: argv[0][2], &argv[0][3]);
101: continue;
102: case 'm':
103: p = &nextf[nfi];
104: q = &argv[0][2];
105: while ((*p++ = *q++) != 0)
106: ;
107: mflg++;
108: continue;
109: case 'o':
110: getpn(&argv[0][2]);
111: continue;
112: #ifdef NROFF
113: case 'h':
114: hflg++;
115: continue;
116: case 'z':
117: no_out++;
118: continue;
119: case 'e':
120: eqflg++;
121: continue;
122: case 'T':
123: strcat(termtab, &argv[0][2]);
124: dotT++;
125: continue;
126: #endif
127: #ifndef NROFF
128: case 'T':
129: strcpy(devname, &argv[0][2]);
130: dotT++;
131: continue;
132: case 'z':
133: no_out++;
134: case 'a':
135: ascii = 1;
136: nofeed++;
137: case 't':
138: ptid = 1;
139: continue;
140: case 'f':
141: nofeed++;
142: continue;
143: #endif
144: default:
145: fprintf(stderr, "troff: unknown option %s\n", argv[0]);
146: done(02);
147: }
148:
149: start:
150: init1(oargv[0][0]);
151: argp = argv;
152: rargc = argc;
153: init2();
154: setjmp(sjbuf);
155: loop:
156: copyf = lgf = nb = nflush = nlflg = 0;
157: if (ip && rbf0(ip) == 0 && ejf && frame->pframe <= ejl) {
158: nflush++;
159: trap = 0;
160: eject((struct s *)0);
161: goto loop;
162: }
163: i = getch();
164: if (pendt)
165: goto lt;
166: if ((j = cbits(i)) == XPAR) {
167: copyf++;
168: tflg++;
169: while (cbits(i) != '\n')
170: pchar(i = getch());
171: tflg = 0;
172: copyf--;
173: goto loop;
174: }
175: if (j == cc || j == c2) {
176: if (j == c2)
177: nb++;
178: copyf++;
179: while ((j = cbits(i = getch())) == ' ' || j == '\t')
180: ;
181: ch = i;
182: copyf--;
183: control(getrq(), 1);
184: flushi();
185: goto loop;
186: }
187: lt:
188: ch = i;
189: text();
190: goto loop;
191: }
192:
193:
194: catch()
195: {
196: done3(01);
197: }
198:
199:
200: kcatch()
201: {
202: signal(SIGTERM, SIG_IGN);
203: done3(01);
204: }
205:
206:
207: init0()
208: {
209: eibuf = ibufp = ibuf;
210: ibuf[0] = 0;
211: v.nl = -1;
212: }
213:
214:
215: init1(a)
216: char a;
217: {
218: register char *p;
219: char *mktemp();
220: register i;
221:
222: p = mktemp("/usr/tmp/trtmpXXXXX");
223: if (a == 'a')
224: p = &p[9];
225: if ((close(creat(p, 0600))) < 0) {
226: fprintf(stderr, "troff: cannot create temp file.\n");
227: exit(-1);
228: }
229: ibf = open(p, 2);
230: unlkp = p;
231: for (i = NTRTAB; --i; )
232: trtab[i] = i;
233: trtab[UNPAD] = ' ';
234: }
235:
236:
237: init2()
238: {
239: register i, j;
240: register char *p;
241: tchar *t;
242: extern int block;
243: extern char *setbrk();
244: extern char *ttyname();
245:
246: ttyod = 2;
247: if ((ttyp=ttyname(j=0)) != 0 || (ttyp=ttyname(j=1)) != 0 || (ttyp=ttyname(j=2)) != 0)
248: ;
249: else
250: ttyp = "notty";
251: iflg = j;
252: if (ascii)
253: mesg(0);
254: obufp = obuf;
255: ptinit();
256: mchbits();
257: cvtime();
258: v.pid = getpid();
259: olinep = oline;
260: ioff = 0;
261: v.hp = init = 0;
262: pinchar = inchar; /* XXX */
263: v.nl = -1;
264: nfo = 0;
265: ifile = 0;
266: copyf = raw = 0;
267: level = 0;
268: eibuf = sprintf(ibuf+strlen(ibuf), ".ds .T %s\n", devname);
269: for (p=ibuf, t=cbuf; *t++ = *p++; )
270: ;
271: cp = cbuf;
272: eibuf = ibuf;
273: ibufp = ibuf;
274: nx = mflg;
275: frame = stk = (struct s *)setbrk(DELTA);
276: dip = &d[0];
277: nxf = frame + 1;
278: for (i = NEV; i--; )
279: write(ibf, (char *) & block, EVS);
280: }
281:
282:
283: cvtime()
284: {
285: long tt;
286: register i;
287: static int ms[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
288:
289: time(&tt);
290: tt -= 3600 * ZONE; /* 5hrs for EST */
291: v.dy = (tt / 86400L) + 1;
292: v.dw = (v.dy + 3) % 7 + 1;
293: for (v.yr = 70; ; v.yr++) {
294: if ((v.yr) % 4)
295: ms[1] = 28;
296: else
297: ms[1] = 29;
298: for (i = 0; i < 12; ) {
299: if (v.dy <= ms[i]) {
300: v.mo = i + 1;
301: return;
302: }
303: v.dy -= ms[i++];
304: }
305: }
306: }
307:
308:
309: ctoi(s)
310: register char *s;
311: {
312: register n;
313:
314: while (*s == ' ')
315: s++;
316: n = 0;
317: while (isdigit(*s))
318: n = 10 * n + *s++ - '0';
319: return n;
320: }
321:
322:
323: mesg(f)
324: int f;
325: {
326: static int mode;
327:
328: if (!f) {
329: stat(ttyp, cbuf);
330: mode = ((struct stat *)(cbuf))->st_mode;
331: chmod(ttyp, mode & ~0122); /* turn off writing for others */
332: } else {
333: chmod(ttyp, mode);
334: }
335: }
336:
337:
338: /*
339: * Scaled down version of C Library printf.
340: * Only %s %u %d (==%u) %o %c %x %D are recognized.
341: */
342: #define putchar(n) (*pfbp++ = (n)) /* NO CHECKING! */
343:
344: static char pfbuf[NTM];
345: static char *pfbp = pfbuf;
346: int stderr = 2; /* NOT stdio value */
347:
348: /* VARARGS */
349: fprintf(fd, fmt, x1)
350: int fd;
351: char *fmt;
352: unsigned x1;
353: {
354: register c;
355: register unsigned int *adx;
356: char *s;
357: register i;
358:
359: pfbp = pfbuf;
360: adx = &x1;
361: loop:
362: while ((c = *fmt++) != '%') {
363: if (c == '\0') {
364: if (fd == stderr)
365: write(stderr, pfbuf, pfbp - pfbuf);
366: else {
367: *pfbp = 0;
368: pfbp = pfbuf;
369: while (*pfbp) {
370: *obufp++ = *pfbp++;
371: if (obufp >= &obuf[OBUFSZ])
372: flusho();
373: }
374: }
375: return;
376: }
377: putchar(c);
378: }
379: c = *fmt++;
380: if (c == 'd') {
381: i = *adx;
382: if (i < 0) {
383: putchar('-');
384: i = -i;
385: }
386: printn((long)i, 10);
387: } else if (c == 'u' || c == 'o' || c == 'x')
388: printn((long)*adx, c == 'o' ? 8 : (c == 'x' ? 16 : 10));
389: else if (c == 'c') {
390: if (c > 0177 || c < 040)
391: putchar('\\');
392: putchar(*adx & 0177);
393: } else if (c == 's') {
394: s = (char *) * adx;
395: while (c = *s++)
396: putchar(c);
397: } else if (c == 'D') {
398: printn(*(long *)adx, 10);
399: adx += (sizeof(long) / sizeof(int)) - 1;
400: } else if (c == 'O') {
401: printn(*(long *)adx, 8);
402: adx += (sizeof(long) / sizeof(int)) - 1;
403: }
404: adx++;
405: goto loop;
406: }
407:
408:
409: /*
410: * Print an unsigned integer in base b.
411: */
412: static printn(n, b)
413: long n;
414: {
415: register long a;
416:
417: if (n < 0) { /* shouldn't happen */
418: putchar('-');
419: n = -n;
420: }
421: if (a = n / b)
422: printn(a, b);
423: putchar("0123456789ABCDEF"[(int)(n%b)]);
424: }
425:
426: /* scaled down version of library sprintf */
427: /* same limits as fprintf */
428: /* returns pointer to \0 that ends the string */
429:
430: /* VARARGS */
431: char *sprintf(str, fmt, x1)
432: char *str;
433: char *fmt;
434: unsigned x1;
435: {
436: register c;
437: char *sprintn();
438: register unsigned int *adx;
439: char *s;
440: register i;
441:
442: adx = &x1;
443: loop:
444: while ((c = *fmt++) != '%') {
445: if (c == '\0') {
446: *str = 0;
447: return str;
448: }
449: *str++ = c;
450: }
451: c = *fmt++;
452: if (c == 'd') {
453: i = *adx;
454: if (i < 0) {
455: *str++ = '-';
456: i = -i;
457: }
458: str = sprintn(str, (long)i, 10);
459: } else if (c == 'u' || c == 'o' || c == 'x')
460: str = sprintn(str, (long)*adx, c == 'o' ? 8 : (c == 'x' ? 16 : 10));
461: else if (c == 'c') {
462: if (c > 0177 || c < 040)
463: *str++ = '\\';
464: *str++ = *adx & 0177;
465: } else if (c == 's') {
466: s = (char *) * adx;
467: while (c = *s++)
468: *str++ = c;
469: } else if (c == 'D') {
470: str = sprintn(str, *(long *)adx, 10);
471: adx += (sizeof(long) / sizeof(int)) - 1;
472: } else if (c == 'O') {
473: str = sprintn(str, *(long *)adx, 8);
474: adx += (sizeof(long) / sizeof(int)) - 1;
475: }
476: adx++;
477: goto loop;
478: }
479:
480: /*
481: * Print an unsigned integer in base b.
482: */
483: static char *sprintn(s, n, b)
484: register char *s;
485: register long n;
486: {
487: register long a;
488:
489: if (n < 0) { /* shouldn't happen */
490: *s++ = '-';
491: n = -n;
492: }
493: if (a = n / b)
494: s = sprintn(s, a, b);
495: *s++ = "0123456789ABCDEF"[(int)(n%b)];
496: return s;
497: }
498:
499:
500: control(a, b)
501: register int a, b;
502: {
503: register int j;
504:
505: if (a == 0 || (j = findmn(a)) == -1)
506: return(0);
507: if (contab[j].rq & MMASK) {
508: nxf->nargs = 0;
509: if (b)
510: collect();
511: flushi();
512: return(pushi((filep)contab[j].x.mx));
513: } else if (b)
514: return((*contab[j].x.f)(0));
515: else
516: return(0);
517: }
518:
519:
520: getrq()
521: {
522: register i, j;
523:
524: if (((i = getach()) == 0) || ((j = getach()) == 0))
525: goto rtn;
526: i = PAIR(i, j);
527: rtn:
528: return(i);
529: }
530:
531:
532: tchar getch()
533: {
534: register int k;
535: tchar i, j;
536: tchar setht(), setslant();
537:
538: level++;
539: g0:
540: if (ch) {
541: if (cbits(i = ch) == '\n')
542: nlflg++;
543: ch = 0;
544: level--;
545: return(i);
546: }
547:
548: if (nlflg) {
549: level--;
550: return('\n');
551: }
552:
553: if ((k = cbits(i = getch0())) != ESC) {
554: if (ismot(i))
555: goto g2;
556: if (k == FLSS) {
557: copyf++;
558: raw++;
559: i = getch0();
560: if (!fi)
561: flss = i;
562: copyf--;
563: raw--;
564: goto g0;
565: }
566: if (k == RPT) {
567: setrpt();
568: goto g0;
569: }
570: if (!copyf) {
571: if (k == 'f' && lg && !lgf) {
572: i = getlg(i);
573: goto g2;
574: }
575: if (k == fc || k == tabch || k == ldrch) {
576: if ((i = setfield(k)) == 0)
577: goto g0;
578: else
579: goto g2;
580: }
581: if (k == '\b') {
582: i = makem(-width(' ' | chbits));
583: goto g2;
584: }
585: }
586: goto g2;
587: }
588: k = cbits(j = getch0());
589: if (ismot(j)) {
590: i = j;
591: goto g2;
592: }
593: switch (k) {
594:
595: case '\n': /* concealed newline */
596: goto g0;
597: case 'n': /* number register */
598: setn();
599: goto g0;
600: case '*': /* string indicator */
601: setstr();
602: goto g0;
603: case '$': /* argument indicator */
604: seta();
605: goto g0;
606: case '{': /* LEFT */
607: i = LEFT;
608: goto gx;
609: case '}': /* RIGHT */
610: i = RIGHT;
611: goto gx;
612: case '"': /* comment */
613: while (cbits(i = getch0()) != '\n')
614: ;
615: goto g2;
616: case ESC: /* double backslash */
617: i = eschar;
618: goto gx;
619: case 'e': /* printable version of current eschar */
620: i = PRESC;
621: goto gx;
622: case ' ': /* unpaddable space */
623: i = UNPAD;
624: goto gx;
625: case '|': /* narrow space */
626: i = NARSP;
627: goto gx;
628: case '^': /* half of narrow space */
629: i = HNARSP;
630: goto gx;
631: case '\'': /* \(aa */
632: i = ACUTE;
633: goto gx;
634: case '`': /* \(ga */
635: i = GRAVE;
636: goto gx;
637: case '_': /* \(ul */
638: i = UNDERLINE;
639: goto gx;
640: case '-': /* current font minus */
641: i = MINUS;
642: goto gx;
643: case '&': /* filler */
644: i = FILLER;
645: goto gx;
646: case 'c': /* to be continued */
647: i = CONT;
648: goto gx;
649: case '!': /* transparent indicator */
650: i = XPAR;
651: goto gx;
652: case 't': /* tab */
653: i = '\t';
654: goto g2;
655: case 'a': /* leader (SOH) */
656: i = LEADER;
657: goto g2;
658: case '%': /* ohc */
659: i = OHC;
660: goto g2;
661: case 'g': /* return format of a number register */
662: setaf();
663: goto g0;
664: case '.': /* . */
665: i = '.';
666: gx:
667: setsfbits(i, sfbits(j));
668: goto g2;
669: }
670: if (!copyf)
671: switch (k) {
672:
673: case 'p': /* spread */
674: spread++;
675: goto g0;
676: case '(': /* special char name */
677: if ((i = setch()) == 0)
678: goto g0;
679: break;
680: case 's': /* size indicator */
681: setps();
682: goto g0;
683: case 'H': /* character height */
684: i = setht();
685: break;
686: case 'S': /* slant */
687: i = setslant();
688: break;
689: case 'f': /* font indicator */
690: setfont(0);
691: goto g0;
692: case 'w': /* width function */
693: setwd();
694: goto g0;
695: case 'v': /* vert mot */
696: if (i = vmot())
697: break;
698: goto g0;
699: case 'h': /* horiz mot */
700: if (i = hmot())
701: break;
702: goto g0;
703: case 'z': /* zero with char */
704: i = setz();
705: break;
706: case 'l': /* hor line */
707: setline();
708: goto g0;
709: case 'L': /* vert line */
710: setvline();
711: goto g0;
712: case 'D': /* drawing function */
713: setdraw();
714: goto g0;
715: case 'b': /* bracket */
716: setbra();
717: goto g0;
718: case 'o': /* overstrike */
719: setov();
720: goto g0;
721: case 'k': /* mark hor place */
722: if ((k = findr(getsn())) != -1) {
723: vlist[k] = v.hp = sumhp();
724: }
725: goto g0;
726: case '0': /* number space */
727: i = makem(width('0' | chbits));
728: break;
729: case 'x': /* extra line space */
730: if (i = xlss())
731: break;
732: goto g0;
733: case 'u': /* half em up */
734: case 'r': /* full em up */
735: case 'd': /* half em down */
736: i = sethl(k);
737: break;
738: default:
739: i = j;
740: }
741: else {
742: ch0 = j;
743: i = eschar;
744: }
745: g2:
746: if (cbits(i) == '\n') {
747: nlflg++;
748: v.hp = 0;
749: pinchar = inchar; /* XXX */
750: if (ip == 0)
751: v.cd++; /* current input line number in this file */
752: }
753: if (!--level) {
754: if (pinchar >= inchar + LNSIZE) { /* XXX */
755: inchar[0] = makem(sumhp());
756: pinchar = &inchar[1];
757: }
758: *pinchar++ = i; /* XXX */
759: }
760: return(i);
761: }
762:
763:
764: char ifilt[32] = {
765: 0, 001, 002, 003, 0, 005, 006, 007, 010, 011, 012};
766:
767:
768: sumhp() /* XXX - add up values in inchar */
769: {
770: register int n;
771: register tchar *p;
772:
773: n = 0;
774: for (p = inchar; p < pinchar; p++)
775: n += width(*p);
776: return(n);
777: }
778:
779:
780: tchar getch0()
781: {
782: register int j;
783: tchar i;
784:
785: if (ch0) {
786: i = ch0;
787: ch0 = 0;
788: return(i);
789: }
790: if (nchar) {
791: nchar--;
792: return(rchar);
793: }
794:
795: again:
796: if (cp) {
797: if ((i = *cp++) == 0) {
798: cp = 0;
799: goto again;
800: }
801: } else if (ap) {
802: if ((i = *ap++) == 0) {
803: ap = 0;
804: goto again;
805: }
806: } else if (ip) {
807: if (ip == -1)
808: i = rdtty();
809: else
810: i = rbf();
811: } else {
812: if (donef)
813: done(0);
814: if (nx || ibufp >= eibuf) {
815: if (nfo)
816: goto g1;
817: g0:
818: if (nextfile()) {
819: if (ip)
820: goto again;
821: if (ibufp < eibuf)
822: goto g2;
823: }
824: g1:
825: nx = 0;
826: if ((j = read(ifile, ibuf, IBUFSZ)) <= 0)
827: goto g0;
828: ibufp = ibuf;
829: eibuf = ibuf + j;
830: if (ip)
831: goto again;
832: }
833: g2:
834: i = *ibufp++ & 0177;
835: ioff++;
836: if (i >= 040)
837: goto g4;
838: else
839: i = ifilt[i];
840: }
841: if (raw)
842: return(i);
843: if ((j = cbits(i)) == IMP)
844: goto again;
845: if ((i == 0) && !init)
846: goto again;
847: g4:
848: if (copyf == 0 && (i & ~BMASK) == 0 && !iscontrol(cbits(i)))
849: i |= chbits;
850: if (cbits(i) == eschar)
851: setcbits(i, ESC);
852: return(i);
853: }
854:
855:
856: nextfile()
857: {
858: register char *p;
859:
860: n0:
861: if (ifile)
862: close(ifile);
863: if (nx) {
864: p = nextf;
865: if (*p != 0)
866: goto n1;
867: }
868: if (ifi > 0) {
869: if (popf())
870: goto n0; /* popf error */
871: return(1); /* popf ok */
872: }
873: if (rargc-- <= 0) {
874: goto n2;
875: }
876: p = (argp++)[0];
877: n1:
878: if ((p[0] == '-') && (p[1] == 0)) {
879: ifile = 0;
880: } else if ((ifile = open(p, 0)) < 0) {
881: fprintf(stderr, "troff: cannot open %s\n", p);
882: nfo -= mflg;
883: done(02);
884: }
885: nfo++;
886: v.cd = 0;
887: ioff = 0;
888: return(0);
889: n2:
890: if ((nfo -= mflg) && !stdi)
891: done(0);
892: nfo++;
893: v.cd = ifile = stdi = mflg = 0;
894: ioff = 0;
895: return(0);
896: }
897:
898:
899: popf()
900: {
901: register i;
902: register char *p, *q;
903: extern char *ttyname();
904:
905: ioff = offl[--ifi];
906: ip = ipl[ifi];
907: if ((ifile = ifl[ifi]) == 0) {
908: p = xbuf;
909: q = ibuf;
910: ibufp = xbufp;
911: eibuf = xeibuf;
912: while (q < eibuf)
913: *q++ = *p++;
914: return(0);
915: }
916: if ((lseek(ifile, (long)(ioff & ~(IBUFSZ - 1)), 0) < 0) || ((i = read(ifile, ibuf, IBUFSZ)) < 0))
917: return(1);
918: eibuf = ibuf + i;
919: ibufp = ibuf;
920: if (ttyname(ifile) == 0)
921: if ((ibufp = ibuf + (int)(ioff & (IBUFSZ - 1))) >= eibuf)
922: return(1);
923: return(0);
924: }
925:
926:
927: flushi()
928: {
929: if (nflush)
930: return;
931: ch = 0;
932: if (cbits(ch0) == '\n')
933: nlflg++;
934: ch0 = 0;
935: copyf++;
936: while (!nlflg) {
937: if (donef && (frame == stk))
938: break;
939: getch();
940: }
941: copyf--;
942: v.hp = 0;
943: pinchar = inchar; /* XXX */
944: }
945:
946:
947: getach()
948: {
949: tchar i;
950: register j;
951:
952: lgf++;
953: j = cbits(i = getch());
954: if (ismot(i) || j == ' ' || j == '\n' || j & 0200) {
955: ch = i;
956: j = 0;
957: }
958: lgf--;
959: return(j & 0177);
960: }
961:
962:
963: casenx()
964: {
965: lgf++;
966: skip();
967: getname();
968: nx++;
969: nextfile();
970: nlflg++;
971: ip = 0;
972: ap = 0;
973: nchar = pendt = 0;
974: frame = stk;
975: nxf = frame + 1;
976: }
977:
978:
979: getname()
980: {
981: register int j, k;
982: tchar i;
983:
984: lgf++;
985: for (k = 0; k < (NS - 1); k++) {
986: if (((j = cbits(i = getch())) <= ' ') || (j > 0176))
987: break;
988: nextf[k] = j;
989: }
990: nextf[k] = 0;
991: ch = i;
992: lgf--;
993: return(nextf[0]);
994: }
995:
996:
997: caseso()
998: {
999: register i;
1000: register char *p, *q;
1001:
1002: lgf++;
1003: nextf[0] = 0;
1004: if (skip() || !getname() || ((i = open(nextf, 0)) < 0) || (ifi >= NSO)) {
1005: fprintf(stderr, "troff: can't open file %s\n", nextf);
1006: done(02);
1007: }
1008: flushi();
1009: ifl[ifi] = ifile;
1010: ifile = i;
1011: offl[ifi] = ioff;
1012: ioff = 0;
1013: ipl[ifi] = ip;
1014: ip = 0;
1015: nx++;
1016: nflush++;
1017: if (!ifl[ifi++]) {
1018: p = ibuf;
1019: q = xbuf;
1020: xbufp = ibufp;
1021: xeibuf = eibuf;
1022: while (p < eibuf)
1023: *q++ = *p++;
1024: }
1025: }
1026:
1027:
1028: casecf()
1029: { /* copy file without change */
1030: #ifndef NROFF
1031: int fd, n;
1032: char buf[512];
1033: extern int un, hpos, esc, po;
1034:
1035: nextf[0] = 0;
1036: if (skip() || !getname() || (fd = open(nextf, 0)) < 0) {
1037: fprintf(stderr, "troff: can't open file %s\n", nextf);
1038: done(02);
1039: }
1040: tbreak();
1041: /* make it into a clean state, be sure that everything is out */
1042: hpos = po;
1043: esc = un;
1044: ptesc();
1045: ptlead();
1046: ptps();
1047: ptfont();
1048: flusho();
1049: while ((n = read(fd, buf, 512)) > 0)
1050: write(ptid, buf, n);
1051: close(fd);
1052: #endif
1053: }
1054:
1055:
1056: casesy()
1057: { /* call system */
1058: char sybuf[NTM];
1059: int i;
1060:
1061: lgf++;
1062: copyf++;
1063: skip();
1064: for (i = 0; i < NTM - 2; i++)
1065: if ((sybuf[i] = getch()) == '\n')
1066: break;
1067: sybuf[i] = 0;
1068: system(sybuf);
1069: copyf--;
1070: }
1071:
1072:
1073: getpn(a)
1074: register char *a;
1075: {
1076: register int n, neg;
1077:
1078: if (*a == 0)
1079: return;
1080: neg = 0;
1081: for ( ; *a; a++)
1082: switch (*a) {
1083: case '+':
1084: case ',':
1085: continue;
1086: case '-':
1087: neg = 1;
1088: continue;
1089: default:
1090: n = 0;
1091: if (isdigit(*a)) {
1092: do
1093: n = 10 * n + *a++ - '0';
1094: while (isdigit(*a));
1095: a--;
1096: } else
1097: n = 9999;
1098: *pnp++ = neg ? -n : n;
1099: neg = 0;
1100: if (pnp >= &pnlist[NPN-2]) {
1101: fprintf(stderr, "troff: too many page numbers\n");
1102: done3(-3);
1103: }
1104: }
1105: if (neg)
1106: *pnp++ = -9999;
1107: *pnp = -32767;
1108: print = 0;
1109: pnp = pnlist;
1110: if (*pnp != -32767)
1111: chkpn();
1112: }
1113:
1114:
1115: setrpt()
1116: {
1117: tchar i, j;
1118:
1119: copyf++;
1120: raw++;
1121: i = getch0();
1122: copyf--;
1123: raw--;
1124: if (i < 0 || cbits(j = getch0()) == RPT)
1125: return;
1126: rchar = j;
1127: nchar = i & BMASK;
1128: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.