Subversion Repositories planix.SVN

Rev

Blame | Last modification | View Log | RSS feed

#include "a.h"

/*
 * 17.  Environment switching.
 */
typedef struct Env Env;
struct Env
{
        int s;
        int s0;
        int f;
        int f0;
        int fi;
        int ad;
        int ce;
        int v;
        int v0;
        int ls;
        int ls0;
        int it;
        /* - ta */
        /* - tc */
        /* - lc */
        /* - ul */
        /* - cu */
        /* - cc */
        /* - c2 */
        /* - nh */
        /* - hy */
        /* - hc */
        /* - lt */
        /* - nm */
        /* - nn */
        /* - mc */
};

Env defenv =
{
        10,
        10,
        1,
        1,
        1,
        1,
        0,
        12,
        12,
        0,
        0,
        0,
};

Env env[3];
Env *evstack[20];
int nevstack;

void
saveenv(Env *e)
{
        e->s = getnr(L(".s"));
        e->s0 = getnr(L(".s0"));
        e->f = getnr(L(".f"));
        e->f0 = getnr(L(".f0"));
        e->fi = getnr(L(".fi"));
        e->ad = getnr(L(".ad"));
        e->ce = getnr(L(".ce"));
        e->v = getnr(L(".v"));
        e->v0 = getnr(L(".v0"));
        e->ls = getnr(L(".ls"));
        e->ls0 = getnr(L(".ls0"));
        e->it = getnr(L(".it"));
}

void
restoreenv(Env *e)
{
        nr(L(".s"), e->s);
        nr(L(".s0"), e->s0);
        nr(L(".f"), e->f);
        nr(L(".f0"), e->f0);
        nr(L(".fi"), e->fi);
        nr(L(".ad"), e->ad);
        nr(L(".ce"), e->ce);
        nr(L(".v"), e->v);
        nr(L(".v0"), e->v0);
        nr(L(".ls"), e->ls);
        nr(L(".ls0"), e->ls0);
        nr(L(".it"), e->it);

        nr(L(".ev"), e-env);
        runmacro1(L("font"));
}


void
r_ev(int argc, Rune **argv)
{
        int i;
        Env *e;
        
        if(argc == 1){
                if(nevstack <= 0){
                        if(verbose) warn(".ev stack underflow");
                        return;
                }
                restoreenv(evstack[--nevstack]);
                return;
        }
        if(nevstack >= nelem(evstack))
                sysfatal(".ev stack overflow");
        i = eval(argv[1]);
        if(i < 0 || i > 2){
                warn(".ev bad environment %d", i);
                i = 0;
        }
        e = &env[getnr(L(".ev"))];
        saveenv(e);
        evstack[nevstack++] = e;
        restoreenv(&env[i]);
}

void
t17init(void)
{
        int i;
        
        for(i=0; i<nelem(env); i++)
                env[i] = defenv;

        addreq(L("ev"), r_ev, -1);
}