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