#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