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

Annotation of OpenXM_contrib2/asir2000/parse/pvar.c, Revision 1.1.1.1

1.1       noro        1: /* $OpenXM: OpenXM/src/asir99/parse/pvar.c,v 1.1.1.1 1999/11/10 08:12:34 noro Exp $ */
                      2: #include "ca.h"
                      3: #include "parse.h"
                      4:
                      5: NODE PVSS;
                      6:
                      7: void mkpvs()
                      8:  {
                      9:        VS pvs;
                     10:
                     11:        pvs = (VS)MALLOC(sizeof(struct oVS));
                     12:        pvs->va = (struct oPV *)MALLOC(DEFSIZE*sizeof(struct oPV));
                     13:        pvs->n = 0;
                     14:        pvs->asize=DEFSIZE;
                     15:        CPVS = pvs;
                     16: }
                     17:
                     18: void pushpvs(f)
                     19: FUNC f;
                     20: {
                     21:        VS pvs;
                     22:        NODE node;
                     23:        int level;
                     24:        extern int evalstatline;
                     25:
                     26:        pvs = f->f.usrf->pvs;
                     27:        if ( PVSS ) {
                     28:                ((VS)BDY(PVSS))->at = evalstatline;
                     29:                level = ((VS)BDY(PVSS))->level+1;
                     30:        } else
                     31:                level = 1;
                     32:        MKNODE(node,pvs,PVSS);
                     33:        PVSS = node;
                     34:        CPVS = (VS)MALLOC(sizeof(struct oVS)); BDY(PVSS) = (pointer)CPVS;
                     35:        CPVS->usrf = f;
                     36:        CPVS->n = CPVS->asize = pvs->n;
                     37:        CPVS->level = level;
                     38:        if ( CPVS->n ) {
                     39:                CPVS->va = (struct oPV *)MALLOC(CPVS->n*sizeof(struct oPV));
                     40:                bcopy((char *)pvs->va,(char *)CPVS->va,(int)(pvs->n*sizeof(struct oPV)));
                     41:        }
                     42:        if ( nextbp )
                     43:                nextbplevel++;
                     44: }
                     45:
                     46: void poppvs() {
                     47:        PVSS = NEXT(PVSS);
                     48:        if ( PVSS )
                     49:                CPVS = (VS)BDY(PVSS);
                     50:        else
                     51:                CPVS = GPVS;
                     52:        if ( nextbp )
                     53:                nextbplevel--;
                     54: }
                     55:
                     56: int gdef;
                     57:
                     58: int makepvar(str)
                     59: char *str;
                     60: {
                     61:        int c;
                     62:
                     63:        c = getpvar(CPVS,str,0);
                     64:        if ( gdef ) {
                     65:                getpvar(EPVS,str,0);
                     66:                if ( CPVS != GPVS ) {
                     67:                        getpvar(GPVS,str,0);
                     68:                        CPVS->va[c].attr = 1;
                     69:                }
                     70:        } else if ( (CPVS != GPVS) &&
                     71:                (CPVS->va[c].attr || (getpvar(EPVS,str,1) >= 0)) ) {
                     72:                CPVS->va[c].attr = 1;
                     73:                c = (getpvar(GPVS,str,1)|MSB);
                     74:        }
                     75:        return c;
                     76: }
                     77:
                     78: extern FUNC parse_targetf;
                     79:
                     80: int searchpvar(str)
                     81: char *str;
                     82: {
                     83:        VS pvs;
                     84:        int i;
                     85:
                     86:        if ( parse_targetf && parse_targetf->id != A_USR )
                     87:                return -1;
                     88:        pvs = parse_targetf ? parse_targetf->f.usrf->pvs : GPVS;
                     89:        i = getpvar(pvs,str,1);
                     90:        if ( ((i>=0)&&pvs->va[i].attr) || (i<0) )
                     91:                return getpvar(GPVS,str,1)|MSB;
                     92:        else
                     93:                return i;
                     94: }
                     95:
                     96: int getpvar(pvs,str,searchonly)
                     97: VS pvs;
                     98: char *str;
                     99: int searchonly;
                    100: {
                    101:        struct oPV *va;
                    102:        PV v;
                    103:        int i;
                    104:
                    105:        for ( va = pvs->va, i = 0; i < (int)pvs->n; i++ )
                    106:                if ( va[i].name && !strcmp(va[i].name,str) )
                    107:                        return i;
                    108:        if ( searchonly )
                    109:                return -1;
                    110:        if ( pvs->asize == pvs->n )
                    111:                reallocarray((char **)&pvs->va,(int *)&pvs->asize,(int *)&pvs->n,(int)sizeof(struct oPV));
                    112:        v = &pvs->va[pvs->n];
                    113:        NAME(v) = (char *)CALLOC(strlen(str)+1,sizeof(char));
                    114:        strcpy(NAME(v),str); v->priv = 0;
                    115:        v->attr= 0; v->type = -1; i = pvs->n; pvs->n++;
                    116:        return i;
                    117: }
                    118:
                    119: #if defined(VISUAL)
                    120: #define PCLOSE _pclose
                    121: #else
                    122: #define PCLOSE pclose
                    123: #endif
                    124:
                    125: void closecurrentinput()
                    126: {
                    127:        if ( asir_infile && !asir_infile->fp )
                    128:                return;
                    129:
                    130: #if defined(THINK_C) || defined(VISUAL)
                    131: #if defined(THINK_C)
                    132:        void setDir(short);
                    133:
                    134:        fclose(asir_infile->fp);
                    135:        setDir(asir_infile->vol);
                    136:        unlink(asir_infile->tname);
                    137:        resetDir();
                    138: #else
                    139:        fclose(asir_infile->fp);
                    140:        unlink(asir_infile->tname);
                    141: #endif
                    142: #else
                    143:        PCLOSE(asir_infile->fp);
                    144: #endif
                    145:        asir_infile = NEXT(asir_infile);
                    146:        resetpvs();
                    147: }
                    148:
                    149: void resetpvs()
                    150: {
                    151:        if ( !NEXT(asir_infile) ) {
                    152:                PVSS = 0; CPVS = GPVS; nextbp = 0;
                    153:                if ( EPVS->va ) {
                    154:                        bzero((char *)EPVS->va,(int)(EPVS->asize*sizeof(struct oPV))); EPVS->n = 0;
                    155:                }
                    156:        }
                    157: }
                    158:
                    159: static NODE saved_PVSS;
                    160: static VS saved_CPVS;
                    161: static int saved_nextbp, saved_nextbplevel;
                    162:
                    163: void savepvs()
                    164: {
                    165:        saved_PVSS = PVSS;
                    166:        saved_CPVS = CPVS;
                    167:        saved_nextbp = nextbp;
                    168:        saved_nextbplevel = nextbplevel;
                    169: }
                    170:
                    171: void restorepvs()
                    172: {
                    173:        PVSS = saved_PVSS;
                    174:        CPVS = saved_CPVS;
                    175:        nextbp = saved_nextbp;
                    176:        nextbplevel = saved_nextbplevel;
                    177: }
                    178:
                    179: void storeans(p)
                    180: pointer p;
                    181: {
                    182:        if ( APVS->asize == APVS->n )
                    183:                reallocarray((char **)&APVS->va,(int *)&APVS->asize,(int *)&APVS->n,(int)sizeof(struct oPV));
                    184:        APVS->va[APVS->n++].priv = p;
                    185: }
                    186:
                    187: #if 1
                    188: pointer evalpv(id,expr,f)
                    189: int id;
                    190: FNODE expr;
                    191: pointer f;
                    192: {
                    193:        pointer a,val = 0;
                    194:        pointer *addr;
                    195:
                    196:        if ( expr->id != I_PVAR && expr->id != I_CAST )
                    197:                error("evalpv : invalid assignment");
                    198:        switch ( id ) {
                    199:                case I_PRESELF:
                    200:                        getmemberp((FNODE)expr,(Obj **)&addr);
                    201:                        (*((ARF)f)->fp)(CO,*addr,ONE,&val); *addr = val; break;
                    202:                case I_POSTSELF:
                    203:                        getmemberp((FNODE)expr,(Obj **)&addr);
                    204:                        val = *addr; (*((ARF)f)->fp)(CO,*addr,ONE,&a); *addr = a; break;
                    205:                case I_PVAR:
                    206:                        getmember((FNODE)expr,(Obj *)&val); break;
                    207:                case I_ASSPVAR:
                    208:                        getmemberp((FNODE)expr,(Obj **)&addr); *addr = val = eval((FNODE)f); break;
                    209:        }
                    210:        return val;
                    211: }
                    212: #endif
                    213:
                    214: #if 0
                    215: pointer evalpv(id,tree,f)
                    216: int id;
                    217: NODE2 tree;
                    218: pointer f;
                    219: {
                    220:        pointer a,val = 0;
                    221:        pointer *addr;
                    222:        int pv;
                    223:        NODE ind,tn;
                    224:
                    225:        switch ( id ) {
                    226:                case I_PRESELF:
                    227:                        getmemberp((FNODE)tree,(Obj **)&addr);
                    228:                        (*((ARF)f)->fp)(CO,*addr,ONE,&val); *addr = val; break;
                    229:                case I_POSTSELF:
                    230:                        getmemberp((FNODE)tree,(Obj **)&addr);
                    231:                        val = *addr; (*((ARF)f)->fp)(CO,*addr,ONE,&a); *addr = a; break;
                    232:                case I_PVAR:
                    233:                        pv = (int)BDY1(tree); ind = (NODE)BDY2(tree); GETPV(pv,a);
                    234:                        if ( !ind )
                    235:                                val = a;
                    236:                        else {
                    237:                                evalnodebody(ind,&tn); getarray(a,tn,&val);
                    238:                        }
                    239:                        break;
                    240:                case I_ASSPVAR:
                    241:                        pv = (int)BDY1(tree); ind = (NODE)BDY2(tree);
                    242:                        if ( !ind ) {
                    243:                                val = eval(f); ASSPV(pv,val);
                    244:                        } else {
                    245:                                GETPV(pv,a);
                    246:                                if ( a ) {
                    247:                                        evalnodebody(ind,&tn); putarray(a,tn,val = eval(f));
                    248:                                }
                    249:                        }
                    250:                        break;
                    251:        }
                    252:        return val;
                    253: }
                    254: #endif

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