aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/htmlroff/t17.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/cmd/htmlroff/t17.c')
-rw-r--r--src/cmd/htmlroff/t17.c131
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);
+}