xref: /plan9/sys/src/cmd/htmlroff/t17.c (revision 426d2b71458df9b491ba6c167f699b3f1f7b0428)
1*426d2b71SDavid du Colombier #include "a.h"
2*426d2b71SDavid du Colombier 
3*426d2b71SDavid du Colombier /*
4*426d2b71SDavid du Colombier  * 17.  Environment switching.
5*426d2b71SDavid du Colombier  */
6*426d2b71SDavid du Colombier typedef struct Env Env;
7*426d2b71SDavid du Colombier struct Env
8*426d2b71SDavid du Colombier {
9*426d2b71SDavid du Colombier 	int s;
10*426d2b71SDavid du Colombier 	int s0;
11*426d2b71SDavid du Colombier 	int f;
12*426d2b71SDavid du Colombier 	int f0;
13*426d2b71SDavid du Colombier 	int fi;
14*426d2b71SDavid du Colombier 	int ad;
15*426d2b71SDavid du Colombier 	int ce;
16*426d2b71SDavid du Colombier 	int v;
17*426d2b71SDavid du Colombier 	int v0;
18*426d2b71SDavid du Colombier 	int ls;
19*426d2b71SDavid du Colombier 	int ls0;
20*426d2b71SDavid du Colombier 	int it;
21*426d2b71SDavid du Colombier 	/* - ta */
22*426d2b71SDavid du Colombier 	/* - tc */
23*426d2b71SDavid du Colombier 	/* - lc */
24*426d2b71SDavid du Colombier 	/* - ul */
25*426d2b71SDavid du Colombier 	/* - cu */
26*426d2b71SDavid du Colombier 	/* - cc */
27*426d2b71SDavid du Colombier 	/* - c2 */
28*426d2b71SDavid du Colombier 	/* - nh */
29*426d2b71SDavid du Colombier 	/* - hy */
30*426d2b71SDavid du Colombier 	/* - hc */
31*426d2b71SDavid du Colombier 	/* - lt */
32*426d2b71SDavid du Colombier 	/* - nm */
33*426d2b71SDavid du Colombier 	/* - nn */
34*426d2b71SDavid du Colombier 	/* - mc */
35*426d2b71SDavid du Colombier };
36*426d2b71SDavid du Colombier 
37*426d2b71SDavid du Colombier Env defenv =
38*426d2b71SDavid du Colombier {
39*426d2b71SDavid du Colombier 	10,
40*426d2b71SDavid du Colombier 	10,
41*426d2b71SDavid du Colombier 	1,
42*426d2b71SDavid du Colombier 	1,
43*426d2b71SDavid du Colombier 	1,
44*426d2b71SDavid du Colombier 	1,
45*426d2b71SDavid du Colombier 	0,
46*426d2b71SDavid du Colombier 	12,
47*426d2b71SDavid du Colombier 	12,
48*426d2b71SDavid du Colombier 	0,
49*426d2b71SDavid du Colombier 	0,
50*426d2b71SDavid du Colombier 	0,
51*426d2b71SDavid du Colombier };
52*426d2b71SDavid du Colombier 
53*426d2b71SDavid du Colombier Env env[3];
54*426d2b71SDavid du Colombier Env *evstack[20];
55*426d2b71SDavid du Colombier int nevstack;
56*426d2b71SDavid du Colombier 
57*426d2b71SDavid du Colombier void
saveenv(Env * e)58*426d2b71SDavid du Colombier saveenv(Env *e)
59*426d2b71SDavid du Colombier {
60*426d2b71SDavid du Colombier 	e->s = getnr(L(".s"));
61*426d2b71SDavid du Colombier 	e->s0 = getnr(L(".s0"));
62*426d2b71SDavid du Colombier 	e->f = getnr(L(".f"));
63*426d2b71SDavid du Colombier 	e->f0 = getnr(L(".f0"));
64*426d2b71SDavid du Colombier 	e->fi = getnr(L(".fi"));
65*426d2b71SDavid du Colombier 	e->ad = getnr(L(".ad"));
66*426d2b71SDavid du Colombier 	e->ce = getnr(L(".ce"));
67*426d2b71SDavid du Colombier 	e->v = getnr(L(".v"));
68*426d2b71SDavid du Colombier 	e->v0 = getnr(L(".v0"));
69*426d2b71SDavid du Colombier 	e->ls = getnr(L(".ls"));
70*426d2b71SDavid du Colombier 	e->ls0 = getnr(L(".ls0"));
71*426d2b71SDavid du Colombier 	e->it = getnr(L(".it"));
72*426d2b71SDavid du Colombier }
73*426d2b71SDavid du Colombier 
74*426d2b71SDavid du Colombier void
restoreenv(Env * e)75*426d2b71SDavid du Colombier restoreenv(Env *e)
76*426d2b71SDavid du Colombier {
77*426d2b71SDavid du Colombier 	nr(L(".s"), e->s);
78*426d2b71SDavid du Colombier 	nr(L(".s0"), e->s0);
79*426d2b71SDavid du Colombier 	nr(L(".f"), e->f);
80*426d2b71SDavid du Colombier 	nr(L(".f0"), e->f0);
81*426d2b71SDavid du Colombier 	nr(L(".fi"), e->fi);
82*426d2b71SDavid du Colombier 	nr(L(".ad"), e->ad);
83*426d2b71SDavid du Colombier 	nr(L(".ce"), e->ce);
84*426d2b71SDavid du Colombier 	nr(L(".v"), e->v);
85*426d2b71SDavid du Colombier 	nr(L(".v0"), e->v0);
86*426d2b71SDavid du Colombier 	nr(L(".ls"), e->ls);
87*426d2b71SDavid du Colombier 	nr(L(".ls0"), e->ls0);
88*426d2b71SDavid du Colombier 	nr(L(".it"), e->it);
89*426d2b71SDavid du Colombier 
90*426d2b71SDavid du Colombier 	nr(L(".ev"), e-env);
91*426d2b71SDavid du Colombier 	runmacro1(L("font"));
92*426d2b71SDavid du Colombier }
93*426d2b71SDavid du Colombier 
94*426d2b71SDavid du Colombier 
95*426d2b71SDavid du Colombier void
r_ev(int argc,Rune ** argv)96*426d2b71SDavid du Colombier r_ev(int argc, Rune **argv)
97*426d2b71SDavid du Colombier {
98*426d2b71SDavid du Colombier 	int i;
99*426d2b71SDavid du Colombier 	Env *e;
100*426d2b71SDavid du Colombier 
101*426d2b71SDavid du Colombier 	if(argc == 1){
102*426d2b71SDavid du Colombier 		if(nevstack <= 0){
103*426d2b71SDavid du Colombier 			if(verbose) warn(".ev stack underflow");
104*426d2b71SDavid du Colombier 			return;
105*426d2b71SDavid du Colombier 		}
106*426d2b71SDavid du Colombier 		restoreenv(evstack[--nevstack]);
107*426d2b71SDavid du Colombier 		return;
108*426d2b71SDavid du Colombier 	}
109*426d2b71SDavid du Colombier 	if(nevstack >= nelem(evstack))
110*426d2b71SDavid du Colombier 		sysfatal(".ev stack overflow");
111*426d2b71SDavid du Colombier 	i = eval(argv[1]);
112*426d2b71SDavid du Colombier 	if(i < 0 || i > 2){
113*426d2b71SDavid du Colombier 		warn(".ev bad environment %d", i);
114*426d2b71SDavid du Colombier 		i = 0;
115*426d2b71SDavid du Colombier 	}
116*426d2b71SDavid du Colombier 	e = &env[getnr(L(".ev"))];
117*426d2b71SDavid du Colombier 	saveenv(e);
118*426d2b71SDavid du Colombier 	evstack[nevstack++] = e;
119*426d2b71SDavid du Colombier 	restoreenv(&env[i]);
120*426d2b71SDavid du Colombier }
121*426d2b71SDavid du Colombier 
122*426d2b71SDavid du Colombier void
t17init(void)123*426d2b71SDavid du Colombier t17init(void)
124*426d2b71SDavid du Colombier {
125*426d2b71SDavid du Colombier 	int i;
126*426d2b71SDavid du Colombier 
127*426d2b71SDavid du Colombier 	for(i=0; i<nelem(env); i++)
128*426d2b71SDavid du Colombier 		env[i] = defenv;
129*426d2b71SDavid du Colombier 
130*426d2b71SDavid du Colombier 	addreq(L("ev"), r_ev, -1);
131*426d2b71SDavid du Colombier }
132