Blob


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