n6.c 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362
  1. #include "tdef.h"
  2. #include "ext.h"
  3. #include "fns.h"
  4. #include <ctype.h>
  5. /*
  6. * n6.c -- width functions, sizes and fonts
  7. */
  8. n_width(Tchar j)
  9. {
  10. int i, k;
  11. if (iszbit(j))
  12. return 0;
  13. if (ismot(j)) {
  14. if (isvmot(j))
  15. return(0);
  16. k = absmot(j);
  17. if (isnmot(j))
  18. k = -k;
  19. return(k);
  20. }
  21. i = cbits(j);
  22. if (i < ' ') {
  23. if (i == '\b')
  24. return(-widthp);
  25. if (i == PRESC)
  26. i = eschar;
  27. else if (i == HX)
  28. return(0);
  29. }
  30. if (i == ohc)
  31. return(0);
  32. i = trtab[i];
  33. if (i < ' ')
  34. return(0);
  35. if (i >= t.tfont.nchars) /* not on the font */
  36. k = t.Char; /* really ought to check properly */
  37. else
  38. k = t.tfont.wp[i].wid * t.Char;
  39. widthp = k;
  40. return(k);
  41. }
  42. Tchar n_setch(int c)
  43. {
  44. return t_setch(c);
  45. }
  46. Tchar n_setabs(void) /* set absolute char from \N'...' */
  47. { /* for now, a no-op */
  48. return t_setabs();
  49. }
  50. int n_findft(int i)
  51. {
  52. int k;
  53. if ((k = i - '0') >= 0 && k <= nfonts && k < smnt)
  54. return(k);
  55. for (k = 0; fontlab[k] != i; k++)
  56. if (k > nfonts)
  57. return(-1);
  58. return(k);
  59. }
  60. void n_mchbits(void)
  61. {
  62. chbits = 0;
  63. setfbits(chbits, font);
  64. sps = width(' ' | chbits);
  65. }
  66. void n_setps(void )
  67. {
  68. int i, j;
  69. i = cbits(getch());
  70. if (isdigit(i)) { /* \sd or \sdd */
  71. i -= '0';
  72. if (i == 0) /* \s0 */
  73. ;
  74. else if (i <= 3 && (ch=getch()) && isdigit(cbits(ch))) { /* \sdd */
  75. ch = 0;
  76. }
  77. } else if (i == '(') { /* \s(dd */
  78. getch();
  79. getch();
  80. } else if (i == '+' || i == '-') { /* \s+, \s- */
  81. j = cbits(getch());
  82. if (isdigit(j)) { /* \s+d, \s-d */
  83. ;
  84. } else if (j == '(') { /* \s+(dd, \s-(dd */
  85. getch();
  86. getch();
  87. }
  88. }
  89. }
  90. Tchar n_setht(void) /* set character height from \H'...' */
  91. {
  92. getch();
  93. inumb(&apts);
  94. getch();
  95. return(0);
  96. }
  97. Tchar n_setslant(void) /* set slant from \S'...' */
  98. {
  99. int n;
  100. getch();
  101. n = 0;
  102. n = inumb(&n);
  103. getch();
  104. return(0);
  105. }
  106. void n_caseft(void)
  107. {
  108. skip();
  109. setfont(1);
  110. }
  111. void n_setfont(int a)
  112. {
  113. int i, j;
  114. if (a)
  115. i = getrq();
  116. else
  117. i = getsn();
  118. if (!i || i == 'P') {
  119. j = font1;
  120. goto s0;
  121. }
  122. if (i == 'S' || i == '0')
  123. return;
  124. if ((j = findft(i)) == -1)
  125. return;
  126. s0:
  127. font1 = font;
  128. font = j;
  129. mchbits();
  130. }
  131. void n_setwd(void)
  132. {
  133. int base, wid;
  134. Tchar i;
  135. int delim, emsz, k;
  136. int savhp, savapts, savapts1, savfont, savfont1, savpts, savpts1;
  137. base = numtabp[ST].val = numtabp[ST].val = wid = numtabp[CT].val = 0;
  138. if (ismot(i = getch()))
  139. return;
  140. delim = cbits(i);
  141. savhp = numtabp[HP].val;
  142. numtabp[HP].val = 0;
  143. savapts = apts;
  144. savapts1 = apts1;
  145. savfont = font;
  146. savfont1 = font1;
  147. savpts = pts;
  148. savpts1 = pts1;
  149. setwdf++;
  150. while (cbits(i = getch()) != delim && !nlflg) {
  151. k = width(i);
  152. wid += k;
  153. numtabp[HP].val += k;
  154. if (!ismot(i)) {
  155. emsz = (INCH * pts + 36) / 72;
  156. } else if (isvmot(i)) {
  157. k = absmot(i);
  158. if (isnmot(i))
  159. k = -k;
  160. base -= k;
  161. emsz = 0;
  162. } else
  163. continue;
  164. if (base < numtabp[SB].val)
  165. numtabp[SB].val = base;
  166. if ((k = base + emsz) > numtabp[ST].val)
  167. numtabp[ST].val = k;
  168. }
  169. setn1(wid, 0, (Tchar) 0);
  170. numtabp[HP].val = savhp;
  171. apts = savapts;
  172. apts1 = savapts1;
  173. font = savfont;
  174. font1 = savfont1;
  175. pts = savpts;
  176. pts1 = savpts1;
  177. mchbits();
  178. setwdf = 0;
  179. }
  180. Tchar n_vmot(void)
  181. {
  182. dfact = lss;
  183. vflag++;
  184. return n_mot();
  185. }
  186. Tchar n_hmot(void)
  187. {
  188. dfact = EM;
  189. return n_mot();
  190. }
  191. Tchar n_mot(void)
  192. {
  193. int j, n;
  194. Tchar i;
  195. j = HOR;
  196. getch(); /*eat delim*/
  197. if (n = atoi0()) {
  198. if (vflag)
  199. j = VERT;
  200. i = makem(quant(n, j));
  201. } else
  202. i = 0;
  203. getch();
  204. vflag = 0;
  205. dfact = 1;
  206. return(i);
  207. }
  208. Tchar n_sethl(int k)
  209. {
  210. int j;
  211. Tchar i;
  212. j = t.Halfline;
  213. if (k == 'u')
  214. j = -j;
  215. else if (k == 'r')
  216. j = -2 * j;
  217. vflag++;
  218. i = makem(j);
  219. vflag = 0;
  220. return(i);
  221. }
  222. Tchar n_makem(int i)
  223. {
  224. Tchar j;
  225. if (i >= 0)
  226. j = i;
  227. else
  228. j = -i;
  229. j |= MOT;
  230. if (i < 0)
  231. j |= NMOT;
  232. if (vflag)
  233. j |= VMOT;
  234. return(j);
  235. }
  236. void n_casefp(void)
  237. {
  238. int i, j;
  239. skip();
  240. if ((i = cbits(getch()) - '0') < 0 || i > nfonts)
  241. return;
  242. if (skip() || !(j = getrq()))
  243. return;
  244. fontlab[i] = j;
  245. }
  246. void n_casebd(void)
  247. {
  248. int i, j, k;
  249. k = 0;
  250. bd0:
  251. if (skip() || !(i = getrq()) || (j = findft(i)) == -1) {
  252. if (k)
  253. goto bd1;
  254. else
  255. return;
  256. }
  257. if (j == smnt) {
  258. k = smnt;
  259. goto bd0;
  260. }
  261. if (k) {
  262. sbold = j;
  263. j = k;
  264. }
  265. bd1:
  266. skip();
  267. noscale++;
  268. bdtab[j] = atoi0();
  269. noscale = 0;
  270. }
  271. void n_casevs(void)
  272. {
  273. int i;
  274. skip();
  275. vflag++;
  276. dfact = INCH; /*default scaling is points!*/
  277. dfactd = 72;
  278. res = VERT;
  279. i = inumb(&lss);
  280. if (nonumb)
  281. i = lss1;
  282. if (i < VERT)
  283. i = VERT; /* was VERT */
  284. lss1 = lss;
  285. lss = i;
  286. }
  287. Tchar n_xlss(void)
  288. {
  289. /* stores \x'...' into
  290. /* two successive Tchars.
  291. /* the first contains HX, the second the value,
  292. /* encoded as a vertical motion.
  293. /* decoding is done in n2.c by pchar().
  294. */
  295. int i;
  296. getch();
  297. dfact = lss;
  298. i = quant(atoi0(), VERT);
  299. dfact = 1;
  300. getch();
  301. if (i >= 0)
  302. *pbp++ = MOT | VMOT | i;
  303. else
  304. *pbp++ = MOT | VMOT | NMOT | -i;
  305. return(HX);
  306. }