13e12c5d1SDavid du Colombier /*
23e12c5d1SDavid du Colombier * troff5.c
33e12c5d1SDavid du Colombier *
43e12c5d1SDavid du Colombier * misc processing requests
53e12c5d1SDavid du Colombier */
63e12c5d1SDavid du Colombier
73e12c5d1SDavid du Colombier #include "tdef.h"
83e12c5d1SDavid du Colombier #include "fns.h"
93e12c5d1SDavid du Colombier #include "ext.h"
103e12c5d1SDavid du Colombier
113e12c5d1SDavid du Colombier int iflist[NIF];
123e12c5d1SDavid du Colombier int ifx;
13219b2ee8SDavid du Colombier int ifnum = 0; /* trying numeric expression for .if or .ie condition */
143e12c5d1SDavid du Colombier
casead(void)153e12c5d1SDavid du Colombier void casead(void)
163e12c5d1SDavid du Colombier {
173e12c5d1SDavid du Colombier int i;
183e12c5d1SDavid du Colombier
193e12c5d1SDavid du Colombier ad = 1;
203e12c5d1SDavid du Colombier /* leave admod alone */
213e12c5d1SDavid du Colombier if (skip())
223e12c5d1SDavid du Colombier return;
233e12c5d1SDavid du Colombier switch (i = cbits(getch())) {
243e12c5d1SDavid du Colombier case 'r': /* right adj, left ragged */
253e12c5d1SDavid du Colombier admod = 2;
263e12c5d1SDavid du Colombier break;
273e12c5d1SDavid du Colombier case 'l': /* left adj, right ragged */
283e12c5d1SDavid du Colombier admod = ad = 0; /* same as casena */
293e12c5d1SDavid du Colombier break;
303e12c5d1SDavid du Colombier case 'c': /*centered adj*/
313e12c5d1SDavid du Colombier admod = 1;
323e12c5d1SDavid du Colombier break;
333e12c5d1SDavid du Colombier case 'b':
343e12c5d1SDavid du Colombier case 'n':
353e12c5d1SDavid du Colombier admod = 0;
363e12c5d1SDavid du Colombier break;
373e12c5d1SDavid du Colombier case '0':
383e12c5d1SDavid du Colombier case '2':
393e12c5d1SDavid du Colombier case '4':
403e12c5d1SDavid du Colombier ad = 0;
413e12c5d1SDavid du Colombier case '1':
423e12c5d1SDavid du Colombier case '3':
433e12c5d1SDavid du Colombier case '5':
443e12c5d1SDavid du Colombier admod = (i - '0') / 2;
453e12c5d1SDavid du Colombier }
463e12c5d1SDavid du Colombier }
473e12c5d1SDavid du Colombier
483e12c5d1SDavid du Colombier
casena(void)493e12c5d1SDavid du Colombier void casena(void)
503e12c5d1SDavid du Colombier {
513e12c5d1SDavid du Colombier ad = 0;
523e12c5d1SDavid du Colombier }
533e12c5d1SDavid du Colombier
543e12c5d1SDavid du Colombier
casefi(void)553e12c5d1SDavid du Colombier void casefi(void)
563e12c5d1SDavid du Colombier {
573e12c5d1SDavid du Colombier tbreak();
58219b2ee8SDavid du Colombier fi = 1;
593e12c5d1SDavid du Colombier pendnf = 0;
603e12c5d1SDavid du Colombier }
613e12c5d1SDavid du Colombier
623e12c5d1SDavid du Colombier
casenf(void)633e12c5d1SDavid du Colombier void casenf(void)
643e12c5d1SDavid du Colombier {
653e12c5d1SDavid du Colombier tbreak();
663e12c5d1SDavid du Colombier fi = 0;
673e12c5d1SDavid du Colombier }
683e12c5d1SDavid du Colombier
693e12c5d1SDavid du Colombier
casers(void)703e12c5d1SDavid du Colombier void casers(void)
713e12c5d1SDavid du Colombier {
723e12c5d1SDavid du Colombier dip->nls = 0;
733e12c5d1SDavid du Colombier }
743e12c5d1SDavid du Colombier
753e12c5d1SDavid du Colombier
casens(void)763e12c5d1SDavid du Colombier void casens(void)
773e12c5d1SDavid du Colombier {
783e12c5d1SDavid du Colombier dip->nls++;
793e12c5d1SDavid du Colombier }
803e12c5d1SDavid du Colombier
813e12c5d1SDavid du Colombier
chget(int c)823e12c5d1SDavid du Colombier chget(int c)
833e12c5d1SDavid du Colombier {
843e12c5d1SDavid du Colombier Tchar i;
853e12c5d1SDavid du Colombier
86*14f51593SDavid du Colombier i = 0;
873e12c5d1SDavid du Colombier if (skip() || ismot(i = getch()) || cbits(i) == ' ' || cbits(i) == '\n') {
883e12c5d1SDavid du Colombier ch = i;
893e12c5d1SDavid du Colombier return(c);
903e12c5d1SDavid du Colombier } else
913e12c5d1SDavid du Colombier return cbits(i); /* was (i & BYTEMASK) */
923e12c5d1SDavid du Colombier }
933e12c5d1SDavid du Colombier
943e12c5d1SDavid du Colombier
casecc(void)953e12c5d1SDavid du Colombier void casecc(void)
963e12c5d1SDavid du Colombier {
973e12c5d1SDavid du Colombier cc = chget('.');
983e12c5d1SDavid du Colombier }
993e12c5d1SDavid du Colombier
1003e12c5d1SDavid du Colombier
casec2(void)1013e12c5d1SDavid du Colombier void casec2(void)
1023e12c5d1SDavid du Colombier {
1033e12c5d1SDavid du Colombier c2 = chget('\'');
1043e12c5d1SDavid du Colombier }
1053e12c5d1SDavid du Colombier
1063e12c5d1SDavid du Colombier
casehc(void)1073e12c5d1SDavid du Colombier void casehc(void)
1083e12c5d1SDavid du Colombier {
1093e12c5d1SDavid du Colombier ohc = chget(OHC);
1103e12c5d1SDavid du Colombier }
1113e12c5d1SDavid du Colombier
1123e12c5d1SDavid du Colombier
casetc(void)1133e12c5d1SDavid du Colombier void casetc(void)
1143e12c5d1SDavid du Colombier {
1153e12c5d1SDavid du Colombier tabc = chget(0);
1163e12c5d1SDavid du Colombier }
1173e12c5d1SDavid du Colombier
1183e12c5d1SDavid du Colombier
caselc(void)1193e12c5d1SDavid du Colombier void caselc(void)
1203e12c5d1SDavid du Colombier {
1213e12c5d1SDavid du Colombier dotc = chget(0);
1223e12c5d1SDavid du Colombier }
1233e12c5d1SDavid du Colombier
1243e12c5d1SDavid du Colombier
casehy(void)1253e12c5d1SDavid du Colombier void casehy(void)
1263e12c5d1SDavid du Colombier {
1273e12c5d1SDavid du Colombier int i;
1283e12c5d1SDavid du Colombier
1293e12c5d1SDavid du Colombier hyf = 1;
1303e12c5d1SDavid du Colombier if (skip())
1313e12c5d1SDavid du Colombier return;
1323e12c5d1SDavid du Colombier noscale++;
1333e12c5d1SDavid du Colombier i = atoi0();
1343e12c5d1SDavid du Colombier noscale = 0;
1353e12c5d1SDavid du Colombier if (nonumb)
1363e12c5d1SDavid du Colombier return;
1373e12c5d1SDavid du Colombier hyf = max(i, 0);
1383e12c5d1SDavid du Colombier }
1393e12c5d1SDavid du Colombier
1403e12c5d1SDavid du Colombier
casenh(void)1413e12c5d1SDavid du Colombier void casenh(void)
1423e12c5d1SDavid du Colombier {
1433e12c5d1SDavid du Colombier hyf = 0;
1443e12c5d1SDavid du Colombier }
1453e12c5d1SDavid du Colombier
1463e12c5d1SDavid du Colombier
max(int aa,int bb)1473e12c5d1SDavid du Colombier max(int aa, int bb)
1483e12c5d1SDavid du Colombier {
1493e12c5d1SDavid du Colombier if (aa > bb)
1503e12c5d1SDavid du Colombier return(aa);
1513e12c5d1SDavid du Colombier else
1523e12c5d1SDavid du Colombier return(bb);
1533e12c5d1SDavid du Colombier }
1543e12c5d1SDavid du Colombier
1553e12c5d1SDavid du Colombier
casece(void)1563e12c5d1SDavid du Colombier void casece(void)
1573e12c5d1SDavid du Colombier {
1583e12c5d1SDavid du Colombier int i;
1593e12c5d1SDavid du Colombier
1603e12c5d1SDavid du Colombier noscale++;
1613e12c5d1SDavid du Colombier skip();
1623e12c5d1SDavid du Colombier i = max(atoi0(), 0);
1633e12c5d1SDavid du Colombier if (nonumb)
1643e12c5d1SDavid du Colombier i = 1;
1653e12c5d1SDavid du Colombier tbreak();
1663e12c5d1SDavid du Colombier ce = i;
1673e12c5d1SDavid du Colombier noscale = 0;
1683e12c5d1SDavid du Colombier }
1693e12c5d1SDavid du Colombier
1703e12c5d1SDavid du Colombier
casein(void)1713e12c5d1SDavid du Colombier void casein(void)
1723e12c5d1SDavid du Colombier {
1733e12c5d1SDavid du Colombier int i;
1743e12c5d1SDavid du Colombier
1753e12c5d1SDavid du Colombier if (skip())
1763e12c5d1SDavid du Colombier i = in1;
177219b2ee8SDavid du Colombier else {
1783e12c5d1SDavid du Colombier i = max(hnumb(&in), 0);
179219b2ee8SDavid du Colombier if (nonumb)
180219b2ee8SDavid du Colombier i = in1;
181219b2ee8SDavid du Colombier }
1823e12c5d1SDavid du Colombier tbreak();
1833e12c5d1SDavid du Colombier in1 = in;
1843e12c5d1SDavid du Colombier in = i;
1853e12c5d1SDavid du Colombier if (!nc) {
1863e12c5d1SDavid du Colombier un = in;
1873e12c5d1SDavid du Colombier setnel();
1883e12c5d1SDavid du Colombier }
1893e12c5d1SDavid du Colombier }
1903e12c5d1SDavid du Colombier
1913e12c5d1SDavid du Colombier
casell(void)1923e12c5d1SDavid du Colombier void casell(void)
1933e12c5d1SDavid du Colombier {
1943e12c5d1SDavid du Colombier int i;
1953e12c5d1SDavid du Colombier
1963e12c5d1SDavid du Colombier if (skip())
1973e12c5d1SDavid du Colombier i = ll1;
198219b2ee8SDavid du Colombier else {
1993e12c5d1SDavid du Colombier i = max(hnumb(&ll), INCH / 10);
200219b2ee8SDavid du Colombier if (nonumb)
201219b2ee8SDavid du Colombier i = ll1;
202219b2ee8SDavid du Colombier }
2033e12c5d1SDavid du Colombier ll1 = ll;
2043e12c5d1SDavid du Colombier ll = i;
2053e12c5d1SDavid du Colombier setnel();
2063e12c5d1SDavid du Colombier }
2073e12c5d1SDavid du Colombier
2083e12c5d1SDavid du Colombier
caselt(void)2093e12c5d1SDavid du Colombier void caselt(void)
2103e12c5d1SDavid du Colombier {
2113e12c5d1SDavid du Colombier int i;
2123e12c5d1SDavid du Colombier
2133e12c5d1SDavid du Colombier if (skip())
2143e12c5d1SDavid du Colombier i = lt1;
215219b2ee8SDavid du Colombier else {
2163e12c5d1SDavid du Colombier i = max(hnumb(<), 0);
217219b2ee8SDavid du Colombier if (nonumb)
218219b2ee8SDavid du Colombier i = lt1;
219219b2ee8SDavid du Colombier }
2203e12c5d1SDavid du Colombier lt1 = lt;
2213e12c5d1SDavid du Colombier lt = i;
2223e12c5d1SDavid du Colombier }
2233e12c5d1SDavid du Colombier
2243e12c5d1SDavid du Colombier
caseti(void)2253e12c5d1SDavid du Colombier void caseti(void)
2263e12c5d1SDavid du Colombier {
2273e12c5d1SDavid du Colombier int i;
2283e12c5d1SDavid du Colombier
2293e12c5d1SDavid du Colombier if (skip())
2303e12c5d1SDavid du Colombier return;
2313e12c5d1SDavid du Colombier i = max(hnumb(&in), 0);
2323e12c5d1SDavid du Colombier tbreak();
2333e12c5d1SDavid du Colombier un1 = i;
2343e12c5d1SDavid du Colombier setnel();
2353e12c5d1SDavid du Colombier }
2363e12c5d1SDavid du Colombier
2373e12c5d1SDavid du Colombier
casels(void)2383e12c5d1SDavid du Colombier void casels(void)
2393e12c5d1SDavid du Colombier {
2403e12c5d1SDavid du Colombier int i;
2413e12c5d1SDavid du Colombier
2423e12c5d1SDavid du Colombier noscale++;
2433e12c5d1SDavid du Colombier if (skip())
2443e12c5d1SDavid du Colombier i = ls1;
245219b2ee8SDavid du Colombier else {
2463e12c5d1SDavid du Colombier i = max(inumb(&ls), 1);
247219b2ee8SDavid du Colombier if (nonumb)
248219b2ee8SDavid du Colombier i = ls1;
249219b2ee8SDavid du Colombier }
2503e12c5d1SDavid du Colombier ls1 = ls;
2513e12c5d1SDavid du Colombier ls = i;
2523e12c5d1SDavid du Colombier noscale = 0;
2533e12c5d1SDavid du Colombier }
2543e12c5d1SDavid du Colombier
2553e12c5d1SDavid du Colombier
casepo(void)2563e12c5d1SDavid du Colombier void casepo(void)
2573e12c5d1SDavid du Colombier {
2583e12c5d1SDavid du Colombier int i;
2593e12c5d1SDavid du Colombier
2603e12c5d1SDavid du Colombier if (skip())
2613e12c5d1SDavid du Colombier i = po1;
2623e12c5d1SDavid du Colombier else {
2633e12c5d1SDavid du Colombier i = max(hnumb(&po), 0);
2643e12c5d1SDavid du Colombier if (nonumb)
2653e12c5d1SDavid du Colombier i = po1;
2663e12c5d1SDavid du Colombier }
2673e12c5d1SDavid du Colombier po1 = po;
2683e12c5d1SDavid du Colombier po = i;
2693e12c5d1SDavid du Colombier if (TROFF & !ascii)
2703e12c5d1SDavid du Colombier esc += po - po1;
2713e12c5d1SDavid du Colombier }
2723e12c5d1SDavid du Colombier
2733e12c5d1SDavid du Colombier
casepl(void)2743e12c5d1SDavid du Colombier void casepl(void)
2753e12c5d1SDavid du Colombier {
2763e12c5d1SDavid du Colombier int i;
2773e12c5d1SDavid du Colombier
2783e12c5d1SDavid du Colombier skip();
2793e12c5d1SDavid du Colombier if ((i = vnumb(&pl)) == 0)
2803e12c5d1SDavid du Colombier pl = 11 * INCH; /*11in*/
2813e12c5d1SDavid du Colombier else
2823e12c5d1SDavid du Colombier pl = i;
283219b2ee8SDavid du Colombier if (numtabp[NL].val > pl)
284219b2ee8SDavid du Colombier numtabp[NL].val = pl;
2853e12c5d1SDavid du Colombier }
2863e12c5d1SDavid du Colombier
2873e12c5d1SDavid du Colombier
casewh(void)2883e12c5d1SDavid du Colombier void casewh(void)
2893e12c5d1SDavid du Colombier {
2903e12c5d1SDavid du Colombier int i, j, k;
2913e12c5d1SDavid du Colombier
2923e12c5d1SDavid du Colombier lgf++;
2933e12c5d1SDavid du Colombier skip();
2943e12c5d1SDavid du Colombier i = vnumb((int *)0);
2953e12c5d1SDavid du Colombier if (nonumb)
2963e12c5d1SDavid du Colombier return;
2973e12c5d1SDavid du Colombier skip();
2983e12c5d1SDavid du Colombier j = getrq();
2993e12c5d1SDavid du Colombier if ((k = findn(i)) != NTRAP) {
3003e12c5d1SDavid du Colombier mlist[k] = j;
3013e12c5d1SDavid du Colombier return;
3023e12c5d1SDavid du Colombier }
3033e12c5d1SDavid du Colombier for (k = 0; k < NTRAP; k++)
3043e12c5d1SDavid du Colombier if (mlist[k] == 0)
3053e12c5d1SDavid du Colombier break;
3063e12c5d1SDavid du Colombier if (k == NTRAP) {
3073e12c5d1SDavid du Colombier flusho();
3083e12c5d1SDavid du Colombier ERROR "cannot plant trap." WARN;
3093e12c5d1SDavid du Colombier return;
3103e12c5d1SDavid du Colombier }
3113e12c5d1SDavid du Colombier mlist[k] = j;
3123e12c5d1SDavid du Colombier nlist[k] = i;
3133e12c5d1SDavid du Colombier }
3143e12c5d1SDavid du Colombier
3153e12c5d1SDavid du Colombier
casech(void)3163e12c5d1SDavid du Colombier void casech(void)
3173e12c5d1SDavid du Colombier {
3183e12c5d1SDavid du Colombier int i, j, k;
3193e12c5d1SDavid du Colombier
3203e12c5d1SDavid du Colombier lgf++;
3213e12c5d1SDavid du Colombier skip();
3223e12c5d1SDavid du Colombier if (!(j = getrq()))
3233e12c5d1SDavid du Colombier return;
3243e12c5d1SDavid du Colombier else
3253e12c5d1SDavid du Colombier for (k = 0; k < NTRAP; k++)
3263e12c5d1SDavid du Colombier if (mlist[k] == j)
3273e12c5d1SDavid du Colombier break;
3283e12c5d1SDavid du Colombier if (k == NTRAP)
3293e12c5d1SDavid du Colombier return;
3303e12c5d1SDavid du Colombier skip();
3313e12c5d1SDavid du Colombier i = vnumb((int *)0);
3323e12c5d1SDavid du Colombier if (nonumb)
3333e12c5d1SDavid du Colombier mlist[k] = 0;
3343e12c5d1SDavid du Colombier nlist[k] = i;
3353e12c5d1SDavid du Colombier }
3363e12c5d1SDavid du Colombier
3373e12c5d1SDavid du Colombier
findn(int i)3383e12c5d1SDavid du Colombier findn(int i)
3393e12c5d1SDavid du Colombier {
3403e12c5d1SDavid du Colombier int k;
3413e12c5d1SDavid du Colombier
3423e12c5d1SDavid du Colombier for (k = 0; k < NTRAP; k++)
3433e12c5d1SDavid du Colombier if ((nlist[k] == i) && (mlist[k] != 0))
3443e12c5d1SDavid du Colombier break;
3453e12c5d1SDavid du Colombier return(k);
3463e12c5d1SDavid du Colombier }
3473e12c5d1SDavid du Colombier
3483e12c5d1SDavid du Colombier
casepn(void)3493e12c5d1SDavid du Colombier void casepn(void)
3503e12c5d1SDavid du Colombier {
3513e12c5d1SDavid du Colombier int i;
3523e12c5d1SDavid du Colombier
3533e12c5d1SDavid du Colombier skip();
3543e12c5d1SDavid du Colombier noscale++;
355219b2ee8SDavid du Colombier i = max(inumb(&numtabp[PN].val), 0);
3563e12c5d1SDavid du Colombier noscale = 0;
3573e12c5d1SDavid du Colombier if (!nonumb) {
3583e12c5d1SDavid du Colombier npn = i;
3593e12c5d1SDavid du Colombier npnflg++;
3603e12c5d1SDavid du Colombier }
3613e12c5d1SDavid du Colombier }
3623e12c5d1SDavid du Colombier
3633e12c5d1SDavid du Colombier
casebp(void)3643e12c5d1SDavid du Colombier void casebp(void)
3653e12c5d1SDavid du Colombier {
3663e12c5d1SDavid du Colombier int i;
3673e12c5d1SDavid du Colombier Stack *savframe;
3683e12c5d1SDavid du Colombier
3693e12c5d1SDavid du Colombier if (dip != d)
3703e12c5d1SDavid du Colombier return;
3713e12c5d1SDavid du Colombier savframe = frame;
3723e12c5d1SDavid du Colombier skip();
373219b2ee8SDavid du Colombier if ((i = inumb(&numtabp[PN].val)) < 0)
3743e12c5d1SDavid du Colombier i = 0;
3753e12c5d1SDavid du Colombier tbreak();
3763e12c5d1SDavid du Colombier if (!nonumb) {
3773e12c5d1SDavid du Colombier npn = i;
3783e12c5d1SDavid du Colombier npnflg++;
3793e12c5d1SDavid du Colombier } else if (dip->nls)
3803e12c5d1SDavid du Colombier return;
3813e12c5d1SDavid du Colombier eject(savframe);
3823e12c5d1SDavid du Colombier }
3833e12c5d1SDavid du Colombier
casetm(void)3843e12c5d1SDavid du Colombier void casetm(void)
3853e12c5d1SDavid du Colombier {
386219b2ee8SDavid du Colombier casetm1(0, stderr);
3873e12c5d1SDavid du Colombier }
3883e12c5d1SDavid du Colombier
389219b2ee8SDavid du Colombier
casefm(void)390219b2ee8SDavid du Colombier void casefm(void)
391219b2ee8SDavid du Colombier {
392219b2ee8SDavid du Colombier static struct fcache {
393219b2ee8SDavid du Colombier char *name;
394219b2ee8SDavid du Colombier FILE *fp;
395219b2ee8SDavid du Colombier } fcache[15];
396219b2ee8SDavid du Colombier int i;
397219b2ee8SDavid du Colombier
398219b2ee8SDavid du Colombier if ( skip() || !getname()) {
399219b2ee8SDavid du Colombier ERROR "fm: missing filename" WARN;
400219b2ee8SDavid du Colombier return;
401219b2ee8SDavid du Colombier }
402219b2ee8SDavid du Colombier
403219b2ee8SDavid du Colombier for (i = 0; i < 15 && fcache[i].fp != NULL; i++) {
404219b2ee8SDavid du Colombier if (strcmp(nextf, fcache[i].name) == 0)
405219b2ee8SDavid du Colombier break;
406219b2ee8SDavid du Colombier }
407219b2ee8SDavid du Colombier if (i >= 15) {
408219b2ee8SDavid du Colombier ERROR "fm: too many streams" WARN;
409219b2ee8SDavid du Colombier return;
410219b2ee8SDavid du Colombier }
411219b2ee8SDavid du Colombier if (fcache[i].fp == NULL) {
412219b2ee8SDavid du Colombier if( (fcache[i].fp = fopen(nextf, "w")) == NULL) {
413219b2ee8SDavid du Colombier ERROR "fm: cannot open %s", nextf WARN;
414219b2ee8SDavid du Colombier return;
415219b2ee8SDavid du Colombier }
416219b2ee8SDavid du Colombier fcache[i].name = strdupl(nextf);
417219b2ee8SDavid du Colombier }
418219b2ee8SDavid du Colombier casetm1(0, fcache[i].fp);
419219b2ee8SDavid du Colombier }
420219b2ee8SDavid du Colombier
casetm1(int ab,FILE * out)421219b2ee8SDavid du Colombier void casetm1(int ab, FILE *out)
4223e12c5d1SDavid du Colombier {
4233e12c5d1SDavid du Colombier int i, j, c;
4243e12c5d1SDavid du Colombier char *p;
4253e12c5d1SDavid du Colombier char tmbuf[NTM];
4263e12c5d1SDavid du Colombier
4273e12c5d1SDavid du Colombier lgf++;
4283e12c5d1SDavid du Colombier copyf++;
429219b2ee8SDavid du Colombier if (ab) {
430219b2ee8SDavid du Colombier if (skip())
4313e12c5d1SDavid du Colombier ERROR "User Abort" WARN;
432219b2ee8SDavid du Colombier else {
433219b2ee8SDavid du Colombier extern int error;
434219b2ee8SDavid du Colombier int savtrac = trace;
435*14f51593SDavid du Colombier trace = 0;
436219b2ee8SDavid du Colombier noscale++;
437219b2ee8SDavid du Colombier i = inumb(&trace);
438219b2ee8SDavid du Colombier noscale--;
439219b2ee8SDavid du Colombier if (i) {
440219b2ee8SDavid du Colombier error = i;
441219b2ee8SDavid du Colombier if (nlflg || skip())
442219b2ee8SDavid du Colombier ERROR "User Abort, exit code %d", i WARN;
443219b2ee8SDavid du Colombier }
444219b2ee8SDavid du Colombier trace = savtrac;
445219b2ee8SDavid du Colombier }
446219b2ee8SDavid du Colombier } else
447219b2ee8SDavid du Colombier skip();
4483e12c5d1SDavid du Colombier for (i = 0; i < NTM - 2; ) {
4493e12c5d1SDavid du Colombier if ((c = cbits(getch())) == '\n' || c == RIGHT)
4503e12c5d1SDavid du Colombier break;
4513e12c5d1SDavid du Colombier else if (c == MINUS) { /* special pleading for strange encodings */
4523e12c5d1SDavid du Colombier tmbuf[i++] = '\\';
4533e12c5d1SDavid du Colombier tmbuf[i++] = '-';
4543e12c5d1SDavid du Colombier } else if (c == PRESC) {
4553e12c5d1SDavid du Colombier tmbuf[i++] = '\\';
4563e12c5d1SDavid du Colombier tmbuf[i++] = 'e';
4573e12c5d1SDavid du Colombier } else if (c == FILLER) {
4583e12c5d1SDavid du Colombier tmbuf[i++] = '\\';
4593e12c5d1SDavid du Colombier tmbuf[i++] = '&';
4603e12c5d1SDavid du Colombier } else if (c == UNPAD) {
4613e12c5d1SDavid du Colombier tmbuf[i++] = '\\';
4623e12c5d1SDavid du Colombier tmbuf[i++] = ' ';
4633e12c5d1SDavid du Colombier } else if (c == OHC) {
4643e12c5d1SDavid du Colombier tmbuf[i++] = '\\';
4653e12c5d1SDavid du Colombier tmbuf[i++] = '%';
466219b2ee8SDavid du Colombier } else if (c >= ALPHABET) {
4673e12c5d1SDavid du Colombier p = chname(c);
468219b2ee8SDavid du Colombier switch (*p) {
469219b2ee8SDavid du Colombier case MBchar:
470219b2ee8SDavid du Colombier sprintf(&tmbuf[i], p+1);
471219b2ee8SDavid du Colombier break;
472219b2ee8SDavid du Colombier case Number:
473219b2ee8SDavid du Colombier sprintf(&tmbuf[i], "\\N'%s'", p+1);
474219b2ee8SDavid du Colombier break;
475219b2ee8SDavid du Colombier case Troffchar:
476*14f51593SDavid du Colombier if (strlen(p+1) == 2)
477219b2ee8SDavid du Colombier sprintf(&tmbuf[i], "\\(%s", p+1);
478219b2ee8SDavid du Colombier else
479219b2ee8SDavid du Colombier sprintf(&tmbuf[i], "\\C'%s'", p+1);
480219b2ee8SDavid du Colombier break;
481219b2ee8SDavid du Colombier default:
482219b2ee8SDavid du Colombier sprintf(&tmbuf[i]," %s? ", p);
483219b2ee8SDavid du Colombier break;
4843e12c5d1SDavid du Colombier }
485219b2ee8SDavid du Colombier j = strlen(&tmbuf[i]);
486219b2ee8SDavid du Colombier i += j;
4873e12c5d1SDavid du Colombier } else
4883e12c5d1SDavid du Colombier tmbuf[i++] = c;
4893e12c5d1SDavid du Colombier }
4903e12c5d1SDavid du Colombier tmbuf[i] = 0;
4913e12c5d1SDavid du Colombier if (ab) /* truncate output */
4923e12c5d1SDavid du Colombier obufp = obuf; /* should be a function in n2.c */
4933e12c5d1SDavid du Colombier flusho();
494219b2ee8SDavid du Colombier if (i)
495219b2ee8SDavid du Colombier fprintf(out, "%s\n", tmbuf);
496219b2ee8SDavid du Colombier fflush(out);
4973e12c5d1SDavid du Colombier copyf--;
4983e12c5d1SDavid du Colombier lgf--;
4993e12c5d1SDavid du Colombier }
5003e12c5d1SDavid du Colombier
5013e12c5d1SDavid du Colombier
casesp(void)5023e12c5d1SDavid du Colombier void casesp(void)
5033e12c5d1SDavid du Colombier {
5043e12c5d1SDavid du Colombier casesp1(0);
5053e12c5d1SDavid du Colombier }
5063e12c5d1SDavid du Colombier
casesp1(int a)5073e12c5d1SDavid du Colombier void casesp1(int a)
5083e12c5d1SDavid du Colombier {
5093e12c5d1SDavid du Colombier int i, j, savlss;
5103e12c5d1SDavid du Colombier
5113e12c5d1SDavid du Colombier tbreak();
5123e12c5d1SDavid du Colombier if (dip->nls || trap)
5133e12c5d1SDavid du Colombier return;
5143e12c5d1SDavid du Colombier i = findt1();
5153e12c5d1SDavid du Colombier if (!a) {
5163e12c5d1SDavid du Colombier skip();
5173e12c5d1SDavid du Colombier j = vnumb((int *)0);
5183e12c5d1SDavid du Colombier if (nonumb)
5193e12c5d1SDavid du Colombier j = lss;
5203e12c5d1SDavid du Colombier } else
5213e12c5d1SDavid du Colombier j = a;
5223e12c5d1SDavid du Colombier if (j == 0)
5233e12c5d1SDavid du Colombier return;
5243e12c5d1SDavid du Colombier if (i < j)
5253e12c5d1SDavid du Colombier j = i;
5263e12c5d1SDavid du Colombier savlss = lss;
5273e12c5d1SDavid du Colombier if (dip != d)
5283e12c5d1SDavid du Colombier i = dip->dnl;
5293e12c5d1SDavid du Colombier else
530219b2ee8SDavid du Colombier i = numtabp[NL].val;
5313e12c5d1SDavid du Colombier if ((i + j) < 0)
5323e12c5d1SDavid du Colombier j = -i;
5333e12c5d1SDavid du Colombier lss = j;
5343e12c5d1SDavid du Colombier newline(0);
5353e12c5d1SDavid du Colombier lss = savlss;
5363e12c5d1SDavid du Colombier }
5373e12c5d1SDavid du Colombier
5383e12c5d1SDavid du Colombier
casert(void)5393e12c5d1SDavid du Colombier void casert(void)
5403e12c5d1SDavid du Colombier {
5413e12c5d1SDavid du Colombier int a, *p;
5423e12c5d1SDavid du Colombier
5433e12c5d1SDavid du Colombier skip();
5443e12c5d1SDavid du Colombier if (dip != d)
5453e12c5d1SDavid du Colombier p = &dip->dnl;
5463e12c5d1SDavid du Colombier else
547219b2ee8SDavid du Colombier p = &numtabp[NL].val;
5483e12c5d1SDavid du Colombier a = vnumb(p);
5493e12c5d1SDavid du Colombier if (nonumb)
5503e12c5d1SDavid du Colombier a = dip->mkline;
5513e12c5d1SDavid du Colombier if ((a < 0) || (a >= *p))
5523e12c5d1SDavid du Colombier return;
5533e12c5d1SDavid du Colombier nb++;
5543e12c5d1SDavid du Colombier casesp1(a - *p);
5553e12c5d1SDavid du Colombier }
5563e12c5d1SDavid du Colombier
5573e12c5d1SDavid du Colombier
caseem(void)5583e12c5d1SDavid du Colombier void caseem(void)
5593e12c5d1SDavid du Colombier {
5603e12c5d1SDavid du Colombier lgf++;
5613e12c5d1SDavid du Colombier skip();
5623e12c5d1SDavid du Colombier em = getrq();
5633e12c5d1SDavid du Colombier }
5643e12c5d1SDavid du Colombier
5653e12c5d1SDavid du Colombier
casefl(void)5663e12c5d1SDavid du Colombier void casefl(void)
5673e12c5d1SDavid du Colombier {
5683e12c5d1SDavid du Colombier tbreak();
5693e12c5d1SDavid du Colombier if (!ascii)
5703e12c5d1SDavid du Colombier ptflush();
5713e12c5d1SDavid du Colombier flusho();
5723e12c5d1SDavid du Colombier }
5733e12c5d1SDavid du Colombier
5743e12c5d1SDavid du Colombier
caseev(void)5753e12c5d1SDavid du Colombier void caseev(void)
5763e12c5d1SDavid du Colombier {
5773e12c5d1SDavid du Colombier int nxev;
5783e12c5d1SDavid du Colombier
5793e12c5d1SDavid du Colombier if (skip()) {
5803e12c5d1SDavid du Colombier e0:
5813e12c5d1SDavid du Colombier if (evi == 0)
5823e12c5d1SDavid du Colombier return;
5833e12c5d1SDavid du Colombier nxev = evlist[--evi];
5843e12c5d1SDavid du Colombier goto e1;
5853e12c5d1SDavid du Colombier }
5863e12c5d1SDavid du Colombier noscale++;
5873e12c5d1SDavid du Colombier nxev = atoi0();
5883e12c5d1SDavid du Colombier noscale = 0;
5893e12c5d1SDavid du Colombier if (nonumb)
5903e12c5d1SDavid du Colombier goto e0;
5913e12c5d1SDavid du Colombier flushi();
5923e12c5d1SDavid du Colombier if (nxev >= NEV || nxev < 0 || evi >= EVLSZ) {
5933e12c5d1SDavid du Colombier flusho();
5943e12c5d1SDavid du Colombier ERROR "cannot do .ev %d", nxev WARN;
5953e12c5d1SDavid du Colombier if (error)
5963e12c5d1SDavid du Colombier done2(040);
5973e12c5d1SDavid du Colombier else
5983e12c5d1SDavid du Colombier edone(040);
5993e12c5d1SDavid du Colombier return;
6003e12c5d1SDavid du Colombier }
6013e12c5d1SDavid du Colombier evlist[evi++] = ev;
6023e12c5d1SDavid du Colombier e1:
6033e12c5d1SDavid du Colombier if (ev == nxev)
6043e12c5d1SDavid du Colombier return;
6053e12c5d1SDavid du Colombier ev = nxev;
6063e12c5d1SDavid du Colombier envp = &env[ev];
6073e12c5d1SDavid du Colombier }
6083e12c5d1SDavid du Colombier
envcopy(Env * e1,Env * e2)6093e12c5d1SDavid du Colombier void envcopy(Env *e1, Env *e2) /* copy env e2 to e1 */
6103e12c5d1SDavid du Colombier {
6113e12c5d1SDavid du Colombier *e1 = *e2; /* rumor hath that this fails on some machines */
6123e12c5d1SDavid du Colombier }
6133e12c5d1SDavid du Colombier
6143e12c5d1SDavid du Colombier
caseel(void)6153e12c5d1SDavid du Colombier void caseel(void)
6163e12c5d1SDavid du Colombier {
6173e12c5d1SDavid du Colombier if (--ifx < 0) {
6183e12c5d1SDavid du Colombier ifx = 0;
6193e12c5d1SDavid du Colombier iflist[0] = 0;
6203e12c5d1SDavid du Colombier }
6213e12c5d1SDavid du Colombier caseif1(2);
6223e12c5d1SDavid du Colombier }
6233e12c5d1SDavid du Colombier
6243e12c5d1SDavid du Colombier
caseie(void)6253e12c5d1SDavid du Colombier void caseie(void)
6263e12c5d1SDavid du Colombier {
6273e12c5d1SDavid du Colombier if (ifx >= NIF) {
6283e12c5d1SDavid du Colombier ERROR "if-else overflow." WARN;
6293e12c5d1SDavid du Colombier ifx = 0;
6303e12c5d1SDavid du Colombier edone(040);
6313e12c5d1SDavid du Colombier }
6323e12c5d1SDavid du Colombier caseif1(1);
6333e12c5d1SDavid du Colombier ifx++;
6343e12c5d1SDavid du Colombier }
6353e12c5d1SDavid du Colombier
6363e12c5d1SDavid du Colombier
caseif(void)6373e12c5d1SDavid du Colombier void caseif(void)
6383e12c5d1SDavid du Colombier {
6393e12c5d1SDavid du Colombier caseif1(0);
6403e12c5d1SDavid du Colombier }
6413e12c5d1SDavid du Colombier
caseif1(int x)6423e12c5d1SDavid du Colombier void caseif1(int x)
6433e12c5d1SDavid du Colombier {
6443e12c5d1SDavid du Colombier extern int falsef;
6453e12c5d1SDavid du Colombier int notflag, true;
6463e12c5d1SDavid du Colombier Tchar i;
6473e12c5d1SDavid du Colombier
6483e12c5d1SDavid du Colombier if (x == 2) {
6493e12c5d1SDavid du Colombier notflag = 0;
6503e12c5d1SDavid du Colombier true = iflist[ifx];
6513e12c5d1SDavid du Colombier goto i1;
6523e12c5d1SDavid du Colombier }
6533e12c5d1SDavid du Colombier true = 0;
6543e12c5d1SDavid du Colombier skip();
6553e12c5d1SDavid du Colombier if ((cbits(i = getch())) == '!') {
6563e12c5d1SDavid du Colombier notflag = 1;
6573e12c5d1SDavid du Colombier } else {
6583e12c5d1SDavid du Colombier notflag = 0;
6593e12c5d1SDavid du Colombier ch = i;
6603e12c5d1SDavid du Colombier }
661219b2ee8SDavid du Colombier ifnum++;
6623e12c5d1SDavid du Colombier i = atoi0();
663219b2ee8SDavid du Colombier ifnum = 0;
6643e12c5d1SDavid du Colombier if (!nonumb) {
6653e12c5d1SDavid du Colombier if (i > 0)
6663e12c5d1SDavid du Colombier true++;
6673e12c5d1SDavid du Colombier goto i1;
6683e12c5d1SDavid du Colombier }
6693e12c5d1SDavid du Colombier i = getch();
6703e12c5d1SDavid du Colombier switch (cbits(i)) {
6713e12c5d1SDavid du Colombier case 'e':
672219b2ee8SDavid du Colombier if (!(numtabp[PN].val & 01))
6733e12c5d1SDavid du Colombier true++;
6743e12c5d1SDavid du Colombier break;
6753e12c5d1SDavid du Colombier case 'o':
676219b2ee8SDavid du Colombier if (numtabp[PN].val & 01)
6773e12c5d1SDavid du Colombier true++;
6783e12c5d1SDavid du Colombier break;
6793e12c5d1SDavid du Colombier case 'n':
6803e12c5d1SDavid du Colombier if (NROFF)
6813e12c5d1SDavid du Colombier true++;
6823e12c5d1SDavid du Colombier break;
6833e12c5d1SDavid du Colombier case 't':
6843e12c5d1SDavid du Colombier if (TROFF)
6853e12c5d1SDavid du Colombier true++;
6863e12c5d1SDavid du Colombier break;
6873e12c5d1SDavid du Colombier case ' ':
6883e12c5d1SDavid du Colombier break;
6893e12c5d1SDavid du Colombier default:
6903e12c5d1SDavid du Colombier true = cmpstr(i);
6913e12c5d1SDavid du Colombier }
6923e12c5d1SDavid du Colombier i1:
6933e12c5d1SDavid du Colombier true ^= notflag;
6943e12c5d1SDavid du Colombier if (x == 1)
6953e12c5d1SDavid du Colombier iflist[ifx] = !true;
6963e12c5d1SDavid du Colombier if (true) {
6973e12c5d1SDavid du Colombier i2:
6983e12c5d1SDavid du Colombier while ((cbits(i = getch())) == ' ')
6993e12c5d1SDavid du Colombier ;
7003e12c5d1SDavid du Colombier if (cbits(i) == LEFT)
7013e12c5d1SDavid du Colombier goto i2;
7023e12c5d1SDavid du Colombier ch = i;
7033e12c5d1SDavid du Colombier nflush++;
7043e12c5d1SDavid du Colombier } else {
705219b2ee8SDavid du Colombier if (!nlflg) {
7063e12c5d1SDavid du Colombier copyf++;
7073e12c5d1SDavid du Colombier falsef++;
7083e12c5d1SDavid du Colombier eatblk(0);
7093e12c5d1SDavid du Colombier copyf--;
7103e12c5d1SDavid du Colombier falsef--;
7113e12c5d1SDavid du Colombier }
7123e12c5d1SDavid du Colombier }
713219b2ee8SDavid du Colombier }
7143e12c5d1SDavid du Colombier
eatblk(int inblk)7153e12c5d1SDavid du Colombier void eatblk(int inblk)
7163e12c5d1SDavid du Colombier {
7173e12c5d1SDavid du Colombier int cnt, i;
7183e12c5d1SDavid du Colombier
7193e12c5d1SDavid du Colombier cnt = 0;
7203e12c5d1SDavid du Colombier do {
7213e12c5d1SDavid du Colombier if (ch) {
7223e12c5d1SDavid du Colombier i = cbits(ch);
7233e12c5d1SDavid du Colombier ch = 0;
7243e12c5d1SDavid du Colombier } else
7253e12c5d1SDavid du Colombier i = cbits(getch0());
7263e12c5d1SDavid du Colombier if (i == ESC)
7273e12c5d1SDavid du Colombier cnt++;
7283e12c5d1SDavid du Colombier else {
7293e12c5d1SDavid du Colombier if (cnt == 1)
7303e12c5d1SDavid du Colombier switch (i) {
7313e12c5d1SDavid du Colombier case '{': i = LEFT; break;
7323e12c5d1SDavid du Colombier case '}': i = RIGHT; break;
7333e12c5d1SDavid du Colombier case '\n': i = 'x'; break;
7343e12c5d1SDavid du Colombier }
7353e12c5d1SDavid du Colombier cnt = 0;
7363e12c5d1SDavid du Colombier }
7373e12c5d1SDavid du Colombier if (i == LEFT) eatblk(1);
7383e12c5d1SDavid du Colombier } while ((!inblk && (i != '\n')) || (inblk && (i != RIGHT)));
739219b2ee8SDavid du Colombier if (i == '\n') {
7403e12c5d1SDavid du Colombier nlflg++;
741219b2ee8SDavid du Colombier if (ip == 0)
742219b2ee8SDavid du Colombier numtabp[CD].val++;
743219b2ee8SDavid du Colombier }
7443e12c5d1SDavid du Colombier }
7453e12c5d1SDavid du Colombier
7463e12c5d1SDavid du Colombier
cmpstr(Tchar c)7473e12c5d1SDavid du Colombier cmpstr(Tchar c)
7483e12c5d1SDavid du Colombier {
7493e12c5d1SDavid du Colombier int j, delim;
7503e12c5d1SDavid du Colombier Tchar i;
7513e12c5d1SDavid du Colombier int val;
7523e12c5d1SDavid du Colombier int savapts, savapts1, savfont, savfont1, savpts, savpts1;
7533e12c5d1SDavid du Colombier Tchar string[1280];
7543e12c5d1SDavid du Colombier Tchar *sp;
7553e12c5d1SDavid du Colombier
7563e12c5d1SDavid du Colombier if (ismot(c))
7573e12c5d1SDavid du Colombier return(0);
7583e12c5d1SDavid du Colombier delim = cbits(c);
7593e12c5d1SDavid du Colombier savapts = apts;
7603e12c5d1SDavid du Colombier savapts1 = apts1;
7613e12c5d1SDavid du Colombier savfont = font;
7623e12c5d1SDavid du Colombier savfont1 = font1;
7633e12c5d1SDavid du Colombier savpts = pts;
7643e12c5d1SDavid du Colombier savpts1 = pts1;
7653e12c5d1SDavid du Colombier sp = string;
7663e12c5d1SDavid du Colombier while ((j = cbits(i = getch()))!=delim && j!='\n' && sp<&string[1280-1])
7673e12c5d1SDavid du Colombier *sp++ = i;
7683e12c5d1SDavid du Colombier if (sp >= string + 1280) {
7693e12c5d1SDavid du Colombier ERROR "too-long string compare." WARN;
7703e12c5d1SDavid du Colombier edone(0100);
7713e12c5d1SDavid du Colombier }
7723e12c5d1SDavid du Colombier if (nlflg) {
7733e12c5d1SDavid du Colombier val = sp==string;
7743e12c5d1SDavid du Colombier goto rtn;
7753e12c5d1SDavid du Colombier }
7763e12c5d1SDavid du Colombier *sp = 0;
7773e12c5d1SDavid du Colombier apts = savapts;
7783e12c5d1SDavid du Colombier apts1 = savapts1;
7793e12c5d1SDavid du Colombier font = savfont;
7803e12c5d1SDavid du Colombier font1 = savfont1;
7813e12c5d1SDavid du Colombier pts = savpts;
7823e12c5d1SDavid du Colombier pts1 = savpts1;
7833e12c5d1SDavid du Colombier mchbits();
7843e12c5d1SDavid du Colombier val = 1;
7853e12c5d1SDavid du Colombier sp = string;
7863e12c5d1SDavid du Colombier while ((j = cbits(i = getch())) != delim && j != '\n') {
7873e12c5d1SDavid du Colombier if (*sp != i) {
7883e12c5d1SDavid du Colombier eat(delim);
7893e12c5d1SDavid du Colombier val = 0;
7903e12c5d1SDavid du Colombier goto rtn;
7913e12c5d1SDavid du Colombier }
7923e12c5d1SDavid du Colombier sp++;
7933e12c5d1SDavid du Colombier }
7943e12c5d1SDavid du Colombier if (*sp)
7953e12c5d1SDavid du Colombier val = 0;
7963e12c5d1SDavid du Colombier rtn:
7973e12c5d1SDavid du Colombier apts = savapts;
7983e12c5d1SDavid du Colombier apts1 = savapts1;
7993e12c5d1SDavid du Colombier font = savfont;
8003e12c5d1SDavid du Colombier font1 = savfont1;
8013e12c5d1SDavid du Colombier pts = savpts;
8023e12c5d1SDavid du Colombier pts1 = savpts1;
8033e12c5d1SDavid du Colombier mchbits();
8043e12c5d1SDavid du Colombier return(val);
8053e12c5d1SDavid du Colombier }
8063e12c5d1SDavid du Colombier
8073e12c5d1SDavid du Colombier
caserd(void)8083e12c5d1SDavid du Colombier void caserd(void)
8093e12c5d1SDavid du Colombier {
8103e12c5d1SDavid du Colombier
8113e12c5d1SDavid du Colombier lgf++;
8123e12c5d1SDavid du Colombier skip();
8133e12c5d1SDavid du Colombier getname();
8143e12c5d1SDavid du Colombier if (!iflg) {
8153e12c5d1SDavid du Colombier if (quiet) {
8163e12c5d1SDavid du Colombier if (NROFF) {
8173e12c5d1SDavid du Colombier echo_off();
8183e12c5d1SDavid du Colombier flusho();
8193e12c5d1SDavid du Colombier }
8203e12c5d1SDavid du Colombier fprintf(stderr, "\007"); /*bell*/
8213e12c5d1SDavid du Colombier } else {
8223e12c5d1SDavid du Colombier if (nextf[0]) {
8233e12c5d1SDavid du Colombier fprintf(stderr, "%s:", nextf);
8243e12c5d1SDavid du Colombier } else {
8253e12c5d1SDavid du Colombier fprintf(stderr, "\007"); /*bell*/
8263e12c5d1SDavid du Colombier }
8273e12c5d1SDavid du Colombier }
8283e12c5d1SDavid du Colombier }
8293e12c5d1SDavid du Colombier collect();
8303e12c5d1SDavid du Colombier tty++;
8313e12c5d1SDavid du Colombier pushi(RD_OFFSET, PAIR('r','d'));
8323e12c5d1SDavid du Colombier }
8333e12c5d1SDavid du Colombier
8343e12c5d1SDavid du Colombier
rdtty(void)8353e12c5d1SDavid du Colombier rdtty(void)
8363e12c5d1SDavid du Colombier {
8373e12c5d1SDavid du Colombier char onechar;
8383e12c5d1SDavid du Colombier
8393e12c5d1SDavid du Colombier onechar = 0;
8403e12c5d1SDavid du Colombier if (read(0, &onechar, 1) == 1) {
8413e12c5d1SDavid du Colombier if (onechar == '\n')
8423e12c5d1SDavid du Colombier tty++;
8433e12c5d1SDavid du Colombier else
8443e12c5d1SDavid du Colombier tty = 1;
8453e12c5d1SDavid du Colombier if (tty != 3)
8463e12c5d1SDavid du Colombier return(onechar);
8473e12c5d1SDavid du Colombier }
8483e12c5d1SDavid du Colombier tty = 0;
8493e12c5d1SDavid du Colombier if (NROFF && quiet)
8503e12c5d1SDavid du Colombier echo_on();
8513e12c5d1SDavid du Colombier return(0);
8523e12c5d1SDavid du Colombier }
8533e12c5d1SDavid du Colombier
8543e12c5d1SDavid du Colombier
caseec(void)8553e12c5d1SDavid du Colombier void caseec(void)
8563e12c5d1SDavid du Colombier {
8573e12c5d1SDavid du Colombier eschar = chget('\\');
8583e12c5d1SDavid du Colombier }
8593e12c5d1SDavid du Colombier
8603e12c5d1SDavid du Colombier
caseeo(void)8613e12c5d1SDavid du Colombier void caseeo(void)
8623e12c5d1SDavid du Colombier {
8633e12c5d1SDavid du Colombier eschar = 0;
8643e12c5d1SDavid du Colombier }
8653e12c5d1SDavid du Colombier
8663e12c5d1SDavid du Colombier
caseta(void)8673e12c5d1SDavid du Colombier void caseta(void)
8683e12c5d1SDavid du Colombier {
869219b2ee8SDavid du Colombier int i, j, k;
8703e12c5d1SDavid du Colombier
8713e12c5d1SDavid du Colombier tabtab[0] = nonumb = 0;
8723e12c5d1SDavid du Colombier for (i = 0; ((i < (NTAB - 1)) && !nonumb); i++) {
8733e12c5d1SDavid du Colombier if (skip())
8743e12c5d1SDavid du Colombier break;
875219b2ee8SDavid du Colombier k = tabtab[max(i-1, 0)] & TABMASK;
876219b2ee8SDavid du Colombier if ((j = max(hnumb(&k), 0)) > TABMASK) {
877219b2ee8SDavid du Colombier ERROR "Tab too far away" WARN;
878219b2ee8SDavid du Colombier j = TABMASK;
879219b2ee8SDavid du Colombier }
880219b2ee8SDavid du Colombier tabtab[i] = j & TABMASK;
8813e12c5d1SDavid du Colombier if (!nonumb)
8823e12c5d1SDavid du Colombier switch (cbits(ch)) {
8833e12c5d1SDavid du Colombier case 'C':
8843e12c5d1SDavid du Colombier tabtab[i] |= CTAB;
8853e12c5d1SDavid du Colombier break;
8863e12c5d1SDavid du Colombier case 'R':
8873e12c5d1SDavid du Colombier tabtab[i] |= RTAB;
8883e12c5d1SDavid du Colombier break;
8893e12c5d1SDavid du Colombier default: /*includes L*/
8903e12c5d1SDavid du Colombier break;
8913e12c5d1SDavid du Colombier }
8923e12c5d1SDavid du Colombier nonumb = ch = 0;
8933e12c5d1SDavid du Colombier }
894219b2ee8SDavid du Colombier if (!skip())
895219b2ee8SDavid du Colombier ERROR "Too many tab stops" WARN;
8963e12c5d1SDavid du Colombier tabtab[i] = 0;
8973e12c5d1SDavid du Colombier }
8983e12c5d1SDavid du Colombier
8993e12c5d1SDavid du Colombier
casene(void)9003e12c5d1SDavid du Colombier void casene(void)
9013e12c5d1SDavid du Colombier {
9023e12c5d1SDavid du Colombier int i, j;
9033e12c5d1SDavid du Colombier
9043e12c5d1SDavid du Colombier skip();
9053e12c5d1SDavid du Colombier i = vnumb((int *)0);
9063e12c5d1SDavid du Colombier if (nonumb)
9073e12c5d1SDavid du Colombier i = lss;
908219b2ee8SDavid du Colombier if (dip == d && numtabp[NL].val == -1) {
909219b2ee8SDavid du Colombier newline(1);
910219b2ee8SDavid du Colombier return;
911219b2ee8SDavid du Colombier }
9123e12c5d1SDavid du Colombier if (i > (j = findt1())) {
9133e12c5d1SDavid du Colombier i = lss;
9143e12c5d1SDavid du Colombier lss = j;
9153e12c5d1SDavid du Colombier dip->nls = 0;
9163e12c5d1SDavid du Colombier newline(0);
9173e12c5d1SDavid du Colombier lss = i;
9183e12c5d1SDavid du Colombier }
9193e12c5d1SDavid du Colombier }
9203e12c5d1SDavid du Colombier
9213e12c5d1SDavid du Colombier
casetr(void)9223e12c5d1SDavid du Colombier void casetr(void)
9233e12c5d1SDavid du Colombier {
9243e12c5d1SDavid du Colombier int i, j;
9253e12c5d1SDavid du Colombier Tchar k;
9263e12c5d1SDavid du Colombier
9273e12c5d1SDavid du Colombier lgf++;
9283e12c5d1SDavid du Colombier skip();
9293e12c5d1SDavid du Colombier while ((i = cbits(k=getch())) != '\n') {
9303e12c5d1SDavid du Colombier if (ismot(k))
9313e12c5d1SDavid du Colombier return;
9323e12c5d1SDavid du Colombier if (ismot(k = getch()))
9333e12c5d1SDavid du Colombier return;
9343e12c5d1SDavid du Colombier if ((j = cbits(k)) == '\n')
9353e12c5d1SDavid du Colombier j = ' ';
9363e12c5d1SDavid du Colombier trtab[i] = j;
9373e12c5d1SDavid du Colombier }
9383e12c5d1SDavid du Colombier }
9393e12c5d1SDavid du Colombier
9403e12c5d1SDavid du Colombier
casecu(void)9413e12c5d1SDavid du Colombier void casecu(void)
9423e12c5d1SDavid du Colombier {
9433e12c5d1SDavid du Colombier cu++;
9443e12c5d1SDavid du Colombier caseul();
9453e12c5d1SDavid du Colombier }
9463e12c5d1SDavid du Colombier
9473e12c5d1SDavid du Colombier
caseul(void)9483e12c5d1SDavid du Colombier void caseul(void)
9493e12c5d1SDavid du Colombier {
9503e12c5d1SDavid du Colombier int i;
9513e12c5d1SDavid du Colombier
9523e12c5d1SDavid du Colombier noscale++;
953219b2ee8SDavid du Colombier skip();
954219b2ee8SDavid du Colombier i = max(atoi0(), 0);
955219b2ee8SDavid du Colombier if (nonumb)
9563e12c5d1SDavid du Colombier i = 1;
9573e12c5d1SDavid du Colombier if (ul && (i == 0)) {
9583e12c5d1SDavid du Colombier font = sfont;
9593e12c5d1SDavid du Colombier ul = cu = 0;
9603e12c5d1SDavid du Colombier }
9613e12c5d1SDavid du Colombier if (i) {
9623e12c5d1SDavid du Colombier if (!ul) {
9633e12c5d1SDavid du Colombier sfont = font;
9643e12c5d1SDavid du Colombier font = ulfont;
9653e12c5d1SDavid du Colombier }
9663e12c5d1SDavid du Colombier ul = i;
9673e12c5d1SDavid du Colombier }
9683e12c5d1SDavid du Colombier noscale = 0;
9693e12c5d1SDavid du Colombier mchbits();
9703e12c5d1SDavid du Colombier }
9713e12c5d1SDavid du Colombier
9723e12c5d1SDavid du Colombier
caseuf(void)9733e12c5d1SDavid du Colombier void caseuf(void)
9743e12c5d1SDavid du Colombier {
9753e12c5d1SDavid du Colombier int i, j;
9763e12c5d1SDavid du Colombier
9773e12c5d1SDavid du Colombier if (skip() || !(i = getrq()) || i == 'S' || (j = findft(i)) == -1)
9783e12c5d1SDavid du Colombier ulfont = ULFONT; /*default underline position*/
9793e12c5d1SDavid du Colombier else
9803e12c5d1SDavid du Colombier ulfont = j;
9813e12c5d1SDavid du Colombier if (NROFF && ulfont == FT)
9823e12c5d1SDavid du Colombier ulfont = ULFONT;
9833e12c5d1SDavid du Colombier }
9843e12c5d1SDavid du Colombier
9853e12c5d1SDavid du Colombier
caseit(void)9863e12c5d1SDavid du Colombier void caseit(void)
9873e12c5d1SDavid du Colombier {
9883e12c5d1SDavid du Colombier int i;
9893e12c5d1SDavid du Colombier
9903e12c5d1SDavid du Colombier lgf++;
9913e12c5d1SDavid du Colombier it = itmac = 0;
9923e12c5d1SDavid du Colombier noscale++;
9933e12c5d1SDavid du Colombier skip();
9943e12c5d1SDavid du Colombier i = atoi0();
9953e12c5d1SDavid du Colombier skip();
9963e12c5d1SDavid du Colombier if (!nonumb && (itmac = getrq()))
9973e12c5d1SDavid du Colombier it = i;
9983e12c5d1SDavid du Colombier noscale = 0;
9993e12c5d1SDavid du Colombier }
10003e12c5d1SDavid du Colombier
10013e12c5d1SDavid du Colombier
casemc(void)10023e12c5d1SDavid du Colombier void casemc(void)
10033e12c5d1SDavid du Colombier {
10043e12c5d1SDavid du Colombier int i;
10053e12c5d1SDavid du Colombier
10063e12c5d1SDavid du Colombier if (icf > 1)
10073e12c5d1SDavid du Colombier ic = 0;
10083e12c5d1SDavid du Colombier icf = 0;
10093e12c5d1SDavid du Colombier if (skip())
10103e12c5d1SDavid du Colombier return;
10113e12c5d1SDavid du Colombier ic = getch();
10123e12c5d1SDavid du Colombier icf = 1;
10133e12c5d1SDavid du Colombier skip();
10143e12c5d1SDavid du Colombier i = max(hnumb((int *)0), 0);
10153e12c5d1SDavid du Colombier if (!nonumb)
10163e12c5d1SDavid du Colombier ics = i;
10173e12c5d1SDavid du Colombier }
10183e12c5d1SDavid du Colombier
10193e12c5d1SDavid du Colombier
casemk(void)10203e12c5d1SDavid du Colombier void casemk(void)
10213e12c5d1SDavid du Colombier {
10223e12c5d1SDavid du Colombier int i, j;
10233e12c5d1SDavid du Colombier
10243e12c5d1SDavid du Colombier if (dip != d)
10253e12c5d1SDavid du Colombier j = dip->dnl;
10263e12c5d1SDavid du Colombier else
1027219b2ee8SDavid du Colombier j = numtabp[NL].val;
10283e12c5d1SDavid du Colombier if (skip()) {
10293e12c5d1SDavid du Colombier dip->mkline = j;
10303e12c5d1SDavid du Colombier return;
10313e12c5d1SDavid du Colombier }
10323e12c5d1SDavid du Colombier if ((i = getrq()) == 0)
10333e12c5d1SDavid du Colombier return;
1034219b2ee8SDavid du Colombier numtabp[findr(i)].val = j;
10353e12c5d1SDavid du Colombier }
10363e12c5d1SDavid du Colombier
10373e12c5d1SDavid du Colombier
casesv(void)10383e12c5d1SDavid du Colombier void casesv(void)
10393e12c5d1SDavid du Colombier {
10403e12c5d1SDavid du Colombier int i;
10413e12c5d1SDavid du Colombier
10423e12c5d1SDavid du Colombier skip();
10433e12c5d1SDavid du Colombier if ((i = vnumb((int *)0)) < 0)
10443e12c5d1SDavid du Colombier return;
10453e12c5d1SDavid du Colombier if (nonumb)
10463e12c5d1SDavid du Colombier i = 1;
10473e12c5d1SDavid du Colombier sv += i;
10483e12c5d1SDavid du Colombier caseos();
10493e12c5d1SDavid du Colombier }
10503e12c5d1SDavid du Colombier
10513e12c5d1SDavid du Colombier
caseos(void)10523e12c5d1SDavid du Colombier void caseos(void)
10533e12c5d1SDavid du Colombier {
10543e12c5d1SDavid du Colombier int savlss;
10553e12c5d1SDavid du Colombier
10563e12c5d1SDavid du Colombier if (sv <= findt1()) {
10573e12c5d1SDavid du Colombier savlss = lss;
10583e12c5d1SDavid du Colombier lss = sv;
10593e12c5d1SDavid du Colombier newline(0);
10603e12c5d1SDavid du Colombier lss = savlss;
10613e12c5d1SDavid du Colombier sv = 0;
10623e12c5d1SDavid du Colombier }
10633e12c5d1SDavid du Colombier }
10643e12c5d1SDavid du Colombier
10653e12c5d1SDavid du Colombier
casenm(void)10663e12c5d1SDavid du Colombier void casenm(void)
10673e12c5d1SDavid du Colombier {
10683e12c5d1SDavid du Colombier int i;
10693e12c5d1SDavid du Colombier
10703e12c5d1SDavid du Colombier lnmod = nn = 0;
10713e12c5d1SDavid du Colombier if (skip())
10723e12c5d1SDavid du Colombier return;
10733e12c5d1SDavid du Colombier lnmod++;
10743e12c5d1SDavid du Colombier noscale++;
1075219b2ee8SDavid du Colombier i = inumb(&numtabp[LN].val);
10763e12c5d1SDavid du Colombier if (!nonumb)
1077219b2ee8SDavid du Colombier numtabp[LN].val = max(i, 0);
10783e12c5d1SDavid du Colombier getnm(&ndf, 1);
10793e12c5d1SDavid du Colombier getnm(&nms, 0);
10803e12c5d1SDavid du Colombier getnm(&ni, 0);
1081219b2ee8SDavid du Colombier getnm(&nmwid, 3); /* really kludgy! */
10823e12c5d1SDavid du Colombier noscale = 0;
10833e12c5d1SDavid du Colombier nmbits = chbits;
10843e12c5d1SDavid du Colombier }
10853e12c5d1SDavid du Colombier
1086219b2ee8SDavid du Colombier /*
1087219b2ee8SDavid du Colombier * .nm relies on the fact that illegal args are skipped; don't warn
1088219b2ee8SDavid du Colombier * for illegality of these
1089219b2ee8SDavid du Colombier */
getnm(int * p,int min)10903e12c5d1SDavid du Colombier void getnm(int *p, int min)
10913e12c5d1SDavid du Colombier {
10923e12c5d1SDavid du Colombier int i;
1093219b2ee8SDavid du Colombier int savtr = trace;
10943e12c5d1SDavid du Colombier
10953e12c5d1SDavid du Colombier eat(' ');
10963e12c5d1SDavid du Colombier if (skip())
10973e12c5d1SDavid du Colombier return;
1098219b2ee8SDavid du Colombier trace = 0;
10993e12c5d1SDavid du Colombier i = atoi0();
11003e12c5d1SDavid du Colombier if (nonumb)
11013e12c5d1SDavid du Colombier return;
11023e12c5d1SDavid du Colombier *p = max(i, min);
1103219b2ee8SDavid du Colombier trace = savtr;
11043e12c5d1SDavid du Colombier }
11053e12c5d1SDavid du Colombier
11063e12c5d1SDavid du Colombier
casenn(void)11073e12c5d1SDavid du Colombier void casenn(void)
11083e12c5d1SDavid du Colombier {
11093e12c5d1SDavid du Colombier noscale++;
11103e12c5d1SDavid du Colombier skip();
11113e12c5d1SDavid du Colombier nn = max(atoi0(), 1);
11123e12c5d1SDavid du Colombier noscale = 0;
11133e12c5d1SDavid du Colombier }
11143e12c5d1SDavid du Colombier
11153e12c5d1SDavid du Colombier
caseab(void)11163e12c5d1SDavid du Colombier void caseab(void)
11173e12c5d1SDavid du Colombier {
1118219b2ee8SDavid du Colombier casetm1(1, stderr);
11193e12c5d1SDavid du Colombier done3(0);
11203e12c5d1SDavid du Colombier }
11213e12c5d1SDavid du Colombier
11223e12c5d1SDavid du Colombier
11233e12c5d1SDavid du Colombier /* nroff terminal handling has been pretty well excised */
11243e12c5d1SDavid du Colombier /* as part of the merge with troff. these are ghostly remnants, */
11253e12c5d1SDavid du Colombier /* called, but doing nothing. restore them at your peril. */
11263e12c5d1SDavid du Colombier
11273e12c5d1SDavid du Colombier
save_tty(void)11283e12c5d1SDavid du Colombier void save_tty(void) /*save any tty settings that may be changed*/
11293e12c5d1SDavid du Colombier {
11303e12c5d1SDavid du Colombier }
11313e12c5d1SDavid du Colombier
11323e12c5d1SDavid du Colombier
restore_tty(void)11333e12c5d1SDavid du Colombier void restore_tty(void) /*restore tty settings from beginning*/
11343e12c5d1SDavid du Colombier {
11353e12c5d1SDavid du Colombier }
11363e12c5d1SDavid du Colombier
11373e12c5d1SDavid du Colombier
set_tty(void)11383e12c5d1SDavid du Colombier void set_tty(void)
11393e12c5d1SDavid du Colombier {
11403e12c5d1SDavid du Colombier }
11413e12c5d1SDavid du Colombier
11423e12c5d1SDavid du Colombier
echo_off(void)11433e12c5d1SDavid du Colombier void echo_off(void) /*turn off ECHO for .rd in "-q" mode*/
11443e12c5d1SDavid du Colombier {
11453e12c5d1SDavid du Colombier }
11463e12c5d1SDavid du Colombier
11473e12c5d1SDavid du Colombier
echo_on(void)11483e12c5d1SDavid du Colombier void echo_on(void) /*restore ECHO after .rd in "-q" mode*/
11493e12c5d1SDavid du Colombier {
11503e12c5d1SDavid du Colombier }
1151