2 5cedca1b 2004-05-15 devnull * troff5.c
4 5cedca1b 2004-05-15 devnull * misc processing requests
7 5cedca1b 2004-05-15 devnull #include "tdef.h"
8 5cedca1b 2004-05-15 devnull #include "fns.h"
9 5cedca1b 2004-05-15 devnull #include "ext.h"
11 5cedca1b 2004-05-15 devnull int iflist[NIF];
13 5cedca1b 2004-05-15 devnull int ifnum = 0; /* trying numeric expression for .if or .ie condition */
15 5cedca1b 2004-05-15 devnull void casead(void)
20 5cedca1b 2004-05-15 devnull /* leave admod alone */
21 5cedca1b 2004-05-15 devnull if (skip())
23 5cedca1b 2004-05-15 devnull switch (i = cbits(getch())) {
24 5cedca1b 2004-05-15 devnull case 'r': /* right adj, left ragged */
25 5cedca1b 2004-05-15 devnull admod = 2;
27 5cedca1b 2004-05-15 devnull case 'l': /* left adj, right ragged */
28 5cedca1b 2004-05-15 devnull admod = ad = 0; /* same as casena */
30 5cedca1b 2004-05-15 devnull case 'c': /*centered adj*/
31 5cedca1b 2004-05-15 devnull admod = 1;
33 5cedca1b 2004-05-15 devnull case 'b':
34 5cedca1b 2004-05-15 devnull case 'n':
35 5cedca1b 2004-05-15 devnull admod = 0;
37 5cedca1b 2004-05-15 devnull case '0':
38 5cedca1b 2004-05-15 devnull case '2':
39 5cedca1b 2004-05-15 devnull case '4':
41 5cedca1b 2004-05-15 devnull case '1':
42 5cedca1b 2004-05-15 devnull case '3':
43 5cedca1b 2004-05-15 devnull case '5':
44 5cedca1b 2004-05-15 devnull admod = (i - '0') / 2;
49 5cedca1b 2004-05-15 devnull void casena(void)
55 5cedca1b 2004-05-15 devnull void casefi(void)
57 5cedca1b 2004-05-15 devnull tbreak();
59 5cedca1b 2004-05-15 devnull pendnf = 0;
63 5cedca1b 2004-05-15 devnull void casenf(void)
65 5cedca1b 2004-05-15 devnull tbreak();
70 5cedca1b 2004-05-15 devnull void casers(void)
72 5cedca1b 2004-05-15 devnull dip->nls = 0;
76 5cedca1b 2004-05-15 devnull void casens(void)
78 5cedca1b 2004-05-15 devnull dip->nls++;
82 5cedca1b 2004-05-15 devnull chget(int c)
87 5cedca1b 2004-05-15 devnull if (skip() || ismot(i = getch()) || cbits(i) == ' ' || cbits(i) == '\n') {
89 5cedca1b 2004-05-15 devnull return(c);
91 5cedca1b 2004-05-15 devnull return cbits(i); /* was (i & BYTEMASK) */
95 5cedca1b 2004-05-15 devnull void casecc(void)
97 5cedca1b 2004-05-15 devnull cc = chget('.');
101 5cedca1b 2004-05-15 devnull void casec2(void)
103 5cedca1b 2004-05-15 devnull c2 = chget('\'');
107 5cedca1b 2004-05-15 devnull void casehc(void)
109 5cedca1b 2004-05-15 devnull ohc = chget(OHC);
113 5cedca1b 2004-05-15 devnull void casetc(void)
115 5cedca1b 2004-05-15 devnull tabc = chget(0);
119 5cedca1b 2004-05-15 devnull void caselc(void)
121 5cedca1b 2004-05-15 devnull dotc = chget(0);
125 5cedca1b 2004-05-15 devnull void casehy(void)
129 5cedca1b 2004-05-15 devnull hyf = 1;
130 5cedca1b 2004-05-15 devnull if (skip())
132 5cedca1b 2004-05-15 devnull noscale++;
133 5cedca1b 2004-05-15 devnull i = atoi0();
134 5cedca1b 2004-05-15 devnull noscale = 0;
135 5cedca1b 2004-05-15 devnull if (nonumb)
137 5cedca1b 2004-05-15 devnull hyf = max(i, 0);
141 5cedca1b 2004-05-15 devnull void casenh(void)
143 5cedca1b 2004-05-15 devnull hyf = 0;
147 5cedca1b 2004-05-15 devnull max(int aa, int bb)
149 5cedca1b 2004-05-15 devnull if (aa > bb)
150 5cedca1b 2004-05-15 devnull return(aa);
152 5cedca1b 2004-05-15 devnull return(bb);
156 5cedca1b 2004-05-15 devnull void casece(void)
160 5cedca1b 2004-05-15 devnull noscale++;
162 5cedca1b 2004-05-15 devnull i = max(atoi0(), 0);
163 5cedca1b 2004-05-15 devnull if (nonumb)
165 5cedca1b 2004-05-15 devnull tbreak();
167 5cedca1b 2004-05-15 devnull noscale = 0;
171 5cedca1b 2004-05-15 devnull void casein(void)
175 5cedca1b 2004-05-15 devnull if (skip())
176 5cedca1b 2004-05-15 devnull i = in1;
178 5cedca1b 2004-05-15 devnull i = max(hnumb(&in), 0);
179 5cedca1b 2004-05-15 devnull if (nonumb)
180 5cedca1b 2004-05-15 devnull i = in1;
182 5cedca1b 2004-05-15 devnull tbreak();
183 5cedca1b 2004-05-15 devnull in1 = in;
185 5cedca1b 2004-05-15 devnull if (!nc) {
186 5cedca1b 2004-05-15 devnull un = in;
187 5cedca1b 2004-05-15 devnull setnel();
192 5cedca1b 2004-05-15 devnull void casell(void)
196 5cedca1b 2004-05-15 devnull if (skip())
197 5cedca1b 2004-05-15 devnull i = ll1;
199 5cedca1b 2004-05-15 devnull i = max(hnumb(&ll), INCH / 10);
200 5cedca1b 2004-05-15 devnull if (nonumb)
201 5cedca1b 2004-05-15 devnull i = ll1;
203 5cedca1b 2004-05-15 devnull ll1 = ll;
205 5cedca1b 2004-05-15 devnull setnel();
209 5cedca1b 2004-05-15 devnull void caselt(void)
213 5cedca1b 2004-05-15 devnull if (skip())
214 5cedca1b 2004-05-15 devnull i = lt1;
216 5cedca1b 2004-05-15 devnull i = max(hnumb(<), 0);
217 5cedca1b 2004-05-15 devnull if (nonumb)
218 5cedca1b 2004-05-15 devnull i = lt1;
220 5cedca1b 2004-05-15 devnull lt1 = lt;
225 5cedca1b 2004-05-15 devnull void caseti(void)
229 5cedca1b 2004-05-15 devnull if (skip())
231 5cedca1b 2004-05-15 devnull i = max(hnumb(&in), 0);
232 5cedca1b 2004-05-15 devnull tbreak();
233 5cedca1b 2004-05-15 devnull un1 = i;
234 5cedca1b 2004-05-15 devnull setnel();
238 5cedca1b 2004-05-15 devnull void casels(void)
242 5cedca1b 2004-05-15 devnull noscale++;
243 5cedca1b 2004-05-15 devnull if (skip())
244 5cedca1b 2004-05-15 devnull i = ls1;
246 5cedca1b 2004-05-15 devnull i = max(inumb(&ls), 1);
247 5cedca1b 2004-05-15 devnull if (nonumb)
248 5cedca1b 2004-05-15 devnull i = ls1;
250 5cedca1b 2004-05-15 devnull ls1 = ls;
252 5cedca1b 2004-05-15 devnull noscale = 0;
256 5cedca1b 2004-05-15 devnull void casepo(void)
260 5cedca1b 2004-05-15 devnull if (skip())
261 5cedca1b 2004-05-15 devnull i = po1;
263 5cedca1b 2004-05-15 devnull i = max(hnumb(&po), 0);
264 5cedca1b 2004-05-15 devnull if (nonumb)
265 5cedca1b 2004-05-15 devnull i = po1;
267 5cedca1b 2004-05-15 devnull po1 = po;
269 5cedca1b 2004-05-15 devnull if (TROFF & !ascii)
270 5cedca1b 2004-05-15 devnull esc += po - po1;
274 5cedca1b 2004-05-15 devnull void casepl(void)
279 5cedca1b 2004-05-15 devnull if ((i = vnumb(&pl)) == 0)
280 5cedca1b 2004-05-15 devnull pl = 11 * INCH; /*11in*/
283 5cedca1b 2004-05-15 devnull if (numtabp[NL].val > pl)
284 5cedca1b 2004-05-15 devnull numtabp[NL].val = pl;
288 5cedca1b 2004-05-15 devnull void casewh(void)
290 5cedca1b 2004-05-15 devnull int i, j, k;
294 5cedca1b 2004-05-15 devnull i = vnumb((int *)0);
295 5cedca1b 2004-05-15 devnull if (nonumb)
298 5cedca1b 2004-05-15 devnull j = getrq();
299 5cedca1b 2004-05-15 devnull if ((k = findn(i)) != NTRAP) {
300 5cedca1b 2004-05-15 devnull mlist[k] = j;
303 5cedca1b 2004-05-15 devnull for (k = 0; k < NTRAP; k++)
304 5cedca1b 2004-05-15 devnull if (mlist[k] == 0)
306 5cedca1b 2004-05-15 devnull if (k == NTRAP) {
307 5cedca1b 2004-05-15 devnull flusho();
308 5cedca1b 2004-05-15 devnull ERROR "cannot plant trap." WARN;
311 5cedca1b 2004-05-15 devnull mlist[k] = j;
312 5cedca1b 2004-05-15 devnull nlist[k] = i;
316 5cedca1b 2004-05-15 devnull void casech(void)
318 5cedca1b 2004-05-15 devnull int i, j, k;
322 5cedca1b 2004-05-15 devnull if (!(j = getrq()))
325 5cedca1b 2004-05-15 devnull for (k = 0; k < NTRAP; k++)
326 5cedca1b 2004-05-15 devnull if (mlist[k] == j)
328 5cedca1b 2004-05-15 devnull if (k == NTRAP)
331 5cedca1b 2004-05-15 devnull i = vnumb((int *)0);
332 5cedca1b 2004-05-15 devnull if (nonumb)
333 5cedca1b 2004-05-15 devnull mlist[k] = 0;
334 5cedca1b 2004-05-15 devnull nlist[k] = i;
338 5cedca1b 2004-05-15 devnull findn(int i)
342 5cedca1b 2004-05-15 devnull for (k = 0; k < NTRAP; k++)
343 5cedca1b 2004-05-15 devnull if ((nlist[k] == i) && (mlist[k] != 0))
345 5cedca1b 2004-05-15 devnull return(k);
349 5cedca1b 2004-05-15 devnull void casepn(void)
354 5cedca1b 2004-05-15 devnull noscale++;
355 5cedca1b 2004-05-15 devnull i = max(inumb(&numtabp[PN].val), 0);
356 5cedca1b 2004-05-15 devnull noscale = 0;
357 5cedca1b 2004-05-15 devnull if (!nonumb) {
358 5cedca1b 2004-05-15 devnull npn = i;
359 5cedca1b 2004-05-15 devnull npnflg++;
364 5cedca1b 2004-05-15 devnull void casebp(void)
367 5cedca1b 2004-05-15 devnull Stack *savframe;
369 5cedca1b 2004-05-15 devnull if (dip != d)
371 5cedca1b 2004-05-15 devnull savframe = frame;
373 5cedca1b 2004-05-15 devnull if ((i = inumb(&numtabp[PN].val)) < 0)
375 5cedca1b 2004-05-15 devnull tbreak();
376 5cedca1b 2004-05-15 devnull if (!nonumb) {
377 5cedca1b 2004-05-15 devnull npn = i;
378 5cedca1b 2004-05-15 devnull npnflg++;
379 5cedca1b 2004-05-15 devnull } else if (dip->nls)
381 5cedca1b 2004-05-15 devnull eject(savframe);
384 5cedca1b 2004-05-15 devnull void casetm(void)
386 5cedca1b 2004-05-15 devnull casetm1(0, stderr);
390 5cedca1b 2004-05-15 devnull void casefm(void)
392 5cedca1b 2004-05-15 devnull static struct fcache {
393 5cedca1b 2004-05-15 devnull char *name;
394 5cedca1b 2004-05-15 devnull FILE *fp;
395 5cedca1b 2004-05-15 devnull } fcache[15];
398 5cedca1b 2004-05-15 devnull if ( skip() || !getname()) {
399 5cedca1b 2004-05-15 devnull ERROR "fm: missing filename" WARN;
403 5cedca1b 2004-05-15 devnull for (i = 0; i < 15 && fcache[i].fp != NULL; i++) {
404 5cedca1b 2004-05-15 devnull if (strcmp(nextf, fcache[i].name) == 0)
407 5cedca1b 2004-05-15 devnull if (i >= 15) {
408 5cedca1b 2004-05-15 devnull ERROR "fm: too many streams" WARN;
411 5cedca1b 2004-05-15 devnull if (fcache[i].fp == NULL) {
412 1f72bc47 2004-05-17 devnull if( (fcache[i].fp = fopen(unsharp(nextf), "w")) == NULL) {
413 5cedca1b 2004-05-15 devnull ERROR "fm: cannot open %s", nextf WARN;
416 5cedca1b 2004-05-15 devnull fcache[i].name = strdupl(nextf);
418 5cedca1b 2004-05-15 devnull casetm1(0, fcache[i].fp);
421 5cedca1b 2004-05-15 devnull void casetm1(int ab, FILE *out)
423 5cedca1b 2004-05-15 devnull int i, j, c;
424 5cedca1b 2004-05-15 devnull char *p;
425 5cedca1b 2004-05-15 devnull char tmbuf[NTM];
428 5cedca1b 2004-05-15 devnull copyf++;
429 5cedca1b 2004-05-15 devnull if (ab) {
430 5cedca1b 2004-05-15 devnull if (skip())
431 5cedca1b 2004-05-15 devnull ERROR "User Abort" WARN;
433 5cedca1b 2004-05-15 devnull extern int error;
434 5cedca1b 2004-05-15 devnull int savtrac = trace;
435 5cedca1b 2004-05-15 devnull i = trace = 0;
436 5cedca1b 2004-05-15 devnull noscale++;
437 5cedca1b 2004-05-15 devnull i = inumb(&trace);
438 5cedca1b 2004-05-15 devnull noscale--;
439 5cedca1b 2004-05-15 devnull if (i) {
440 5cedca1b 2004-05-15 devnull error = i;
441 5cedca1b 2004-05-15 devnull if (nlflg || skip())
442 5cedca1b 2004-05-15 devnull ERROR "User Abort, exit code %d", i WARN;
444 5cedca1b 2004-05-15 devnull trace = savtrac;
448 5cedca1b 2004-05-15 devnull for (i = 0; i < NTM - 2; ) {
449 5cedca1b 2004-05-15 devnull if ((c = cbits(getch())) == '\n' || c == RIGHT)
451 5cedca1b 2004-05-15 devnull else if (c == MINUS) { /* special pleading for strange encodings */
452 5cedca1b 2004-05-15 devnull tmbuf[i++] = '\\';
453 5cedca1b 2004-05-15 devnull tmbuf[i++] = '-';
454 5cedca1b 2004-05-15 devnull } else if (c == PRESC) {
455 5cedca1b 2004-05-15 devnull tmbuf[i++] = '\\';
456 5cedca1b 2004-05-15 devnull tmbuf[i++] = 'e';
457 5cedca1b 2004-05-15 devnull } else if (c == FILLER) {
458 5cedca1b 2004-05-15 devnull tmbuf[i++] = '\\';
459 5cedca1b 2004-05-15 devnull tmbuf[i++] = '&';
460 5cedca1b 2004-05-15 devnull } else if (c == UNPAD) {
461 5cedca1b 2004-05-15 devnull tmbuf[i++] = '\\';
462 5cedca1b 2004-05-15 devnull tmbuf[i++] = ' ';
463 5cedca1b 2004-05-15 devnull } else if (c == OHC) {
464 5cedca1b 2004-05-15 devnull tmbuf[i++] = '\\';
465 5cedca1b 2004-05-15 devnull tmbuf[i++] = '%';
466 5cedca1b 2004-05-15 devnull } else if (c >= ALPHABET) {
467 5cedca1b 2004-05-15 devnull p = chname(c);
468 5cedca1b 2004-05-15 devnull switch (*p) {
469 5cedca1b 2004-05-15 devnull case MBchar:
470 5cedca1b 2004-05-15 devnull sprintf(&tmbuf[i], p+1);
472 5cedca1b 2004-05-15 devnull case Number:
473 5cedca1b 2004-05-15 devnull sprintf(&tmbuf[i], "\\N'%s'", p+1);
475 5cedca1b 2004-05-15 devnull case Troffchar:
476 5cedca1b 2004-05-15 devnull if ((j = strlen(p+1)) == 2)
477 5cedca1b 2004-05-15 devnull sprintf(&tmbuf[i], "\\(%s", p+1);
479 5cedca1b 2004-05-15 devnull sprintf(&tmbuf[i], "\\C'%s'", p+1);
481 5cedca1b 2004-05-15 devnull default:
482 5cedca1b 2004-05-15 devnull sprintf(&tmbuf[i]," %s? ", p);
485 5cedca1b 2004-05-15 devnull j = strlen(&tmbuf[i]);
488 5cedca1b 2004-05-15 devnull tmbuf[i++] = c;
490 5cedca1b 2004-05-15 devnull tmbuf[i] = 0;
491 5cedca1b 2004-05-15 devnull if (ab) /* truncate output */
492 5cedca1b 2004-05-15 devnull obufp = obuf; /* should be a function in n2.c */
493 5cedca1b 2004-05-15 devnull flusho();
495 5cedca1b 2004-05-15 devnull fprintf(out, "%s\n", tmbuf);
496 5cedca1b 2004-05-15 devnull fflush(out);
497 5cedca1b 2004-05-15 devnull copyf--;
502 5cedca1b 2004-05-15 devnull void casesp(void)
504 5cedca1b 2004-05-15 devnull casesp1(0);
507 5cedca1b 2004-05-15 devnull void casesp1(int a)
509 5cedca1b 2004-05-15 devnull int i, j, savlss;
511 5cedca1b 2004-05-15 devnull tbreak();
512 5cedca1b 2004-05-15 devnull if (dip->nls || trap)
514 5cedca1b 2004-05-15 devnull i = findt1();
515 5cedca1b 2004-05-15 devnull if (!a) {
517 5cedca1b 2004-05-15 devnull j = vnumb((int *)0);
518 5cedca1b 2004-05-15 devnull if (nonumb)
519 5cedca1b 2004-05-15 devnull j = lss;
522 5cedca1b 2004-05-15 devnull if (j == 0)
524 5cedca1b 2004-05-15 devnull if (i < j)
526 5cedca1b 2004-05-15 devnull savlss = lss;
527 5cedca1b 2004-05-15 devnull if (dip != d)
528 5cedca1b 2004-05-15 devnull i = dip->dnl;
530 5cedca1b 2004-05-15 devnull i = numtabp[NL].val;
531 5cedca1b 2004-05-15 devnull if ((i + j) < 0)
533 5cedca1b 2004-05-15 devnull lss = j;
534 5cedca1b 2004-05-15 devnull newline(0);
535 5cedca1b 2004-05-15 devnull lss = savlss;
539 5cedca1b 2004-05-15 devnull void casert(void)
541 5cedca1b 2004-05-15 devnull int a, *p;
544 5cedca1b 2004-05-15 devnull if (dip != d)
545 5cedca1b 2004-05-15 devnull p = &dip->dnl;
547 5cedca1b 2004-05-15 devnull p = &numtabp[NL].val;
548 5cedca1b 2004-05-15 devnull a = vnumb(p);
549 5cedca1b 2004-05-15 devnull if (nonumb)
550 5cedca1b 2004-05-15 devnull a = dip->mkline;
551 5cedca1b 2004-05-15 devnull if ((a < 0) || (a >= *p))
554 5cedca1b 2004-05-15 devnull casesp1(a - *p);
558 5cedca1b 2004-05-15 devnull void caseem(void)
562 5cedca1b 2004-05-15 devnull em = getrq();
566 5cedca1b 2004-05-15 devnull void casefl(void)
568 5cedca1b 2004-05-15 devnull tbreak();
569 5cedca1b 2004-05-15 devnull if (!ascii)
570 5cedca1b 2004-05-15 devnull ptflush();
571 5cedca1b 2004-05-15 devnull flusho();
575 5cedca1b 2004-05-15 devnull void caseev(void)
577 5cedca1b 2004-05-15 devnull int nxev;
579 5cedca1b 2004-05-15 devnull if (skip()) {
581 5cedca1b 2004-05-15 devnull if (evi == 0)
583 5cedca1b 2004-05-15 devnull nxev = evlist[--evi];
584 5cedca1b 2004-05-15 devnull goto e1;
586 5cedca1b 2004-05-15 devnull noscale++;
587 5cedca1b 2004-05-15 devnull nxev = atoi0();
588 5cedca1b 2004-05-15 devnull noscale = 0;
589 5cedca1b 2004-05-15 devnull if (nonumb)
590 5cedca1b 2004-05-15 devnull goto e0;
591 5cedca1b 2004-05-15 devnull flushi();
592 5cedca1b 2004-05-15 devnull if (nxev >= NEV || nxev < 0 || evi >= EVLSZ) {
593 5cedca1b 2004-05-15 devnull flusho();
594 5cedca1b 2004-05-15 devnull ERROR "cannot do .ev %d", nxev WARN;
595 5cedca1b 2004-05-15 devnull if (error)
596 5cedca1b 2004-05-15 devnull done2(040);
598 5cedca1b 2004-05-15 devnull edone(040);
601 5cedca1b 2004-05-15 devnull evlist[evi++] = ev;
603 5cedca1b 2004-05-15 devnull if (ev == nxev)
605 5cedca1b 2004-05-15 devnull ev = nxev;
606 5cedca1b 2004-05-15 devnull envp = &env[ev];
609 5cedca1b 2004-05-15 devnull void envcopy(Env *e1, Env *e2) /* copy env e2 to e1 */
611 5cedca1b 2004-05-15 devnull *e1 = *e2; /* rumor hath that this fails on some machines */
615 5cedca1b 2004-05-15 devnull void caseel(void)
617 5cedca1b 2004-05-15 devnull if (--ifx < 0) {
618 5cedca1b 2004-05-15 devnull ifx = 0;
619 5cedca1b 2004-05-15 devnull iflist[0] = 0;
621 5cedca1b 2004-05-15 devnull caseif1(2);
625 5cedca1b 2004-05-15 devnull void caseie(void)
627 5cedca1b 2004-05-15 devnull if (ifx >= NIF) {
628 5cedca1b 2004-05-15 devnull ERROR "if-else overflow." WARN;
629 5cedca1b 2004-05-15 devnull ifx = 0;
630 5cedca1b 2004-05-15 devnull edone(040);
632 5cedca1b 2004-05-15 devnull caseif1(1);
637 5cedca1b 2004-05-15 devnull void caseif(void)
639 5cedca1b 2004-05-15 devnull caseif1(0);
642 5cedca1b 2004-05-15 devnull void caseif1(int x)
644 5cedca1b 2004-05-15 devnull extern int falsef;
645 5cedca1b 2004-05-15 devnull int notflag, true;
646 5cedca1b 2004-05-15 devnull Tchar i;
648 5cedca1b 2004-05-15 devnull if (x == 2) {
649 5cedca1b 2004-05-15 devnull notflag = 0;
650 5cedca1b 2004-05-15 devnull true = iflist[ifx];
651 5cedca1b 2004-05-15 devnull goto i1;
653 5cedca1b 2004-05-15 devnull true = 0;
655 5cedca1b 2004-05-15 devnull if ((cbits(i = getch())) == '!') {
656 5cedca1b 2004-05-15 devnull notflag = 1;
657 5cedca1b 2004-05-15 devnull } else {
658 5cedca1b 2004-05-15 devnull notflag = 0;
661 5cedca1b 2004-05-15 devnull ifnum++;
662 5cedca1b 2004-05-15 devnull i = atoi0();
663 5cedca1b 2004-05-15 devnull ifnum = 0;
664 5cedca1b 2004-05-15 devnull if (!nonumb) {
665 5cedca1b 2004-05-15 devnull if (i > 0)
667 5cedca1b 2004-05-15 devnull goto i1;
669 5cedca1b 2004-05-15 devnull i = getch();
670 5cedca1b 2004-05-15 devnull switch (cbits(i)) {
671 5cedca1b 2004-05-15 devnull case 'e':
672 5cedca1b 2004-05-15 devnull if (!(numtabp[PN].val & 01))
675 5cedca1b 2004-05-15 devnull case 'o':
676 5cedca1b 2004-05-15 devnull if (numtabp[PN].val & 01)
679 5cedca1b 2004-05-15 devnull case 'n':
680 5cedca1b 2004-05-15 devnull if (NROFF)
683 5cedca1b 2004-05-15 devnull case 't':
684 5cedca1b 2004-05-15 devnull if (TROFF)
687 5cedca1b 2004-05-15 devnull case ' ':
689 5cedca1b 2004-05-15 devnull default:
690 5cedca1b 2004-05-15 devnull true = cmpstr(i);
693 5cedca1b 2004-05-15 devnull true ^= notflag;
694 5cedca1b 2004-05-15 devnull if (x == 1)
695 5cedca1b 2004-05-15 devnull iflist[ifx] = !true;
696 5cedca1b 2004-05-15 devnull if (true) {
698 5cedca1b 2004-05-15 devnull while ((cbits(i = getch())) == ' ')
700 5cedca1b 2004-05-15 devnull if (cbits(i) == LEFT)
701 5cedca1b 2004-05-15 devnull goto i2;
703 5cedca1b 2004-05-15 devnull nflush++;
704 5cedca1b 2004-05-15 devnull } else {
705 5cedca1b 2004-05-15 devnull if (!nlflg) {
706 5cedca1b 2004-05-15 devnull copyf++;
707 5cedca1b 2004-05-15 devnull falsef++;
708 5cedca1b 2004-05-15 devnull eatblk(0);
709 5cedca1b 2004-05-15 devnull copyf--;
710 5cedca1b 2004-05-15 devnull falsef--;
715 5cedca1b 2004-05-15 devnull void eatblk(int inblk)
717 5cedca1b 2004-05-15 devnull int cnt, i;
719 5cedca1b 2004-05-15 devnull cnt = 0;
721 5cedca1b 2004-05-15 devnull if (ch) {
722 5cedca1b 2004-05-15 devnull i = cbits(ch);
725 5cedca1b 2004-05-15 devnull i = cbits(getch0());
726 5cedca1b 2004-05-15 devnull if (i == ESC)
729 5cedca1b 2004-05-15 devnull if (cnt == 1)
730 5cedca1b 2004-05-15 devnull switch (i) {
731 5cedca1b 2004-05-15 devnull case '{': i = LEFT; break;
732 5cedca1b 2004-05-15 devnull case '}': i = RIGHT; break;
733 5cedca1b 2004-05-15 devnull case '\n': i = 'x'; break;
735 5cedca1b 2004-05-15 devnull cnt = 0;
737 5cedca1b 2004-05-15 devnull if (i == LEFT) eatblk(1);
738 5cedca1b 2004-05-15 devnull } while ((!inblk && (i != '\n')) || (inblk && (i != RIGHT)));
739 5cedca1b 2004-05-15 devnull if (i == '\n') {
740 5cedca1b 2004-05-15 devnull nlflg++;
741 5cedca1b 2004-05-15 devnull if (ip == 0)
742 5cedca1b 2004-05-15 devnull numtabp[CD].val++;
747 5cedca1b 2004-05-15 devnull cmpstr(Tchar c)
749 5cedca1b 2004-05-15 devnull int j, delim;
750 5cedca1b 2004-05-15 devnull Tchar i;
751 5cedca1b 2004-05-15 devnull int val;
752 5cedca1b 2004-05-15 devnull int savapts, savapts1, savfont, savfont1, savpts, savpts1;
753 5cedca1b 2004-05-15 devnull Tchar string[1280];
754 5cedca1b 2004-05-15 devnull Tchar *sp;
756 5cedca1b 2004-05-15 devnull if (ismot(c))
757 5cedca1b 2004-05-15 devnull return(0);
758 5cedca1b 2004-05-15 devnull delim = cbits(c);
759 5cedca1b 2004-05-15 devnull savapts = apts;
760 5cedca1b 2004-05-15 devnull savapts1 = apts1;
761 5cedca1b 2004-05-15 devnull savfont = font;
762 5cedca1b 2004-05-15 devnull savfont1 = font1;
763 5cedca1b 2004-05-15 devnull savpts = pts;
764 5cedca1b 2004-05-15 devnull savpts1 = pts1;
765 5cedca1b 2004-05-15 devnull sp = string;
766 5cedca1b 2004-05-15 devnull while ((j = cbits(i = getch()))!=delim && j!='\n' && sp<&string[1280-1])
767 5cedca1b 2004-05-15 devnull *sp++ = i;
768 5cedca1b 2004-05-15 devnull if (sp >= string + 1280) {
769 5cedca1b 2004-05-15 devnull ERROR "too-long string compare." WARN;
770 5cedca1b 2004-05-15 devnull edone(0100);
772 5cedca1b 2004-05-15 devnull if (nlflg) {
773 5cedca1b 2004-05-15 devnull val = sp==string;
774 5cedca1b 2004-05-15 devnull goto rtn;
776 5cedca1b 2004-05-15 devnull *sp = 0;
777 5cedca1b 2004-05-15 devnull apts = savapts;
778 5cedca1b 2004-05-15 devnull apts1 = savapts1;
779 5cedca1b 2004-05-15 devnull font = savfont;
780 5cedca1b 2004-05-15 devnull font1 = savfont1;
781 5cedca1b 2004-05-15 devnull pts = savpts;
782 5cedca1b 2004-05-15 devnull pts1 = savpts1;
783 5cedca1b 2004-05-15 devnull mchbits();
784 5cedca1b 2004-05-15 devnull val = 1;
785 5cedca1b 2004-05-15 devnull sp = string;
786 5cedca1b 2004-05-15 devnull while ((j = cbits(i = getch())) != delim && j != '\n') {
787 5cedca1b 2004-05-15 devnull if (*sp != i) {
788 5cedca1b 2004-05-15 devnull eat(delim);
789 5cedca1b 2004-05-15 devnull val = 0;
790 5cedca1b 2004-05-15 devnull goto rtn;
794 5cedca1b 2004-05-15 devnull if (*sp)
795 5cedca1b 2004-05-15 devnull val = 0;
797 5cedca1b 2004-05-15 devnull apts = savapts;
798 5cedca1b 2004-05-15 devnull apts1 = savapts1;
799 5cedca1b 2004-05-15 devnull font = savfont;
800 5cedca1b 2004-05-15 devnull font1 = savfont1;
801 5cedca1b 2004-05-15 devnull pts = savpts;
802 5cedca1b 2004-05-15 devnull pts1 = savpts1;
803 5cedca1b 2004-05-15 devnull mchbits();
804 5cedca1b 2004-05-15 devnull return(val);
808 5cedca1b 2004-05-15 devnull void caserd(void)
813 5cedca1b 2004-05-15 devnull getname();
814 5cedca1b 2004-05-15 devnull if (!iflg) {
815 5cedca1b 2004-05-15 devnull if (quiet) {
816 5cedca1b 2004-05-15 devnull if (NROFF) {
817 5cedca1b 2004-05-15 devnull echo_off();
818 5cedca1b 2004-05-15 devnull flusho();
820 5cedca1b 2004-05-15 devnull fprintf(stderr, "\007"); /*bell*/
821 5cedca1b 2004-05-15 devnull } else {
822 5cedca1b 2004-05-15 devnull if (nextf[0]) {
823 5cedca1b 2004-05-15 devnull fprintf(stderr, "%s:", nextf);
824 5cedca1b 2004-05-15 devnull } else {
825 5cedca1b 2004-05-15 devnull fprintf(stderr, "\007"); /*bell*/
829 5cedca1b 2004-05-15 devnull collect();
831 5cedca1b 2004-05-15 devnull pushi(RD_OFFSET, PAIR('r','d'));
835 5cedca1b 2004-05-15 devnull rdtty(void)
837 5cedca1b 2004-05-15 devnull char onechar;
839 5cedca1b 2004-05-15 devnull onechar = 0;
840 5cedca1b 2004-05-15 devnull if (read(0, &onechar, 1) == 1) {
841 5cedca1b 2004-05-15 devnull if (onechar == '\n')
844 5cedca1b 2004-05-15 devnull tty = 1;
845 5cedca1b 2004-05-15 devnull if (tty != 3)
846 5cedca1b 2004-05-15 devnull return(onechar);
848 5cedca1b 2004-05-15 devnull tty = 0;
849 5cedca1b 2004-05-15 devnull if (NROFF && quiet)
850 5cedca1b 2004-05-15 devnull echo_on();
851 5cedca1b 2004-05-15 devnull return(0);
855 5cedca1b 2004-05-15 devnull void caseec(void)
857 5cedca1b 2004-05-15 devnull eschar = chget('\\');
861 5cedca1b 2004-05-15 devnull void caseeo(void)
863 5cedca1b 2004-05-15 devnull eschar = 0;
867 5cedca1b 2004-05-15 devnull void caseta(void)
869 5cedca1b 2004-05-15 devnull int i, j, k;
871 5cedca1b 2004-05-15 devnull tabtab[0] = nonumb = 0;
872 5cedca1b 2004-05-15 devnull for (i = 0; ((i < (NTAB - 1)) && !nonumb); i++) {
873 5cedca1b 2004-05-15 devnull if (skip())
875 5cedca1b 2004-05-15 devnull k = tabtab[max(i-1, 0)] & TABMASK;
876 5cedca1b 2004-05-15 devnull if ((j = max(hnumb(&k), 0)) > TABMASK) {
877 5cedca1b 2004-05-15 devnull ERROR "Tab too far away" WARN;
878 5cedca1b 2004-05-15 devnull j = TABMASK;
880 5cedca1b 2004-05-15 devnull tabtab[i] = j & TABMASK;
881 5cedca1b 2004-05-15 devnull if (!nonumb)
882 5cedca1b 2004-05-15 devnull switch (cbits(ch)) {
883 5cedca1b 2004-05-15 devnull case 'C':
884 5cedca1b 2004-05-15 devnull tabtab[i] |= CTAB;
886 5cedca1b 2004-05-15 devnull case 'R':
887 5cedca1b 2004-05-15 devnull tabtab[i] |= RTAB;
889 5cedca1b 2004-05-15 devnull default: /*includes L*/
892 5cedca1b 2004-05-15 devnull nonumb = ch = 0;
894 5cedca1b 2004-05-15 devnull if (!skip())
895 5cedca1b 2004-05-15 devnull ERROR "Too many tab stops" WARN;
896 5cedca1b 2004-05-15 devnull tabtab[i] = 0;
900 5cedca1b 2004-05-15 devnull void casene(void)
902 5cedca1b 2004-05-15 devnull int i, j;
905 5cedca1b 2004-05-15 devnull i = vnumb((int *)0);
906 5cedca1b 2004-05-15 devnull if (nonumb)
907 5cedca1b 2004-05-15 devnull i = lss;
908 5cedca1b 2004-05-15 devnull if (dip == d && numtabp[NL].val == -1) {
909 5cedca1b 2004-05-15 devnull newline(1);
912 5cedca1b 2004-05-15 devnull if (i > (j = findt1())) {
913 5cedca1b 2004-05-15 devnull i = lss;
914 5cedca1b 2004-05-15 devnull lss = j;
915 5cedca1b 2004-05-15 devnull dip->nls = 0;
916 5cedca1b 2004-05-15 devnull newline(0);
917 5cedca1b 2004-05-15 devnull lss = i;
922 5cedca1b 2004-05-15 devnull void casetr(void)
924 5cedca1b 2004-05-15 devnull int i, j;
925 5cedca1b 2004-05-15 devnull Tchar k;
929 5cedca1b 2004-05-15 devnull while ((i = cbits(k=getch())) != '\n') {
930 5cedca1b 2004-05-15 devnull if (ismot(k))
932 5cedca1b 2004-05-15 devnull if (ismot(k = getch()))
934 5cedca1b 2004-05-15 devnull if ((j = cbits(k)) == '\n')
935 5cedca1b 2004-05-15 devnull j = ' ';
936 5cedca1b 2004-05-15 devnull trtab[i] = j;
941 5cedca1b 2004-05-15 devnull void casecu(void)
944 5cedca1b 2004-05-15 devnull caseul();
948 5cedca1b 2004-05-15 devnull void caseul(void)
952 5cedca1b 2004-05-15 devnull noscale++;
954 5cedca1b 2004-05-15 devnull i = max(atoi0(), 0);
955 5cedca1b 2004-05-15 devnull if (nonumb)
957 5cedca1b 2004-05-15 devnull if (ul && (i == 0)) {
958 5cedca1b 2004-05-15 devnull font = sfont;
959 5cedca1b 2004-05-15 devnull ul = cu = 0;
961 5cedca1b 2004-05-15 devnull if (i) {
962 5cedca1b 2004-05-15 devnull if (!ul) {
963 5cedca1b 2004-05-15 devnull sfont = font;
964 5cedca1b 2004-05-15 devnull font = ulfont;
968 5cedca1b 2004-05-15 devnull noscale = 0;
969 5cedca1b 2004-05-15 devnull mchbits();
973 5cedca1b 2004-05-15 devnull void caseuf(void)
975 5cedca1b 2004-05-15 devnull int i, j;
977 5cedca1b 2004-05-15 devnull if (skip() || !(i = getrq()) || i == 'S' || (j = findft(i)) == -1)
978 5cedca1b 2004-05-15 devnull ulfont = ULFONT; /*default underline position*/
980 5cedca1b 2004-05-15 devnull ulfont = j;
981 5cedca1b 2004-05-15 devnull if (NROFF && ulfont == FT)
982 5cedca1b 2004-05-15 devnull ulfont = ULFONT;
986 5cedca1b 2004-05-15 devnull void caseit(void)
991 5cedca1b 2004-05-15 devnull it = itmac = 0;
992 5cedca1b 2004-05-15 devnull noscale++;
994 5cedca1b 2004-05-15 devnull i = atoi0();
996 5cedca1b 2004-05-15 devnull if (!nonumb && (itmac = getrq()))
998 5cedca1b 2004-05-15 devnull noscale = 0;
1002 5cedca1b 2004-05-15 devnull void casemc(void)
1006 5cedca1b 2004-05-15 devnull if (icf > 1)
1007 5cedca1b 2004-05-15 devnull ic = 0;
1008 5cedca1b 2004-05-15 devnull icf = 0;
1009 5cedca1b 2004-05-15 devnull if (skip())
1010 5cedca1b 2004-05-15 devnull return;
1011 5cedca1b 2004-05-15 devnull ic = getch();
1012 5cedca1b 2004-05-15 devnull icf = 1;
1013 5cedca1b 2004-05-15 devnull skip();
1014 5cedca1b 2004-05-15 devnull i = max(hnumb((int *)0), 0);
1015 5cedca1b 2004-05-15 devnull if (!nonumb)
1016 5cedca1b 2004-05-15 devnull ics = i;
1020 5cedca1b 2004-05-15 devnull void casemk(void)
1022 5cedca1b 2004-05-15 devnull int i, j;
1024 5cedca1b 2004-05-15 devnull if (dip != d)
1025 5cedca1b 2004-05-15 devnull j = dip->dnl;
1027 5cedca1b 2004-05-15 devnull j = numtabp[NL].val;
1028 5cedca1b 2004-05-15 devnull if (skip()) {
1029 5cedca1b 2004-05-15 devnull dip->mkline = j;
1030 5cedca1b 2004-05-15 devnull return;
1032 5cedca1b 2004-05-15 devnull if ((i = getrq()) == 0)
1033 5cedca1b 2004-05-15 devnull return;
1034 5cedca1b 2004-05-15 devnull numtabp[findr(i)].val = j;
1038 5cedca1b 2004-05-15 devnull void casesv(void)
1042 5cedca1b 2004-05-15 devnull skip();
1043 5cedca1b 2004-05-15 devnull if ((i = vnumb((int *)0)) < 0)
1044 5cedca1b 2004-05-15 devnull return;
1045 5cedca1b 2004-05-15 devnull if (nonumb)
1047 5cedca1b 2004-05-15 devnull sv += i;
1048 5cedca1b 2004-05-15 devnull caseos();
1052 5cedca1b 2004-05-15 devnull void caseos(void)
1054 5cedca1b 2004-05-15 devnull int savlss;
1056 5cedca1b 2004-05-15 devnull if (sv <= findt1()) {
1057 5cedca1b 2004-05-15 devnull savlss = lss;
1058 5cedca1b 2004-05-15 devnull lss = sv;
1059 5cedca1b 2004-05-15 devnull newline(0);
1060 5cedca1b 2004-05-15 devnull lss = savlss;
1061 5cedca1b 2004-05-15 devnull sv = 0;
1066 5cedca1b 2004-05-15 devnull void casenm(void)
1070 5cedca1b 2004-05-15 devnull lnmod = nn = 0;
1071 5cedca1b 2004-05-15 devnull if (skip())
1072 5cedca1b 2004-05-15 devnull return;
1073 5cedca1b 2004-05-15 devnull lnmod++;
1074 5cedca1b 2004-05-15 devnull noscale++;
1075 5cedca1b 2004-05-15 devnull i = inumb(&numtabp[LN].val);
1076 5cedca1b 2004-05-15 devnull if (!nonumb)
1077 5cedca1b 2004-05-15 devnull numtabp[LN].val = max(i, 0);
1078 5cedca1b 2004-05-15 devnull getnm(&ndf, 1);
1079 5cedca1b 2004-05-15 devnull getnm(&nms, 0);
1080 5cedca1b 2004-05-15 devnull getnm(&ni, 0);
1081 5cedca1b 2004-05-15 devnull getnm(&nmwid, 3); /* really kludgy! */
1082 5cedca1b 2004-05-15 devnull noscale = 0;
1083 5cedca1b 2004-05-15 devnull nmbits = chbits;
1087 5cedca1b 2004-05-15 devnull * .nm relies on the fact that illegal args are skipped; don't warn
1088 5cedca1b 2004-05-15 devnull * for illegality of these
1090 5cedca1b 2004-05-15 devnull void getnm(int *p, int min)
1093 5cedca1b 2004-05-15 devnull int savtr = trace;
1095 5cedca1b 2004-05-15 devnull eat(' ');
1096 5cedca1b 2004-05-15 devnull if (skip())
1097 5cedca1b 2004-05-15 devnull return;
1098 5cedca1b 2004-05-15 devnull trace = 0;
1099 5cedca1b 2004-05-15 devnull i = atoi0();
1100 5cedca1b 2004-05-15 devnull if (nonumb)
1101 5cedca1b 2004-05-15 devnull return;
1102 5cedca1b 2004-05-15 devnull *p = max(i, min);
1103 5cedca1b 2004-05-15 devnull trace = savtr;
1107 5cedca1b 2004-05-15 devnull void casenn(void)
1109 5cedca1b 2004-05-15 devnull noscale++;
1110 5cedca1b 2004-05-15 devnull skip();
1111 5cedca1b 2004-05-15 devnull nn = max(atoi0(), 1);
1112 5cedca1b 2004-05-15 devnull noscale = 0;
1116 5cedca1b 2004-05-15 devnull void caseab(void)
1118 5cedca1b 2004-05-15 devnull casetm1(1, stderr);
1119 5cedca1b 2004-05-15 devnull done3(0);
1123 5cedca1b 2004-05-15 devnull /* nroff terminal handling has been pretty well excised */
1124 5cedca1b 2004-05-15 devnull /* as part of the merge with troff. these are ghostly remnants, */
1125 5cedca1b 2004-05-15 devnull /* called, but doing nothing. restore them at your peril. */
1128 5cedca1b 2004-05-15 devnull void save_tty(void) /*save any tty settings that may be changed*/
1133 5cedca1b 2004-05-15 devnull void restore_tty(void) /*restore tty settings from beginning*/
1138 5cedca1b 2004-05-15 devnull void set_tty(void)
1143 5cedca1b 2004-05-15 devnull void echo_off(void) /*turn off ECHO for .rd in "-q" mode*/
1148 5cedca1b 2004-05-15 devnull void echo_on(void) /*restore ECHO after .rd in "-q" mode*/