xref: /plan9/sys/src/cmd/htmlroff/t17.c (revision 426d2b71458df9b491ba6c167f699b3f1f7b0428)
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
saveenv(Env * e)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
restoreenv(Env * e)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
r_ev(int argc,Rune ** argv)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
t17init(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 }
132