]> git.lizzy.rs Git - plan9front.git/blob - sys/src/cmd/htmlroff/t17.c
ndb/dns: remove single-ip-address assuptions
[plan9front.git] / sys / src / cmd / htmlroff / t17.c
1 #include "a.h"
2
3 /*
4  * 17.  Environment switching.
5  */
6 typedef struct Env Env;
7 struct Env
8 {
9         int s;
10         int s0;
11         int f;
12         int f0;
13         int fi;
14         int ad;
15         int ce;
16         int v;
17         int v0;
18         int ls;
19         int ls0;
20         int it;
21         /* - ta */
22         /* - tc */
23         /* - lc */
24         /* - ul */
25         /* - cu */
26         /* - cc */
27         /* - c2 */
28         /* - nh */
29         /* - hy */
30         /* - hc */
31         /* - lt */
32         /* - nm */
33         /* - nn */
34         /* - mc */
35 };
36
37 Env defenv =
38 {
39         10,
40         10,
41         1,
42         1,
43         1,
44         1,
45         0,
46         12,
47         12,
48         0,
49         0,
50         0,
51 };
52
53 Env env[3];
54 Env *evstack[20];
55 int nevstack;
56
57 void
58 saveenv(Env *e)
59 {
60         e->s = getnr(L(".s"));
61         e->s0 = getnr(L(".s0"));
62         e->f = getnr(L(".f"));
63         e->f0 = getnr(L(".f0"));
64         e->fi = getnr(L(".fi"));
65         e->ad = getnr(L(".ad"));
66         e->ce = getnr(L(".ce"));
67         e->v = getnr(L(".v"));
68         e->v0 = getnr(L(".v0"));
69         e->ls = getnr(L(".ls"));
70         e->ls0 = getnr(L(".ls0"));
71         e->it = getnr(L(".it"));
72 }
73
74 void
75 restoreenv(Env *e)
76 {
77         nr(L(".s"), e->s);
78         nr(L(".s0"), e->s0);
79         nr(L(".f"), e->f);
80         nr(L(".f0"), e->f0);
81         nr(L(".fi"), e->fi);
82         nr(L(".ad"), e->ad);
83         nr(L(".ce"), e->ce);
84         nr(L(".v"), e->v);
85         nr(L(".v0"), e->v0);
86         nr(L(".ls"), e->ls);
87         nr(L(".ls0"), e->ls0);
88         nr(L(".it"), e->it);
89
90         nr(L(".ev"), e-env);
91         runmacro1(L("font"));
92 }
93
94
95 void
96 r_ev(int argc, Rune **argv)
97 {
98         int i;
99         Env *e;
100         
101         if(argc == 1){
102                 if(nevstack <= 0){
103                         if(verbose) warn(".ev stack underflow");
104                         return;
105                 }
106                 restoreenv(evstack[--nevstack]);
107                 return;
108         }
109         if(nevstack >= nelem(evstack))
110                 sysfatal(".ev stack overflow");
111         i = eval(argv[1]);
112         if(i < 0 || i > 2){
113                 warn(".ev bad environment %d", i);
114                 i = 0;
115         }
116         e = &env[getnr(L(".ev"))];
117         saveenv(e);
118         evstack[nevstack++] = e;
119         restoreenv(&env[i]);
120 }
121
122 void
123 t17init(void)
124 {
125         int i;
126         
127         for(i=0; i<nelem(env); i++)
128                 env[i] = defenv;
129
130         addreq(L("ev"), r_ev, -1);
131 }