t17.c (1708B)
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 }