]> git.lizzy.rs Git - plan9front.git/blob - sys/src/cmd/troff/ni.c
usb lib: add maxpkt and ntds to Altc struct
[plan9front.git] / sys / src / cmd / troff / ni.c
1 #include <stdio.h>
2 #include "tdef.h"
3 #include "fns.h"
4 #include "ext.h"
5
6 char    termtab[NS];    /* term type added in ptinit() */
7 char    fontdir[NS];    /* added in casefp; not used by nroff */
8 char    devname[20];    /* default output device */
9
10 Numtab numtab[NN] = {
11         { PAIR('%', 0) },
12         { PAIR('n', 'l') },
13         { PAIR('y', 'r') },
14         { PAIR('h', 'p') },
15         { PAIR('c', 't') },
16         { PAIR('d', 'n') },
17         { PAIR('m', 'o') },
18         { PAIR('d', 'y') },
19         { PAIR('d', 'w') },
20         { PAIR('l', 'n') },
21         { PAIR('d', 'l') },
22         { PAIR('s', 't') },
23         { PAIR('s', 'b') },
24         { PAIR('c', '.') },
25         { PAIR('$', '$') },
26 };
27
28
29 int     alphabet        = 256;  /* latin-1 */
30 int     pto     = 10000;
31 int     pfrom   = 1;
32 int     print   = 1;
33 char    nextf[NS]       = TMACDIR;
34 char    mfiles[NMF][NS];
35 int     nmfi    = 0;
36 int     oldbits = -1;
37 int     init    = 1;
38 int     fc      = IMP;  /* field character */
39 int     eschar  = '\\';
40 int     pl;
41 int     po;
42 FILE    *ptid   = stdout;
43
44 int     dfact   = 1;
45 int     dfactd  = 1;
46 int     res     = 1;
47 int     smnt    = 0;    /* beginning of special fonts */
48 int     ascii   = 0;    /* ascii normally off for troff, on for nroff;  -a turns on */
49 int     lg;
50 int     pnlist[NPN] = { -1 };
51
52
53 int     *pnp    = pnlist;
54 int     npn     = 1;
55 int     npnflg  =  1;
56 int     dpn     =  -1;
57 int     totout  =  1;
58 int     ulfont  =  ULFONT;
59 int     tabch   =  TAB;
60 int     ldrch   =  LEADER;
61
62
63 Contab contab[NM] = {
64         C(PAIR('d', 's'), caseds),
65         C(PAIR('a', 's'), caseas),
66         C(PAIR('s', 'p'), casesp),
67         C(PAIR('f', 't'), caseft),
68         C(PAIR('p', 's'), caseps),
69         C(PAIR('v', 's'), casevs),
70         C(PAIR('n', 'r'), casenr),
71         C(PAIR('i', 'f'), caseif),
72         C(PAIR('i', 'e'), caseie),
73         C(PAIR('e', 'l'), caseel),
74         C(PAIR('p', 'o'), casepo),
75         C(PAIR('t', 'l'), casetl),
76         C(PAIR('t', 'm'), casetm),
77         C(PAIR('f', 'm'), casefm),
78         C(PAIR('b', 'p'), casebp),
79         C(PAIR('c', 'h'), casech),
80         C(PAIR('p', 'n'), casepn),
81         C(PAIR('b', 'r'), tbreak),
82         C(PAIR('t', 'i'), caseti),
83         C(PAIR('n', 'e'), casene),
84         C(PAIR('n', 'f'), casenf),
85         C(PAIR('c', 'e'), casece),
86         C(PAIR('f', 'i'), casefi),
87         C(PAIR('i', 'n'), casein),
88         C(PAIR('l', 'l'), casell),
89         C(PAIR('n', 's'), casens),
90         C(PAIR('m', 'k'), casemk),
91         C(PAIR('r', 't'), casert),
92         C(PAIR('a', 'm'), caseam),
93         C(PAIR('d', 'e'), casede),
94         C(PAIR('d', 'i'), casedi),
95         C(PAIR('d', 'a'), caseda),
96         C(PAIR('w', 'h'), casewh),
97         C(PAIR('d', 't'), casedt),
98         C(PAIR('i', 't'), caseit),
99         C(PAIR('r', 'm'), caserm),
100         C(PAIR('r', 'r'), caserr),
101         C(PAIR('r', 'n'), casern),
102         C(PAIR('a', 'd'), casead),
103         C(PAIR('r', 's'), casers),
104         C(PAIR('n', 'a'), casena),
105         C(PAIR('p', 'l'), casepl),
106         C(PAIR('t', 'a'), caseta),
107         C(PAIR('t', 'r'), casetr),
108         C(PAIR('u', 'l'), caseul),
109         C(PAIR('c', 'u'), casecu),
110         C(PAIR('l', 't'), caselt),
111         C(PAIR('n', 'x'), casenx),
112         C(PAIR('s', 'o'), caseso),
113         C(PAIR('i', 'g'), caseig),
114         C(PAIR('t', 'c'), casetc),
115         C(PAIR('f', 'c'), casefc),
116         C(PAIR('e', 'c'), caseec),
117         C(PAIR('e', 'o'), caseeo),
118         C(PAIR('l', 'c'), caselc),
119         C(PAIR('e', 'v'), caseev),
120         C(PAIR('r', 'd'), caserd),
121         C(PAIR('a', 'b'), caseab),
122         C(PAIR('f', 'l'), casefl),
123         C(PAIR('e', 'x'), caseex),
124         C(PAIR('s', 's'), casess),
125         C(PAIR('f', 'p'), casefp),
126         C(PAIR('c', 's'), casecs),
127         C(PAIR('b', 'd'), casebd),
128         C(PAIR('l', 'g'), caselg),
129         C(PAIR('h', 'c'), casehc),
130         C(PAIR('h', 'y'), casehy),
131         C(PAIR('n', 'h'), casenh),
132         C(PAIR('n', 'm'), casenm),
133         C(PAIR('n', 'n'), casenn),
134         C(PAIR('s', 'v'), casesv),
135         C(PAIR('o', 's'), caseos),
136         C(PAIR('l', 's'), casels),
137         C(PAIR('c', 'c'), casecc),
138         C(PAIR('c', '2'), casec2),
139         C(PAIR('e', 'm'), caseem),
140         C(PAIR('a', 'f'), caseaf),
141         C(PAIR('h', 'a'), caseha),
142         C(PAIR('h', 'w'), casehw),
143         C(PAIR('m', 'c'), casemc),
144         C(PAIR('p', 'm'), casepm),
145         C(PAIR('p', 'i'), casepi),
146         C(PAIR('u', 'f'), caseuf),
147         C(PAIR('p', 'c'), casepc),
148         C(PAIR('h', 't'), caseht),
149         C(PAIR('c', 'f'), casecf),
150         C(PAIR('s', 'y'), casesy),
151         C(PAIR('l', 'f'), caself),
152         C(PAIR('p', 't'), casept),
153         C(PAIR('g', 'd'), casegd),
154 };
155
156
157 Tbuf _oline;
158
159 /*
160  * troff environment block
161  */
162
163 Env env[NEV] = { {      /* this sets up env[0] */
164 /* int  ics      */     0,      /* insertion character space, set by .mc */
165 /* int  sps      */     0,
166 /* int  spacesz  */     0,
167 /* int  lss      */     0,
168 /* int  lss1     */     0,
169 /* int  ll       */     0,
170 /* int  ll1      */     0,
171 /* int  lt       */     0,
172 /* int  lt1      */     0,
173 /* Tchar ic      */     0,      /* insertion character (= margin character) */
174 /* int  icf      */     0,      /* insertion character flag */
175 /* Tchar chbits  */     0,      /* size+font bits for current character */
176 /* Tchar spbits  */     0,
177 /* Tchar nmbits  */     0,      /* size+font bits for number from .nm */
178 /* int  apts     */     PS,     /* actual point size -- as requested by user */
179 /* int  apts1    */     PS,     /* need not match an existent size */
180 /* int  pts      */     PS,     /* hence, this is the size that really exists */
181 /* int  pts1     */     PS,
182 /* int  font     */     FT,
183 /* int  font1    */     FT,
184 /* int  ls       */     1,
185 /* int  ls1      */     1,
186 /* int  ad       */     1,
187 /* int  nms      */     1,      /* .nm multiplier */
188 /* int  ndf      */     1,      /* .nm separator */
189 /* int  nmwid    */     3,      /* max width of .nm numbers */
190 /* int  fi       */     1,
191 /* int  cc       */     '.',
192 /* int  c2       */     '\'',
193 /* int  ohc      */     OHC,
194 /* int  tdelim   */     IMP,
195 /* int  hyf      */     1,
196 /* int  hyoff    */     0,
197 /* int  hyphalg  */     HYPHALG,
198 /* int  un1      */     -1,
199 /* int  tabc     */     0,
200 /* int  dotc     */     '.',
201 /* int  adsp     */     0,      /* add this much space to each padding point */
202 /* int  adrem    */     0,      /* excess space to add until it runs out */
203 /* int  lastl    */     0,      /* last text on current output line */
204 /* int  nel      */     0,      /* how much space left on current output line */
205 /* int  admod    */     0,      /* adjust mode */
206 /* Tchar *wordp  */     0,
207 /* int  spflg    */     0,      /* probably to indicate space after punctuation needed */
208 /* Tchar *linep  */     0,
209 /* Tchar *wdend  */     0,
210 /* Tchar *wdstart */    0,
211 /* int  wne      */     0,
212 /* int  ne       */     0,      /* how much space taken on current output line */
213 /* int  nc       */     0,      /* #characters (incl blank) on output line */
214 /* int  nb       */     0,
215 /* int  lnmod    */     0,      /* line number mode, set by .nm */
216 /* int  nwd      */     0,      /* number of words on current output line */
217 /* int  nn       */     0,      /* from .nn command */
218 /* int  ni       */     0,      /* indent of .nm numbers, probably */
219 /* int  ul       */     0,
220 /* int  cu       */     0,
221 /* int  ce       */     0,
222 /* int  in       */     0,      /* indent and previous value */
223 /* int  in1      */     0,
224 /* int  un       */     0,      /* unindent of left margin in some way */
225 /* int  wch      */     0,
226 /* int  pendt    */     0,
227 /* Tchar *pendw  */     (Tchar *)0,
228 /* int  pendnf   */     0,
229 /* int  spread   */     0,
230 /* int  it       */     0,      /* input trap count */
231 /* int  itmac    */     0,
232 } };
233
234 Env     *envp   = env;  /* start off in env 0 */
235
236 Numerr  numerr;
237
238 Stack   *frame, *stk, *ejl;
239 Stack   *nxf;
240
241 int     pipeflg;
242 int     hflg;   /* used in nroff only */
243 int     eqflg;  /* used in nroff only */
244
245 int     xpts;
246 int     ppts;
247 int     pfont;
248 int     mpts;
249 int     mfont;
250 int     cs;
251 int     ccs;
252 int     bd;
253
254 int     stdi;
255 int     quiet;
256 int     stop;
257 char    ibuf[IBUFSZ];
258 char    xbuf[IBUFSZ];
259 char    *ibufp;
260 char    *xbufp;
261 char    *eibuf;
262 char    *xeibuf;
263 Tchar   pbbuf[NC];              /* pushback buffer for arguments, \n, etc. */
264 Tchar   *pbp = pbbuf;           /* next free slot in pbbuf */
265 Tchar   *lastpbp = pbbuf;       /* pbp in previous stack frame */
266 int     nx;
267 int     mflg;
268 Tchar   ch = 0;
269 int     ibf;
270 int     ifi;
271 int     iflg;
272 int     rargc;
273 char    **argp;
274 Ushort  trtab[NTRTAB];
275 int     lgf;
276 int     copyf;
277 Offset  ip;
278 int     nlflg;
279 int     donef;
280 int     nflush;
281 int     nfo;
282 int     padc;
283 int     raw;
284 int     flss;
285 int     nonumb;
286 int     trap;
287 int     tflg;
288 int     ejf;
289 int     dilev;
290 Offset  offset;
291 int     em;
292 int     ds;
293 Offset  woff;
294 int     app;
295 int     ndone;
296 int     lead;
297 int     ralss;
298 Offset  nextb;
299 Tchar   nrbits;
300 int     nform;
301 int     oldmn;
302 int     newmn;
303 int     macerr;
304 Offset  apptr;
305 int     diflg;
306 int     evi;
307 int     vflag;
308 int     noscale;
309 int     po1;
310 int     nlist[NTRAP];
311 int     mlist[NTRAP];
312 int     evlist[EVLSZ];
313 int     ev;
314 int     tty;
315 int     sfont   = FT;   /* appears to be "standard" font; used by .ul */
316 int     sv;
317 int     esc;
318 int     widthp;
319 int     xfont;
320 int     setwdf;
321 int     over;
322 int     nhyp;
323 Tchar   **hyp;
324 Tchar   *olinep;
325 int     dotT;
326 char    *unlkp;
327 Wcache  widcache[NWIDCACHE];
328 Diver   d[NDI];
329 Diver   *dip;
330
331 int     c_hyphen;
332 int     c_emdash;
333 int     c_rule;
334 int     c_minus;
335 int     c_fi;
336 int     c_fl;
337 int     c_ff;
338 int     c_ffi;
339 int     c_ffl;
340 int     c_acute;
341 int     c_grave;
342 int     c_under;
343 int     c_rooten;
344 int     c_boxrule;
345 int     c_lefthand;
346 int     c_dagger;
347 int     c_isalnum;
348
349 Spnames spnames[] =
350 {
351         &c_hyphen,      "hy",
352         &c_emdash,      "em",
353         &c_rule,        "ru",
354         &c_minus,       "\\-",
355         &c_fi,          "fi",
356         &c_fl,          "fl",
357         &c_ff,          "ff",
358         &c_ffi,         "Fi",
359         &c_ffl,         "Fl",
360         &c_acute,       "aa",
361         &c_grave,       "ga",
362         &c_under,       "ul",
363         &c_rooten,      "rn",
364         &c_boxrule,     "br",
365         &c_lefthand,    "lh",
366         &c_dagger,      "dg",   /* not in nroff?? */
367         &c_isalnum,     "__",
368         0, 0
369 };
370
371
372 Tchar   (*hmot)(void);
373 Tchar   (*makem)(int i);
374 Tchar   (*setabs)(void);
375 Tchar   (*setch)(int c);
376 Tchar   (*sethl)(int k);
377 Tchar   (*setht)(void);
378 Tchar   (*setslant)(void);
379 Tchar   (*vmot)(void);
380 Tchar   (*xlss)(void);
381 int     (*findft)(int i);
382 int     (*width)(Tchar j);
383 void    (*mchbits)(void);
384 void    (*ptlead)(void);
385 void    (*ptout)(Tchar i);
386 void    (*ptpause)(void);
387 void    (*setfont)(int a);
388 void    (*setps)(void);
389 void    (*setwd)(void);
390