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