diff options
Diffstat (limited to 'src/cmd/htmlroff/t17.c')
-rw-r--r-- | src/cmd/htmlroff/t17.c | 131 |
1 files changed, 131 insertions, 0 deletions
diff --git a/src/cmd/htmlroff/t17.c b/src/cmd/htmlroff/t17.c new file mode 100644 index 00000000..2800ec76 --- /dev/null +++ b/src/cmd/htmlroff/t17.c @@ -0,0 +1,131 @@ +#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); +} |