1 c42a1d3d 2006-02-21 devnull #include "a.h"
4 c42a1d3d 2006-02-21 devnull * 17. Environment switching.
6 c42a1d3d 2006-02-21 devnull typedef struct Env Env;
7 c42a1d3d 2006-02-21 devnull struct Env
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 */
37 c42a1d3d 2006-02-21 devnull Env defenv =
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;
58 c42a1d3d 2006-02-21 devnull saveenv(Env *e)
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"));
75 c42a1d3d 2006-02-21 devnull restoreenv(Env *e)
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);
90 c42a1d3d 2006-02-21 devnull nr(L(".ev"), e-env);
91 c42a1d3d 2006-02-21 devnull runmacro1(L("font"));
96 c42a1d3d 2006-02-21 devnull r_ev(int argc, Rune **argv)
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");
106 c42a1d3d 2006-02-21 devnull restoreenv(evstack[--nevstack]);
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);
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]);
123 c42a1d3d 2006-02-21 devnull t17init(void)
127 c42a1d3d 2006-02-21 devnull for(i=0; i<nelem(env); i++)
128 c42a1d3d 2006-02-21 devnull env[i] = defenv;
130 c42a1d3d 2006-02-21 devnull addreq(L("ev"), r_ev, -1);