Annotation of lucent/sys/src/cmd/rc/tree.c, revision 1.1

1.1     ! root        1: #include "rc.h"
        !             2: #include "exec.h"
        !             3: #include "io.h"
        !             4: #include "fns.h"
        !             5: tree *treenodes;
        !             6: /*
        !             7:  * create and clear a new tree node, and add it
        !             8:  * to the node list.
        !             9:  */
        !            10: tree *newtree(void){
        !            11:        tree *t=new(tree);
        !            12:        t->iskw=0;
        !            13:        t->str=0;
        !            14:        t->child[0]=t->child[1]=t->child[2]=0;
        !            15:        t->next=treenodes;
        !            16:        treenodes=t;
        !            17:        return t;
        !            18: }
        !            19: void freenodes(void){
        !            20:        tree *t, *u;
        !            21:        for(t=treenodes;t;t=u){
        !            22:                u=t->next;
        !            23:                if(t->str) efree(t->str);
        !            24:                efree((char *)t);
        !            25:        }
        !            26:        treenodes=0;
        !            27: }
        !            28: tree *tree1(int type, tree *c0)
        !            29: {
        !            30:        return tree3(type, c0, (tree *)0, (tree *)0);
        !            31: }
        !            32: tree *tree2(int type, tree *c0, tree *c1)
        !            33: {
        !            34:        return tree3(type, c0, c1, (tree *)0);
        !            35: }
        !            36: tree *tree3(int type, tree *c0, tree *c1, tree *c2)
        !            37: {
        !            38:        tree *t;
        !            39:        if(type==';'){
        !            40:                if(c0==0) return c1;
        !            41:                if(c1==0) return c0;
        !            42:        }
        !            43:        t=newtree();
        !            44:        t->type=type;
        !            45:        t->child[0]=c0;
        !            46:        t->child[1]=c1;
        !            47:        t->child[2]=c2;
        !            48:        return t;
        !            49: }
        !            50: tree *mung1(tree *t, tree *c0)
        !            51: {
        !            52:        t->child[0]=c0;
        !            53:        return t;
        !            54: }
        !            55: tree *mung2(tree *t, tree *c0, tree *c1)
        !            56: {
        !            57:        t->child[0]=c0;
        !            58:        t->child[1]=c1;
        !            59:        return t;
        !            60: }
        !            61: tree *mung3(tree *t, tree *c0, tree *c1, tree *c2)
        !            62: {
        !            63:        t->child[0]=c0;
        !            64:        t->child[1]=c1;
        !            65:        t->child[2]=c2;
        !            66:        return t;
        !            67: }
        !            68: tree *epimung(tree *comp, tree *epi)
        !            69: {
        !            70:        tree *p;
        !            71:        if(epi==0) return comp;
        !            72:        for(p=epi;p->child[1];p=p->child[1]);
        !            73:        p->child[1]=comp;
        !            74:        return epi;
        !            75: }
        !            76: /*
        !            77:  * Add a SIMPLE node at the root of t and percolate all the redirections
        !            78:  * up to the root.
        !            79:  */
        !            80: tree *simplemung(tree *t)
        !            81: {
        !            82:        tree *u;
        !            83:        struct io *s;
        !            84:        t=tree1(SIMPLE, t);
        !            85:        s=openstr();
        !            86:        pfmt(s, "%t", t);
        !            87:        t->str=strdup(s->strp);
        !            88:        closeio(s);
        !            89:        for(u=t->child[0];u->type==ARGLIST;u=u->child[0]){
        !            90:                if(u->child[1]->type==DUP
        !            91:                || u->child[1]->type==REDIR){
        !            92:                        u->child[1]->child[1]=t;
        !            93:                        t=u->child[1];
        !            94:                        u->child[1]=0;
        !            95:                }
        !            96:        }
        !            97:        return t;
        !            98: }
        !            99: tree *token(char *str, int type)
        !           100: {
        !           101:        tree *t=newtree();
        !           102:        t->type=type;
        !           103:        t->str=strdup(str);
        !           104:        return t;
        !           105: }
        !           106: void freetree(tree *p)
        !           107: {
        !           108:        if(p==0) return;        
        !           109:        freetree(p->child[0]);
        !           110:        freetree(p->child[1]);
        !           111:        freetree(p->child[2]);
        !           112:        if(p->str) efree(p->str);
        !           113:        efree((char *)p);
        !           114: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.