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

Annotation of OpenXM_contrib2/asir2000/parse/quote.c, Revision 1.24

1.24    ! noro        1: /* $OpenXM: OpenXM_contrib2/asir2000/parse/quote.c,v 1.23 2005/09/27 09:32:22 noro Exp $ */
1.3       noro        2:
1.1       noro        3: #include "ca.h"
                      4: #include "parse.h"
                      5:
1.6       noro        6: void addquote(VL vl,QUOTE a,QUOTE b,QUOTE *c)
1.1       noro        7: {
                      8:        FNODE fn;
1.22      noro        9:        QUOTE t;
1.1       noro       10:
1.22      noro       11:        objtoquote((Obj)a,&t); a = t; objtoquote((Obj)b,&t); b = t;
1.1       noro       12:        fn = mkfnode(3,I_BOP,addfs,BDY(a),BDY(b));
                     13:        MKQUOTE(*c,fn);
                     14: }
                     15:
1.6       noro       16: void subquote(VL vl,QUOTE a,QUOTE b,QUOTE *c)
1.1       noro       17: {
                     18:        FNODE fn;
1.22      noro       19:        QUOTE t;
1.1       noro       20:
1.22      noro       21:        objtoquote((Obj)a,&t); a = t; objtoquote((Obj)b,&t); b = t;
1.1       noro       22:        fn = mkfnode(3,I_BOP,subfs,BDY(a),BDY(b));
                     23:        MKQUOTE(*c,fn);
                     24: }
                     25:
1.6       noro       26: void mulquote(VL vl,QUOTE a,QUOTE b,QUOTE *c)
1.1       noro       27: {
                     28:        FNODE fn;
1.22      noro       29:        QUOTE t;
1.1       noro       30:
1.22      noro       31:        objtoquote((Obj)a,&t); a = t; objtoquote((Obj)b,&t); b = t;
1.1       noro       32:        fn = mkfnode(3,I_BOP,mulfs,BDY(a),BDY(b));
                     33:        MKQUOTE(*c,fn);
                     34: }
                     35:
1.6       noro       36: void divquote(VL vl,QUOTE a,QUOTE b,QUOTE *c)
1.1       noro       37: {
                     38:        FNODE fn;
1.22      noro       39:        QUOTE t;
1.1       noro       40:
1.22      noro       41:        objtoquote((Obj)a,&t); a = t; objtoquote((Obj)b,&t); b = t;
1.1       noro       42:        fn = mkfnode(3,I_BOP,divfs,BDY(a),BDY(b));
                     43:        MKQUOTE(*c,fn);
                     44: }
                     45:
1.6       noro       46: void pwrquote(VL vl,QUOTE a,QUOTE b,QUOTE *c)
1.1       noro       47: {
                     48:        FNODE fn;
1.22      noro       49:        QUOTE t;
1.1       noro       50:
1.22      noro       51:        objtoquote((Obj)a,&t); a = t; objtoquote((Obj)b,&t); b = t;
1.1       noro       52:        fn = mkfnode(3,I_BOP,pwrfs,BDY(a),BDY(b));
                     53:        MKQUOTE(*c,fn);
                     54: }
                     55:
1.6       noro       56: void chsgnquote(QUOTE a,QUOTE *c)
1.1       noro       57: {
                     58:        FNODE fn;
1.22      noro       59:        QUOTE t;
1.1       noro       60:
1.22      noro       61:        objtoquote((Obj)a,&t); a = t;
1.17      noro       62:        fn = mkfnode(1,I_MINUS,BDY(a));
1.1       noro       63:        MKQUOTE(*c,fn);
                     64: }
1.2       noro       65:
1.6       noro       66: void objtoquote(Obj a,QUOTE *c)
1.2       noro       67: {
                     68:        QUOTE nm,dn;
1.4       noro       69:        NODE arg,t0,t,t1,t2,t3;
                     70:        FNODE fn;
1.5       noro       71:        Obj obj;
1.4       noro       72:        Obj *b;
                     73:        Obj **m;
                     74:        int i,j,len,row,col;
                     75:        Q q,qrow,qcol;
                     76:        FUNC f;
1.2       noro       77:
                     78:        if ( !a ) {
                     79:                MKQUOTE(*c,mkfnode(1,I_FORMULA,(pointer)a));
                     80:                return;
                     81:        }
                     82:        switch ( OID(a) ) {
                     83:                case O_N:
1.5       noro       84:                        if ( negative_number((Num)a) ) {
                     85:                                arf_chsgn(a,&obj);
                     86:                                MKQUOTE(*c,mkfnode(1,I_MINUS,
                     87:                                        mkfnode(1,I_FORMULA,(pointer)obj)));
                     88:                        } else {
                     89:                                MKQUOTE(*c,mkfnode(1,I_FORMULA,(pointer)a));
                     90:                        }
                     91:                        break;
1.4       noro       92:                case O_STR:
1.2       noro       93:                        MKQUOTE(*c,mkfnode(1,I_FORMULA,(pointer)a));
                     94:                        break;
                     95:                case O_P:
                     96:                        polytoquote((P)a,c);
                     97:                        break;
                     98:                case O_R:
                     99:                        polytoquote(NM((R)a),&nm);
                    100:                        polytoquote(DN((R)a),&dn);
                    101:                        divquote(CO,nm,dn,c);
                    102:                        break;
1.4       noro      103:                case O_LIST:
                    104:                        t0 = 0;
                    105:                        for ( arg = BDY((LIST)a); arg; arg = NEXT(arg) ) {
                    106:                                NEXTNODE(t0,t);
                    107:                                objtoquote(BDY(arg),&nm);
                    108:                                BDY(t) = BDY(nm);
                    109:                        }
                    110:                        if ( t0 )
                    111:                                NEXT(t) = 0;
                    112:                        MKQUOTE(*c,mkfnode(1,I_LIST,t0));
                    113:                        break;
                    114:                case O_VECT:
                    115:                        len = ((VECT)a)->len;
                    116:                        b = (Obj *)BDY(((VECT)a));
                    117:                        t = 0;
                    118:                        for ( i = len-1; i >= 0; i-- ) {
                    119:                                objtoquote(b[i],&nm);
                    120:                                MKNODE(t1,BDY(nm),t);
                    121:                                t = t1;
                    122:                        }
                    123:                        STOQ(len,q);
                    124:                        t = mknode(2,mkfnode(1,I_FORMULA,q),mkfnode(1,I_LIST,t));
                    125:                        gen_searchf("vector",&f);
                    126:                        MKQUOTE(*c,mkfnode(2,I_FUNC,f,mkfnode(1,I_LIST,t)));
                    127:                        break;
                    128:                case O_MAT:
                    129:                        row = ((MAT)a)->row;
                    130:                        col = ((MAT)a)->row;
                    131:                        m = (Obj **)BDY(((MAT)a));
                    132:                        t2 = 0;
                    133:                        for ( i = row-1; i >= 0; i-- ) {
                    134:                                t = 0;
                    135:                                for ( j = col-1; j >= 0; j-- ) {
                    136:                                        objtoquote(m[i][j],&nm);
                    137:                                        MKNODE(t1,BDY(nm),t);
                    138:                                        t = t1;
                    139:                                }
                    140:                                fn = mkfnode(1,I_LIST,t);
                    141:                                MKNODE(t3,fn,t2);
                    142:                                t2 = t3;
                    143:                        }
                    144:                        fn = mkfnode(1,I_LIST,t2);
                    145:
                    146:                        STOQ(row,qrow);
                    147:                        STOQ(col,qcol);
                    148:                        t = mknode(3,
                    149:                                mkfnode(1,I_FORMULA,qrow),mkfnode(1,I_FORMULA,qcol),fn);
                    150:                        gen_searchf("matrix",&f);
                    151:                        MKQUOTE(*c,mkfnode(2,I_FUNC,f,mkfnode(1,I_LIST,t)));
                    152:                        break;
                    153:                case O_DP:
                    154:                        dptoquote((DP)a,c);
                    155:                        break;
1.2       noro      156:                case O_QUOTE:
                    157:                        *c = (QUOTE)a;
                    158:                        break;
                    159:                default:
                    160:                        error("objtoquote : not implemented");
                    161:        }
                    162: }
                    163:
1.6       noro      164: void polytoquote(P a,QUOTE *c)
1.2       noro      165: {
                    166:        DCP dc,t;
                    167:        DCP *dca;
1.7       noro      168:        int n,i,sgn;
1.2       noro      169:        QUOTE v,r,s,u;
                    170:
1.10      noro      171:        if ( !a ) {
                    172:                MKQUOTE(*c,mkfnode(1,I_FORMULA,(pointer)a));
                    173:                return;
                    174:        } else if ( OID(a) == O_N ) {
1.2       noro      175:                MKQUOTE(*c,mkfnode(1,I_FORMULA,(pointer)a));
                    176:                return;
                    177:        }
1.7       noro      178:        vartoquote(VR((P)a),&v);
1.2       noro      179:        dc = DC((P)a);
1.7       noro      180:        dctoquote(dc,v,&r,&sgn);
                    181:        if ( sgn == -1 ) {
                    182:                MKQUOTE(u,mkfnode(1,I_MINUS,BDY(r)));
                    183:                r = u;
                    184:        }
                    185:        for (dc = NEXT(dc); dc; dc = NEXT(dc) ) {
                    186:                dctoquote(dc,v,&s,&sgn);
                    187:                if ( sgn == -1 )
                    188:                        subquote(CO,r,s,&u);
                    189:                else
                    190:                        addquote(CO,r,s,&u);
1.2       noro      191:                r = u;
                    192:        }
                    193:        *c = r;
                    194: }
                    195:
1.6       noro      196: void dptoquote(DP a,QUOTE *c)
1.4       noro      197: {
                    198:        MP t;
1.8       noro      199:        MP m;
                    200:        int i,n,nv,sgn;
1.4       noro      201:        QUOTE s,r,u;
                    202:
                    203:        if ( !a ) {
                    204:                MKQUOTE(*c,mkfnode(1,I_FORMULA,(pointer)a));
                    205:                return;
                    206:        }
                    207:        nv = NV(a);
1.8       noro      208:        m = BDY(a);
                    209:        mptoquote(m,nv,&r,&sgn);
                    210:        if ( sgn == -1 ) {
                    211:                MKQUOTE(u,mkfnode(1,I_MINUS,BDY(r)));
                    212:                r = u;
                    213:        }
                    214:        for ( m = NEXT(m); m; m = NEXT(m) ) {
                    215:                mptoquote(m,nv,&s,&sgn);
                    216:                if ( sgn < 0 )
                    217:                        subquote(CO,r,s,&u);
                    218:                else
                    219:                        addquote(CO,r,s,&u);
1.4       noro      220:                r = u;
                    221:        }
                    222:        *c = r;
                    223: }
                    224:
1.7       noro      225: void dctoquote(DCP dc,QUOTE v,QUOTE *q,int *sgn)
1.2       noro      226: {
1.7       noro      227:        QUOTE t,s,u,r;
                    228:        P c;
                    229:        Q d;
                    230:
                    231:        if ( mmono(COEF(dc)) ) {
                    232:                /* -xyz... */
                    233:                chsgnp(COEF(dc),&c);
                    234:                *sgn = -1;
                    235:        } else {
                    236:                c = COEF(dc);
                    237:                *sgn = 1;
                    238:        }
                    239:        d = DEG(dc);
                    240:        if ( UNIQ(c) ) {
                    241:                if ( d ) {
                    242:                        if ( UNIQ(d) )
                    243:                                r = v;
1.4       noro      244:                        else {
1.7       noro      245:                                objtoquote((Obj)d,&t);
                    246:                                pwrquote(CO,v,t,&r);
1.4       noro      247:                        }
                    248:                } else
1.7       noro      249:                        objtoquote((Obj)ONE,&r);
1.4       noro      250:        } else {
1.7       noro      251:                objtoquote((Obj)c,&u);
1.12      noro      252:                if ( !NUM(c) && NEXT(DC(c)) && d ) {
1.7       noro      253:                        MKQUOTE(t,mkfnode(1,I_PAREN,BDY(u)));
                    254:                        u = t;
                    255:                }
                    256:                if ( d ) {
                    257:                        if ( UNIQ(d) )
1.4       noro      258:                                s = v;
                    259:                        else {
1.7       noro      260:                                objtoquote((Obj)d,&t);
                    261:                                pwrquote(CO,v,t,&s);
1.4       noro      262:                        }
1.7       noro      263:                        mulquote(CO,u,s,&r);
1.4       noro      264:                } else
1.7       noro      265:                        r = u;
1.4       noro      266:        }
1.7       noro      267:        *q = r;
1.4       noro      268: }
                    269:
1.8       noro      270: void mptoquote(MP m,int n,QUOTE *r,int *sgn)
1.4       noro      271: {
                    272:        QUOTE s,u;
1.8       noro      273:        P c;
1.4       noro      274:        NODE t,t1;
                    275:        FNODE f;
                    276:        Q q;
                    277:        DL dl;
                    278:        int i;
                    279:
1.8       noro      280:        if ( mmono(C(m)) ) {
                    281:                chsgnp(C(m),&c);
                    282:                *sgn = -1;
                    283:        } else {
                    284:                c = C(m);
                    285:                *sgn = 1;
                    286:        }
                    287:        objtoquote((Obj)c,&s);
                    288:        if ( !NUM(c) && NEXT(DC(c)) ) {
                    289:                MKQUOTE(u,mkfnode(1,I_PAREN,BDY(s)));
                    290:                s = u;
                    291:        }
1.4       noro      292:        dl = m->dl;
1.9       noro      293:        for ( i = n-1, t = 0; i >= 0; i-- ) {
                    294:                STOQ(dl->d[i],q);
                    295:                f = mkfnode(1,I_FORMULA,q);
                    296:                MKNODE(t1,f,t);
                    297:                t = t1;
                    298:        }
                    299:        MKQUOTE(u,mkfnode(1,I_EV,t));
                    300:        if ( UNIQ(c) )
                    301:                *r = u;
                    302:        else
                    303:                mulquote(CO,s,u,r);
1.2       noro      304: }
                    305:
1.6       noro      306: void vartoquote(V v,QUOTE *c)
1.2       noro      307: {
                    308:        P x;
                    309:        PF pf;
                    310:        PFAD ad;
1.13      noro      311:        QUOTE a,b,u;
1.2       noro      312:        int i;
                    313:        FUNC f;
                    314:        NODE t,t1;
                    315:
                    316:        if ( NAME(v) ) {
                    317:                MKV(v,x);
                    318:                MKQUOTE(*c,mkfnode(1,I_FORMULA,(pointer)x));
                    319:        } else if ( (vid)v->attr == V_PF ) {
                    320:                /* pure function */
                    321:                pf = ((PFINS)v->priv)->pf;
                    322:                ad = ((PFINS)v->priv)->ad;
                    323:                if ( !strcmp(NAME(pf),"pow") ) {
                    324:                        /* pow(a,b) = a^b */
1.13      noro      325:                        objtoquote(ad[0].arg,&a);
                    326:                        x = (P)ad[0].arg;
                    327:                        /* check whether x is a variable */
                    328:                        if ( x && OID(x)==O_P && !NEXT(DC(x))
                    329:                                && UNIQ(DEG(DC(x))) && UNIQ(COEF(DC(x))) ) {
                    330:                                /* use a as is */
                    331:                        } else {
                    332:                                /* a => (a) */
1.19      noro      333:                                MKQUOTE(u,mkfnode(1,I_PAREN,BDY(a))); a = u;
1.13      noro      334:                        }
                    335:                        objtoquote(ad[1].arg,&b);
1.19      noro      336:                        pwrquote(CO,a,b,c);
1.2       noro      337:                } else {
                    338:                        for ( i = 0; i < pf->argc; i++ )
                    339:                                if ( ad[i].d )
                    340:                                        break;
                    341:                        if ( i < pf->argc )
                    342:                                error("vartoquote : not implemented");
                    343:                        gen_searchf(NAME(pf),&f);
                    344:                        t = 0;
                    345:                        for ( i = pf->argc-1; i >= 0; i-- ) {
                    346:                                objtoquote(ad[i].arg,&a);
                    347:                                MKNODE(t1,BDY(a),t);
                    348:                                t = t1;
                    349:                        }
                    350:                        MKQUOTE(*c,mkfnode(2,I_FUNC,f,mkfnode(1,I_LIST,t)));
                    351:                }
1.14      noro      352:        }
                    353: }
                    354:
1.21      noro      355: /*
                    356:  * A_arf : arithmetic function
                    357:  * A_int : machine integer
                    358:  * A_fnode : FNODE
                    359:  * A_node : NODE with FNODE bodies
                    360:  * A_internal : internal object
                    361:  * A_str : string
                    362:  * A_end : terminal
                    363:  * A_func : FUNC
                    364:  * A_notimpl : not implemented
                    365:  */
                    366:
1.14      noro      367: struct fid_spec fid_spec_tab[] = {
1.17      noro      368:        {I_BOP,A_arf,A_fnode,A_fnode,A_end},
                    369:        {I_COP,A_int,A_fnode,A_fnode,A_end},
                    370:        {I_AND,A_fnode,A_fnode,A_end},
                    371:        {I_OR,A_fnode,A_fnode,A_end},
                    372:        {I_NOT,A_fnode,A_end},
                    373:        {I_CE,A_fnode,A_fnode,A_end},
                    374:        {I_PRESELF,A_arf,A_fnode,A_end},
                    375:        {I_POSTSELF,A_arf,A_fnode,A_end},
                    376:        {I_FUNC,A_func,A_fnode,A_end},
                    377:        {I_FUNC_OPT,A_func,A_fnode,A_fnode,A_end},
                    378:        {I_IFUNC,A_fnode,A_fnode,A_end},
                    379:        {I_MAP,A_func,A_fnode,A_end},
                    380:        {I_RECMAP,A_func,A_fnode,A_end},
1.14      noro      381:        {I_PFDERIV,A_notimpl,A_end},
                    382:        {I_ANS,A_int,A_end},
                    383:        {I_PVAR,A_int,A_node,A_end},
1.17      noro      384:        {I_ASSPVAR,A_fnode,A_fnode,A_end},
1.14      noro      385:        {I_FORMULA,A_internal,A_end},
                    386:        {I_LIST,A_node,A_end},
                    387:        {I_STR,A_str,A_end},
                    388:        {I_NEWCOMP,A_int,A_end},
1.17      noro      389:        {I_CAR,A_fnode,A_end},
                    390:        {I_CDR,A_fnode,A_end},
1.14      noro      391:        {I_CAST,A_notimpl,A_end},
1.17      noro      392:        {I_INDEX,A_fnode,A_node,A_end},
1.14      noro      393:        {I_EV,A_node,A_end},
1.17      noro      394:        {I_TIMER,A_fnode,A_fnode,A_fnode,A_end},
1.14      noro      395:        {I_GF2NGEN,A_end},
                    396:        {I_GFPNGEN,A_end},
                    397:        {I_GFSNGEN,A_end},
1.17      noro      398:        {I_LOP,A_int,A_fnode,A_fnode,A_end},
                    399:        {I_OPT,A_str,A_fnode,A_end},
1.14      noro      400:        {I_GETOPT,A_str,A_end},
1.17      noro      401:        {I_POINT,A_fnode,A_str,A_end},
                    402:        {I_PAREN,A_fnode,A_end},
                    403:        {I_MINUS,A_fnode,A_end},
1.24    ! noro      404:        {I_NARYOP,A_arf,A_node,A_end}
1.14      noro      405: };
                    406:
                    407: #define N_FID_SPEC (sizeof(fid_spec_tab)/sizeof(struct fid_spec))
                    408:
                    409: void get_fid_spec(fid id,fid_spec_p *spec)
                    410: {
                    411:        int i;
                    412:
                    413:        for ( i = 0; i < N_FID_SPEC; i++ )
                    414:                if ( fid_spec_tab[i].id == id ) {
                    415:                        *spec = &fid_spec_tab[i];
                    416:                        return;
                    417:                }
                    418:        *spec = 0;
                    419: }
                    420:
1.15      noro      421: FNODE strip_paren(FNODE f)
                    422: {
                    423:        if ( !f || f->id != I_PAREN ) return f;
                    424:        else {
                    425:                return strip_paren((FNODE)FA0(f));
                    426:        }
                    427: }
                    428:
1.18      noro      429: NODE flatten_fnodenode(NODE n,char *opname);
                    430: FNODE flatten_fnode(FNODE f,char *opname);
                    431:
                    432: NODE flatten_fnodenode(NODE n,char *opname)
                    433: {
                    434:        NODE r0,r,t;
                    435:
                    436:        r0 = 0;
                    437:        for ( t = n; t; t = NEXT(t) ) {
                    438:                NEXTNODE(r0,r);
                    439:                BDY(r) = (pointer)flatten_fnode((FNODE)BDY(t),opname);
                    440:        }
                    441:        if ( r0 ) NEXT(r) = 0;
                    442:        return r0;
                    443: }
                    444:
1.14      noro      445: FNODE flatten_fnode(FNODE f,char *opname)
                    446: {
                    447:        fid_spec_p spec;
                    448:        farg_type *type;
                    449:        fid id;
                    450:        FNODE f1,f2,r;
                    451:        int i;
                    452:
                    453:        if ( !f ) return f;
                    454:        id = f->id;
                    455:        get_fid_spec(id,&spec);
                    456:        /* unknown fid */
                    457:        if ( !spec ) return f;
                    458:        if ( id == I_BOP && !strcmp(((ARF)FA0(f))->name,opname) ) {
                    459:                f1 = (pointer)flatten_fnode(FA1(f),opname);
1.15      noro      460:                f1 = strip_paren(f1);
1.14      noro      461:                f2 = (pointer)flatten_fnode(FA2(f),opname);
1.15      noro      462:                f2 = strip_paren(f2);
1.14      noro      463:                if ( f1->id == I_BOP && !strcmp(((ARF)FA0(f1))->name,opname) ) {
1.16      noro      464:                        /* [op [op A B] C] => [op A [op B C]] */
1.22      noro      465:                        f2 = flatten_fnode(mkfnode(3,I_BOP,(ARF)FA0(f),FA2(f1),f2),opname);
                    466:                        return mkfnode(3,I_BOP,(ARF)FA0(f),FA1(f1),f2);
1.14      noro      467:                } else
                    468:                        return mkfnode(3,I_BOP,(ARF)FA0(f),f1,f2);
                    469:        } else {
                    470:                type = spec->type;
                    471:                for ( i = 0; type[i] != A_end; i++ );
                    472:                NEWFNODE(r,i); ID(r) = f->id;
                    473:                for ( i = 0; type[i] != A_end; i++ ) {
1.17      noro      474:                        if ( type[i] == A_fnode )
1.14      noro      475:                                r->arg[i] = (pointer)flatten_fnode(f->arg[i],opname);
1.18      noro      476:                        else if ( type[i] == A_node )
                    477:                                r->arg[i] = (pointer)flatten_fnodenode(f->arg[i],opname);
1.14      noro      478:                        else
                    479:                                r->arg[i] = f->arg[i];
                    480:                }
                    481:                return r;
1.2       noro      482:        }
1.21      noro      483: }
                    484:
                    485: /* comparison of QUOTE */
                    486:
                    487: int compquote(VL vl,QUOTE q1,QUOTE q2)
                    488: {
                    489:        return compfnode(BDY(q1),BDY(q2));
                    490: }
                    491:
                    492: /* comparison of QUOTEARG */
                    493: /* XXX : executes a non-sense comparison for bodies */
                    494:
                    495: int compqa(VL vl,QUOTEARG q1,QUOTEARG q2)
                    496: {
                    497:        if ( !q1 ) return q2?-1:0;
                    498:        else if ( !q2 ) return 1;
                    499:        else if ( OID(q1) > OID(q2) ) return 1;
                    500:        else if ( OID(q1) < OID(q2) ) return -1;
                    501:        else if ( q1->type > q2->type ) return 1;
                    502:        else if ( q1->type < q2->type ) return -1;
                    503:        else switch ( q1->type ) {
                    504:                case A_func:
                    505:                        return strcmp(((FUNC)q1->body)->name,((FUNC)q2->body)->name);
                    506:                case A_arf:
                    507:                        return strcmp(((ARF)q1->body)->name,((ARF)q2->body)->name);
                    508:                default:
                    509:                        if ( (unsigned)q1->body  > (unsigned)q2->body ) return 1;
                    510:                        else if ( (unsigned)q1->body  < (unsigned)q2->body ) return -1;
                    511:                        else return 0;
                    512:        }
                    513: }
                    514:
                    515: int compfnode(FNODE f1,FNODE f2)
                    516: {
                    517:        fid_spec_p spec;
                    518:        int t,s1,s2,i;
                    519:        NODE n1,n2;
                    520:
                    521:        if ( !f1 ) return f2 ? -1 : 1;
                    522:        else if ( !f2 ) return 1;
                    523:     else if ( f1->id > f2->id ) return 1;
                    524:        else if ( f1->id < f2->id ) return -1;
                    525:        spec = fid_spec_tab+f1->id;
                    526:        for ( i = 0; spec->type[i] != A_end; i++ ) {
                    527:                switch ( spec->type[i] ) {
                    528:                        case A_fnode:
1.23      noro      529:                                t = compfnode((FNODE)f1->arg[i],(FNODE)f2->arg[i]);
                    530:                                if ( t ) return t;
1.21      noro      531:                                break;
                    532:                        case A_int:
                    533:                                s1 = (int)f1->arg[i];
                    534:                                s2 = (int)f2->arg[i];
                    535:                                if ( s1 > s2 ) return 1;
                    536:                                else if ( s1 < s2 ) return -1;
                    537:                                break;
                    538:                        case A_str:
                    539:                                t = strcmp((char *)f1->arg[i],(char *)f2->arg[i]);
                    540:                                if ( t ) return t;
                    541:                                break;
                    542:                        case A_internal:
                    543:                                t = arf_comp(CO,(Obj)f1->arg[i],(Obj)f2->arg[i]);
                    544:                                if ( t ) return t;
                    545:                                break;
                    546:                        case A_node:
                    547:                                n1 = (NODE)f1->arg[i];
                    548:                                n2 = (NODE)f2->arg[i];
                    549:                                for ( ; n1 && n2; n1 = NEXT(n1), n2 = NEXT(n2) ) {
                    550:                                        t = compfnode(BDY(n1),BDY(n2));
                    551:                                        if ( t ) return t;
                    552:                                }
                    553:                                if ( n1 ) return 1;
                    554:                                else if ( n2 ) return -1;
                    555:                                break;
                    556:                        case A_arf:
                    557:                                 t = strcmp(((ARF)f1->arg[i])->name,((ARF)f2->arg[i])->name);
                    558:                                if ( t ) return t;
                    559:                                break;
                    560:                        case A_func:
                    561:                                 t = strcmp(((FUNC)f1->arg[i])->name,((FUNC)f2->arg[i])->name);
                    562:                                if ( t ) return t;
                    563:                                break;
                    564:                        case A_notimpl:
                    565:                        default:
                    566:                                error("compfnode : not implemented");
                    567:                                break;
                    568:                }
                    569:        }
                    570:        return 0;
1.2       noro      571: }

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