[BACK]Return to var.c CVS log [TXT][DIR] Up to [local] / OpenXM_contrib2 / asir2000 / builtin

Annotation of OpenXM_contrib2/asir2000/builtin/var.c, Revision 1.1

1.1     ! noro        1: /* $OpenXM: OpenXM/src/asir99/builtin/var.c,v 1.1.1.1 1999/11/10 08:12:26 noro Exp $ */
        !             2: #include "ca.h"
        !             3: #include "parse.h"
        !             4:
        !             5: void Pvar(), Pvars(), Puc(), Pvars_recursive();
        !             6: void get_vars(Obj,VL *);
        !             7: void get_vars_recursive(Obj,VL *);
        !             8:
        !             9: struct ftab var_tab[] = {
        !            10:        {"var",Pvar,1},
        !            11:        {"vars",Pvars,1},
        !            12:        {"vars_recursive",Pvars_recursive,1},
        !            13:        {"uc",Puc,0},
        !            14:        {0,0,0},
        !            15: };
        !            16:
        !            17: void Pvar(arg,rp)
        !            18: NODE arg;
        !            19: Obj *rp;
        !            20: {
        !            21:        Obj t;
        !            22:        P p;
        !            23:        V vn,vd,v;
        !            24:        VL vl;
        !            25:
        !            26:        if ( !(t = (Obj)ARG0(arg)) )
        !            27:                v = 0;
        !            28:        else
        !            29:                switch ( OID(t) ) {
        !            30:                        case O_P:
        !            31:                                v = VR((P)t); break;
        !            32:                        case O_R:
        !            33:                                vn = VR(NM((R)t)); vd = VR(DN((R)t));
        !            34:                                for ( vl = CO; (vl->v != vn) && (vl->v != vd); vl = NEXT(vl) );
        !            35:                                v = vl->v; break;
        !            36:                        default:
        !            37:                                v = 0; break;
        !            38:                }
        !            39:        if ( v ) {
        !            40:                MKV(v,p); *rp = (Obj)p;
        !            41:        } else
        !            42:                *rp = 0;
        !            43: }
        !            44:
        !            45: void Pvars(arg,rp)
        !            46: NODE arg;
        !            47: LIST *rp;
        !            48: {
        !            49:        VL vl;
        !            50:        NODE n,n0;
        !            51:        P p;
        !            52:
        !            53:        get_vars((Obj)ARG0(arg),&vl);
        !            54:        for ( n0 = 0; vl; vl = NEXT(vl) ) {
        !            55:                NEXTNODE(n0,n); MKV(vl->v,p); BDY(n) = (pointer)p;
        !            56:        }
        !            57:        if ( n0 )
        !            58:                NEXT(n) = 0;
        !            59:        MKLIST(*rp,n0);
        !            60: }
        !            61:
        !            62: void Pvars_recursive(arg,rp)
        !            63: NODE arg;
        !            64: LIST *rp;
        !            65: {
        !            66:        VL vl;
        !            67:        NODE n,n0;
        !            68:        P p;
        !            69:
        !            70:        get_vars_recursive((Obj)ARG0(arg),&vl);
        !            71:        for ( n0 = 0; vl; vl = NEXT(vl) ) {
        !            72:                NEXTNODE(n0,n); MKV(vl->v,p); BDY(n) = (pointer)p;
        !            73:        }
        !            74:        if ( n0 )
        !            75:                NEXT(n) = 0;
        !            76:        MKLIST(*rp,n0);
        !            77: }
        !            78:
        !            79: void get_vars_recursive(obj,vlp)
        !            80: Obj obj;
        !            81: VL *vlp;
        !            82: {
        !            83:        VL vl,vl0,vl1,vl2,t;
        !            84:        PFINS ins;
        !            85:        int argc,i;
        !            86:        PFAD ad;
        !            87:
        !            88:        get_vars(obj,&vl);
        !            89:        vl0 = 0;
        !            90:        for ( t = vl; t; t = NEXT(t) )
        !            91:                if ( t->v->attr == (pointer)V_PF ) {
        !            92:                        ins = (PFINS)t->v->priv;
        !            93:                        argc = ins->pf->argc;
        !            94:                        ad = ins->ad;
        !            95:                        for ( i = 0; i < argc; i++ ) {
        !            96:                                get_vars_recursive(ad[i].arg,&vl1);
        !            97:                                mergev(CO,vl0,vl1,&vl2); vl0 = vl2;
        !            98:                        }
        !            99:                }
        !           100:        mergev(CO,vl,vl0,vlp);
        !           101: }
        !           102:
        !           103: void get_vars(t,vlp)
        !           104: Obj t;
        !           105: VL *vlp;
        !           106: {
        !           107:        pointer *vb;
        !           108:        pointer **mb;
        !           109:        VL vl,vl1,vl2;
        !           110:        NODE n;
        !           111:        MP mp;
        !           112:        int i,j,row,col,len;
        !           113:
        !           114:        if ( !t )
        !           115:                vl = 0;
        !           116:        else
        !           117:                switch ( OID(t) ) {
        !           118:                        case O_P: case O_R:
        !           119:                                clctvr(CO,t,&vl); break;
        !           120:                        case O_VECT:
        !           121:                                len = ((VECT)t)->len; vb = BDY((VECT)t);
        !           122:                                for ( i = 0, vl = 0; i < len; i++ ) {
        !           123:                                        get_vars((Obj)vb[i],&vl1); mergev(CO,vl,vl1,&vl2);
        !           124:                                        vl = vl2;
        !           125:                                }
        !           126:                                break;
        !           127:                        case O_MAT:
        !           128:                                row = ((MAT)t)->row; col = ((MAT)t)->col; mb = BDY((MAT)t);
        !           129:                                for ( i = 0, vl = 0; i < row; i++ )
        !           130:                                        for ( j = 0; j < col; j++ ) {
        !           131:                                                get_vars((Obj)mb[i][j],&vl1); mergev(CO,vl,vl1,&vl2);
        !           132:                                                vl = vl2;
        !           133:                                        }
        !           134:                                break;
        !           135:                        case O_LIST:
        !           136:                                n = BDY((LIST)t);
        !           137:                                for ( vl = 0; n; n = NEXT(n) ) {
        !           138:                                        get_vars((Obj)BDY(n),&vl1); mergev(CO,vl,vl1,&vl2);
        !           139:                                        vl = vl2;
        !           140:                                }
        !           141:                                break;
        !           142:                        case O_DP:
        !           143:                                mp = ((DP)t)->body;
        !           144:                                for ( vl = 0; mp; mp = NEXT(mp) ) {
        !           145:                                        get_vars((Obj)mp->c,&vl1); mergev(CO,vl,vl1,&vl2);
        !           146:                                        vl = vl2;
        !           147:                                }
        !           148:                                break;
        !           149:                        default:
        !           150:                                vl = 0; break;
        !           151:                }
        !           152:        *vlp = vl;
        !           153: }
        !           154:
        !           155: void Puc(p)
        !           156: Obj *p;
        !           157: {
        !           158:        VL vl;
        !           159:        V v;
        !           160:        P t;
        !           161:        char buf[BUFSIZ];
        !           162:        static int UCN;
        !           163:
        !           164:        NEWV(v); v->attr = (pointer)V_UC;
        !           165:        sprintf(buf,"_%d",UCN++);
        !           166:        NAME(v) = (char *)CALLOC(strlen(buf)+1,sizeof(char));
        !           167:        strcpy(NAME(v),buf);
        !           168:        for ( vl = CO; NEXT(vl); vl = NEXT(vl) );
        !           169:        NEWVL(NEXT(vl)); VR(NEXT(vl)) = v; NEXT(NEXT(vl)) = 0;
        !           170:        MKV(v,t); *p = (Obj)t;
        !           171: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>