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