plan9port

fork of plan9port with libvec, libstr and libsdb
Log | Files | Refs | README | LICENSE

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 }