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

Annotation of OpenXM_contrib2/asir2000/builtin/subst.c, Revision 1.1.1.1

1.1       noro        1: /* $OpenXM: OpenXM/src/asir99/builtin/subst.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 Psubst(), Ppsubst(), Psubstf();
                      6:
                      7: struct ftab subst_tab[] = {
                      8:        {"subst",Psubst,-99999999},
                      9:        {"psubst",Ppsubst,-99999999},
                     10:        {"substf",Psubstf,-99999999},
                     11:        {0,0,0},
                     12: };
                     13:
                     14: void Psubst(arg,rp)
                     15: NODE arg;
                     16: Obj *rp;
                     17: {
                     18:        Obj a,b,t;
                     19:        LIST l;
                     20:        V v;
                     21:
                     22:        if ( !arg ) {
                     23:                *rp = 0; return;
                     24:        }
                     25:        asir_assert(ARG0(arg),O_R,"subst");
                     26:        reductr(CO,(Obj)ARG0(arg),&a);
                     27: /*     a = (Obj)ARG0(arg); */
                     28:        arg = NEXT(arg);
                     29:        if ( arg && (l = (LIST)ARG0(arg)) && OID(l) == O_LIST )
                     30:                arg = BDY(l);
                     31:        while ( arg ) {
                     32:                asir_assert(BDY(arg),O_P,"subst");
                     33:                v = VR((P)BDY(arg)); arg = NEXT(arg);
                     34:                if ( !arg )
                     35:                        error("subst : invalid argument");
                     36:                asir_assert(ARG0(arg),O_R,"subst");
                     37:                reductr(CO,(Obj)BDY(arg),&b); arg = NEXT(arg);
                     38: /*             b = (Obj)BDY(arg); arg = NEXT(arg); */
                     39:                substr(CO,0,a,v,b,&t); a = t;
                     40:        }
                     41:        *rp = a;
                     42: }
                     43:
                     44: void Ppsubst(arg,rp)
                     45: NODE arg;
                     46: Obj *rp;
                     47: {
                     48:        Obj a,b,t;
                     49:        LIST l;
                     50:        V v;
                     51:
                     52:        if ( !arg ) {
                     53:                *rp = 0; return;
                     54:        }
                     55:        asir_assert(ARG0(arg),O_R,"psubst");
                     56:        reductr(CO,(Obj)ARG0(arg),&a);
                     57: /*     a = (Obj)ARG0(arg); */
                     58:        arg = NEXT(arg);
                     59:        if ( arg && (l = (LIST)ARG0(arg)) && OID(l) == O_LIST )
                     60:                arg = BDY(l);
                     61:        while ( arg ) {
                     62:                asir_assert(BDY(arg),O_P,"psubst");
                     63:                v = VR((P)BDY(arg)); arg = NEXT(arg);
                     64:                if ( !arg )
                     65:                        error("psubst : invalid argument");
                     66:                asir_assert(ARG0(arg),O_R,"psubst");
                     67:                reductr(CO,(Obj)BDY(arg),&b); arg = NEXT(arg);
                     68: /*             b = (Obj)BDY(arg); arg = NEXT(arg); */
                     69:                substr(CO,1,a,v,b,&t); a = t;
                     70:        }
                     71:        *rp = a;
                     72: }
                     73:
                     74: void Psubstf(arg,rp)
                     75: NODE arg;
                     76: Obj *rp;
                     77: {
                     78:        Obj a,t;
                     79:        LIST l;
                     80:        V v,f;
                     81:
                     82:        if ( !arg ) {
                     83:                *rp = 0; return;
                     84:        }
                     85:        asir_assert(ARG0(arg),O_R,"substf");
                     86:        reductr(CO,(Obj)ARG0(arg),&a);
                     87: /*     a = (Obj)ARG0(arg); */
                     88:        arg = NEXT(arg);
                     89:        if ( arg && (l = (LIST)ARG0(arg)) && OID(l) == O_LIST )
                     90:                arg = BDY(l);
                     91:        while ( arg ) {
                     92:                asir_assert(BDY(arg),O_P,"substf");
                     93:                v = VR((P)BDY(arg)); arg = NEXT(arg);
                     94:                if ( !arg || (int)v->attr != V_SR )
                     95:                        error("substf : invalid argument");
                     96:                f = VR((P)BDY(arg)); arg = NEXT(arg);
                     97:                if ( (int)f->attr != V_SR )
                     98:                        error("substf : invalid argument\n");
                     99:                substfr(CO,a,((FUNC)v->priv)->f.puref,((FUNC)f->priv)->f.puref,&t);
                    100:                a = t;
                    101:        }
                    102:        *rp = a;
                    103: }

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