1
0

t2.c 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283
  1. /*
  2. * This file is part of the UCB release of Plan 9. It is subject to the license
  3. * terms in the LICENSE file found in the top-level directory of this
  4. * distribution and at http://akaros.cs.berkeley.edu/files/Plan9License. No
  5. * part of the UCB release of Plan 9, including this file, may be copied,
  6. * modified, propagated, or distributed except according to the terms contained
  7. * in the LICENSE file.
  8. */
  9. #include "a.h"
  10. /*
  11. * Section 2 - Font and character size control.
  12. */
  13. /* 2.1 - Character set */
  14. /* XXX
  15. *
  16. * \C'name' - character named name
  17. * \N'n' - character number
  18. * \(xx - two-letter character
  19. * \-
  20. * \`
  21. * \'
  22. * `
  23. * '
  24. * -
  25. */
  26. Rune*
  27. getqarg(void)
  28. {
  29. static Rune buf[MaxLine];
  30. int c;
  31. Rune *p, *e;
  32. p = buf;
  33. e = p+sizeof buf-1;
  34. if(getrune() != '\'')
  35. return nil;
  36. while(p < e){
  37. c = getrune();
  38. if(c < 0)
  39. return nil;
  40. if(c == '\'')
  41. break;
  42. *p++ = c;
  43. }
  44. *p = 0;
  45. return buf;
  46. }
  47. int
  48. e_N(void)
  49. {
  50. Rune *a;
  51. if((a = getqarg()) == nil)
  52. goto error;
  53. return eval(a);
  54. error:
  55. warn("malformed %CN'...'", backslash);
  56. return 0;
  57. }
  58. int
  59. e_paren(void)
  60. {
  61. int c, cc;
  62. Rune buf[2], r;
  63. if((c = getrune()) < 0 || c == '\n')
  64. goto error;
  65. if((cc = getrune()) < 0 || cc == '\n')
  66. goto error;
  67. buf[0] = c;
  68. buf[1] = cc;
  69. r = troff2rune(buf);
  70. if(r == Runeerror)
  71. warn("unknown char %C(%C%C", backslash, c, cc);
  72. return r;
  73. error:
  74. warn("malformed %C(xx", backslash);
  75. return 0;
  76. }
  77. /* 2.2 - Fonts */
  78. Rune fonttab[10][100];
  79. /*
  80. * \fx \f(xx \fN - font change
  81. * number register .f - current font
  82. * \f0 previous font (undocumented?)
  83. */
  84. /* change to font f. also \fx, \f(xx, \fN */
  85. /* .ft LongName is okay - temporarily at fp 0 */
  86. void
  87. ft(Rune *f)
  88. {
  89. int i;
  90. int fn;
  91. if(f && runestrcmp(f, L("P")) == 0)
  92. f = nil;
  93. if(f == nil)
  94. fn = 0;
  95. else if(isdigit(f[0]))
  96. fn = eval(f);
  97. else{
  98. for(i=0; i<nelem(fonttab); i++){
  99. if(runestrcmp(fonttab[i], f) == 0){
  100. fn = i;
  101. goto have;
  102. }
  103. }
  104. warn("unknown font %S", f);
  105. fn = 1;
  106. }
  107. have:
  108. if(fn < 0 || fn >= nelem(fonttab)){
  109. warn("unknown font %d", fn);
  110. fn = 1;
  111. }
  112. if(fn == 0)
  113. fn = getnr(L(".f0"));
  114. nr(L(".f0"), getnr(L(".f")));
  115. nr(L(".f"), fn);
  116. runmacro1(L("font"));
  117. }
  118. /* mount font named f on physical position N */
  119. void
  120. fp(int i, Rune *f)
  121. {
  122. if(i <= 0 || i >= nelem(fonttab)){
  123. warn("bad font position %d", i);
  124. return;
  125. }
  126. runestrecpy(fonttab[i], fonttab[i]+sizeof fonttab[i], f);
  127. }
  128. int
  129. e_f(void)
  130. {
  131. ft(getname());
  132. return 0;
  133. }
  134. void
  135. r_ft(int argc, Rune **argv)
  136. {
  137. if(argc == 1)
  138. ft(nil);
  139. else
  140. ft(argv[1]);
  141. }
  142. void
  143. r_fp(int argc, Rune **argv)
  144. {
  145. if(argc < 3){
  146. warn("missing arguments to %Cfp", dot);
  147. return;
  148. }
  149. fp(eval(argv[1]), argv[2]);
  150. }
  151. /* 2.3 - Character size */
  152. /* \H'±N' sets height */
  153. void
  154. ps(int s)
  155. {
  156. if(s == 0)
  157. s = getnr(L(".s0"));
  158. nr(L(".s0"), getnr(L(".s")));
  159. nr(L(".s"), s);
  160. runmacro1(L("font"));
  161. }
  162. /* set point size */
  163. void
  164. r_ps(int argc, Rune **argv)
  165. {
  166. Rune *p;
  167. if(argc == 1 || argv[1][0] == 0)
  168. ps(0);
  169. else{
  170. p = argv[1];
  171. if(p[0] == '-')
  172. ps(getnr(L(".s"))-eval(p+1));
  173. else if(p[0] == '+')
  174. ps(getnr(L(".s"))+eval(p+1));
  175. else
  176. ps(eval(p));
  177. }
  178. }
  179. int
  180. e_s(void)
  181. {
  182. int c, cc, ccc, n, twodigit;
  183. c = getnext();
  184. if(c < 0)
  185. return 0;
  186. if(c == '+' || c == '-'){
  187. cc = getnext();
  188. if(cc == '('){
  189. cc = getnext();
  190. ccc = getnext();
  191. if(cc < '0' || cc > '9' || ccc < '0' || ccc > '9'){
  192. warn("bad size %Cs%C(%C%C", backslash, c, cc, ccc);
  193. return 0;
  194. }
  195. n = (cc-'0')*10+ccc-'0';
  196. }else{
  197. if(cc < '0' || cc > '9'){
  198. warn("bad size %Cs%C%C", backslash, c, cc);
  199. return 0;
  200. }
  201. n = cc-'0';
  202. }
  203. if(c == '+')
  204. ps(getnr(L(".s"))+n);
  205. else
  206. ps(getnr(L(".s"))-n);
  207. return 0;
  208. }
  209. twodigit = 0;
  210. if(c == '('){
  211. twodigit = 1;
  212. c = getnext();
  213. if(c < 0)
  214. return 0;
  215. }
  216. if(c < '0' || c > '9'){
  217. warn("bad size %Cs%C", backslash, c);
  218. ungetnext(c);
  219. return 0;
  220. }
  221. if(twodigit || (c < '4' && c != '0')){
  222. cc = getnext();
  223. if(c < 0)
  224. return 0;
  225. n = (c-'0')*10+cc-'0';
  226. }else
  227. n = c-'0';
  228. ps(n);
  229. return 0;
  230. }
  231. void
  232. t2init(void)
  233. {
  234. fp(1, L("R"));
  235. fp(2, L("I"));
  236. fp(3, L("B"));
  237. fp(4, L("BI"));
  238. fp(5, L("CW"));
  239. nr(L(".s"), 10);
  240. nr(L(".s0"), 10);
  241. addreq(L("ft"), r_ft, -1);
  242. addreq(L("fp"), r_fp, -1);
  243. addreq(L("ps"), r_ps, -1);
  244. addreq(L("ss"), r_warn, -1);
  245. addreq(L("cs"), r_warn, -1);
  246. addreq(L("bd"), r_warn, -1);
  247. addesc('f', e_f, 0);
  248. addesc('s', e_s, 0);
  249. addesc('(', e_paren, 0); /* ) */
  250. addesc('C', e_warn, 0);
  251. addesc('N', e_N, 0);
  252. /* \- \' \` are handled in html.c */
  253. }