Blame


1 5cedca1b 2004-05-15 devnull /*
2 5cedca1b 2004-05-15 devnull * n1.c
3 5cedca1b 2004-05-15 devnull *
4 5cedca1b 2004-05-15 devnull * consume options, initialization, main loop,
5 5cedca1b 2004-05-15 devnull * input routines, escape function calling
6 5cedca1b 2004-05-15 devnull */
7 5cedca1b 2004-05-15 devnull
8 5cedca1b 2004-05-15 devnull #include "tdef.h"
9 5cedca1b 2004-05-15 devnull #include "fns.h"
10 5cedca1b 2004-05-15 devnull #include "ext.h"
11 5cedca1b 2004-05-15 devnull #include "dwbinit.h"
12 5cedca1b 2004-05-15 devnull
13 5cedca1b 2004-05-15 devnull #include <setjmp.h>
14 5cedca1b 2004-05-15 devnull #include <time.h>
15 5cedca1b 2004-05-15 devnull
16 5cedca1b 2004-05-15 devnull char *Version = "March 11, 1994";
17 5cedca1b 2004-05-15 devnull
18 5cedca1b 2004-05-15 devnull #ifndef DWBVERSION
19 5cedca1b 2004-05-15 devnull #define DWBVERSION "???"
20 5cedca1b 2004-05-15 devnull #endif
21 5cedca1b 2004-05-15 devnull
22 5cedca1b 2004-05-15 devnull char *DWBfontdir = FONTDIR;
23 5cedca1b 2004-05-15 devnull char *DWBntermdir = NTERMDIR;
24 5cedca1b 2004-05-15 devnull char *DWBalthyphens = ALTHYPHENS;
25 5cedca1b 2004-05-15 devnull char *DWBhomedir = "";
26 5cedca1b 2004-05-15 devnull
27 5cedca1b 2004-05-15 devnull dwbinit dwbpaths[] = {
28 5cedca1b 2004-05-15 devnull &DWBfontdir, NULL, 0,
29 5cedca1b 2004-05-15 devnull &DWBntermdir, NULL, 0,
30 5cedca1b 2004-05-15 devnull &DWBalthyphens, NULL, 0,
31 5cedca1b 2004-05-15 devnull &DWBhomedir, NULL, 0,
32 5cedca1b 2004-05-15 devnull NULL, nextf, NS,
33 5cedca1b 2004-05-15 devnull NULL, NULL, 0
34 5cedca1b 2004-05-15 devnull };
35 5cedca1b 2004-05-15 devnull
36 5cedca1b 2004-05-15 devnull int TROFF = 1; /* assume we started in troff... */
37 5cedca1b 2004-05-15 devnull
38 5cedca1b 2004-05-15 devnull jmp_buf sjbuf;
39 5cedca1b 2004-05-15 devnull Offset ipl[NSO];
40 5cedca1b 2004-05-15 devnull
41 5cedca1b 2004-05-15 devnull static FILE *ifile;
42 5cedca1b 2004-05-15 devnull static FILE *ifl[NSO]; /* open input file pointers */
43 5cedca1b 2004-05-15 devnull char cfname[NSO+1][NS] = { "stdin" }; /* file name stack */
44 5cedca1b 2004-05-15 devnull int cfline[NSO]; /* input line count stack */
45 5cedca1b 2004-05-15 devnull char *progname; /* program name (troff or nroff) */
46 5cedca1b 2004-05-15 devnull
47 5cedca1b 2004-05-15 devnull int trace = 0; /* tracing mode: default off */
48 5cedca1b 2004-05-15 devnull int trace1 = 0;
49 5cedca1b 2004-05-15 devnull
50 c5561c23 2004-05-16 devnull int
51 5cedca1b 2004-05-15 devnull main(int argc, char *argv[])
52 5cedca1b 2004-05-15 devnull {
53 5cedca1b 2004-05-15 devnull char *p;
54 5cedca1b 2004-05-15 devnull int j;
55 5cedca1b 2004-05-15 devnull Tchar i;
56 5cedca1b 2004-05-15 devnull char buf[100];
57 5cedca1b 2004-05-15 devnull
58 c5561c23 2004-05-16 devnull ifile = stdin; /* gcc */
59 5cedca1b 2004-05-15 devnull ptid = stdout;
60 5cedca1b 2004-05-15 devnull
61 5cedca1b 2004-05-15 devnull buf[0] = '\0'; /* make sure it's empty (silly 3b2) */
62 5cedca1b 2004-05-15 devnull progname = argv[0];
63 5cedca1b 2004-05-15 devnull if ((p = strrchr(progname, '/')) == NULL)
64 5cedca1b 2004-05-15 devnull p = progname;
65 5cedca1b 2004-05-15 devnull else
66 5cedca1b 2004-05-15 devnull p++;
67 5cedca1b 2004-05-15 devnull DWBinit(progname, dwbpaths);
68 5cedca1b 2004-05-15 devnull if (strcmp(p, "nroff") == 0)
69 5cedca1b 2004-05-15 devnull TROFF = 0;
70 5cedca1b 2004-05-15 devnull #ifdef UNICODE
71 5cedca1b 2004-05-15 devnull alphabet = 128; /* unicode for plan 9 */
72 5cedca1b 2004-05-15 devnull #endif /*UNICODE*/
73 5cedca1b 2004-05-15 devnull mnspace();
74 5cedca1b 2004-05-15 devnull nnspace();
75 5cedca1b 2004-05-15 devnull mrehash();
76 5cedca1b 2004-05-15 devnull nrehash();
77 5cedca1b 2004-05-15 devnull numtabp[NL].val = -1;
78 5cedca1b 2004-05-15 devnull
79 5cedca1b 2004-05-15 devnull while (--argc > 0 && (++argv)[0][0] == '-')
80 5cedca1b 2004-05-15 devnull switch (argv[0][1]) {
81 5cedca1b 2004-05-15 devnull
82 5cedca1b 2004-05-15 devnull case 'N': /* ought to be used first... */
83 5cedca1b 2004-05-15 devnull TROFF = 0;
84 5cedca1b 2004-05-15 devnull break;
85 5cedca1b 2004-05-15 devnull case 'd':
86 5cedca1b 2004-05-15 devnull fprintf(stderr, "troff/nroff version %s\n", Version);
87 5cedca1b 2004-05-15 devnull break;
88 5cedca1b 2004-05-15 devnull case 'F': /* switch font tables from default */
89 5cedca1b 2004-05-15 devnull if (argv[0][2] != '\0') {
90 5cedca1b 2004-05-15 devnull strcpy(termtab, &argv[0][2]);
91 5cedca1b 2004-05-15 devnull strcpy(fontdir, &argv[0][2]);
92 5cedca1b 2004-05-15 devnull } else {
93 5cedca1b 2004-05-15 devnull argv++; argc--;
94 5cedca1b 2004-05-15 devnull strcpy(termtab, argv[0]);
95 5cedca1b 2004-05-15 devnull strcpy(fontdir, argv[0]);
96 5cedca1b 2004-05-15 devnull }
97 5cedca1b 2004-05-15 devnull break;
98 5cedca1b 2004-05-15 devnull case 0:
99 5cedca1b 2004-05-15 devnull goto start;
100 5cedca1b 2004-05-15 devnull case 'i':
101 5cedca1b 2004-05-15 devnull stdi++;
102 5cedca1b 2004-05-15 devnull break;
103 5cedca1b 2004-05-15 devnull case 'n':
104 5cedca1b 2004-05-15 devnull npn = atoi(&argv[0][2]);
105 5cedca1b 2004-05-15 devnull break;
106 5cedca1b 2004-05-15 devnull case 'u': /* set emboldening amount */
107 5cedca1b 2004-05-15 devnull bdtab[3] = atoi(&argv[0][2]);
108 5cedca1b 2004-05-15 devnull if (bdtab[3] < 0 || bdtab[3] > 50)
109 5cedca1b 2004-05-15 devnull bdtab[3] = 0;
110 5cedca1b 2004-05-15 devnull break;
111 5cedca1b 2004-05-15 devnull case 's':
112 5cedca1b 2004-05-15 devnull if (!(stop = atoi(&argv[0][2])))
113 5cedca1b 2004-05-15 devnull stop++;
114 5cedca1b 2004-05-15 devnull break;
115 5cedca1b 2004-05-15 devnull case 'r':
116 5cedca1b 2004-05-15 devnull sprintf(buf + strlen(buf), ".nr %c %s\n",
117 5cedca1b 2004-05-15 devnull argv[0][2], &argv[0][3]);
118 5cedca1b 2004-05-15 devnull /* not yet cpushback(buf);*/
119 5cedca1b 2004-05-15 devnull /* dotnr(&argv[0][2], &argv[0][3]); */
120 5cedca1b 2004-05-15 devnull break;
121 5cedca1b 2004-05-15 devnull case 'm':
122 5cedca1b 2004-05-15 devnull if (mflg++ >= NMF) {
123 5cedca1b 2004-05-15 devnull ERROR "Too many macro packages: %s", argv[0] WARN;
124 5cedca1b 2004-05-15 devnull break;
125 5cedca1b 2004-05-15 devnull }
126 5cedca1b 2004-05-15 devnull strcpy(mfiles[nmfi], nextf);
127 5cedca1b 2004-05-15 devnull strcat(mfiles[nmfi++], &argv[0][2]);
128 5cedca1b 2004-05-15 devnull break;
129 5cedca1b 2004-05-15 devnull case 'o':
130 5cedca1b 2004-05-15 devnull getpn(&argv[0][2]);
131 5cedca1b 2004-05-15 devnull break;
132 5cedca1b 2004-05-15 devnull case 'T':
133 5cedca1b 2004-05-15 devnull strcpy(devname, &argv[0][2]);
134 5cedca1b 2004-05-15 devnull dotT++;
135 5cedca1b 2004-05-15 devnull break;
136 5cedca1b 2004-05-15 devnull case 'a':
137 5cedca1b 2004-05-15 devnull ascii = 1;
138 5cedca1b 2004-05-15 devnull break;
139 5cedca1b 2004-05-15 devnull case 'h':
140 5cedca1b 2004-05-15 devnull hflg++;
141 5cedca1b 2004-05-15 devnull break;
142 5cedca1b 2004-05-15 devnull case 'e':
143 5cedca1b 2004-05-15 devnull eqflg++;
144 5cedca1b 2004-05-15 devnull break;
145 5cedca1b 2004-05-15 devnull case 'q':
146 5cedca1b 2004-05-15 devnull quiet++;
147 5cedca1b 2004-05-15 devnull save_tty();
148 5cedca1b 2004-05-15 devnull break;
149 5cedca1b 2004-05-15 devnull case 'V':
150 5cedca1b 2004-05-15 devnull fprintf(stdout, "%croff: DWB %s\n",
151 5cedca1b 2004-05-15 devnull TROFF ? 't' : 'n', DWBVERSION);
152 5cedca1b 2004-05-15 devnull exit(0);
153 5cedca1b 2004-05-15 devnull case 't':
154 5cedca1b 2004-05-15 devnull if (argv[0][2] != '\0')
155 5cedca1b 2004-05-15 devnull trace = trace1 = argv[0][2];
156 5cedca1b 2004-05-15 devnull break; /* for the sake of compatibility */
157 5cedca1b 2004-05-15 devnull default:
158 5cedca1b 2004-05-15 devnull ERROR "unknown option %s", argv[0] WARN;
159 5cedca1b 2004-05-15 devnull done(02);
160 5cedca1b 2004-05-15 devnull }
161 5cedca1b 2004-05-15 devnull
162 5cedca1b 2004-05-15 devnull start:
163 5cedca1b 2004-05-15 devnull /*
164 5cedca1b 2004-05-15 devnull * cpushback maintains a LIFO, so push pack the -r arguments
165 5cedca1b 2004-05-15 devnull * in reverse order to maintain a FIFO in case someone did -rC1 -rC3
166 5cedca1b 2004-05-15 devnull */
167 5cedca1b 2004-05-15 devnull if (buf[0]) {
168 5cedca1b 2004-05-15 devnull char *p = buf;
169 5cedca1b 2004-05-15 devnull while(*p++)
170 5cedca1b 2004-05-15 devnull ;
171 5cedca1b 2004-05-15 devnull while(p > buf) {
172 5cedca1b 2004-05-15 devnull while(strncmp(p, ".nr", 3) != 0)
173 5cedca1b 2004-05-15 devnull p--;
174 5cedca1b 2004-05-15 devnull cpushback(p);
175 5cedca1b 2004-05-15 devnull *p-- = '\0';
176 5cedca1b 2004-05-15 devnull }
177 5cedca1b 2004-05-15 devnull }
178 5cedca1b 2004-05-15 devnull argp = argv;
179 5cedca1b 2004-05-15 devnull rargc = argc;
180 5cedca1b 2004-05-15 devnull nmfi = 0;
181 5cedca1b 2004-05-15 devnull init2();
182 5cedca1b 2004-05-15 devnull setjmp(sjbuf);
183 5cedca1b 2004-05-15 devnull loop:
184 5cedca1b 2004-05-15 devnull copyf = lgf = nb = nflush = nlflg = 0;
185 5cedca1b 2004-05-15 devnull if (ip && rbf0(ip) == 0 && ejf && frame->pframe <= ejl && dip == d) {
186 5cedca1b 2004-05-15 devnull nflush++;
187 5cedca1b 2004-05-15 devnull trap = 0;
188 5cedca1b 2004-05-15 devnull eject((Stack *)0);
189 5cedca1b 2004-05-15 devnull goto loop;
190 5cedca1b 2004-05-15 devnull }
191 5cedca1b 2004-05-15 devnull i = getch();
192 5cedca1b 2004-05-15 devnull if (pendt)
193 5cedca1b 2004-05-15 devnull goto Lt;
194 5cedca1b 2004-05-15 devnull if ((j = cbits(i)) == XPAR) {
195 5cedca1b 2004-05-15 devnull copyf++;
196 5cedca1b 2004-05-15 devnull tflg++;
197 5cedca1b 2004-05-15 devnull while (cbits(i) != '\n')
198 5cedca1b 2004-05-15 devnull pchar(i = getch());
199 5cedca1b 2004-05-15 devnull tflg = 0;
200 5cedca1b 2004-05-15 devnull copyf--;
201 5cedca1b 2004-05-15 devnull goto loop;
202 5cedca1b 2004-05-15 devnull }
203 5cedca1b 2004-05-15 devnull if (j == cc || j == c2) {
204 5cedca1b 2004-05-15 devnull if (j == c2)
205 5cedca1b 2004-05-15 devnull nb++;
206 5cedca1b 2004-05-15 devnull copyf++;
207 5cedca1b 2004-05-15 devnull while ((j = cbits(i = getch())) == ' ' || j == '\t')
208 5cedca1b 2004-05-15 devnull ;
209 5cedca1b 2004-05-15 devnull ch = i;
210 5cedca1b 2004-05-15 devnull copyf--;
211 5cedca1b 2004-05-15 devnull control(getrq(), 1);
212 5cedca1b 2004-05-15 devnull flushi();
213 5cedca1b 2004-05-15 devnull goto loop;
214 5cedca1b 2004-05-15 devnull }
215 5cedca1b 2004-05-15 devnull Lt:
216 5cedca1b 2004-05-15 devnull ch = i;
217 5cedca1b 2004-05-15 devnull text();
218 5cedca1b 2004-05-15 devnull if (nlflg)
219 5cedca1b 2004-05-15 devnull numtabp[HP].val = 0;
220 5cedca1b 2004-05-15 devnull goto loop;
221 5cedca1b 2004-05-15 devnull }
222 5cedca1b 2004-05-15 devnull
223 5cedca1b 2004-05-15 devnull
224 5cedca1b 2004-05-15 devnull
225 5cedca1b 2004-05-15 devnull void init2(void)
226 5cedca1b 2004-05-15 devnull {
227 5cedca1b 2004-05-15 devnull int i;
228 5cedca1b 2004-05-15 devnull char buf[100];
229 5cedca1b 2004-05-15 devnull
230 5cedca1b 2004-05-15 devnull for (i = NTRTAB; --i; )
231 5cedca1b 2004-05-15 devnull trtab[i] = i;
232 5cedca1b 2004-05-15 devnull trtab[UNPAD] = ' ';
233 5cedca1b 2004-05-15 devnull iflg = 0;
234 5cedca1b 2004-05-15 devnull obufp = obuf;
235 5cedca1b 2004-05-15 devnull if (TROFF)
236 5cedca1b 2004-05-15 devnull t_ptinit();
237 5cedca1b 2004-05-15 devnull else
238 5cedca1b 2004-05-15 devnull n_ptinit();
239 5cedca1b 2004-05-15 devnull mchbits();
240 5cedca1b 2004-05-15 devnull cvtime();
241 5cedca1b 2004-05-15 devnull numtabp[PID].val = getpid();
242 5cedca1b 2004-05-15 devnull numtabp[HP].val = init = 0;
243 5cedca1b 2004-05-15 devnull numtabp[NL].val = -1;
244 5cedca1b 2004-05-15 devnull nfo = 0;
245 5cedca1b 2004-05-15 devnull copyf = raw = 0;
246 5cedca1b 2004-05-15 devnull sprintf(buf, ".ds .T %s\n", devname);
247 5cedca1b 2004-05-15 devnull cpushback(buf);
248 5cedca1b 2004-05-15 devnull sprintf(buf, ".ds .P %s\n", DWBhomedir);
249 5cedca1b 2004-05-15 devnull cpushback(buf);
250 5cedca1b 2004-05-15 devnull numtabp[CD].val = -1; /* compensation */
251 5cedca1b 2004-05-15 devnull nx = mflg;
252 5cedca1b 2004-05-15 devnull frame = stk = (Stack *)setbrk(STACKSIZE);
253 5cedca1b 2004-05-15 devnull dip = &d[0];
254 5cedca1b 2004-05-15 devnull nxf = frame + 1;
255 5cedca1b 2004-05-15 devnull for (i = 1; i < NEV; i++) /* propagate the environment */
256 5cedca1b 2004-05-15 devnull envcopy(&env[i], &env[0]);
257 5cedca1b 2004-05-15 devnull for (i = 0; i < NEV; i++) {
258 5cedca1b 2004-05-15 devnull if ((env[i]._word._bufp = (Tchar *)calloc(WDSIZE, sizeof(Tchar))) == NULL) {
259 5cedca1b 2004-05-15 devnull ERROR "not enough room for word buffers" WARN;
260 5cedca1b 2004-05-15 devnull done2(1);
261 5cedca1b 2004-05-15 devnull }
262 5cedca1b 2004-05-15 devnull env[i]._word._size = WDSIZE;
263 5cedca1b 2004-05-15 devnull if ((env[i]._line._bufp = (Tchar *)calloc(LNSIZE, sizeof(Tchar))) == NULL) {
264 5cedca1b 2004-05-15 devnull ERROR "not enough room for line buffers" WARN;
265 5cedca1b 2004-05-15 devnull done2(1);
266 5cedca1b 2004-05-15 devnull }
267 5cedca1b 2004-05-15 devnull env[i]._line._size = LNSIZE;
268 5cedca1b 2004-05-15 devnull }
269 5cedca1b 2004-05-15 devnull if ((oline = (Tchar *)calloc(OLNSIZE, sizeof(Tchar))) == NULL) {
270 5cedca1b 2004-05-15 devnull ERROR "not enough room for line buffers" WARN;
271 5cedca1b 2004-05-15 devnull done2(1);
272 5cedca1b 2004-05-15 devnull }
273 5cedca1b 2004-05-15 devnull olinep = oline;
274 5cedca1b 2004-05-15 devnull olnsize = OLNSIZE;
275 5cedca1b 2004-05-15 devnull blockinit();
276 5cedca1b 2004-05-15 devnull }
277 5cedca1b 2004-05-15 devnull
278 5cedca1b 2004-05-15 devnull void cvtime(void)
279 5cedca1b 2004-05-15 devnull {
280 c5561c23 2004-05-16 devnull time_t tt;
281 5cedca1b 2004-05-15 devnull struct tm *ltime;
282 5cedca1b 2004-05-15 devnull
283 5cedca1b 2004-05-15 devnull time(&tt);
284 5cedca1b 2004-05-15 devnull ltime = localtime(&tt);
285 5cedca1b 2004-05-15 devnull numtabp[YR].val = ltime->tm_year % 100;
286 5cedca1b 2004-05-15 devnull numtabp[YR].fmt = 2;
287 5cedca1b 2004-05-15 devnull numtabp[MO].val = ltime->tm_mon + 1; /* troff uses 1..12 */
288 5cedca1b 2004-05-15 devnull numtabp[DY].val = ltime->tm_mday;
289 5cedca1b 2004-05-15 devnull numtabp[DW].val = ltime->tm_wday + 1; /* troff uses 1..7 */
290 5cedca1b 2004-05-15 devnull }
291 5cedca1b 2004-05-15 devnull
292 5cedca1b 2004-05-15 devnull
293 5cedca1b 2004-05-15 devnull
294 5cedca1b 2004-05-15 devnull char errbuf[200];
295 5cedca1b 2004-05-15 devnull
296 5cedca1b 2004-05-15 devnull void errprint(void) /* error message printer */
297 5cedca1b 2004-05-15 devnull {
298 5cedca1b 2004-05-15 devnull int savecd = numtabp[CD].val;
299 5cedca1b 2004-05-15 devnull
300 5cedca1b 2004-05-15 devnull if (!nlflg)
301 5cedca1b 2004-05-15 devnull numtabp[CD].val++;
302 5cedca1b 2004-05-15 devnull
303 5cedca1b 2004-05-15 devnull fprintf(stderr, "%s: ", progname);
304 5cedca1b 2004-05-15 devnull fputs(errbuf, stderr);
305 5cedca1b 2004-05-15 devnull if (cfname[ifi][0])
306 5cedca1b 2004-05-15 devnull fprintf(stderr, "; %s:%d", cfname[ifi], numtabp[CD].val);
307 5cedca1b 2004-05-15 devnull fputs("\n", stderr);
308 5cedca1b 2004-05-15 devnull if (cfname[ifi][0])
309 5cedca1b 2004-05-15 devnull stackdump();
310 5cedca1b 2004-05-15 devnull numtabp[CD].val = savecd;
311 5cedca1b 2004-05-15 devnull }
312 5cedca1b 2004-05-15 devnull
313 5cedca1b 2004-05-15 devnull
314 5cedca1b 2004-05-15 devnull int control(int a, int b)
315 5cedca1b 2004-05-15 devnull {
316 5cedca1b 2004-05-15 devnull int j, k;
317 5cedca1b 2004-05-15 devnull extern Contab *contabp;
318 5cedca1b 2004-05-15 devnull
319 5cedca1b 2004-05-15 devnull numerr.type = RQERR;
320 5cedca1b 2004-05-15 devnull numerr.req = a;
321 5cedca1b 2004-05-15 devnull if (a == 0 || (j = findmn(a)) == -1)
322 5cedca1b 2004-05-15 devnull return(0);
323 5cedca1b 2004-05-15 devnull if (contabp[j].f == 0) {
324 5cedca1b 2004-05-15 devnull if (trace & TRMAC)
325 5cedca1b 2004-05-15 devnull fprintf(stderr, "invoke macro %s\n", unpair(a));
326 5cedca1b 2004-05-15 devnull if (dip != d)
327 5cedca1b 2004-05-15 devnull for (k = dilev; k; k--)
328 5cedca1b 2004-05-15 devnull if (d[k].curd == a) {
329 5cedca1b 2004-05-15 devnull ERROR "diversion %s invokes itself during diversion",
330 5cedca1b 2004-05-15 devnull unpair(a) WARN;
331 5cedca1b 2004-05-15 devnull edone(0100);
332 5cedca1b 2004-05-15 devnull }
333 5cedca1b 2004-05-15 devnull nxf->nargs = 0;
334 5cedca1b 2004-05-15 devnull if (b)
335 5cedca1b 2004-05-15 devnull collect();
336 5cedca1b 2004-05-15 devnull flushi();
337 5cedca1b 2004-05-15 devnull return pushi(contabp[j].mx, a); /* BUG??? all that matters is 0/!0 */
338 5cedca1b 2004-05-15 devnull }
339 5cedca1b 2004-05-15 devnull if (b) {
340 5cedca1b 2004-05-15 devnull if (trace & TRREQ)
341 5cedca1b 2004-05-15 devnull fprintf(stderr, "invoke request %s\n", unpair(a));
342 5cedca1b 2004-05-15 devnull (*contabp[j].f)();
343 5cedca1b 2004-05-15 devnull }
344 5cedca1b 2004-05-15 devnull return(0);
345 5cedca1b 2004-05-15 devnull }
346 5cedca1b 2004-05-15 devnull
347 5cedca1b 2004-05-15 devnull void casept(void)
348 5cedca1b 2004-05-15 devnull {
349 5cedca1b 2004-05-15 devnull int i;
350 5cedca1b 2004-05-15 devnull
351 5cedca1b 2004-05-15 devnull noscale++;
352 5cedca1b 2004-05-15 devnull if (skip())
353 5cedca1b 2004-05-15 devnull i = trace1;
354 5cedca1b 2004-05-15 devnull else {
355 5cedca1b 2004-05-15 devnull i = max(inumb(&trace), 0);
356 5cedca1b 2004-05-15 devnull if (nonumb)
357 5cedca1b 2004-05-15 devnull i = trace1;
358 5cedca1b 2004-05-15 devnull }
359 5cedca1b 2004-05-15 devnull trace1 = trace;
360 5cedca1b 2004-05-15 devnull trace = i;
361 5cedca1b 2004-05-15 devnull noscale = 0;
362 5cedca1b 2004-05-15 devnull }
363 5cedca1b 2004-05-15 devnull
364 5cedca1b 2004-05-15 devnull
365 5cedca1b 2004-05-15 devnull int getrq(void)
366 5cedca1b 2004-05-15 devnull {
367 5cedca1b 2004-05-15 devnull int i, j;
368 5cedca1b 2004-05-15 devnull
369 5cedca1b 2004-05-15 devnull if ((i = getach()) == 0 || (j = getach()) == 0)
370 5cedca1b 2004-05-15 devnull goto rtn;
371 5cedca1b 2004-05-15 devnull i = PAIR(i, j);
372 5cedca1b 2004-05-15 devnull rtn:
373 5cedca1b 2004-05-15 devnull return(i);
374 5cedca1b 2004-05-15 devnull }
375 5cedca1b 2004-05-15 devnull
376 5cedca1b 2004-05-15 devnull /*
377 5cedca1b 2004-05-15 devnull * table encodes some special characters, to speed up tests
378 5cedca1b 2004-05-15 devnull * in getch, viz FLSS, RPT, f, \b, \n, fc, tabch, ldrch
379 5cedca1b 2004-05-15 devnull */
380 5cedca1b 2004-05-15 devnull
381 5cedca1b 2004-05-15 devnull char gchtab[NCHARS] = {
382 5cedca1b 2004-05-15 devnull 000,004,000,000,010,000,000,000, /* fc, ldr */
383 5cedca1b 2004-05-15 devnull 001,002,001,000,001,000,000,000, /* \b, tab, nl, RPT */
384 5cedca1b 2004-05-15 devnull 000,000,000,000,000,000,000,000,
385 5cedca1b 2004-05-15 devnull 000,001,000,001,000,000,000,000, /* FLSS, ESC */
386 5cedca1b 2004-05-15 devnull 000,000,000,000,000,000,000,000,
387 5cedca1b 2004-05-15 devnull 000,000,000,000,000,000,000,000,
388 5cedca1b 2004-05-15 devnull 000,000,000,000,000,000,000,000,
389 5cedca1b 2004-05-15 devnull 000,000,000,000,000,000,000,000,
390 5cedca1b 2004-05-15 devnull 000,000,000,000,000,000,000,000,
391 5cedca1b 2004-05-15 devnull 000,000,000,000,000,000,000,000,
392 5cedca1b 2004-05-15 devnull 000,000,000,000,000,000,000,000,
393 5cedca1b 2004-05-15 devnull 000,000,000,000,000,000,000,000,
394 5cedca1b 2004-05-15 devnull 000,000,000,000,000,000,001,000, /* f */
395 5cedca1b 2004-05-15 devnull 000,000,000,000,000,000,000,000,
396 5cedca1b 2004-05-15 devnull 000,000,000,000,000,000,000,000,
397 5cedca1b 2004-05-15 devnull 000,000,000,000,000,000,000,000,
398 5cedca1b 2004-05-15 devnull };
399 5cedca1b 2004-05-15 devnull
400 5cedca1b 2004-05-15 devnull int realcbits(Tchar c) /* return character bits, or MOTCH if motion */
401 5cedca1b 2004-05-15 devnull {
402 5cedca1b 2004-05-15 devnull if (ismot(c))
403 5cedca1b 2004-05-15 devnull return MOTCH;
404 5cedca1b 2004-05-15 devnull else
405 5cedca1b 2004-05-15 devnull return c & 0xFFFF;
406 5cedca1b 2004-05-15 devnull }
407 5cedca1b 2004-05-15 devnull
408 5cedca1b 2004-05-15 devnull Tchar getch(void)
409 5cedca1b 2004-05-15 devnull {
410 5cedca1b 2004-05-15 devnull int k;
411 5cedca1b 2004-05-15 devnull Tchar i, j;
412 5cedca1b 2004-05-15 devnull
413 5cedca1b 2004-05-15 devnull g0:
414 5cedca1b 2004-05-15 devnull if (ch) {
415 5cedca1b 2004-05-15 devnull i = ch;
416 5cedca1b 2004-05-15 devnull if (cbits(i) == '\n')
417 5cedca1b 2004-05-15 devnull nlflg++;
418 5cedca1b 2004-05-15 devnull ch = 0;
419 5cedca1b 2004-05-15 devnull return(i);
420 5cedca1b 2004-05-15 devnull }
421 5cedca1b 2004-05-15 devnull
422 5cedca1b 2004-05-15 devnull if (nlflg)
423 5cedca1b 2004-05-15 devnull return('\n');
424 5cedca1b 2004-05-15 devnull i = getch0();
425 5cedca1b 2004-05-15 devnull if (ismot(i))
426 5cedca1b 2004-05-15 devnull return(i);
427 5cedca1b 2004-05-15 devnull k = cbits(i);
428 5cedca1b 2004-05-15 devnull if (k >= sizeof(gchtab)/sizeof(gchtab[0]) || gchtab[k] == 0) /* nothing special */
429 5cedca1b 2004-05-15 devnull return(i);
430 5cedca1b 2004-05-15 devnull if (k != ESC) {
431 5cedca1b 2004-05-15 devnull if (k == '\n') {
432 5cedca1b 2004-05-15 devnull nlflg++;
433 5cedca1b 2004-05-15 devnull if (ip == 0)
434 5cedca1b 2004-05-15 devnull numtabp[CD].val++; /* line number */
435 5cedca1b 2004-05-15 devnull return(k);
436 5cedca1b 2004-05-15 devnull }
437 5cedca1b 2004-05-15 devnull if (k == FLSS) {
438 5cedca1b 2004-05-15 devnull copyf++;
439 5cedca1b 2004-05-15 devnull raw++;
440 5cedca1b 2004-05-15 devnull i = getch0();
441 5cedca1b 2004-05-15 devnull if (!fi)
442 5cedca1b 2004-05-15 devnull flss = i;
443 5cedca1b 2004-05-15 devnull copyf--;
444 5cedca1b 2004-05-15 devnull raw--;
445 5cedca1b 2004-05-15 devnull goto g0;
446 5cedca1b 2004-05-15 devnull }
447 5cedca1b 2004-05-15 devnull if (k == RPT) {
448 5cedca1b 2004-05-15 devnull setrpt();
449 5cedca1b 2004-05-15 devnull goto g0;
450 5cedca1b 2004-05-15 devnull }
451 5cedca1b 2004-05-15 devnull if (!copyf) {
452 5cedca1b 2004-05-15 devnull if (k == 'f' && lg && !lgf) {
453 5cedca1b 2004-05-15 devnull i = getlg(i);
454 5cedca1b 2004-05-15 devnull return(i);
455 5cedca1b 2004-05-15 devnull }
456 5cedca1b 2004-05-15 devnull if (k == fc || k == tabch || k == ldrch) {
457 5cedca1b 2004-05-15 devnull if ((i = setfield(k)) == 0)
458 5cedca1b 2004-05-15 devnull goto g0;
459 5cedca1b 2004-05-15 devnull else
460 5cedca1b 2004-05-15 devnull return(i);
461 5cedca1b 2004-05-15 devnull }
462 5cedca1b 2004-05-15 devnull if (k == '\b') {
463 5cedca1b 2004-05-15 devnull i = makem(-width(' ' | chbits));
464 5cedca1b 2004-05-15 devnull return(i);
465 5cedca1b 2004-05-15 devnull }
466 5cedca1b 2004-05-15 devnull }
467 5cedca1b 2004-05-15 devnull return(i);
468 5cedca1b 2004-05-15 devnull }
469 5cedca1b 2004-05-15 devnull
470 5cedca1b 2004-05-15 devnull k = cbits(j = getch0());
471 5cedca1b 2004-05-15 devnull if (ismot(j))
472 5cedca1b 2004-05-15 devnull return(j);
473 5cedca1b 2004-05-15 devnull
474 5cedca1b 2004-05-15 devnull switch (k) {
475 5cedca1b 2004-05-15 devnull case 'n': /* number register */
476 5cedca1b 2004-05-15 devnull setn();
477 5cedca1b 2004-05-15 devnull goto g0;
478 5cedca1b 2004-05-15 devnull case '$': /* argument indicator */
479 5cedca1b 2004-05-15 devnull seta();
480 5cedca1b 2004-05-15 devnull goto g0;
481 5cedca1b 2004-05-15 devnull case '*': /* string indicator */
482 5cedca1b 2004-05-15 devnull setstr();
483 5cedca1b 2004-05-15 devnull goto g0;
484 5cedca1b 2004-05-15 devnull case '{': /* LEFT */
485 5cedca1b 2004-05-15 devnull i = LEFT;
486 5cedca1b 2004-05-15 devnull goto gx;
487 5cedca1b 2004-05-15 devnull case '}': /* RIGHT */
488 5cedca1b 2004-05-15 devnull i = RIGHT;
489 5cedca1b 2004-05-15 devnull goto gx;
490 5cedca1b 2004-05-15 devnull case '"': /* comment */
491 5cedca1b 2004-05-15 devnull while (cbits(i = getch0()) != '\n')
492 5cedca1b 2004-05-15 devnull ;
493 5cedca1b 2004-05-15 devnull if (ip == 0)
494 5cedca1b 2004-05-15 devnull numtabp[CD].val++; /* line number */
495 5cedca1b 2004-05-15 devnull nlflg++;
496 5cedca1b 2004-05-15 devnull return(i);
497 5cedca1b 2004-05-15 devnull
498 5cedca1b 2004-05-15 devnull /* experiment: put it here instead of copy mode */
499 5cedca1b 2004-05-15 devnull case '(': /* special char name \(xx */
500 5cedca1b 2004-05-15 devnull case 'C': /* \C'...' */
501 5cedca1b 2004-05-15 devnull if ((i = setch(k)) == 0)
502 5cedca1b 2004-05-15 devnull goto g0;
503 5cedca1b 2004-05-15 devnull goto gx;
504 5cedca1b 2004-05-15 devnull
505 5cedca1b 2004-05-15 devnull case ESC: /* double backslash */
506 5cedca1b 2004-05-15 devnull i = eschar;
507 5cedca1b 2004-05-15 devnull goto gx;
508 5cedca1b 2004-05-15 devnull case 'e': /* printable version of current eschar */
509 5cedca1b 2004-05-15 devnull i = PRESC;
510 5cedca1b 2004-05-15 devnull goto gx;
511 5cedca1b 2004-05-15 devnull case '\n': /* concealed newline */
512 5cedca1b 2004-05-15 devnull numtabp[CD].val++;
513 5cedca1b 2004-05-15 devnull goto g0;
514 5cedca1b 2004-05-15 devnull case ' ': /* unpaddable space */
515 5cedca1b 2004-05-15 devnull i = UNPAD;
516 5cedca1b 2004-05-15 devnull goto gx;
517 5cedca1b 2004-05-15 devnull case '\'': /* \(aa */
518 5cedca1b 2004-05-15 devnull i = ACUTE;
519 5cedca1b 2004-05-15 devnull goto gx;
520 5cedca1b 2004-05-15 devnull case '`': /* \(ga */
521 5cedca1b 2004-05-15 devnull i = GRAVE;
522 5cedca1b 2004-05-15 devnull goto gx;
523 5cedca1b 2004-05-15 devnull case '_': /* \(ul */
524 5cedca1b 2004-05-15 devnull i = UNDERLINE;
525 5cedca1b 2004-05-15 devnull goto gx;
526 5cedca1b 2004-05-15 devnull case '-': /* current font minus */
527 5cedca1b 2004-05-15 devnull i = MINUS;
528 5cedca1b 2004-05-15 devnull goto gx;
529 5cedca1b 2004-05-15 devnull case '&': /* filler */
530 5cedca1b 2004-05-15 devnull i = FILLER;
531 5cedca1b 2004-05-15 devnull goto gx;
532 5cedca1b 2004-05-15 devnull case 'c': /* to be continued */
533 5cedca1b 2004-05-15 devnull i = CONT;
534 5cedca1b 2004-05-15 devnull goto gx;
535 5cedca1b 2004-05-15 devnull case '!': /* transparent indicator */
536 5cedca1b 2004-05-15 devnull i = XPAR;
537 5cedca1b 2004-05-15 devnull goto gx;
538 5cedca1b 2004-05-15 devnull case 't': /* tab */
539 5cedca1b 2004-05-15 devnull i = '\t';
540 5cedca1b 2004-05-15 devnull return(i);
541 5cedca1b 2004-05-15 devnull case 'a': /* leader (SOH) */
542 5cedca1b 2004-05-15 devnull /* old: *pbp++ = LEADER; goto g0; */
543 5cedca1b 2004-05-15 devnull i = LEADER;
544 5cedca1b 2004-05-15 devnull return i;
545 5cedca1b 2004-05-15 devnull case '%': /* ohc */
546 5cedca1b 2004-05-15 devnull i = OHC;
547 5cedca1b 2004-05-15 devnull return(i);
548 5cedca1b 2004-05-15 devnull case 'g': /* return format of a number register */
549 5cedca1b 2004-05-15 devnull setaf(); /* should this really be in copy mode??? */
550 5cedca1b 2004-05-15 devnull goto g0;
551 5cedca1b 2004-05-15 devnull case '.': /* . */
552 5cedca1b 2004-05-15 devnull i = '.';
553 5cedca1b 2004-05-15 devnull gx:
554 5cedca1b 2004-05-15 devnull setsfbits(i, sfbits(j));
555 5cedca1b 2004-05-15 devnull return(i);
556 5cedca1b 2004-05-15 devnull }
557 5cedca1b 2004-05-15 devnull if (copyf) {
558 5cedca1b 2004-05-15 devnull *pbp++ = j;
559 5cedca1b 2004-05-15 devnull return(eschar);
560 5cedca1b 2004-05-15 devnull }
561 5cedca1b 2004-05-15 devnull switch (k) {
562 5cedca1b 2004-05-15 devnull
563 5cedca1b 2004-05-15 devnull case 'f': /* font indicator */
564 5cedca1b 2004-05-15 devnull setfont(0);
565 5cedca1b 2004-05-15 devnull goto g0;
566 5cedca1b 2004-05-15 devnull case 's': /* size indicator */
567 5cedca1b 2004-05-15 devnull setps();
568 5cedca1b 2004-05-15 devnull goto g0;
569 5cedca1b 2004-05-15 devnull case 'v': /* vert mot */
570 5cedca1b 2004-05-15 devnull numerr.type = numerr.escarg = 0; numerr.esc = k;
571 5cedca1b 2004-05-15 devnull if (i = vmot()) {
572 5cedca1b 2004-05-15 devnull return(i);
573 5cedca1b 2004-05-15 devnull }
574 5cedca1b 2004-05-15 devnull goto g0;
575 5cedca1b 2004-05-15 devnull case 'h': /* horiz mot */
576 5cedca1b 2004-05-15 devnull numerr.type = numerr.escarg = 0; numerr.esc = k;
577 5cedca1b 2004-05-15 devnull if (i = hmot())
578 5cedca1b 2004-05-15 devnull return(i);
579 5cedca1b 2004-05-15 devnull goto g0;
580 5cedca1b 2004-05-15 devnull case '|': /* narrow space */
581 5cedca1b 2004-05-15 devnull if (NROFF)
582 5cedca1b 2004-05-15 devnull goto g0;
583 5cedca1b 2004-05-15 devnull return(makem((int)(EM)/6));
584 5cedca1b 2004-05-15 devnull case '^': /* half narrow space */
585 5cedca1b 2004-05-15 devnull if (NROFF)
586 5cedca1b 2004-05-15 devnull goto g0;
587 5cedca1b 2004-05-15 devnull return(makem((int)(EM)/12));
588 5cedca1b 2004-05-15 devnull case 'w': /* width function */
589 5cedca1b 2004-05-15 devnull setwd();
590 5cedca1b 2004-05-15 devnull goto g0;
591 5cedca1b 2004-05-15 devnull case 'p': /* spread */
592 5cedca1b 2004-05-15 devnull spread++;
593 5cedca1b 2004-05-15 devnull goto g0;
594 5cedca1b 2004-05-15 devnull case 'N': /* absolute character number */
595 5cedca1b 2004-05-15 devnull numerr.type = numerr.escarg = 0; numerr.esc = k;
596 5cedca1b 2004-05-15 devnull if ((i = setabs()) == 0)
597 5cedca1b 2004-05-15 devnull goto g0;
598 5cedca1b 2004-05-15 devnull return i;
599 5cedca1b 2004-05-15 devnull case 'H': /* character height */
600 5cedca1b 2004-05-15 devnull numerr.type = numerr.escarg = 0; numerr.esc = k;
601 5cedca1b 2004-05-15 devnull return(setht());
602 5cedca1b 2004-05-15 devnull case 'S': /* slant */
603 5cedca1b 2004-05-15 devnull numerr.type = numerr.escarg = 0; numerr.esc = k;
604 5cedca1b 2004-05-15 devnull return(setslant());
605 5cedca1b 2004-05-15 devnull case 'z': /* zero with char */
606 5cedca1b 2004-05-15 devnull return(setz());
607 5cedca1b 2004-05-15 devnull case 'l': /* hor line */
608 5cedca1b 2004-05-15 devnull numerr.type = numerr.escarg = 0; numerr.esc = k;
609 5cedca1b 2004-05-15 devnull setline();
610 5cedca1b 2004-05-15 devnull goto g0;
611 5cedca1b 2004-05-15 devnull case 'L': /* vert line */
612 5cedca1b 2004-05-15 devnull numerr.type = numerr.escarg = 0; numerr.esc = k;
613 5cedca1b 2004-05-15 devnull setvline();
614 5cedca1b 2004-05-15 devnull goto g0;
615 5cedca1b 2004-05-15 devnull case 'D': /* drawing function */
616 5cedca1b 2004-05-15 devnull numerr.type = numerr.escarg = 0; numerr.esc = k;
617 5cedca1b 2004-05-15 devnull setdraw();
618 5cedca1b 2004-05-15 devnull goto g0;
619 5cedca1b 2004-05-15 devnull case 'X': /* \X'...' for copy through */
620 5cedca1b 2004-05-15 devnull setxon();
621 5cedca1b 2004-05-15 devnull goto g0;
622 5cedca1b 2004-05-15 devnull case 'b': /* bracket */
623 5cedca1b 2004-05-15 devnull setbra();
624 5cedca1b 2004-05-15 devnull goto g0;
625 5cedca1b 2004-05-15 devnull case 'o': /* overstrike */
626 5cedca1b 2004-05-15 devnull setov();
627 5cedca1b 2004-05-15 devnull goto g0;
628 5cedca1b 2004-05-15 devnull case 'k': /* mark hor place */
629 5cedca1b 2004-05-15 devnull if ((k = findr(getsn())) != -1) {
630 5cedca1b 2004-05-15 devnull numtabp[k].val = numtabp[HP].val;
631 5cedca1b 2004-05-15 devnull }
632 5cedca1b 2004-05-15 devnull goto g0;
633 5cedca1b 2004-05-15 devnull case '0': /* number space */
634 5cedca1b 2004-05-15 devnull return(makem(width('0' | chbits)));
635 5cedca1b 2004-05-15 devnull case 'x': /* extra line space */
636 5cedca1b 2004-05-15 devnull numerr.type = numerr.escarg = 0; numerr.esc = k;
637 5cedca1b 2004-05-15 devnull if (i = xlss())
638 5cedca1b 2004-05-15 devnull return(i);
639 5cedca1b 2004-05-15 devnull goto g0;
640 5cedca1b 2004-05-15 devnull case 'u': /* half em up */
641 5cedca1b 2004-05-15 devnull case 'r': /* full em up */
642 5cedca1b 2004-05-15 devnull case 'd': /* half em down */
643 5cedca1b 2004-05-15 devnull return(sethl(k));
644 5cedca1b 2004-05-15 devnull default:
645 5cedca1b 2004-05-15 devnull return(j);
646 5cedca1b 2004-05-15 devnull }
647 5cedca1b 2004-05-15 devnull /* NOTREACHED */
648 5cedca1b 2004-05-15 devnull }
649 5cedca1b 2004-05-15 devnull
650 5cedca1b 2004-05-15 devnull void setxon(void) /* \X'...' for copy through */
651 5cedca1b 2004-05-15 devnull {
652 5cedca1b 2004-05-15 devnull Tchar xbuf[NC];
653 5cedca1b 2004-05-15 devnull Tchar *i;
654 5cedca1b 2004-05-15 devnull Tchar c;
655 5cedca1b 2004-05-15 devnull int delim, k;
656 5cedca1b 2004-05-15 devnull
657 5cedca1b 2004-05-15 devnull if (ismot(c = getch()))
658 5cedca1b 2004-05-15 devnull return;
659 5cedca1b 2004-05-15 devnull delim = cbits(c);
660 5cedca1b 2004-05-15 devnull i = xbuf;
661 5cedca1b 2004-05-15 devnull *i++ = XON | chbits;
662 5cedca1b 2004-05-15 devnull while ((k = cbits(c = getch())) != delim && k != '\n' && i < xbuf+NC-1) {
663 5cedca1b 2004-05-15 devnull if (k == ' ')
664 5cedca1b 2004-05-15 devnull setcbits(c, WORDSP);
665 5cedca1b 2004-05-15 devnull *i++ = c | ZBIT;
666 5cedca1b 2004-05-15 devnull }
667 5cedca1b 2004-05-15 devnull *i++ = XOFF | chbits;
668 5cedca1b 2004-05-15 devnull *i = 0;
669 5cedca1b 2004-05-15 devnull pushback(xbuf);
670 5cedca1b 2004-05-15 devnull }
671 5cedca1b 2004-05-15 devnull
672 5cedca1b 2004-05-15 devnull
673 5cedca1b 2004-05-15 devnull char ifilt[32] = { 0, 001, 002, 003, 0, 005, 006, 007, 010, 011, 012 };
674 5cedca1b 2004-05-15 devnull
675 5cedca1b 2004-05-15 devnull Tchar getch0(void)
676 5cedca1b 2004-05-15 devnull {
677 5cedca1b 2004-05-15 devnull Tchar i;
678 5cedca1b 2004-05-15 devnull
679 5cedca1b 2004-05-15 devnull again:
680 5cedca1b 2004-05-15 devnull if (pbp > lastpbp)
681 5cedca1b 2004-05-15 devnull i = *--pbp;
682 5cedca1b 2004-05-15 devnull else if (ip) {
683 5cedca1b 2004-05-15 devnull /* i = rbf(); */
684 5cedca1b 2004-05-15 devnull i = rbf0(ip);
685 5cedca1b 2004-05-15 devnull if (i == 0)
686 5cedca1b 2004-05-15 devnull i = rbf();
687 5cedca1b 2004-05-15 devnull else {
688 5cedca1b 2004-05-15 devnull ++ip;
689 5cedca1b 2004-05-15 devnull if (pastend(ip)) {
690 5cedca1b 2004-05-15 devnull --ip;
691 5cedca1b 2004-05-15 devnull rbf();
692 5cedca1b 2004-05-15 devnull }
693 5cedca1b 2004-05-15 devnull }
694 5cedca1b 2004-05-15 devnull } else {
695 5cedca1b 2004-05-15 devnull if (donef || ndone)
696 5cedca1b 2004-05-15 devnull done(0);
697 5cedca1b 2004-05-15 devnull if (nx || 1) { /* BUG: was ibufp >= eibuf, so EOF test is wrong */
698 5cedca1b 2004-05-15 devnull if (nfo < 0)
699 5cedca1b 2004-05-15 devnull ERROR "in getch0, nfo = %d", nfo WARN;
700 5cedca1b 2004-05-15 devnull if (nfo == 0) {
701 5cedca1b 2004-05-15 devnull g0:
702 5cedca1b 2004-05-15 devnull if (nextfile()) {
703 5cedca1b 2004-05-15 devnull if (ip)
704 5cedca1b 2004-05-15 devnull goto again;
705 5cedca1b 2004-05-15 devnull }
706 5cedca1b 2004-05-15 devnull }
707 5cedca1b 2004-05-15 devnull nx = 0;
708 5cedca1b 2004-05-15 devnull #ifdef UNICODE
709 5cedca1b 2004-05-15 devnull if (MB_CUR_MAX > 1)
710 5cedca1b 2004-05-15 devnull i = get1ch(ifile);
711 5cedca1b 2004-05-15 devnull else
712 5cedca1b 2004-05-15 devnull #endif /*UNICODE*/
713 5cedca1b 2004-05-15 devnull i = getc(ifile);
714 5cedca1b 2004-05-15 devnull if (i == EOF)
715 5cedca1b 2004-05-15 devnull goto g0;
716 5cedca1b 2004-05-15 devnull if (ip)
717 5cedca1b 2004-05-15 devnull goto again;
718 5cedca1b 2004-05-15 devnull }
719 c5561c23 2004-05-16 devnull //g2:
720 5cedca1b 2004-05-15 devnull if (i >= 040) /* zapped: && i < 0177 */
721 5cedca1b 2004-05-15 devnull goto g4;
722 5cedca1b 2004-05-15 devnull i = ifilt[i];
723 5cedca1b 2004-05-15 devnull }
724 5cedca1b 2004-05-15 devnull if (cbits(i) == IMP && !raw)
725 5cedca1b 2004-05-15 devnull goto again;
726 5cedca1b 2004-05-15 devnull if (i == 0 && !init && !raw) { /* zapped: || i == 0177 */
727 5cedca1b 2004-05-15 devnull goto again;
728 5cedca1b 2004-05-15 devnull }
729 5cedca1b 2004-05-15 devnull g4:
730 5cedca1b 2004-05-15 devnull if (ismot(i))
731 5cedca1b 2004-05-15 devnull return i;
732 5cedca1b 2004-05-15 devnull if (copyf == 0 && sfbits(i) == 0)
733 5cedca1b 2004-05-15 devnull i |= chbits;
734 5cedca1b 2004-05-15 devnull if (cbits(i) == eschar && !raw)
735 5cedca1b 2004-05-15 devnull setcbits(i, ESC);
736 5cedca1b 2004-05-15 devnull return(i);
737 5cedca1b 2004-05-15 devnull }
738 5cedca1b 2004-05-15 devnull
739 5cedca1b 2004-05-15 devnull
740 5cedca1b 2004-05-15 devnull #ifdef UNICODE
741 5cedca1b 2004-05-15 devnull Tchar get1ch(FILE *fp) /* get one "character" from input, figure out what alphabet */
742 5cedca1b 2004-05-15 devnull {
743 5cedca1b 2004-05-15 devnull wchar_t wc;
744 5cedca1b 2004-05-15 devnull char buf[100], *p;
745 5cedca1b 2004-05-15 devnull int i, n, c;
746 5cedca1b 2004-05-15 devnull
747 5cedca1b 2004-05-15 devnull for (i = 0, p = buf; i < MB_CUR_MAX; i++) {
748 5cedca1b 2004-05-15 devnull if ((c = getc(fp)) == EOF)
749 5cedca1b 2004-05-15 devnull return c;
750 5cedca1b 2004-05-15 devnull *p++ = c;
751 5cedca1b 2004-05-15 devnull if ((n = mbtowc(&wc, buf, p-buf)) >= 0)
752 5cedca1b 2004-05-15 devnull break;
753 5cedca1b 2004-05-15 devnull }
754 c5561c23 2004-05-16 devnull
755 5cedca1b 2004-05-15 devnull if (n == 1) /* real ascii, presumably */
756 5cedca1b 2004-05-15 devnull return wc;
757 5cedca1b 2004-05-15 devnull if (n == 0)
758 5cedca1b 2004-05-15 devnull return p[-1]; /* illegal, but what else to do? */
759 5cedca1b 2004-05-15 devnull if (c == EOF)
760 5cedca1b 2004-05-15 devnull return EOF;
761 5cedca1b 2004-05-15 devnull *p = 0;
762 5cedca1b 2004-05-15 devnull return chadd(buf, MBchar, Install); /* add name even if haven't seen it */
763 5cedca1b 2004-05-15 devnull }
764 5cedca1b 2004-05-15 devnull #endif /*UNICODE*/
765 5cedca1b 2004-05-15 devnull
766 5cedca1b 2004-05-15 devnull void pushback(Tchar *b)
767 5cedca1b 2004-05-15 devnull {
768 5cedca1b 2004-05-15 devnull Tchar *ob = b;
769 5cedca1b 2004-05-15 devnull
770 5cedca1b 2004-05-15 devnull while (*b++)
771 5cedca1b 2004-05-15 devnull ;
772 5cedca1b 2004-05-15 devnull b--;
773 5cedca1b 2004-05-15 devnull while (b > ob && pbp < &pbbuf[NC-3])
774 5cedca1b 2004-05-15 devnull *pbp++ = *--b;
775 5cedca1b 2004-05-15 devnull if (pbp >= &pbbuf[NC-3]) {
776 5cedca1b 2004-05-15 devnull ERROR "pushback overflow" WARN;
777 5cedca1b 2004-05-15 devnull done(2);
778 5cedca1b 2004-05-15 devnull }
779 5cedca1b 2004-05-15 devnull }
780 5cedca1b 2004-05-15 devnull
781 5cedca1b 2004-05-15 devnull void cpushback(char *b)
782 5cedca1b 2004-05-15 devnull {
783 5cedca1b 2004-05-15 devnull char *ob = b;
784 5cedca1b 2004-05-15 devnull
785 5cedca1b 2004-05-15 devnull while (*b++)
786 5cedca1b 2004-05-15 devnull ;
787 5cedca1b 2004-05-15 devnull b--;
788 5cedca1b 2004-05-15 devnull while (b > ob && pbp < &pbbuf[NC-3])
789 5cedca1b 2004-05-15 devnull *pbp++ = *--b;
790 5cedca1b 2004-05-15 devnull if (pbp >= &pbbuf[NC-3]) {
791 5cedca1b 2004-05-15 devnull ERROR "cpushback overflow" WARN;
792 5cedca1b 2004-05-15 devnull done(2);
793 5cedca1b 2004-05-15 devnull }
794 5cedca1b 2004-05-15 devnull }
795 5cedca1b 2004-05-15 devnull
796 5cedca1b 2004-05-15 devnull int nextfile(void)
797 5cedca1b 2004-05-15 devnull {
798 5cedca1b 2004-05-15 devnull char *p;
799 5cedca1b 2004-05-15 devnull
800 5cedca1b 2004-05-15 devnull n0:
801 5cedca1b 2004-05-15 devnull if (ifile != stdin)
802 5cedca1b 2004-05-15 devnull fclose(ifile);
803 5cedca1b 2004-05-15 devnull if (ifi > 0 && !nx) {
804 5cedca1b 2004-05-15 devnull if (popf())
805 5cedca1b 2004-05-15 devnull goto n0; /* popf error */
806 5cedca1b 2004-05-15 devnull return(1); /* popf ok */
807 5cedca1b 2004-05-15 devnull }
808 5cedca1b 2004-05-15 devnull if (nx || nmfi < mflg) {
809 5cedca1b 2004-05-15 devnull p = mfiles[nmfi++];
810 5cedca1b 2004-05-15 devnull if (*p != 0)
811 5cedca1b 2004-05-15 devnull goto n1;
812 5cedca1b 2004-05-15 devnull }
813 5cedca1b 2004-05-15 devnull if (rargc-- <= 0) {
814 5cedca1b 2004-05-15 devnull if ((nfo -= mflg) && !stdi) {
815 5cedca1b 2004-05-15 devnull done(0);
816 5cedca1b 2004-05-15 devnull }
817 5cedca1b 2004-05-15 devnull nfo++;
818 5cedca1b 2004-05-15 devnull numtabp[CD].val = stdi = mflg = 0;
819 5cedca1b 2004-05-15 devnull ifile = stdin;
820 5cedca1b 2004-05-15 devnull strcpy(cfname[ifi], "stdin");
821 5cedca1b 2004-05-15 devnull return(0);
822 5cedca1b 2004-05-15 devnull }
823 5cedca1b 2004-05-15 devnull p = (argp++)[0];
824 5cedca1b 2004-05-15 devnull if (rargc >= 0)
825 5cedca1b 2004-05-15 devnull cfname[ifi][0] = 0;
826 5cedca1b 2004-05-15 devnull n1:
827 5cedca1b 2004-05-15 devnull numtabp[CD].val = 0;
828 5cedca1b 2004-05-15 devnull if (p[0] == '-' && p[1] == 0) {
829 5cedca1b 2004-05-15 devnull ifile = stdin;
830 5cedca1b 2004-05-15 devnull strcpy(cfname[ifi], "stdin");
831 1f72bc47 2004-05-17 devnull } else if ((ifile = fopen(unsharp(p), "r")) == NULL) {
832 5cedca1b 2004-05-15 devnull ERROR "cannot open file %s", p WARN;
833 5cedca1b 2004-05-15 devnull nfo -= mflg;
834 5cedca1b 2004-05-15 devnull done(02);
835 5cedca1b 2004-05-15 devnull } else
836 5cedca1b 2004-05-15 devnull strcpy(cfname[ifi],p);
837 5cedca1b 2004-05-15 devnull nfo++;
838 5cedca1b 2004-05-15 devnull return(0);
839 5cedca1b 2004-05-15 devnull }
840 5cedca1b 2004-05-15 devnull
841 c5561c23 2004-05-16 devnull int
842 5cedca1b 2004-05-15 devnull popf(void)
843 5cedca1b 2004-05-15 devnull {
844 5cedca1b 2004-05-15 devnull --ifi;
845 5cedca1b 2004-05-15 devnull if (ifi < 0) {
846 5cedca1b 2004-05-15 devnull ERROR "popf went negative" WARN;
847 5cedca1b 2004-05-15 devnull return 1;
848 5cedca1b 2004-05-15 devnull }
849 5cedca1b 2004-05-15 devnull numtabp[CD].val = cfline[ifi]; /* restore line counter */
850 5cedca1b 2004-05-15 devnull ip = ipl[ifi]; /* input pointer */
851 5cedca1b 2004-05-15 devnull ifile = ifl[ifi]; /* input FILE * */
852 5cedca1b 2004-05-15 devnull return(0);
853 5cedca1b 2004-05-15 devnull }
854 5cedca1b 2004-05-15 devnull
855 5cedca1b 2004-05-15 devnull
856 5cedca1b 2004-05-15 devnull void flushi(void)
857 5cedca1b 2004-05-15 devnull {
858 5cedca1b 2004-05-15 devnull if (nflush)
859 5cedca1b 2004-05-15 devnull return;
860 5cedca1b 2004-05-15 devnull ch = 0;
861 5cedca1b 2004-05-15 devnull copyf++;
862 5cedca1b 2004-05-15 devnull while (!nlflg) {
863 5cedca1b 2004-05-15 devnull if (donef && frame == stk)
864 5cedca1b 2004-05-15 devnull break;
865 5cedca1b 2004-05-15 devnull getch();
866 5cedca1b 2004-05-15 devnull }
867 5cedca1b 2004-05-15 devnull copyf--;
868 5cedca1b 2004-05-15 devnull }
869 5cedca1b 2004-05-15 devnull
870 5cedca1b 2004-05-15 devnull /*
871 5cedca1b 2004-05-15 devnull * return 16-bit, ascii/alphabetic character, ignore chars with more bits,
872 5cedca1b 2004-05-15 devnull * (internal names), spaces and special cookies (below 040).
873 5cedca1b 2004-05-15 devnull * Leave STX ETX ENQ ACK and BELL in to maintain compatibility with v7 troff.
874 5cedca1b 2004-05-15 devnull */
875 c5561c23 2004-05-16 devnull int
876 5cedca1b 2004-05-15 devnull getach(void)
877 5cedca1b 2004-05-15 devnull {
878 5cedca1b 2004-05-15 devnull Tchar i;
879 5cedca1b 2004-05-15 devnull int j;
880 5cedca1b 2004-05-15 devnull
881 5cedca1b 2004-05-15 devnull lgf++;
882 5cedca1b 2004-05-15 devnull j = cbits(i = getch());
883 5cedca1b 2004-05-15 devnull if (ismot(i)
884 5cedca1b 2004-05-15 devnull || j > SHORTMASK
885 5cedca1b 2004-05-15 devnull || (j <= 040 && j != 002 /*STX*/
886 5cedca1b 2004-05-15 devnull && j != 003 /*ETX*/
887 5cedca1b 2004-05-15 devnull && j != 005 /*ENQ*/
888 5cedca1b 2004-05-15 devnull && j != 006 /*ACK*/
889 5cedca1b 2004-05-15 devnull && j != 007)) { /*BELL*/
890 5cedca1b 2004-05-15 devnull ch = i;
891 5cedca1b 2004-05-15 devnull j = 0;
892 5cedca1b 2004-05-15 devnull }
893 5cedca1b 2004-05-15 devnull lgf--;
894 5cedca1b 2004-05-15 devnull return j;
895 5cedca1b 2004-05-15 devnull }
896 5cedca1b 2004-05-15 devnull
897 5cedca1b 2004-05-15 devnull
898 5cedca1b 2004-05-15 devnull void casenx(void)
899 5cedca1b 2004-05-15 devnull {
900 5cedca1b 2004-05-15 devnull lgf++;
901 5cedca1b 2004-05-15 devnull skip();
902 5cedca1b 2004-05-15 devnull getname();
903 5cedca1b 2004-05-15 devnull nx++;
904 5cedca1b 2004-05-15 devnull if (nmfi > 0)
905 5cedca1b 2004-05-15 devnull nmfi--;
906 5cedca1b 2004-05-15 devnull strcpy(mfiles[nmfi], nextf);
907 5cedca1b 2004-05-15 devnull nextfile();
908 5cedca1b 2004-05-15 devnull nlflg++;
909 5cedca1b 2004-05-15 devnull ip = 0;
910 5cedca1b 2004-05-15 devnull pendt = 0;
911 5cedca1b 2004-05-15 devnull frame = stk;
912 5cedca1b 2004-05-15 devnull nxf = frame + 1;
913 5cedca1b 2004-05-15 devnull }
914 5cedca1b 2004-05-15 devnull
915 c5561c23 2004-05-16 devnull int
916 5cedca1b 2004-05-15 devnull getname(void)
917 5cedca1b 2004-05-15 devnull {
918 5cedca1b 2004-05-15 devnull int j, k;
919 5cedca1b 2004-05-15 devnull
920 5cedca1b 2004-05-15 devnull lgf++;
921 5cedca1b 2004-05-15 devnull for (k = 0; k < NS - 1; k++) {
922 5cedca1b 2004-05-15 devnull j = getach();
923 5cedca1b 2004-05-15 devnull if (!j)
924 5cedca1b 2004-05-15 devnull break;
925 5cedca1b 2004-05-15 devnull nextf[k] = j;
926 5cedca1b 2004-05-15 devnull }
927 5cedca1b 2004-05-15 devnull nextf[k] = 0;
928 5cedca1b 2004-05-15 devnull lgf--;
929 5cedca1b 2004-05-15 devnull return(nextf[0]);
930 5cedca1b 2004-05-15 devnull }
931 5cedca1b 2004-05-15 devnull
932 5cedca1b 2004-05-15 devnull
933 5cedca1b 2004-05-15 devnull void caseso(void)
934 5cedca1b 2004-05-15 devnull {
935 c5561c23 2004-05-16 devnull FILE *fp = 0;
936 5cedca1b 2004-05-15 devnull
937 5cedca1b 2004-05-15 devnull lgf++;
938 5cedca1b 2004-05-15 devnull nextf[0] = 0;
939 1f72bc47 2004-05-17 devnull if (skip() || !getname() || (fp = fopen(unsharp(nextf), "r")) == NULL || ifi >= NSO) {
940 5cedca1b 2004-05-15 devnull ERROR "can't open file %s", nextf WARN;
941 5cedca1b 2004-05-15 devnull done(02);
942 5cedca1b 2004-05-15 devnull }
943 5cedca1b 2004-05-15 devnull strcpy(cfname[ifi+1], nextf);
944 5cedca1b 2004-05-15 devnull cfline[ifi] = numtabp[CD].val; /*hold line counter*/
945 5cedca1b 2004-05-15 devnull numtabp[CD].val = 0;
946 5cedca1b 2004-05-15 devnull flushi();
947 5cedca1b 2004-05-15 devnull ifl[ifi] = ifile;
948 5cedca1b 2004-05-15 devnull ifile = fp;
949 5cedca1b 2004-05-15 devnull ipl[ifi] = ip;
950 5cedca1b 2004-05-15 devnull ip = 0;
951 5cedca1b 2004-05-15 devnull nx++;
952 5cedca1b 2004-05-15 devnull nflush++;
953 5cedca1b 2004-05-15 devnull ifi++;
954 5cedca1b 2004-05-15 devnull }
955 5cedca1b 2004-05-15 devnull
956 5cedca1b 2004-05-15 devnull void caself(void) /* set line number and file */
957 5cedca1b 2004-05-15 devnull {
958 5cedca1b 2004-05-15 devnull int n;
959 5cedca1b 2004-05-15 devnull
960 5cedca1b 2004-05-15 devnull if (skip())
961 5cedca1b 2004-05-15 devnull return;
962 5cedca1b 2004-05-15 devnull n = atoi0();
963 5cedca1b 2004-05-15 devnull if (!nonumb)
964 5cedca1b 2004-05-15 devnull cfline[ifi] = numtabp[CD].val = n - 1;
965 5cedca1b 2004-05-15 devnull if (!skip())
966 5cedca1b 2004-05-15 devnull if (getname()) { /* eats '\n' ? */
967 5cedca1b 2004-05-15 devnull strcpy(cfname[ifi], nextf);
968 5cedca1b 2004-05-15 devnull if (!nonumb)
969 5cedca1b 2004-05-15 devnull numtabp[CD].val--;
970 5cedca1b 2004-05-15 devnull }
971 5cedca1b 2004-05-15 devnull }
972 5cedca1b 2004-05-15 devnull
973 5cedca1b 2004-05-15 devnull void cpout(FILE *fin, char *token)
974 5cedca1b 2004-05-15 devnull {
975 5cedca1b 2004-05-15 devnull int n;
976 5cedca1b 2004-05-15 devnull char buf[1024];
977 5cedca1b 2004-05-15 devnull
978 5cedca1b 2004-05-15 devnull if (token) { /* BUG: There should be no NULL bytes in input */
979 5cedca1b 2004-05-15 devnull char *newl = buf;
980 5cedca1b 2004-05-15 devnull while ((fgets(buf, sizeof buf, fin)) != NULL) {
981 5cedca1b 2004-05-15 devnull if (newl) {
982 5cedca1b 2004-05-15 devnull numtabp[CD].val++; /* line number */
983 5cedca1b 2004-05-15 devnull if (strcmp(token, buf) == 0)
984 5cedca1b 2004-05-15 devnull return;
985 5cedca1b 2004-05-15 devnull }
986 5cedca1b 2004-05-15 devnull newl = strchr(buf, '\n');
987 5cedca1b 2004-05-15 devnull fputs(buf, ptid);
988 5cedca1b 2004-05-15 devnull }
989 5cedca1b 2004-05-15 devnull } else {
990 5cedca1b 2004-05-15 devnull while ((n = fread(buf, sizeof *buf, sizeof buf, fin)) > 0)
991 5cedca1b 2004-05-15 devnull fwrite(buf, n, 1, ptid);
992 5cedca1b 2004-05-15 devnull fclose(fin);
993 5cedca1b 2004-05-15 devnull }
994 5cedca1b 2004-05-15 devnull }
995 5cedca1b 2004-05-15 devnull
996 5cedca1b 2004-05-15 devnull void casecf(void)
997 5cedca1b 2004-05-15 devnull { /* copy file without change */
998 5cedca1b 2004-05-15 devnull FILE *fd;
999 5cedca1b 2004-05-15 devnull char *eof, *p;
1000 5cedca1b 2004-05-15 devnull extern int hpos, esc, po;
1001 5cedca1b 2004-05-15 devnull
1002 5cedca1b 2004-05-15 devnull /* this may not make much sense in nroff... */
1003 5cedca1b 2004-05-15 devnull
1004 5cedca1b 2004-05-15 devnull lgf++;
1005 5cedca1b 2004-05-15 devnull nextf[0] = 0;
1006 5cedca1b 2004-05-15 devnull if (!skip() && getname()) {
1007 5cedca1b 2004-05-15 devnull if (strncmp("<<", nextf, 2) != 0) {
1008 1f72bc47 2004-05-17 devnull if ((fd = fopen(unsharp(nextf), "r")) == NULL) {
1009 5cedca1b 2004-05-15 devnull ERROR "can't open file %s", nextf WARN;
1010 5cedca1b 2004-05-15 devnull done(02);
1011 5cedca1b 2004-05-15 devnull }
1012 5cedca1b 2004-05-15 devnull eof = (char *) NULL;
1013 5cedca1b 2004-05-15 devnull } else { /* current file */
1014 5cedca1b 2004-05-15 devnull if (pbp > lastpbp || ip) {
1015 5cedca1b 2004-05-15 devnull ERROR "casecf: not reading from file" WARN;
1016 5cedca1b 2004-05-15 devnull done(02);
1017 5cedca1b 2004-05-15 devnull }
1018 5cedca1b 2004-05-15 devnull eof = &nextf[2];
1019 5cedca1b 2004-05-15 devnull if (!*eof) {
1020 5cedca1b 2004-05-15 devnull ERROR "casecf: missing end of input token" WARN;
1021 5cedca1b 2004-05-15 devnull done(02);
1022 5cedca1b 2004-05-15 devnull }
1023 5cedca1b 2004-05-15 devnull p = eof;
1024 5cedca1b 2004-05-15 devnull while(*++p)
1025 5cedca1b 2004-05-15 devnull ;
1026 5cedca1b 2004-05-15 devnull *p++ = '\n';
1027 5cedca1b 2004-05-15 devnull *p = 0;
1028 5cedca1b 2004-05-15 devnull fd = ifile;
1029 5cedca1b 2004-05-15 devnull }
1030 5cedca1b 2004-05-15 devnull } else {
1031 5cedca1b 2004-05-15 devnull ERROR "casecf: no argument" WARN;
1032 5cedca1b 2004-05-15 devnull lgf--;
1033 5cedca1b 2004-05-15 devnull return;
1034 5cedca1b 2004-05-15 devnull }
1035 5cedca1b 2004-05-15 devnull lgf--;
1036 5cedca1b 2004-05-15 devnull
1037 5cedca1b 2004-05-15 devnull /* make it into a clean state, be sure that everything is out */
1038 5cedca1b 2004-05-15 devnull tbreak();
1039 5cedca1b 2004-05-15 devnull hpos = po;
1040 5cedca1b 2004-05-15 devnull esc = 0;
1041 5cedca1b 2004-05-15 devnull ptesc(); /* to left margin */
1042 5cedca1b 2004-05-15 devnull esc = un;
1043 5cedca1b 2004-05-15 devnull ptesc();
1044 5cedca1b 2004-05-15 devnull ptlead();
1045 5cedca1b 2004-05-15 devnull ptps();
1046 5cedca1b 2004-05-15 devnull ptfont();
1047 5cedca1b 2004-05-15 devnull flusho();
1048 5cedca1b 2004-05-15 devnull cpout(fd, eof);
1049 5cedca1b 2004-05-15 devnull ptps();
1050 5cedca1b 2004-05-15 devnull ptfont();
1051 5cedca1b 2004-05-15 devnull }
1052 5cedca1b 2004-05-15 devnull
1053 5cedca1b 2004-05-15 devnull void getline(char *s, int n) /* get rest of input line into s */
1054 5cedca1b 2004-05-15 devnull {
1055 5cedca1b 2004-05-15 devnull int i;
1056 5cedca1b 2004-05-15 devnull
1057 5cedca1b 2004-05-15 devnull lgf++;
1058 5cedca1b 2004-05-15 devnull copyf++;
1059 5cedca1b 2004-05-15 devnull skip();
1060 5cedca1b 2004-05-15 devnull for (i = 0; i < n-1; i++)
1061 5cedca1b 2004-05-15 devnull if ((s[i] = cbits(getch())) == '\n' || s[i] == RIGHT)
1062 5cedca1b 2004-05-15 devnull break;
1063 5cedca1b 2004-05-15 devnull s[i] = 0;
1064 5cedca1b 2004-05-15 devnull copyf--;
1065 5cedca1b 2004-05-15 devnull lgf--;
1066 5cedca1b 2004-05-15 devnull }
1067 5cedca1b 2004-05-15 devnull
1068 5cedca1b 2004-05-15 devnull void casesy(void) /* call system */
1069 5cedca1b 2004-05-15 devnull {
1070 5cedca1b 2004-05-15 devnull char sybuf[NTM];
1071 5cedca1b 2004-05-15 devnull
1072 5cedca1b 2004-05-15 devnull getline(sybuf, NTM);
1073 5cedca1b 2004-05-15 devnull system(sybuf);
1074 5cedca1b 2004-05-15 devnull }
1075 5cedca1b 2004-05-15 devnull
1076 5cedca1b 2004-05-15 devnull
1077 5cedca1b 2004-05-15 devnull void getpn(char *a)
1078 5cedca1b 2004-05-15 devnull {
1079 5cedca1b 2004-05-15 devnull int n, neg;
1080 5cedca1b 2004-05-15 devnull
1081 5cedca1b 2004-05-15 devnull if (*a == 0)
1082 5cedca1b 2004-05-15 devnull return;
1083 5cedca1b 2004-05-15 devnull neg = 0;
1084 5cedca1b 2004-05-15 devnull for ( ; *a; a++)
1085 5cedca1b 2004-05-15 devnull switch (*a) {
1086 5cedca1b 2004-05-15 devnull case '+':
1087 5cedca1b 2004-05-15 devnull case ',':
1088 5cedca1b 2004-05-15 devnull continue;
1089 5cedca1b 2004-05-15 devnull case '-':
1090 5cedca1b 2004-05-15 devnull neg = 1;
1091 5cedca1b 2004-05-15 devnull continue;
1092 5cedca1b 2004-05-15 devnull default:
1093 5cedca1b 2004-05-15 devnull n = 0;
1094 5cedca1b 2004-05-15 devnull if (isdigit(*a)) {
1095 5cedca1b 2004-05-15 devnull do
1096 5cedca1b 2004-05-15 devnull n = 10 * n + *a++ - '0';
1097 5cedca1b 2004-05-15 devnull while (isdigit(*a));
1098 5cedca1b 2004-05-15 devnull a--;
1099 5cedca1b 2004-05-15 devnull } else
1100 5cedca1b 2004-05-15 devnull n = 9999;
1101 5cedca1b 2004-05-15 devnull *pnp++ = neg ? -n : n;
1102 5cedca1b 2004-05-15 devnull neg = 0;
1103 5cedca1b 2004-05-15 devnull if (pnp >= &pnlist[NPN-2]) {
1104 5cedca1b 2004-05-15 devnull ERROR "too many page numbers" WARN;
1105 5cedca1b 2004-05-15 devnull done3(-3);
1106 5cedca1b 2004-05-15 devnull }
1107 5cedca1b 2004-05-15 devnull }
1108 5cedca1b 2004-05-15 devnull if (neg)
1109 5cedca1b 2004-05-15 devnull *pnp++ = -9999;
1110 5cedca1b 2004-05-15 devnull *pnp = -INT_MAX;
1111 5cedca1b 2004-05-15 devnull print = 0;
1112 5cedca1b 2004-05-15 devnull pnp = pnlist;
1113 5cedca1b 2004-05-15 devnull if (*pnp != -INT_MAX)
1114 5cedca1b 2004-05-15 devnull chkpn();
1115 5cedca1b 2004-05-15 devnull }
1116 5cedca1b 2004-05-15 devnull
1117 5cedca1b 2004-05-15 devnull
1118 5cedca1b 2004-05-15 devnull void setrpt(void)
1119 5cedca1b 2004-05-15 devnull {
1120 5cedca1b 2004-05-15 devnull Tchar i, j;
1121 5cedca1b 2004-05-15 devnull
1122 5cedca1b 2004-05-15 devnull copyf++;
1123 5cedca1b 2004-05-15 devnull raw++;
1124 5cedca1b 2004-05-15 devnull i = getch0();
1125 5cedca1b 2004-05-15 devnull copyf--;
1126 5cedca1b 2004-05-15 devnull raw--;
1127 5cedca1b 2004-05-15 devnull if ((long) i < 0 || cbits(j = getch0()) == RPT)
1128 5cedca1b 2004-05-15 devnull return;
1129 5cedca1b 2004-05-15 devnull while (i > 0 && pbp < &pbbuf[NC-3]) {
1130 5cedca1b 2004-05-15 devnull i--;
1131 5cedca1b 2004-05-15 devnull *pbp++ = j;
1132 5cedca1b 2004-05-15 devnull }
1133 5cedca1b 2004-05-15 devnull }