Blob
1 #include "a.h"3 /*4 * 17. Environment switching.5 */6 typedef struct Env Env;7 struct Env8 {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 051 };53 Env env[3];54 Env *evstack[20];55 int nevstack;57 void58 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 void75 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 void96 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;105 }106 restoreenv(evstack[--nevstack]);107 return;108 }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;115 }116 e = &env[getnr(L(".ev"))];117 saveenv(e);118 evstack[nevstack++] = e;119 restoreenv(&env[i]);120 }122 void123 t17init(void)124 {125 int i;127 for(i=0; i<nelem(env); i++)128 env[i] = defenv;130 addreq(L("ev"), r_ev, -1);131 }