Blame


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>
4 bc7cb1a1 2003-11-23 devnull
5 bc7cb1a1 2003-11-23 devnull /*
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.
16 fa325e9b 2020-01-10 cross *
17 bc7cb1a1 2003-11-23 devnull * All input is through the C macro; the most recently read character is in c.
18 bc7cb1a1 2003-11-23 devnull */
19 bc7cb1a1 2003-11-23 devnull
20 bc7cb1a1 2003-11-23 devnull /*
21 bc7cb1a1 2003-11-23 devnull #define C ((c = Bgetrune(infile)) < 0?\
22 bc7cb1a1 2003-11-23 devnull eof():\
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):\
27 bc7cb1a1 2003-11-23 devnull c)))
28 bc7cb1a1 2003-11-23 devnull
29 bc7cb1a1 2003-11-23 devnull #define C1 ((c = Bgetrune(infile)) == Beof?\
30 bc7cb1a1 2003-11-23 devnull eof():\
31 bc7cb1a1 2003-11-23 devnull (c == '\n'?\
32 bc7cb1a1 2003-11-23 devnull (linect++,c):\
33 bc7cb1a1 2003-11-23 devnull c))
34 bc7cb1a1 2003-11-23 devnull */
35 bc7cb1a1 2003-11-23 devnull
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()
39 bc7cb1a1 2003-11-23 devnull
40 fa325e9b 2020-01-10 cross #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;\
43 bc7cb1a1 2003-11-23 devnull SKIP;\
44 bc7cb1a1 2003-11-23 devnull pc=c;\
45 bc7cb1a1 2003-11-23 devnull while(C != '.' || pc != '\n' || C > 'Z')\
46 bc7cb1a1 2003-11-23 devnull pc=c
47 bc7cb1a1 2003-11-23 devnull
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
54 bc7cb1a1 2003-11-23 devnull
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
62 bc7cb1a1 2003-11-23 devnull
63 bc7cb1a1 2003-11-23 devnull
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;
74 bc7cb1a1 2003-11-23 devnull
75 bc7cb1a1 2003-11-23 devnull #define MAX_ASCII 0X80
76 bc7cb1a1 2003-11-23 devnull
77 bc7cb1a1 2003-11-23 devnull char chars[MAX_ASCII]; /* SPECIAL, PUNCT, APOS, DIGIT, or LETTER */
78 bc7cb1a1 2003-11-23 devnull
79 bc7cb1a1 2003-11-23 devnull Rune line[30000];
80 bc7cb1a1 2003-11-23 devnull Rune* lp;
81 bc7cb1a1 2003-11-23 devnull
82 bc7cb1a1 2003-11-23 devnull long c;
83 bc7cb1a1 2003-11-23 devnull long pc;
84 bc7cb1a1 2003-11-23 devnull int ldelim = NOCHAR;
85 bc7cb1a1 2003-11-23 devnull int rdelim = NOCHAR;
86 bc7cb1a1 2003-11-23 devnull
87 bc7cb1a1 2003-11-23 devnull
88 bc7cb1a1 2003-11-23 devnull char** argv;
89 bc7cb1a1 2003-11-23 devnull
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;
97 bc7cb1a1 2003-11-23 devnull
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);
120 bc7cb1a1 2003-11-23 devnull
121 bc7cb1a1 2003-11-23 devnull int
122 bc7cb1a1 2003-11-23 devnull fC(void)
123 bc7cb1a1 2003-11-23 devnull {
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;
132 bc7cb1a1 2003-11-23 devnull }
133 bc7cb1a1 2003-11-23 devnull
134 bc7cb1a1 2003-11-23 devnull int
135 bc7cb1a1 2003-11-23 devnull fC1(void)
136 bc7cb1a1 2003-11-23 devnull {
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;
143 bc7cb1a1 2003-11-23 devnull }
144 bc7cb1a1 2003-11-23 devnull
145 bc7cb1a1 2003-11-23 devnull void
146 bc7cb1a1 2003-11-23 devnull main(int argc, char *av[])
147 bc7cb1a1 2003-11-23 devnull {
148 bc7cb1a1 2003-11-23 devnull int i;
149 bc7cb1a1 2003-11-23 devnull char *f;
150 bc7cb1a1 2003-11-23 devnull
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;
156 bc7cb1a1 2003-11-23 devnull break;
157 bc7cb1a1 2003-11-23 devnull case '_':
158 bc7cb1a1 2003-11-23 devnull wordflag = YES;
159 bc7cb1a1 2003-11-23 devnull underscoreflag = YES;
160 bc7cb1a1 2003-11-23 devnull break;
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)
165 bc7cb1a1 2003-11-23 devnull {
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();
170 bc7cb1a1 2003-11-23 devnull }
171 bc7cb1a1 2003-11-23 devnull else
172 bc7cb1a1 2003-11-23 devnull usage();
173 bc7cb1a1 2003-11-23 devnull break;
174 bc7cb1a1 2003-11-23 devnull case 'i':
175 bc7cb1a1 2003-11-23 devnull iflag = YES;
176 bc7cb1a1 2003-11-23 devnull break;
177 bc7cb1a1 2003-11-23 devnull default:
178 bc7cb1a1 2003-11-23 devnull usage();
179 bc7cb1a1 2003-11-23 devnull }ARGEND
180 bc7cb1a1 2003-11-23 devnull if(*argv)
181 bc7cb1a1 2003-11-23 devnull infile = opn(*argv++);
182 bc7cb1a1 2003-11-23 devnull else{
183 bc7cb1a1 2003-11-23 devnull infile = malloc(sizeof(Biobuf));
184 bc7cb1a1 2003-11-23 devnull Binit(infile, 0, OREAD);
185 bc7cb1a1 2003-11-23 devnull }
186 bc7cb1a1 2003-11-23 devnull files[0] = infile;
187 bc7cb1a1 2003-11-23 devnull filesp = &files[0];
188 bc7cb1a1 2003-11-23 devnull
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;
203 bc7cb1a1 2003-11-23 devnull work();
204 bc7cb1a1 2003-11-23 devnull }
205 bc7cb1a1 2003-11-23 devnull
206 bc7cb1a1 2003-11-23 devnull long
207 bc7cb1a1 2003-11-23 devnull skeqn(void)
208 bc7cb1a1 2003-11-23 devnull {
209 bc7cb1a1 2003-11-23 devnull while(C1 != rdelim)
210 bc7cb1a1 2003-11-23 devnull if(c == '\\')
211 bc7cb1a1 2003-11-23 devnull c = C1;
212 bc7cb1a1 2003-11-23 devnull else if(c == '"')
213 bc7cb1a1 2003-11-23 devnull while(C1 != '"')
214 fa325e9b 2020-01-10 cross if(c == '\\')
215 bc7cb1a1 2003-11-23 devnull C1;
216 bc7cb1a1 2003-11-23 devnull if (msflag)
217 bc7cb1a1 2003-11-23 devnull eqnflag = 1;
218 bc7cb1a1 2003-11-23 devnull return(c = ' ');
219 bc7cb1a1 2003-11-23 devnull }
220 bc7cb1a1 2003-11-23 devnull
221 bc7cb1a1 2003-11-23 devnull Biobuf*
222 bc7cb1a1 2003-11-23 devnull opn(char *p)
223 bc7cb1a1 2003-11-23 devnull {
224 bc7cb1a1 2003-11-23 devnull Biobuf *fd;
225 bc7cb1a1 2003-11-23 devnull
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);
229 bc7cb1a1 2003-11-23 devnull else {
230 bc7cb1a1 2003-11-23 devnull fprint(2, "Deroff: Cannot open file %s - continuing\n", p);
231 bc7cb1a1 2003-11-23 devnull p = devnull;
232 bc7cb1a1 2003-11-23 devnull }
233 bc7cb1a1 2003-11-23 devnull }
234 bc7cb1a1 2003-11-23 devnull linect = 0;
235 bc7cb1a1 2003-11-23 devnull return(fd);
236 bc7cb1a1 2003-11-23 devnull }
237 bc7cb1a1 2003-11-23 devnull
238 bc7cb1a1 2003-11-23 devnull int
239 bc7cb1a1 2003-11-23 devnull eof(void)
240 bc7cb1a1 2003-11-23 devnull {
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;
245 bc7cb1a1 2003-11-23 devnull else
246 bc7cb1a1 2003-11-23 devnull if(*argv)
247 bc7cb1a1 2003-11-23 devnull infile = opn(*argv++);
248 bc7cb1a1 2003-11-23 devnull else
249 bc7cb1a1 2003-11-23 devnull exits(0);
250 bc7cb1a1 2003-11-23 devnull return(C);
251 bc7cb1a1 2003-11-23 devnull }
252 bc7cb1a1 2003-11-23 devnull
253 bc7cb1a1 2003-11-23 devnull void
254 bc7cb1a1 2003-11-23 devnull getfname(void)
255 bc7cb1a1 2003-11-23 devnull {
256 bc7cb1a1 2003-11-23 devnull char *p;
257 bc7cb1a1 2003-11-23 devnull Rune r;
258 bc7cb1a1 2003-11-23 devnull Dir *dir;
259 bc7cb1a1 2003-11-23 devnull struct chain
260 fa325e9b 2020-01-10 cross {
261 fa325e9b 2020-01-10 cross struct chain* nextp;
262 fa325e9b 2020-01-10 cross char* datap;
263 bc7cb1a1 2003-11-23 devnull } *q;
264 bc7cb1a1 2003-11-23 devnull
265 bc7cb1a1 2003-11-23 devnull static struct chain *namechain= 0;
266 bc7cb1a1 2003-11-23 devnull
267 bc7cb1a1 2003-11-23 devnull while(C == ' ')
268 bc7cb1a1 2003-11-23 devnull ;
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')
273 bc7cb1a1 2003-11-23 devnull C;
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';
277 bc7cb1a1 2003-11-23 devnull return;
278 bc7cb1a1 2003-11-23 devnull }
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';
283 bc7cb1a1 2003-11-23 devnull return;
284 bc7cb1a1 2003-11-23 devnull }
285 bc7cb1a1 2003-11-23 devnull free(dir);
286 bc7cb1a1 2003-11-23 devnull /*
287 bc7cb1a1 2003-11-23 devnull * see if this name has already been used
288 bc7cb1a1 2003-11-23 devnull */
289 bc7cb1a1 2003-11-23 devnull
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';
293 bc7cb1a1 2003-11-23 devnull return;
294 bc7cb1a1 2003-11-23 devnull }
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;
299 bc7cb1a1 2003-11-23 devnull }
300 bc7cb1a1 2003-11-23 devnull
301 bc7cb1a1 2003-11-23 devnull void
302 bc7cb1a1 2003-11-23 devnull usage(void)
303 bc7cb1a1 2003-11-23 devnull {
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");
306 bc7cb1a1 2003-11-23 devnull }
307 bc7cb1a1 2003-11-23 devnull
308 bc7cb1a1 2003-11-23 devnull void
309 bc7cb1a1 2003-11-23 devnull fatal(char *s, char *p)
310 bc7cb1a1 2003-11-23 devnull {
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);
314 bc7cb1a1 2003-11-23 devnull }
315 bc7cb1a1 2003-11-23 devnull
316 bc7cb1a1 2003-11-23 devnull void
317 bc7cb1a1 2003-11-23 devnull work(void)
318 bc7cb1a1 2003-11-23 devnull {
319 bc7cb1a1 2003-11-23 devnull
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();
324 bc7cb1a1 2003-11-23 devnull else
325 bc7cb1a1 2003-11-23 devnull regline(NO, TWO);
326 bc7cb1a1 2003-11-23 devnull }
327 bc7cb1a1 2003-11-23 devnull }
328 bc7cb1a1 2003-11-23 devnull
329 bc7cb1a1 2003-11-23 devnull void
330 bc7cb1a1 2003-11-23 devnull regline(int macline, int vconst)
331 bc7cb1a1 2003-11-23 devnull {
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 */
339 bc7cb1a1 2003-11-23 devnull lp--;
340 bc7cb1a1 2003-11-23 devnull }
341 bc7cb1a1 2003-11-23 devnull if(c == '\n')
342 bc7cb1a1 2003-11-23 devnull break;
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;
348 bc7cb1a1 2003-11-23 devnull }
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';
353 bc7cb1a1 2003-11-23 devnull }
354 bc7cb1a1 2003-11-23 devnull *++lp = C;
355 bc7cb1a1 2003-11-23 devnull }
356 bc7cb1a1 2003-11-23 devnull }
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();
361 bc7cb1a1 2003-11-23 devnull else
362 bc7cb1a1 2003-11-23 devnull if(macline)
363 bc7cb1a1 2003-11-23 devnull putmac(line,vconst);
364 bc7cb1a1 2003-11-23 devnull else
365 bc7cb1a1 2003-11-23 devnull Bprint(&bout, "%S\n", line);
366 bc7cb1a1 2003-11-23 devnull }
367 bc7cb1a1 2003-11-23 devnull }
368 bc7cb1a1 2003-11-23 devnull
369 bc7cb1a1 2003-11-23 devnull void
370 bc7cb1a1 2003-11-23 devnull putmac(Rune *rp, int vconst)
371 bc7cb1a1 2003-11-23 devnull {
372 bc7cb1a1 2003-11-23 devnull Rune *t;
373 bc7cb1a1 2003-11-23 devnull int found;
374 bc7cb1a1 2003-11-23 devnull Rune last;
375 bc7cb1a1 2003-11-23 devnull
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++)
382 bc7cb1a1 2003-11-23 devnull ;
383 bc7cb1a1 2003-11-23 devnull if(*rp == '\"')
384 bc7cb1a1 2003-11-23 devnull 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 == '\"')
389 bc7cb1a1 2003-11-23 devnull rp++;
390 bc7cb1a1 2003-11-23 devnull else
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++;
394 bc7cb1a1 2003-11-23 devnull } else
395 bc7cb1a1 2003-11-23 devnull if(found && charclass(*rp) == PUNCT && rp[1] == '\0')
396 bc7cb1a1 2003-11-23 devnull Bputrune(&bout, *rp++);
397 bc7cb1a1 2003-11-23 devnull else {
398 bc7cb1a1 2003-11-23 devnull last = t[-1];
399 bc7cb1a1 2003-11-23 devnull rp = t;
400 bc7cb1a1 2003-11-23 devnull }
401 bc7cb1a1 2003-11-23 devnull }
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);
405 bc7cb1a1 2003-11-23 devnull }
406 bc7cb1a1 2003-11-23 devnull
407 bc7cb1a1 2003-11-23 devnull /*
408 bc7cb1a1 2003-11-23 devnull * break into words for -w option
409 bc7cb1a1 2003-11-23 devnull */
410 bc7cb1a1 2003-11-23 devnull void
411 bc7cb1a1 2003-11-23 devnull putwords(void)
412 bc7cb1a1 2003-11-23 devnull {
413 bc7cb1a1 2003-11-23 devnull Rune *p, *p1;
414 bc7cb1a1 2003-11-23 devnull int i, nlet;
415 bc7cb1a1 2003-11-23 devnull
416 bc7cb1a1 2003-11-23 devnull
417 bc7cb1a1 2003-11-23 devnull for(p1 = line;;) {
418 bc7cb1a1 2003-11-23 devnull /*
419 bc7cb1a1 2003-11-23 devnull * skip initial specials ampersands and apostrophes
420 bc7cb1a1 2003-11-23 devnull */
421 bc7cb1a1 2003-11-23 devnull while((i = charclass(*p1)) != EXTENDED && i < DIGIT)
422 bc7cb1a1 2003-11-23 devnull if(*p1++ == '\0')
423 bc7cb1a1 2003-11-23 devnull return;
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 == '_'))
427 bc7cb1a1 2003-11-23 devnull nlet++;
428 bc7cb1a1 2003-11-23 devnull /*
429 bc7cb1a1 2003-11-23 devnull * MDM definition of word
430 bc7cb1a1 2003-11-23 devnull */
431 bc7cb1a1 2003-11-23 devnull if(nlet > 1) {
432 bc7cb1a1 2003-11-23 devnull /*
433 bc7cb1a1 2003-11-23 devnull * delete trailing ampersands and apostrophes
434 bc7cb1a1 2003-11-23 devnull */
435 bc7cb1a1 2003-11-23 devnull while(*--p == '\'' || *p == '&'
436 bc7cb1a1 2003-11-23 devnull || charclass(*p) == PUNCT)
437 bc7cb1a1 2003-11-23 devnull ;
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');
441 bc7cb1a1 2003-11-23 devnull } else
442 bc7cb1a1 2003-11-23 devnull p1 = p;
443 bc7cb1a1 2003-11-23 devnull }
444 bc7cb1a1 2003-11-23 devnull }
445 bc7cb1a1 2003-11-23 devnull
446 bc7cb1a1 2003-11-23 devnull void
447 bc7cb1a1 2003-11-23 devnull comline(void)
448 bc7cb1a1 2003-11-23 devnull {
449 bc7cb1a1 2003-11-23 devnull long c1, c2;
450 bc7cb1a1 2003-11-23 devnull
451 bc7cb1a1 2003-11-23 devnull while(C==' ' || c=='\t')
452 bc7cb1a1 2003-11-23 devnull ;
453 bc7cb1a1 2003-11-23 devnull comx:
454 bc7cb1a1 2003-11-23 devnull if((c1=c) == '\n')
455 bc7cb1a1 2003-11-23 devnull return;
456 bc7cb1a1 2003-11-23 devnull c2 = C;
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);
461 bc7cb1a1 2003-11-23 devnull return;
462 bc7cb1a1 2003-11-23 devnull }
463 bc7cb1a1 2003-11-23 devnull if(c2 == '\n')
464 bc7cb1a1 2003-11-23 devnull return;
465 bc7cb1a1 2003-11-23 devnull if(c1 == '\\' && c2 == '\"')
466 bc7cb1a1 2003-11-23 devnull SKIP;
467 bc7cb1a1 2003-11-23 devnull else
468 bc7cb1a1 2003-11-23 devnull if (filesp==files && c1=='E' && c2=='Q')
469 bc7cb1a1 2003-11-23 devnull eqn();
470 bc7cb1a1 2003-11-23 devnull else
471 bc7cb1a1 2003-11-23 devnull if(filesp==files && c1=='T' && (c2=='S' || c2=='C' || c2=='&')) {
472 bc7cb1a1 2003-11-23 devnull if(msflag)
473 fa325e9b 2020-01-10 cross stbl();
474 bc7cb1a1 2003-11-23 devnull else
475 bc7cb1a1 2003-11-23 devnull tbl();
476 bc7cb1a1 2003-11-23 devnull }
477 bc7cb1a1 2003-11-23 devnull else
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();
485 bc7cb1a1 2003-11-23 devnull else
486 bc7cb1a1 2003-11-23 devnull if(c1=='s' && c2=='o') {
487 bc7cb1a1 2003-11-23 devnull if(iflag)
488 bc7cb1a1 2003-11-23 devnull SKIP;
489 bc7cb1a1 2003-11-23 devnull else {
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;
495 bc7cb1a1 2003-11-23 devnull }
496 bc7cb1a1 2003-11-23 devnull }
497 bc7cb1a1 2003-11-23 devnull }
498 bc7cb1a1 2003-11-23 devnull else
499 bc7cb1a1 2003-11-23 devnull if(c1=='n' && c2=='x')
500 bc7cb1a1 2003-11-23 devnull if(iflag)
501 bc7cb1a1 2003-11-23 devnull SKIP;
502 bc7cb1a1 2003-11-23 devnull else {
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);
509 bc7cb1a1 2003-11-23 devnull }
510 bc7cb1a1 2003-11-23 devnull else
511 bc7cb1a1 2003-11-23 devnull if(c1 == 't' && c2 == 'm')
512 bc7cb1a1 2003-11-23 devnull SKIP;
513 bc7cb1a1 2003-11-23 devnull else
514 bc7cb1a1 2003-11-23 devnull if(c1=='h' && c2=='w')
515 fa325e9b 2020-01-10 cross SKIP;
516 bc7cb1a1 2003-11-23 devnull else
517 bc7cb1a1 2003-11-23 devnull if(msflag && c1 == 'T' && c2 == 'L') {
518 bc7cb1a1 2003-11-23 devnull SKIP_TO_COM;
519 fa325e9b 2020-01-10 cross goto comx;
520 bc7cb1a1 2003-11-23 devnull }
521 bc7cb1a1 2003-11-23 devnull else
522 bc7cb1a1 2003-11-23 devnull if(msflag && c1=='N' && c2 == 'R')
523 bc7cb1a1 2003-11-23 devnull SKIP;
524 bc7cb1a1 2003-11-23 devnull else
525 bc7cb1a1 2003-11-23 devnull if(msflag && c1 == 'A' && (c2 == 'U' || c2 == 'I')){
526 bc7cb1a1 2003-11-23 devnull if(mac==MM)SKIP;
527 bc7cb1a1 2003-11-23 devnull else {
528 bc7cb1a1 2003-11-23 devnull SKIP_TO_COM;
529 fa325e9b 2020-01-10 cross goto comx;
530 bc7cb1a1 2003-11-23 devnull }
531 bc7cb1a1 2003-11-23 devnull } else
532 bc7cb1a1 2003-11-23 devnull if(msflag && c1=='F' && c2=='S') {
533 bc7cb1a1 2003-11-23 devnull SKIP_TO_COM;
534 fa325e9b 2020-01-10 cross goto comx;
535 bc7cb1a1 2003-11-23 devnull }
536 bc7cb1a1 2003-11-23 devnull else
537 bc7cb1a1 2003-11-23 devnull if(msflag && (c1=='S' || c1=='N') && c2=='H') {
538 bc7cb1a1 2003-11-23 devnull SKIP_TO_COM;
539 fa325e9b 2020-01-10 cross goto comx;
540 bc7cb1a1 2003-11-23 devnull } else
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");
544 bc7cb1a1 2003-11-23 devnull else
545 bc7cb1a1 2003-11-23 devnull Bprint(&bout, "UNIX ");
546 bc7cb1a1 2003-11-23 devnull } else
547 bc7cb1a1 2003-11-23 devnull if(msflag && c1=='O' && c2=='K') {
548 bc7cb1a1 2003-11-23 devnull SKIP_TO_COM;
549 fa325e9b 2020-01-10 cross goto comx;
550 bc7cb1a1 2003-11-23 devnull } else
551 bc7cb1a1 2003-11-23 devnull if(msflag && c1=='N' && c2=='D')
552 bc7cb1a1 2003-11-23 devnull SKIP;
553 bc7cb1a1 2003-11-23 devnull else
554 bc7cb1a1 2003-11-23 devnull if(msflag && mac==MM && c1=='H' && (c2==' '||c2=='U'))
555 bc7cb1a1 2003-11-23 devnull SKIP;
556 bc7cb1a1 2003-11-23 devnull else
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');
560 bc7cb1a1 2003-11-23 devnull else {
561 bc7cb1a1 2003-11-23 devnull SKIP;
562 bc7cb1a1 2003-11-23 devnull Bprint(&bout, " .");
563 bc7cb1a1 2003-11-23 devnull }
564 bc7cb1a1 2003-11-23 devnull } else
565 bc7cb1a1 2003-11-23 devnull if(!msflag && c1=='P' && c2=='S') {
566 bc7cb1a1 2003-11-23 devnull inpic();
567 bc7cb1a1 2003-11-23 devnull } else
568 fa325e9b 2020-01-10 cross if(msflag && (c1=='D' || c1=='N' || c1=='K'|| c1=='P') && c2=='S') {
569 fa325e9b 2020-01-10 cross sdis(c1, 'E');
570 bc7cb1a1 2003-11-23 devnull } else
571 fa325e9b 2020-01-10 cross if(msflag && (c1 == 'K' && c2 == 'F')) {
572 fa325e9b 2020-01-10 cross sdis(c1,'E');
573 bc7cb1a1 2003-11-23 devnull } else
574 bc7cb1a1 2003-11-23 devnull if(msflag && c1=='n' && c2=='f')
575 bc7cb1a1 2003-11-23 devnull sdis('f','i');
576 bc7cb1a1 2003-11-23 devnull else
577 bc7cb1a1 2003-11-23 devnull if(msflag && c1=='c' && c2=='e')
578 bc7cb1a1 2003-11-23 devnull sce();
579 bc7cb1a1 2003-11-23 devnull else {
580 bc7cb1a1 2003-11-23 devnull if(c1=='.' && c2=='.') {
581 bc7cb1a1 2003-11-23 devnull if(msflag) {
582 bc7cb1a1 2003-11-23 devnull SKIP;
583 bc7cb1a1 2003-11-23 devnull return;
584 bc7cb1a1 2003-11-23 devnull }
585 bc7cb1a1 2003-11-23 devnull while(C == '.')
586 bc7cb1a1 2003-11-23 devnull ;
587 bc7cb1a1 2003-11-23 devnull }
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);
591 bc7cb1a1 2003-11-23 devnull else {
592 bc7cb1a1 2003-11-23 devnull if(wordflag)
593 bc7cb1a1 2003-11-23 devnull C;
594 bc7cb1a1 2003-11-23 devnull regline(YES,TWO);
595 bc7cb1a1 2003-11-23 devnull }
596 bc7cb1a1 2003-11-23 devnull inmacro--;
597 bc7cb1a1 2003-11-23 devnull }
598 bc7cb1a1 2003-11-23 devnull }
599 bc7cb1a1 2003-11-23 devnull
600 bc7cb1a1 2003-11-23 devnull void
601 bc7cb1a1 2003-11-23 devnull macro(void)
602 bc7cb1a1 2003-11-23 devnull {
603 bc7cb1a1 2003-11-23 devnull if(msflag) {
604 fa325e9b 2020-01-10 cross do {
605 fa325e9b 2020-01-10 cross SKIP1;
606 bc7cb1a1 2003-11-23 devnull } while(C1 != '.' || C1 != '.' || C1 == '.');
607 bc7cb1a1 2003-11-23 devnull if(c != '\n')
608 bc7cb1a1 2003-11-23 devnull SKIP;
609 bc7cb1a1 2003-11-23 devnull return;
610 bc7cb1a1 2003-11-23 devnull }
611 bc7cb1a1 2003-11-23 devnull SKIP;
612 bc7cb1a1 2003-11-23 devnull inmacro = YES;
613 bc7cb1a1 2003-11-23 devnull }
614 bc7cb1a1 2003-11-23 devnull
615 bc7cb1a1 2003-11-23 devnull void
616 bc7cb1a1 2003-11-23 devnull sdis(char a1, char a2)
617 bc7cb1a1 2003-11-23 devnull {
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;
621 bc7cb1a1 2003-11-23 devnull
622 bc7cb1a1 2003-11-23 devnull if(a1 == 'P'){
623 bc7cb1a1 2003-11-23 devnull while(C1 == ' ')
624 bc7cb1a1 2003-11-23 devnull ;
625 bc7cb1a1 2003-11-23 devnull if(c == '<') {
626 bc7cb1a1 2003-11-23 devnull SKIP1;
627 bc7cb1a1 2003-11-23 devnull return;
628 bc7cb1a1 2003-11-23 devnull }
629 bc7cb1a1 2003-11-23 devnull }
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')
633 bc7cb1a1 2003-11-23 devnull SKIP1;
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;
638 bc7cb1a1 2003-11-23 devnull else
639 bc7cb1a1 2003-11-23 devnull SKIP1;
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'))
644 bc7cb1a1 2003-11-23 devnull return;
645 bc7cb1a1 2003-11-23 devnull continue;
646 bc7cb1a1 2003-11-23 devnull }
647 bc7cb1a1 2003-11-23 devnull if(c1==a1 && c2 == a2) {
648 bc7cb1a1 2003-11-23 devnull SKIP1;
649 bc7cb1a1 2003-11-23 devnull if(lct != 0){
650 bc7cb1a1 2003-11-23 devnull lct--;
651 bc7cb1a1 2003-11-23 devnull continue;
652 bc7cb1a1 2003-11-23 devnull }
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');
656 bc7cb1a1 2003-11-23 devnull return;
657 bc7cb1a1 2003-11-23 devnull } else
658 bc7cb1a1 2003-11-23 devnull if(a1 == 'L' && c2 == 'L') {
659 bc7cb1a1 2003-11-23 devnull lct++;
660 bc7cb1a1 2003-11-23 devnull SKIP1;
661 bc7cb1a1 2003-11-23 devnull } else
662 bc7cb1a1 2003-11-23 devnull if(a1 == 'D' && c1 == 'E' && c2 == 'Q') {
663 fa325e9b 2020-01-10 cross eqn();
664 bc7cb1a1 2003-11-23 devnull eqnf = 0;
665 bc7cb1a1 2003-11-23 devnull } else
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')){
669 bc7cb1a1 2003-11-23 devnull SKIP1;
670 bc7cb1a1 2003-11-23 devnull return;
671 bc7cb1a1 2003-11-23 devnull }
672 bc7cb1a1 2003-11-23 devnull SKIP1;
673 bc7cb1a1 2003-11-23 devnull }
674 bc7cb1a1 2003-11-23 devnull else
675 bc7cb1a1 2003-11-23 devnull SKIP1;
676 bc7cb1a1 2003-11-23 devnull }
677 bc7cb1a1 2003-11-23 devnull }
678 bc7cb1a1 2003-11-23 devnull
679 bc7cb1a1 2003-11-23 devnull void
680 bc7cb1a1 2003-11-23 devnull tbl(void)
681 bc7cb1a1 2003-11-23 devnull {
682 bc7cb1a1 2003-11-23 devnull while(C != '.')
683 bc7cb1a1 2003-11-23 devnull ;
684 bc7cb1a1 2003-11-23 devnull SKIP;
685 bc7cb1a1 2003-11-23 devnull intable = YES;
686 bc7cb1a1 2003-11-23 devnull }
687 bc7cb1a1 2003-11-23 devnull
688 bc7cb1a1 2003-11-23 devnull void
689 bc7cb1a1 2003-11-23 devnull stbl(void)
690 bc7cb1a1 2003-11-23 devnull {
691 bc7cb1a1 2003-11-23 devnull while(C != '.')
692 bc7cb1a1 2003-11-23 devnull ;
693 bc7cb1a1 2003-11-23 devnull SKIP_TO_COM;
694 bc7cb1a1 2003-11-23 devnull if(c != 'T' || C != 'E') {
695 bc7cb1a1 2003-11-23 devnull SKIP;
696 bc7cb1a1 2003-11-23 devnull pc = c;
697 bc7cb1a1 2003-11-23 devnull while(C != '.' || pc != '\n' || C != 'T' || C != 'E')
698 bc7cb1a1 2003-11-23 devnull pc = c;
699 bc7cb1a1 2003-11-23 devnull }
700 bc7cb1a1 2003-11-23 devnull }
701 bc7cb1a1 2003-11-23 devnull
702 bc7cb1a1 2003-11-23 devnull void
703 bc7cb1a1 2003-11-23 devnull eqn(void)
704 bc7cb1a1 2003-11-23 devnull {
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;
708 bc7cb1a1 2003-11-23 devnull
709 bc7cb1a1 2003-11-23 devnull last = 0;
710 bc7cb1a1 2003-11-23 devnull dflg = 1;
711 bc7cb1a1 2003-11-23 devnull SKIP;
712 bc7cb1a1 2003-11-23 devnull
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')
716 bc7cb1a1 2003-11-23 devnull ;
717 bc7cb1a1 2003-11-23 devnull if(c=='E' && C1=='N') {
718 bc7cb1a1 2003-11-23 devnull SKIP;
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 fa325e9b 2020-01-10 cross Bputc(&bout, last);
724 fa325e9b 2020-01-10 cross Bputc(&bout, '\n');
725 bc7cb1a1 2003-11-23 devnull }
726 bc7cb1a1 2003-11-23 devnull }
727 bc7cb1a1 2003-11-23 devnull return;
728 bc7cb1a1 2003-11-23 devnull }
729 bc7cb1a1 2003-11-23 devnull } else
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 == ' ')
734 bc7cb1a1 2003-11-23 devnull ;
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;
742 bc7cb1a1 2003-11-23 devnull }
743 bc7cb1a1 2003-11-23 devnull }
744 bc7cb1a1 2003-11-23 devnull dflg = 0;
745 bc7cb1a1 2003-11-23 devnull }
746 bc7cb1a1 2003-11-23 devnull if(c != '\n')
747 fa325e9b 2020-01-10 cross while(C1 != '\n') {
748 bc7cb1a1 2003-11-23 devnull if(chars[c] == PUNCT)
749 bc7cb1a1 2003-11-23 devnull last = c;
750 bc7cb1a1 2003-11-23 devnull else
751 bc7cb1a1 2003-11-23 devnull if(c != ' ')
752 bc7cb1a1 2003-11-23 devnull last = 0;
753 bc7cb1a1 2003-11-23 devnull }
754 bc7cb1a1 2003-11-23 devnull }
755 bc7cb1a1 2003-11-23 devnull }
756 bc7cb1a1 2003-11-23 devnull
757 bc7cb1a1 2003-11-23 devnull /*
758 bc7cb1a1 2003-11-23 devnull * skip over a complete backslash vconstruction
759 bc7cb1a1 2003-11-23 devnull */
760 bc7cb1a1 2003-11-23 devnull void
761 bc7cb1a1 2003-11-23 devnull backsl(void)
762 bc7cb1a1 2003-11-23 devnull {
763 bc7cb1a1 2003-11-23 devnull int bdelim;
764 bc7cb1a1 2003-11-23 devnull
765 fa325e9b 2020-01-10 cross sw:
766 bc7cb1a1 2003-11-23 devnull switch(C1)
767 bc7cb1a1 2003-11-23 devnull {
768 bc7cb1a1 2003-11-23 devnull case '"':
769 bc7cb1a1 2003-11-23 devnull SKIP1;
770 bc7cb1a1 2003-11-23 devnull return;
771 bc7cb1a1 2003-11-23 devnull
772 bc7cb1a1 2003-11-23 devnull case 's':
773 bc7cb1a1 2003-11-23 devnull if(C1 == '\\')
774 bc7cb1a1 2003-11-23 devnull backsl();
775 bc7cb1a1 2003-11-23 devnull else {
776 bc7cb1a1 2003-11-23 devnull while(C1>='0' && c<='9')
777 bc7cb1a1 2003-11-23 devnull ;
778 bc7cb1a1 2003-11-23 devnull Bungetrune(infile);
779 bc7cb1a1 2003-11-23 devnull c = '0';
780 bc7cb1a1 2003-11-23 devnull }
781 bc7cb1a1 2003-11-23 devnull lp--;
782 bc7cb1a1 2003-11-23 devnull return;
783 bc7cb1a1 2003-11-23 devnull
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 != '(')
788 bc7cb1a1 2003-11-23 devnull return;
789 bc7cb1a1 2003-11-23 devnull
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 = '-';
795 bc7cb1a1 2003-11-23 devnull return;
796 bc7cb1a1 2003-11-23 devnull }
797 bc7cb1a1 2003-11-23 devnull } else
798 bc7cb1a1 2003-11-23 devnull if(c != '\n')
799 bc7cb1a1 2003-11-23 devnull C1;
800 bc7cb1a1 2003-11-23 devnull return;
801 bc7cb1a1 2003-11-23 devnull }
802 bc7cb1a1 2003-11-23 devnull if(C1 != '\n')
803 bc7cb1a1 2003-11-23 devnull C1;
804 bc7cb1a1 2003-11-23 devnull return;
805 bc7cb1a1 2003-11-23 devnull
806 bc7cb1a1 2003-11-23 devnull case '$':
807 bc7cb1a1 2003-11-23 devnull C1; /* discard argument number */
808 bc7cb1a1 2003-11-23 devnull return;
809 bc7cb1a1 2003-11-23 devnull
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')
819 bc7cb1a1 2003-11-23 devnull return;
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();
823 bc7cb1a1 2003-11-23 devnull return;
824 bc7cb1a1 2003-11-23 devnull
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:
829 bc7cb1a1 2003-11-23 devnull return;
830 bc7cb1a1 2003-11-23 devnull }
831 bc7cb1a1 2003-11-23 devnull }
832 bc7cb1a1 2003-11-23 devnull
833 bc7cb1a1 2003-11-23 devnull char*
834 bc7cb1a1 2003-11-23 devnull copys(char *s)
835 bc7cb1a1 2003-11-23 devnull {
836 bc7cb1a1 2003-11-23 devnull char *t, *t0;
837 bc7cb1a1 2003-11-23 devnull
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++)
841 bc7cb1a1 2003-11-23 devnull ;
842 bc7cb1a1 2003-11-23 devnull return(t0);
843 bc7cb1a1 2003-11-23 devnull }
844 bc7cb1a1 2003-11-23 devnull
845 bc7cb1a1 2003-11-23 devnull void
846 bc7cb1a1 2003-11-23 devnull sce(void)
847 bc7cb1a1 2003-11-23 devnull {
848 bc7cb1a1 2003-11-23 devnull int n = 1;
849 bc7cb1a1 2003-11-23 devnull
850 bb0266fe 2005-05-07 devnull while (C != '\n' && !('0' <= c && c <= '9'))
851 bc7cb1a1 2003-11-23 devnull ;
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';
855 bc7cb1a1 2003-11-23 devnull }
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 == ' ')
861 bc7cb1a1 2003-11-23 devnull ;
862 bc7cb1a1 2003-11-23 devnull if(c == '0') {
863 bc7cb1a1 2003-11-23 devnull SKIP;
864 bc7cb1a1 2003-11-23 devnull break;
865 bc7cb1a1 2003-11-23 devnull } else
866 bc7cb1a1 2003-11-23 devnull SKIP;
867 bc7cb1a1 2003-11-23 devnull } else
868 bc7cb1a1 2003-11-23 devnull SKIP;
869 bc7cb1a1 2003-11-23 devnull } else
870 bc7cb1a1 2003-11-23 devnull if(c == 'P' || C == 'P') {
871 bc7cb1a1 2003-11-23 devnull if(c != '\n')
872 bc7cb1a1 2003-11-23 devnull SKIP;
873 bc7cb1a1 2003-11-23 devnull break;
874 bc7cb1a1 2003-11-23 devnull } else
875 bc7cb1a1 2003-11-23 devnull if(c != '\n')
876 bc7cb1a1 2003-11-23 devnull SKIP;
877 bc7cb1a1 2003-11-23 devnull } else {
878 bc7cb1a1 2003-11-23 devnull SKIP;
879 bc7cb1a1 2003-11-23 devnull n--;
880 bc7cb1a1 2003-11-23 devnull }
881 bc7cb1a1 2003-11-23 devnull }
882 bc7cb1a1 2003-11-23 devnull }
883 bc7cb1a1 2003-11-23 devnull
884 bc7cb1a1 2003-11-23 devnull void
885 bc7cb1a1 2003-11-23 devnull refer(int c1)
886 bc7cb1a1 2003-11-23 devnull {
887 bc7cb1a1 2003-11-23 devnull int c2;
888 bc7cb1a1 2003-11-23 devnull
889 bc7cb1a1 2003-11-23 devnull if(c1 != '\n')
890 bc7cb1a1 2003-11-23 devnull SKIP;
891 bc7cb1a1 2003-11-23 devnull c2 = 0;
892 bc7cb1a1 2003-11-23 devnull for(;;) {
893 bc7cb1a1 2003-11-23 devnull if(C != '.')
894 bc7cb1a1 2003-11-23 devnull SKIP;
895 bc7cb1a1 2003-11-23 devnull else {
896 bc7cb1a1 2003-11-23 devnull if(C != ']')
897 bc7cb1a1 2003-11-23 devnull SKIP;
898 bc7cb1a1 2003-11-23 devnull else {
899 bc7cb1a1 2003-11-23 devnull while(C != '\n')
900 bc7cb1a1 2003-11-23 devnull c2 = c;
901 bc7cb1a1 2003-11-23 devnull if(charclass(c2) == PUNCT)
902 bc7cb1a1 2003-11-23 devnull Bprint(&bout, " %C",c2);
903 bc7cb1a1 2003-11-23 devnull return;
904 bc7cb1a1 2003-11-23 devnull }
905 bc7cb1a1 2003-11-23 devnull }
906 bc7cb1a1 2003-11-23 devnull }
907 bc7cb1a1 2003-11-23 devnull }
908 bc7cb1a1 2003-11-23 devnull
909 bc7cb1a1 2003-11-23 devnull void
910 bc7cb1a1 2003-11-23 devnull inpic(void)
911 bc7cb1a1 2003-11-23 devnull {
912 bc7cb1a1 2003-11-23 devnull int c1;
913 bc7cb1a1 2003-11-23 devnull Rune *p1;
914 bc7cb1a1 2003-11-23 devnull
915 bc7cb1a1 2003-11-23 devnull /* SKIP1;*/
916 bc7cb1a1 2003-11-23 devnull while(C1 != '\n')
917 bc7cb1a1 2003-11-23 devnull if(c == '<'){
918 bc7cb1a1 2003-11-23 devnull SKIP1;
919 bc7cb1a1 2003-11-23 devnull return;
920 bc7cb1a1 2003-11-23 devnull }
921 bc7cb1a1 2003-11-23 devnull p1 = line;
922 bc7cb1a1 2003-11-23 devnull c = '\n';
923 bc7cb1a1 2003-11-23 devnull for(;;) {
924 bc7cb1a1 2003-11-23 devnull c1 = c;
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'){
928 bc7cb1a1 2003-11-23 devnull SKIP1;
929 bc7cb1a1 2003-11-23 devnull c = '\n';
930 bc7cb1a1 2003-11-23 devnull }
931 bc7cb1a1 2003-11-23 devnull continue;
932 bc7cb1a1 2003-11-23 devnull }
933 bc7cb1a1 2003-11-23 devnull SKIP1;
934 bc7cb1a1 2003-11-23 devnull return;
935 bc7cb1a1 2003-11-23 devnull } else
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();
943 bc7cb1a1 2003-11-23 devnull } else
944 bc7cb1a1 2003-11-23 devnull *p1++ = c;
945 bc7cb1a1 2003-11-23 devnull }
946 bc7cb1a1 2003-11-23 devnull *p1++ = ' ';
947 bc7cb1a1 2003-11-23 devnull } else
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();
952 bc7cb1a1 2003-11-23 devnull else
953 bc7cb1a1 2003-11-23 devnull Bprint(&bout, "%S\n\n", line);
954 bc7cb1a1 2003-11-23 devnull p1 = line;
955 bc7cb1a1 2003-11-23 devnull }
956 bc7cb1a1 2003-11-23 devnull }
957 bc7cb1a1 2003-11-23 devnull }
958 bc7cb1a1 2003-11-23 devnull
959 bc7cb1a1 2003-11-23 devnull int
960 bc7cb1a1 2003-11-23 devnull charclass(int c)
961 bc7cb1a1 2003-11-23 devnull {
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;
967 bc7cb1a1 2003-11-23 devnull }
968 bc7cb1a1 2003-11-23 devnull return EXTENDED;
969 bc7cb1a1 2003-11-23 devnull }