1 bc7cb1a1 2003-11-23 devnull #include <u.h>
2 bc7cb1a1 2003-11-23 devnull #include <libc.h>
3 bc7cb1a1 2003-11-23 devnull #include <bio.h>
6 bc7cb1a1 2003-11-23 devnull * Deroff command -- strip troff, eqn, and tbl sequences from
7 bc7cb1a1 2003-11-23 devnull * a file. Has three flags argument, -w, to cause output one word per line
8 bc7cb1a1 2003-11-23 devnull * rather than in the original format.
9 bc7cb1a1 2003-11-23 devnull * -mm (or -ms) causes the corresponding macro's to be interpreted
10 bc7cb1a1 2003-11-23 devnull * so that just sentences are output
11 bc7cb1a1 2003-11-23 devnull * -ml also gets rid of lists.
12 bc7cb1a1 2003-11-23 devnull * -i causes deroff to ignore .so and .nx commands.
13 bc7cb1a1 2003-11-23 devnull * Deroff follows .so and .nx commands, removes contents of macro
14 bc7cb1a1 2003-11-23 devnull * definitions, equations (both .EQ ... .EN and $...$),
15 bc7cb1a1 2003-11-23 devnull * Tbl command sequences, and Troff backslash vconstructions.
17 bc7cb1a1 2003-11-23 devnull * All input is through the C macro; the most recently read character is in c.
21 bc7cb1a1 2003-11-23 devnull #define C ((c = Bgetrune(infile)) < 0?\
23 bc7cb1a1 2003-11-23 devnull ((c == ldelim) && (filesp == files)?\
24 bc7cb1a1 2003-11-23 devnull skeqn():\
25 bc7cb1a1 2003-11-23 devnull (c == '\n'?\
26 bc7cb1a1 2003-11-23 devnull (linect++,c):\
29 bc7cb1a1 2003-11-23 devnull #define C1 ((c = Bgetrune(infile)) == Beof?\
31 bc7cb1a1 2003-11-23 devnull (c == '\n'?\
32 bc7cb1a1 2003-11-23 devnull (linect++,c):\
36 bc7cb1a1 2003-11-23 devnull /* lose those macros! */
37 bc7cb1a1 2003-11-23 devnull #define C fC()
38 bc7cb1a1 2003-11-23 devnull #define C1 fC1()
40 bc7cb1a1 2003-11-23 devnull #define SKIP while(C != '\n')
41 bc7cb1a1 2003-11-23 devnull #define SKIP1 while(C1 != '\n')
42 bc7cb1a1 2003-11-23 devnull #define SKIP_TO_COM SKIP;\
45 bc7cb1a1 2003-11-23 devnull while(C != '.' || pc != '\n' || C > 'Z')\
48 bc7cb1a1 2003-11-23 devnull #define YES 1
49 bc7cb1a1 2003-11-23 devnull #define NO 0
50 bc7cb1a1 2003-11-23 devnull #define MS 0
51 bc7cb1a1 2003-11-23 devnull #define MM 1
52 bc7cb1a1 2003-11-23 devnull #define ONE 1
53 bc7cb1a1 2003-11-23 devnull #define TWO 2
55 bc7cb1a1 2003-11-23 devnull #define NOCHAR -2
56 bc7cb1a1 2003-11-23 devnull #define EXTENDED -1 /* All runes above 0x7F */
57 bc7cb1a1 2003-11-23 devnull #define SPECIAL 0
58 bc7cb1a1 2003-11-23 devnull #define APOS 1
59 bc7cb1a1 2003-11-23 devnull #define PUNCT 2
60 bc7cb1a1 2003-11-23 devnull #define DIGIT 3
61 bc7cb1a1 2003-11-23 devnull #define LETTER 4
64 bc7cb1a1 2003-11-23 devnull int linect = 0;
65 bc7cb1a1 2003-11-23 devnull int wordflag= NO;
66 bc7cb1a1 2003-11-23 devnull int underscoreflag = NO;
67 bc7cb1a1 2003-11-23 devnull int msflag = NO;
68 bc7cb1a1 2003-11-23 devnull int iflag = NO;
69 bc7cb1a1 2003-11-23 devnull int mac = MM;
70 bc7cb1a1 2003-11-23 devnull int disp = 0;
71 bc7cb1a1 2003-11-23 devnull int inmacro = NO;
72 bc7cb1a1 2003-11-23 devnull int intable = NO;
73 bc7cb1a1 2003-11-23 devnull int eqnflag = 0;
75 bc7cb1a1 2003-11-23 devnull #define MAX_ASCII 0X80
77 bc7cb1a1 2003-11-23 devnull char chars[MAX_ASCII]; /* SPECIAL, PUNCT, APOS, DIGIT, or LETTER */
79 bc7cb1a1 2003-11-23 devnull Rune line[30000];
80 bc7cb1a1 2003-11-23 devnull Rune* lp;
84 bc7cb1a1 2003-11-23 devnull int ldelim = NOCHAR;
85 bc7cb1a1 2003-11-23 devnull int rdelim = NOCHAR;
88 bc7cb1a1 2003-11-23 devnull char** argv;
90 bc7cb1a1 2003-11-23 devnull char fname[50];
91 bc7cb1a1 2003-11-23 devnull Biobuf* files[15];
92 bc7cb1a1 2003-11-23 devnull Biobuf**filesp;
93 bc7cb1a1 2003-11-23 devnull Biobuf* infile;
94 bc7cb1a1 2003-11-23 devnull char* devnull = "/dev/null";
95 bc7cb1a1 2003-11-23 devnull Biobuf *infile;
96 bc7cb1a1 2003-11-23 devnull Biobuf bout;
98 bc7cb1a1 2003-11-23 devnull long skeqn(void);
99 bc7cb1a1 2003-11-23 devnull Biobuf* opn(char *p);
100 bc7cb1a1 2003-11-23 devnull int eof(void);
101 bc7cb1a1 2003-11-23 devnull int charclass(int);
102 bc7cb1a1 2003-11-23 devnull void getfname(void);
103 bc7cb1a1 2003-11-23 devnull void fatal(char *s, char *p);
104 bc7cb1a1 2003-11-23 devnull void usage(void);
105 bc7cb1a1 2003-11-23 devnull void work(void);
106 bc7cb1a1 2003-11-23 devnull void putmac(Rune *rp, int vconst);
107 bc7cb1a1 2003-11-23 devnull void regline(int macline, int vconst);
108 bc7cb1a1 2003-11-23 devnull void putwords(void);
109 bc7cb1a1 2003-11-23 devnull void comline(void);
110 bc7cb1a1 2003-11-23 devnull void macro(void);
111 bc7cb1a1 2003-11-23 devnull void eqn(void);
112 bc7cb1a1 2003-11-23 devnull void tbl(void);
113 bc7cb1a1 2003-11-23 devnull void stbl(void);
114 bc7cb1a1 2003-11-23 devnull void sdis(char a1, char a2);
115 bc7cb1a1 2003-11-23 devnull void sce(void);
116 bc7cb1a1 2003-11-23 devnull void backsl(void);
117 bc7cb1a1 2003-11-23 devnull char* copys(char *s);
118 bc7cb1a1 2003-11-23 devnull void refer(int c1);
119 bc7cb1a1 2003-11-23 devnull void inpic(void);
122 bc7cb1a1 2003-11-23 devnull fC(void)
124 bc7cb1a1 2003-11-23 devnull c = Bgetrune(infile);
125 bc7cb1a1 2003-11-23 devnull if(c < 0)
126 bc7cb1a1 2003-11-23 devnull return eof();
127 bc7cb1a1 2003-11-23 devnull if(c == ldelim && filesp == files)
128 bc7cb1a1 2003-11-23 devnull return skeqn();
129 bc7cb1a1 2003-11-23 devnull if(c == '\n')
130 bc7cb1a1 2003-11-23 devnull linect++;
131 bc7cb1a1 2003-11-23 devnull return c;
135 bc7cb1a1 2003-11-23 devnull fC1(void)
137 bc7cb1a1 2003-11-23 devnull c = Bgetrune(infile);
138 bc7cb1a1 2003-11-23 devnull if(c == Beof)
139 bc7cb1a1 2003-11-23 devnull return eof();
140 bc7cb1a1 2003-11-23 devnull if(c == '\n')
141 bc7cb1a1 2003-11-23 devnull linect++;
142 bc7cb1a1 2003-11-23 devnull return c;
146 bc7cb1a1 2003-11-23 devnull main(int argc, char *av[])
149 bc7cb1a1 2003-11-23 devnull char *f;
151 bc7cb1a1 2003-11-23 devnull argv = av;
152 bc7cb1a1 2003-11-23 devnull Binit(&bout, 1, OWRITE);
153 bc7cb1a1 2003-11-23 devnull ARGBEGIN{
154 bc7cb1a1 2003-11-23 devnull case 'w':
155 bc7cb1a1 2003-11-23 devnull wordflag = YES;
157 bc7cb1a1 2003-11-23 devnull case '_':
158 bc7cb1a1 2003-11-23 devnull wordflag = YES;
159 bc7cb1a1 2003-11-23 devnull underscoreflag = YES;
161 bc7cb1a1 2003-11-23 devnull case 'm':
162 bc7cb1a1 2003-11-23 devnull msflag = YES;
163 bc7cb1a1 2003-11-23 devnull if(f = ARGF())
164 bc7cb1a1 2003-11-23 devnull switch(*f)
166 bc7cb1a1 2003-11-23 devnull case 'm': mac = MM; break;
167 bc7cb1a1 2003-11-23 devnull case 's': mac = MS; break;
168 bc7cb1a1 2003-11-23 devnull case 'l': disp = 1; break;
169 bc7cb1a1 2003-11-23 devnull default: usage();
172 bc7cb1a1 2003-11-23 devnull usage();
174 bc7cb1a1 2003-11-23 devnull case 'i':
175 bc7cb1a1 2003-11-23 devnull iflag = YES;
177 bc7cb1a1 2003-11-23 devnull default:
178 bc7cb1a1 2003-11-23 devnull usage();
180 bc7cb1a1 2003-11-23 devnull if(*argv)
181 bc7cb1a1 2003-11-23 devnull infile = opn(*argv++);
183 bc7cb1a1 2003-11-23 devnull infile = malloc(sizeof(Biobuf));
184 bc7cb1a1 2003-11-23 devnull Binit(infile, 0, OREAD);
186 bc7cb1a1 2003-11-23 devnull files[0] = infile;
187 bc7cb1a1 2003-11-23 devnull filesp = &files[0];
189 bc7cb1a1 2003-11-23 devnull for(i='a'; i<='z' ; ++i)
190 bc7cb1a1 2003-11-23 devnull chars[i] = LETTER;
191 bc7cb1a1 2003-11-23 devnull for(i='A'; i<='Z'; ++i)
192 bc7cb1a1 2003-11-23 devnull chars[i] = LETTER;
193 bc7cb1a1 2003-11-23 devnull for(i='0'; i<='9'; ++i)
194 bc7cb1a1 2003-11-23 devnull chars[i] = DIGIT;
195 bc7cb1a1 2003-11-23 devnull chars['\''] = APOS;
196 bc7cb1a1 2003-11-23 devnull chars['&'] = APOS;
197 bc7cb1a1 2003-11-23 devnull chars['\b'] = APOS;
198 bc7cb1a1 2003-11-23 devnull chars['.'] = PUNCT;
199 bc7cb1a1 2003-11-23 devnull chars[','] = PUNCT;
200 bc7cb1a1 2003-11-23 devnull chars[';'] = PUNCT;
201 bc7cb1a1 2003-11-23 devnull chars['?'] = PUNCT;
202 bc7cb1a1 2003-11-23 devnull chars[':'] = PUNCT;
207 bc7cb1a1 2003-11-23 devnull skeqn(void)
209 bc7cb1a1 2003-11-23 devnull while(C1 != rdelim)
210 bc7cb1a1 2003-11-23 devnull if(c == '\\')
212 bc7cb1a1 2003-11-23 devnull else if(c == '"')
213 bc7cb1a1 2003-11-23 devnull while(C1 != '"')
214 bc7cb1a1 2003-11-23 devnull if(c == '\\')
216 bc7cb1a1 2003-11-23 devnull if (msflag)
217 bc7cb1a1 2003-11-23 devnull eqnflag = 1;
218 bc7cb1a1 2003-11-23 devnull return(c = ' ');
222 bc7cb1a1 2003-11-23 devnull opn(char *p)
224 bc7cb1a1 2003-11-23 devnull Biobuf *fd;
226 bc7cb1a1 2003-11-23 devnull while ((fd = Bopen(p, OREAD)) == 0) {
227 bc7cb1a1 2003-11-23 devnull if(msflag || p == devnull)
228 bc7cb1a1 2003-11-23 devnull fatal("Cannot open file %s - quitting\n", p);
230 bc7cb1a1 2003-11-23 devnull fprint(2, "Deroff: Cannot open file %s - continuing\n", p);
231 bc7cb1a1 2003-11-23 devnull p = devnull;
234 bc7cb1a1 2003-11-23 devnull linect = 0;
235 bc7cb1a1 2003-11-23 devnull return(fd);
239 bc7cb1a1 2003-11-23 devnull eof(void)
241 bc7cb1a1 2003-11-23 devnull if(Bfildes(infile) != 0)
242 bc7cb1a1 2003-11-23 devnull Bterm(infile);
243 bc7cb1a1 2003-11-23 devnull if(filesp > files)
244 bc7cb1a1 2003-11-23 devnull infile = *--filesp;
246 bc7cb1a1 2003-11-23 devnull if(*argv)
247 bc7cb1a1 2003-11-23 devnull infile = opn(*argv++);
249 bc7cb1a1 2003-11-23 devnull exits(0);
250 bc7cb1a1 2003-11-23 devnull return(C);
254 bc7cb1a1 2003-11-23 devnull getfname(void)
256 bc7cb1a1 2003-11-23 devnull char *p;
258 bc7cb1a1 2003-11-23 devnull Dir *dir;
259 bc7cb1a1 2003-11-23 devnull struct chain
261 bc7cb1a1 2003-11-23 devnull struct chain* nextp;
262 bc7cb1a1 2003-11-23 devnull char* datap;
265 bc7cb1a1 2003-11-23 devnull static struct chain *namechain= 0;
267 bc7cb1a1 2003-11-23 devnull while(C == ' ')
269 bc7cb1a1 2003-11-23 devnull for(p = fname; (r=c) != '\n' && r != ' ' && r != '\t' && r != '\\'; C)
270 bc7cb1a1 2003-11-23 devnull p += runetochar(p, &r);
271 bc7cb1a1 2003-11-23 devnull *p = '\0';
272 bc7cb1a1 2003-11-23 devnull while(c != '\n')
274 bc7cb1a1 2003-11-23 devnull if(!strcmp(fname, "/sys/lib/tmac/tmac.cs")
275 bc7cb1a1 2003-11-23 devnull || !strcmp(fname, "/sys/lib/tmac/tmac.s")) {
276 bc7cb1a1 2003-11-23 devnull fname[0] = '\0';
279 bc7cb1a1 2003-11-23 devnull dir = dirstat(fname);
280 bc7cb1a1 2003-11-23 devnull if(dir!=nil && ((dir->mode & DMDIR) || dir->type != 'M')) {
281 bc7cb1a1 2003-11-23 devnull free(dir);
282 bc7cb1a1 2003-11-23 devnull fname[0] = '\0';
285 bc7cb1a1 2003-11-23 devnull free(dir);
287 bc7cb1a1 2003-11-23 devnull * see if this name has already been used
290 bc7cb1a1 2003-11-23 devnull for(q = namechain; q; q = q->nextp)
291 bc7cb1a1 2003-11-23 devnull if( !strcmp(fname, q->datap)) {
292 bc7cb1a1 2003-11-23 devnull fname[0] = '\0';
295 bc7cb1a1 2003-11-23 devnull q = (struct chain*)malloc(sizeof(struct chain));
296 bc7cb1a1 2003-11-23 devnull q->nextp = namechain;
297 bc7cb1a1 2003-11-23 devnull q->datap = copys(fname);
298 bc7cb1a1 2003-11-23 devnull namechain = q;
302 bc7cb1a1 2003-11-23 devnull usage(void)
304 bc7cb1a1 2003-11-23 devnull fprint(2,"usage: deroff [-nw_pi] [-m (m s l)] [file ...] \n");
305 bc7cb1a1 2003-11-23 devnull exits("usage");
309 bc7cb1a1 2003-11-23 devnull fatal(char *s, char *p)
311 bc7cb1a1 2003-11-23 devnull fprint(2, "deroff: ");
312 bc7cb1a1 2003-11-23 devnull fprint(2, s, p);
313 bc7cb1a1 2003-11-23 devnull exits(s);
317 bc7cb1a1 2003-11-23 devnull work(void)
320 bc7cb1a1 2003-11-23 devnull for(;;) {
321 bc7cb1a1 2003-11-23 devnull eqnflag = 0;
322 bc7cb1a1 2003-11-23 devnull if(C == '.' || c == '\'')
323 bc7cb1a1 2003-11-23 devnull comline();
325 bc7cb1a1 2003-11-23 devnull regline(NO, TWO);
330 bc7cb1a1 2003-11-23 devnull regline(int macline, int vconst)
332 bc7cb1a1 2003-11-23 devnull line[0] = c;
333 bc7cb1a1 2003-11-23 devnull lp = line;
334 bc7cb1a1 2003-11-23 devnull for(;;) {
335 bc7cb1a1 2003-11-23 devnull if(c == '\\') {
336 bc7cb1a1 2003-11-23 devnull *lp = ' ';
337 bc7cb1a1 2003-11-23 devnull backsl();
338 bc7cb1a1 2003-11-23 devnull if(c == '%') /* no blank for hyphenation char */
341 bc7cb1a1 2003-11-23 devnull if(c == '\n')
343 bc7cb1a1 2003-11-23 devnull if(intable && c=='T') {
344 bc7cb1a1 2003-11-23 devnull *++lp = C;
345 bc7cb1a1 2003-11-23 devnull if(c=='{' || c=='}') {
346 bc7cb1a1 2003-11-23 devnull lp[-1] = ' ';
347 bc7cb1a1 2003-11-23 devnull *lp = C;
349 bc7cb1a1 2003-11-23 devnull } else {
350 bc7cb1a1 2003-11-23 devnull if(msflag == 1 && eqnflag == 1) {
351 bc7cb1a1 2003-11-23 devnull eqnflag = 0;
352 bc7cb1a1 2003-11-23 devnull *++lp = 'x';
354 bc7cb1a1 2003-11-23 devnull *++lp = C;
357 bc7cb1a1 2003-11-23 devnull *lp = '\0';
358 bc7cb1a1 2003-11-23 devnull if(lp != line) {
359 bc7cb1a1 2003-11-23 devnull if(wordflag)
360 bc7cb1a1 2003-11-23 devnull putwords();
362 bc7cb1a1 2003-11-23 devnull if(macline)
363 bc7cb1a1 2003-11-23 devnull putmac(line,vconst);
365 bc7cb1a1 2003-11-23 devnull Bprint(&bout, "%S\n", line);
370 bc7cb1a1 2003-11-23 devnull putmac(Rune *rp, int vconst)
372 bc7cb1a1 2003-11-23 devnull Rune *t;
373 bc7cb1a1 2003-11-23 devnull int found;
374 bc7cb1a1 2003-11-23 devnull Rune last;
376 bc7cb1a1 2003-11-23 devnull found = 0;
377 bc7cb1a1 2003-11-23 devnull last = 0;
378 bc7cb1a1 2003-11-23 devnull while(*rp) {
379 bc7cb1a1 2003-11-23 devnull while(*rp == ' ' || *rp == '\t')
380 bc7cb1a1 2003-11-23 devnull Bputrune(&bout, *rp++);
381 bc7cb1a1 2003-11-23 devnull for(t = rp; *t != ' ' && *t != '\t' && *t != '\0'; t++)
383 bc7cb1a1 2003-11-23 devnull if(*rp == '\"')
385 bc7cb1a1 2003-11-23 devnull if(t > rp+vconst && charclass(*rp) == LETTER
386 bc7cb1a1 2003-11-23 devnull && charclass(rp[1]) == LETTER) {
387 bc7cb1a1 2003-11-23 devnull while(rp < t)
388 bc7cb1a1 2003-11-23 devnull if(*rp == '\"')
391 bc7cb1a1 2003-11-23 devnull Bputrune(&bout, *rp++);
392 bc7cb1a1 2003-11-23 devnull last = t[-1];
393 bc7cb1a1 2003-11-23 devnull found++;
395 bc7cb1a1 2003-11-23 devnull if(found && charclass(*rp) == PUNCT && rp[1] == '\0')
396 bc7cb1a1 2003-11-23 devnull Bputrune(&bout, *rp++);
398 bc7cb1a1 2003-11-23 devnull last = t[-1];
402 bc7cb1a1 2003-11-23 devnull Bputc(&bout, '\n');
403 bc7cb1a1 2003-11-23 devnull if(msflag && charclass(last) == PUNCT)
404 bc7cb1a1 2003-11-23 devnull Bprint(&bout, " %C\n", last);
408 bc7cb1a1 2003-11-23 devnull * break into words for -w option
411 bc7cb1a1 2003-11-23 devnull putwords(void)
413 bc7cb1a1 2003-11-23 devnull Rune *p, *p1;
414 bc7cb1a1 2003-11-23 devnull int i, nlet;
417 bc7cb1a1 2003-11-23 devnull for(p1 = line;;) {
419 bc7cb1a1 2003-11-23 devnull * skip initial specials ampersands and apostrophes
421 bc7cb1a1 2003-11-23 devnull while((i = charclass(*p1)) != EXTENDED && i < DIGIT)
422 bc7cb1a1 2003-11-23 devnull if(*p1++ == '\0')
424 bc7cb1a1 2003-11-23 devnull nlet = 0;
425 bc7cb1a1 2003-11-23 devnull for(p = p1; (i = charclass(*p)) != SPECIAL || (underscoreflag && *p=='_'); p++)
426 bc7cb1a1 2003-11-23 devnull if(i == LETTER || (underscoreflag && *p == '_'))
429 bc7cb1a1 2003-11-23 devnull * MDM definition of word
431 bc7cb1a1 2003-11-23 devnull if(nlet > 1) {
433 bc7cb1a1 2003-11-23 devnull * delete trailing ampersands and apostrophes
435 bc7cb1a1 2003-11-23 devnull while(*--p == '\'' || *p == '&'
436 bc7cb1a1 2003-11-23 devnull || charclass(*p) == PUNCT)
438 bc7cb1a1 2003-11-23 devnull while(p1 <= p)
439 bc7cb1a1 2003-11-23 devnull Bputrune(&bout, *p1++);
440 bc7cb1a1 2003-11-23 devnull Bputc(&bout, '\n');
447 bc7cb1a1 2003-11-23 devnull comline(void)
449 bc7cb1a1 2003-11-23 devnull long c1, c2;
451 bc7cb1a1 2003-11-23 devnull while(C==' ' || c=='\t')
454 bc7cb1a1 2003-11-23 devnull if((c1=c) == '\n')
457 bc7cb1a1 2003-11-23 devnull if(c1=='.' && c2!='.')
458 bc7cb1a1 2003-11-23 devnull inmacro = NO;
459 bc7cb1a1 2003-11-23 devnull if(msflag && c1 == '['){
460 bc7cb1a1 2003-11-23 devnull refer(c2);
463 bc7cb1a1 2003-11-23 devnull if(c2 == '\n')
465 bc7cb1a1 2003-11-23 devnull if(c1 == '\\' && c2 == '\"')
468 bc7cb1a1 2003-11-23 devnull if (filesp==files && c1=='E' && c2=='Q')
471 bc7cb1a1 2003-11-23 devnull if(filesp==files && c1=='T' && (c2=='S' || c2=='C' || c2=='&')) {
472 bc7cb1a1 2003-11-23 devnull if(msflag)
478 bc7cb1a1 2003-11-23 devnull if(c1=='T' && c2=='E')
479 bc7cb1a1 2003-11-23 devnull intable = NO;
480 bc7cb1a1 2003-11-23 devnull else if (!inmacro &&
481 bc7cb1a1 2003-11-23 devnull ((c1 == 'd' && c2 == 'e') ||
482 bc7cb1a1 2003-11-23 devnull (c1 == 'i' && c2 == 'g') ||
483 bc7cb1a1 2003-11-23 devnull (c1 == 'a' && c2 == 'm')))
484 bc7cb1a1 2003-11-23 devnull macro();
486 bc7cb1a1 2003-11-23 devnull if(c1=='s' && c2=='o') {
487 bc7cb1a1 2003-11-23 devnull if(iflag)
490 bc7cb1a1 2003-11-23 devnull getfname();
491 bc7cb1a1 2003-11-23 devnull if(fname[0]) {
492 bc7cb1a1 2003-11-23 devnull if(infile = opn(fname))
493 bc7cb1a1 2003-11-23 devnull *++filesp = infile;
494 bc7cb1a1 2003-11-23 devnull else infile = *filesp;
499 bc7cb1a1 2003-11-23 devnull if(c1=='n' && c2=='x')
500 bc7cb1a1 2003-11-23 devnull if(iflag)
503 bc7cb1a1 2003-11-23 devnull getfname();
504 bc7cb1a1 2003-11-23 devnull if(fname[0] == '\0')
505 bc7cb1a1 2003-11-23 devnull exits(0);
506 bc7cb1a1 2003-11-23 devnull if(Bfildes(infile) != 0)
507 bc7cb1a1 2003-11-23 devnull Bterm(infile);
508 bc7cb1a1 2003-11-23 devnull infile = *filesp = opn(fname);
511 bc7cb1a1 2003-11-23 devnull if(c1 == 't' && c2 == 'm')
514 bc7cb1a1 2003-11-23 devnull if(c1=='h' && c2=='w')
517 bc7cb1a1 2003-11-23 devnull if(msflag && c1 == 'T' && c2 == 'L') {
518 bc7cb1a1 2003-11-23 devnull SKIP_TO_COM;
519 bc7cb1a1 2003-11-23 devnull goto comx;
522 bc7cb1a1 2003-11-23 devnull if(msflag && c1=='N' && c2 == 'R')
525 bc7cb1a1 2003-11-23 devnull if(msflag && c1 == 'A' && (c2 == 'U' || c2 == 'I')){
526 bc7cb1a1 2003-11-23 devnull if(mac==MM)SKIP;
528 bc7cb1a1 2003-11-23 devnull SKIP_TO_COM;
529 bc7cb1a1 2003-11-23 devnull goto comx;
532 bc7cb1a1 2003-11-23 devnull if(msflag && c1=='F' && c2=='S') {
533 bc7cb1a1 2003-11-23 devnull SKIP_TO_COM;
534 bc7cb1a1 2003-11-23 devnull goto comx;
537 bc7cb1a1 2003-11-23 devnull if(msflag && (c1=='S' || c1=='N') && c2=='H') {
538 bc7cb1a1 2003-11-23 devnull SKIP_TO_COM;
539 bc7cb1a1 2003-11-23 devnull goto comx;
541 bc7cb1a1 2003-11-23 devnull if(c1 == 'U' && c2 == 'X') {
542 bc7cb1a1 2003-11-23 devnull if(wordflag)
543 bc7cb1a1 2003-11-23 devnull Bprint(&bout, "UNIX\n");
545 bc7cb1a1 2003-11-23 devnull Bprint(&bout, "UNIX ");
547 bc7cb1a1 2003-11-23 devnull if(msflag && c1=='O' && c2=='K') {
548 bc7cb1a1 2003-11-23 devnull SKIP_TO_COM;
549 bc7cb1a1 2003-11-23 devnull goto comx;
551 bc7cb1a1 2003-11-23 devnull if(msflag && c1=='N' && c2=='D')
554 bc7cb1a1 2003-11-23 devnull if(msflag && mac==MM && c1=='H' && (c2==' '||c2=='U'))
557 bc7cb1a1 2003-11-23 devnull if(msflag && mac==MM && c2=='L') {
558 bc7cb1a1 2003-11-23 devnull if(disp || c1=='R')
559 bc7cb1a1 2003-11-23 devnull sdis('L', 'E');
562 bc7cb1a1 2003-11-23 devnull Bprint(&bout, " .");
565 bc7cb1a1 2003-11-23 devnull if(!msflag && c1=='P' && c2=='S') {
566 bc7cb1a1 2003-11-23 devnull inpic();
568 bc7cb1a1 2003-11-23 devnull if(msflag && (c1=='D' || c1=='N' || c1=='K'|| c1=='P') && c2=='S') {
569 bc7cb1a1 2003-11-23 devnull sdis(c1, 'E');
571 bc7cb1a1 2003-11-23 devnull if(msflag && (c1 == 'K' && c2 == 'F')) {
572 bc7cb1a1 2003-11-23 devnull sdis(c1,'E');
574 bc7cb1a1 2003-11-23 devnull if(msflag && c1=='n' && c2=='f')
575 bc7cb1a1 2003-11-23 devnull sdis('f','i');
577 bc7cb1a1 2003-11-23 devnull if(msflag && c1=='c' && c2=='e')
580 bc7cb1a1 2003-11-23 devnull if(c1=='.' && c2=='.') {
581 bc7cb1a1 2003-11-23 devnull if(msflag) {
585 bc7cb1a1 2003-11-23 devnull while(C == '.')
588 bc7cb1a1 2003-11-23 devnull inmacro++;
589 bc7cb1a1 2003-11-23 devnull if(c1 <= 'Z' && msflag)
590 bc7cb1a1 2003-11-23 devnull regline(YES,ONE);
592 bc7cb1a1 2003-11-23 devnull if(wordflag)
594 bc7cb1a1 2003-11-23 devnull regline(YES,TWO);
596 bc7cb1a1 2003-11-23 devnull inmacro--;
601 bc7cb1a1 2003-11-23 devnull macro(void)
603 bc7cb1a1 2003-11-23 devnull if(msflag) {
606 bc7cb1a1 2003-11-23 devnull } while(C1 != '.' || C1 != '.' || C1 == '.');
607 bc7cb1a1 2003-11-23 devnull if(c != '\n')
612 bc7cb1a1 2003-11-23 devnull inmacro = YES;
616 bc7cb1a1 2003-11-23 devnull sdis(char a1, char a2)
618 bc7cb1a1 2003-11-23 devnull int c1, c2;
619 bc7cb1a1 2003-11-23 devnull int eqnf;
620 bc7cb1a1 2003-11-23 devnull int lct;
622 bc7cb1a1 2003-11-23 devnull if(a1 == 'P'){
623 bc7cb1a1 2003-11-23 devnull while(C1 == ' ')
625 bc7cb1a1 2003-11-23 devnull if(c == '<') {
630 bc7cb1a1 2003-11-23 devnull lct = 0;
631 bc7cb1a1 2003-11-23 devnull eqnf = 1;
632 bc7cb1a1 2003-11-23 devnull if(c != '\n')
634 bc7cb1a1 2003-11-23 devnull for(;;) {
635 bc7cb1a1 2003-11-23 devnull while(C1 != '.')
636 bc7cb1a1 2003-11-23 devnull if(c == '\n')
637 bc7cb1a1 2003-11-23 devnull continue;
640 bc7cb1a1 2003-11-23 devnull if((c1=C1) == '\n')
641 bc7cb1a1 2003-11-23 devnull continue;
642 bc7cb1a1 2003-11-23 devnull if((c2=C1) == '\n') {
643 bc7cb1a1 2003-11-23 devnull if(a1 == 'f' && (c1 == 'P' || c1 == 'H'))
645 bc7cb1a1 2003-11-23 devnull continue;
647 bc7cb1a1 2003-11-23 devnull if(c1==a1 && c2 == a2) {
649 bc7cb1a1 2003-11-23 devnull if(lct != 0){
651 bc7cb1a1 2003-11-23 devnull continue;
653 bc7cb1a1 2003-11-23 devnull if(eqnf)
654 bc7cb1a1 2003-11-23 devnull Bprint(&bout, " .");
655 bc7cb1a1 2003-11-23 devnull Bputc(&bout, '\n');
658 bc7cb1a1 2003-11-23 devnull if(a1 == 'L' && c2 == 'L') {
662 bc7cb1a1 2003-11-23 devnull if(a1 == 'D' && c1 == 'E' && c2 == 'Q') {
664 bc7cb1a1 2003-11-23 devnull eqnf = 0;
666 bc7cb1a1 2003-11-23 devnull if(a1 == 'f') {
667 bc7cb1a1 2003-11-23 devnull if((mac == MS && c2 == 'P') ||
668 bc7cb1a1 2003-11-23 devnull (mac == MM && c1 == 'H' && c2 == 'U')){
680 bc7cb1a1 2003-11-23 devnull tbl(void)
682 bc7cb1a1 2003-11-23 devnull while(C != '.')
685 bc7cb1a1 2003-11-23 devnull intable = YES;
689 bc7cb1a1 2003-11-23 devnull stbl(void)
691 bc7cb1a1 2003-11-23 devnull while(C != '.')
693 bc7cb1a1 2003-11-23 devnull SKIP_TO_COM;
694 bc7cb1a1 2003-11-23 devnull if(c != 'T' || C != 'E') {
697 bc7cb1a1 2003-11-23 devnull while(C != '.' || pc != '\n' || C != 'T' || C != 'E')
703 bc7cb1a1 2003-11-23 devnull eqn(void)
705 bc7cb1a1 2003-11-23 devnull long c1, c2;
706 bc7cb1a1 2003-11-23 devnull int dflg;
707 bc7cb1a1 2003-11-23 devnull char last;
709 bc7cb1a1 2003-11-23 devnull last = 0;
710 bc7cb1a1 2003-11-23 devnull dflg = 1;
713 bc7cb1a1 2003-11-23 devnull for(;;) {
714 bc7cb1a1 2003-11-23 devnull if(C1 == '.' || c == '\'') {
715 bc7cb1a1 2003-11-23 devnull while(C1==' ' || c=='\t')
717 bc7cb1a1 2003-11-23 devnull if(c=='E' && C1=='N') {
719 bc7cb1a1 2003-11-23 devnull if(msflag && dflg) {
720 bc7cb1a1 2003-11-23 devnull Bputc(&bout, 'x');
721 bc7cb1a1 2003-11-23 devnull Bputc(&bout, ' ');
722 bc7cb1a1 2003-11-23 devnull if(last) {
723 bc7cb1a1 2003-11-23 devnull Bputc(&bout, last);
724 bc7cb1a1 2003-11-23 devnull Bputc(&bout, '\n');
730 bc7cb1a1 2003-11-23 devnull if(c == 'd') {
731 bc7cb1a1 2003-11-23 devnull if(C1=='e' && C1=='l')
732 bc7cb1a1 2003-11-23 devnull if(C1=='i' && C1=='m') {
733 bc7cb1a1 2003-11-23 devnull while(C1 == ' ')
735 bc7cb1a1 2003-11-23 devnull if((c1=c)=='\n' || (c2=C1)=='\n' ||
736 bc7cb1a1 2003-11-23 devnull (c1=='o' && c2=='f' && C1=='f')) {
737 bc7cb1a1 2003-11-23 devnull ldelim = NOCHAR;
738 bc7cb1a1 2003-11-23 devnull rdelim = NOCHAR;
739 bc7cb1a1 2003-11-23 devnull } else {
740 bc7cb1a1 2003-11-23 devnull ldelim = c1;
741 bc7cb1a1 2003-11-23 devnull rdelim = c2;
744 bc7cb1a1 2003-11-23 devnull dflg = 0;
746 bc7cb1a1 2003-11-23 devnull if(c != '\n')
747 bc7cb1a1 2003-11-23 devnull while(C1 != '\n') {
748 bc7cb1a1 2003-11-23 devnull if(chars[c] == PUNCT)
749 bc7cb1a1 2003-11-23 devnull last = c;
751 bc7cb1a1 2003-11-23 devnull if(c != ' ')
752 bc7cb1a1 2003-11-23 devnull last = 0;
758 bc7cb1a1 2003-11-23 devnull * skip over a complete backslash vconstruction
761 bc7cb1a1 2003-11-23 devnull backsl(void)
763 bc7cb1a1 2003-11-23 devnull int bdelim;
766 bc7cb1a1 2003-11-23 devnull switch(C1)
768 bc7cb1a1 2003-11-23 devnull case '"':
772 bc7cb1a1 2003-11-23 devnull case 's':
773 bc7cb1a1 2003-11-23 devnull if(C1 == '\\')
774 bc7cb1a1 2003-11-23 devnull backsl();
776 bc7cb1a1 2003-11-23 devnull while(C1>='0' && c<='9')
778 bc7cb1a1 2003-11-23 devnull Bungetrune(infile);
779 bc7cb1a1 2003-11-23 devnull c = '0';
784 bc7cb1a1 2003-11-23 devnull case 'f':
785 bc7cb1a1 2003-11-23 devnull case 'n':
786 bc7cb1a1 2003-11-23 devnull case '*':
787 bc7cb1a1 2003-11-23 devnull if(C1 != '(')
790 bc7cb1a1 2003-11-23 devnull case '(':
791 bc7cb1a1 2003-11-23 devnull if(msflag) {
792 bc7cb1a1 2003-11-23 devnull if(C == 'e') {
793 bc7cb1a1 2003-11-23 devnull if(C1 == 'm') {
794 bc7cb1a1 2003-11-23 devnull *lp = '-';
798 bc7cb1a1 2003-11-23 devnull if(c != '\n')
802 bc7cb1a1 2003-11-23 devnull if(C1 != '\n')
806 bc7cb1a1 2003-11-23 devnull case '$':
807 bc7cb1a1 2003-11-23 devnull C1; /* discard argument number */
810 bc7cb1a1 2003-11-23 devnull case 'b':
811 bc7cb1a1 2003-11-23 devnull case 'x':
812 bc7cb1a1 2003-11-23 devnull case 'v':
813 bc7cb1a1 2003-11-23 devnull case 'h':
814 bc7cb1a1 2003-11-23 devnull case 'w':
815 bc7cb1a1 2003-11-23 devnull case 'o':
816 bc7cb1a1 2003-11-23 devnull case 'l':
817 bc7cb1a1 2003-11-23 devnull case 'L':
818 bc7cb1a1 2003-11-23 devnull if((bdelim=C1) == '\n')
820 bc7cb1a1 2003-11-23 devnull while(C1!='\n' && c!=bdelim)
821 bc7cb1a1 2003-11-23 devnull if(c == '\\')
822 bc7cb1a1 2003-11-23 devnull backsl();
825 bc7cb1a1 2003-11-23 devnull case '\\':
826 bc7cb1a1 2003-11-23 devnull if(inmacro)
827 bc7cb1a1 2003-11-23 devnull goto sw;
828 bc7cb1a1 2003-11-23 devnull default:
834 bc7cb1a1 2003-11-23 devnull copys(char *s)
836 bc7cb1a1 2003-11-23 devnull char *t, *t0;
838 bc7cb1a1 2003-11-23 devnull if((t0 = t = malloc((strlen(s)+1))) == 0)
839 bc7cb1a1 2003-11-23 devnull fatal("Cannot allocate memory", (char*)0);
840 bc7cb1a1 2003-11-23 devnull while(*t++ = *s++)
842 bc7cb1a1 2003-11-23 devnull return(t0);
846 bc7cb1a1 2003-11-23 devnull sce(void)
848 bc7cb1a1 2003-11-23 devnull int n = 1;
850 bb0266fe 2005-05-07 devnull while (C != '\n' && !('0' <= c && c <= '9'))
852 bb0266fe 2005-05-07 devnull if (c != '\n') {
853 bb0266fe 2005-05-07 devnull for (n = c-'0';'0' <= C && c <= '9';)
854 bb0266fe 2005-05-07 devnull n = n*10 + c-'0';
856 bc7cb1a1 2003-11-23 devnull while(n) {
857 bc7cb1a1 2003-11-23 devnull if(C == '.') {
858 bc7cb1a1 2003-11-23 devnull if(C == 'c') {
859 bc7cb1a1 2003-11-23 devnull if(C == 'e') {
860 bc7cb1a1 2003-11-23 devnull while(C == ' ')
862 bc7cb1a1 2003-11-23 devnull if(c == '0') {
870 bc7cb1a1 2003-11-23 devnull if(c == 'P' || C == 'P') {
871 bc7cb1a1 2003-11-23 devnull if(c != '\n')
875 bc7cb1a1 2003-11-23 devnull if(c != '\n')
877 bc7cb1a1 2003-11-23 devnull } else {
885 bc7cb1a1 2003-11-23 devnull refer(int c1)
889 bc7cb1a1 2003-11-23 devnull if(c1 != '\n')
892 bc7cb1a1 2003-11-23 devnull for(;;) {
893 bc7cb1a1 2003-11-23 devnull if(C != '.')
896 bc7cb1a1 2003-11-23 devnull if(C != ']')
899 bc7cb1a1 2003-11-23 devnull while(C != '\n')
901 bc7cb1a1 2003-11-23 devnull if(charclass(c2) == PUNCT)
902 bc7cb1a1 2003-11-23 devnull Bprint(&bout, " %C",c2);
910 bc7cb1a1 2003-11-23 devnull inpic(void)
913 bc7cb1a1 2003-11-23 devnull Rune *p1;
915 bc7cb1a1 2003-11-23 devnull /* SKIP1;*/
916 bc7cb1a1 2003-11-23 devnull while(C1 != '\n')
917 bc7cb1a1 2003-11-23 devnull if(c == '<'){
921 bc7cb1a1 2003-11-23 devnull p1 = line;
922 bc7cb1a1 2003-11-23 devnull c = '\n';
923 bc7cb1a1 2003-11-23 devnull for(;;) {
925 bc7cb1a1 2003-11-23 devnull if(C1 == '.' && c1 == '\n') {
926 bc7cb1a1 2003-11-23 devnull if(C1 != 'P' || C1 != 'E') {
927 bc7cb1a1 2003-11-23 devnull if(c != '\n'){
929 bc7cb1a1 2003-11-23 devnull c = '\n';
931 bc7cb1a1 2003-11-23 devnull continue;
936 bc7cb1a1 2003-11-23 devnull if(c == '\"') {
937 bc7cb1a1 2003-11-23 devnull while(C1 != '\"') {
938 bc7cb1a1 2003-11-23 devnull if(c == '\\') {
939 bc7cb1a1 2003-11-23 devnull if(C1 == '\"')
940 bc7cb1a1 2003-11-23 devnull continue;
941 bc7cb1a1 2003-11-23 devnull Bungetrune(infile);
942 bc7cb1a1 2003-11-23 devnull backsl();
944 bc7cb1a1 2003-11-23 devnull *p1++ = c;
946 bc7cb1a1 2003-11-23 devnull *p1++ = ' ';
948 bc7cb1a1 2003-11-23 devnull if(c == '\n' && p1 != line) {
949 bc7cb1a1 2003-11-23 devnull *p1 = '\0';
950 bc7cb1a1 2003-11-23 devnull if(wordflag)
951 bc7cb1a1 2003-11-23 devnull putwords();
953 bc7cb1a1 2003-11-23 devnull Bprint(&bout, "%S\n\n", line);
954 bc7cb1a1 2003-11-23 devnull p1 = line;
960 bc7cb1a1 2003-11-23 devnull charclass(int c)
962 bc7cb1a1 2003-11-23 devnull if(c < MAX_ASCII)
963 bc7cb1a1 2003-11-23 devnull return chars[c];
964 bc7cb1a1 2003-11-23 devnull switch(c){
965 bc7cb1a1 2003-11-23 devnull case 0x2013: case 0x2014: /* en dash, em dash */
966 bc7cb1a1 2003-11-23 devnull return SPECIAL;
968 bc7cb1a1 2003-11-23 devnull return EXTENDED;