URI:
       tt17.c - plan9port - [fork] Plan 9 from user space
  HTML git clone git://src.adamsgaard.dk/plan9port
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
       tt17.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 }