Subversion Repositories planix.SVN

Rev

Rev 2 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
2 - 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
}