#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); | |
} |