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