Blame


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