| #include "a.h" |
| |
| /* |
| * 17. Environment switching. |
| */ |
| typedef struct Env Env; |
| struct Env |
| { |
| int s; |
| int s0; |
| int f; |
| int f0; |
| int fi; |
| int ad; |
| int ce; |
| int v; |
| int v0; |
| int ls; |
| int ls0; |
| int it; |
| /* - ta */ |
| /* - tc */ |
| /* - lc */ |
| /* - ul */ |
| /* - cu */ |
| /* - cc */ |
| /* - c2 */ |
| /* - nh */ |
| /* - hy */ |
| /* - hc */ |
| /* - lt */ |
| /* - nm */ |
| /* - nn */ |
| /* - mc */ |
| }; |
| |
| Env defenv = |
| { |
| 10, |
| 10, |
| 1, |
| 1, |
| 1, |
| 1, |
| 0, |
| 12, |
| 12, |
| 0, |
| 0, |
| 0 |
| }; |
| |
| Env env[3]; |
| Env *evstack[20]; |
| int nevstack; |
| |
| void |
| saveenv(Env *e) |
| { |
| e->s = getnr(L(".s")); |
| e->s0 = getnr(L(".s0")); |
| e->f = getnr(L(".f")); |
| e->f0 = getnr(L(".f0")); |
| e->fi = getnr(L(".fi")); |
| e->ad = getnr(L(".ad")); |
| e->ce = getnr(L(".ce")); |
| e->v = getnr(L(".v")); |
| e->v0 = getnr(L(".v0")); |
| e->ls = getnr(L(".ls")); |
| e->ls0 = getnr(L(".ls0")); |
| e->it = getnr(L(".it")); |
| } |
| |
| void |
| restoreenv(Env *e) |
| { |
| nr(L(".s"), e->s); |
| nr(L(".s0"), e->s0); |
| nr(L(".f"), e->f); |
| nr(L(".f0"), e->f0); |
| nr(L(".fi"), e->fi); |
| nr(L(".ad"), e->ad); |
| nr(L(".ce"), e->ce); |
| nr(L(".v"), e->v); |
| nr(L(".v0"), e->v0); |
| nr(L(".ls"), e->ls); |
| nr(L(".ls0"), e->ls0); |
| nr(L(".it"), e->it); |
| |
| nr(L(".ev"), e-env); |
| runmacro1(L("font")); |
| } |
| |
| |
| void |
| r_ev(int argc, Rune **argv) |
| { |
| int i; |
| Env *e; |
| |
| if(argc == 1){ |
| if(nevstack <= 0){ |
| if(verbose) warn(".ev stack underflow"); |
| return; |
| } |
| restoreenv(evstack[--nevstack]); |
| return; |
| } |
| if(nevstack >= nelem(evstack)) |
| sysfatal(".ev stack overflow"); |
| i = eval(argv[1]); |
| if(i < 0 || i > 2){ |
| warn(".ev bad environment %d", i); |
| i = 0; |
| } |
| e = &env[getnr(L(".ev"))]; |
| saveenv(e); |
| evstack[nevstack++] = e; |
| restoreenv(&env[i]); |
| } |
| |
| void |
| t17init(void) |
| { |
| int i; |
| |
| for(i=0; i<nelem(env); i++) |
| env[i] = defenv; |
| |
| addreq(L("ev"), r_ev, -1); |
| } |