ni.c 8.3 KB

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