132 lines
1.7 KiB
C
132 lines
1.7 KiB
C
#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);
|
|
}
|