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

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

1.1     ! noro        1: /* $OpenXM: OpenXM/src/asir99/builtin/rat.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 Pnm(), Pdn(), Pderiv();
        !             6:
        !             7: struct ftab rat_tab[] = {
        !             8:        {"nm",Pnm,1},
        !             9:        {"dn",Pdn,1},
        !            10:        {"diff",Pderiv,-99999999},
        !            11:        {0,0,0},
        !            12: };
        !            13:
        !            14: void Pnm(arg,rp)
        !            15: NODE arg;
        !            16: Obj *rp;
        !            17: {
        !            18:        Obj t;
        !            19:        Q q;
        !            20:
        !            21:        asir_assert(ARG0(arg),O_R,"nm");
        !            22:        if ( !(t = (Obj)ARG0(arg)) )
        !            23:                *rp = 0;
        !            24:        else
        !            25:                switch ( OID(t) ) {
        !            26:                        case O_N:
        !            27:                                switch ( NID(t) ) {
        !            28:                                        case N_Q:
        !            29:                                                NTOQ(NM((Q)t),SGN((Q)t),q); *rp = (Obj)q; break;
        !            30:                                        default:
        !            31:                                                *rp = t; break;
        !            32:                                }
        !            33:                                break;
        !            34:                        case O_P:
        !            35:                                *rp = t; break;
        !            36:                        case O_R:
        !            37:                                *rp = (Obj)NM((R)t); break;
        !            38:                        default:
        !            39:                                *rp = 0;
        !            40:                }
        !            41: }
        !            42:
        !            43: void Pdn(arg,rp)
        !            44: NODE arg;
        !            45: Obj *rp;
        !            46: {
        !            47:        Obj t;
        !            48:        Q q;
        !            49:
        !            50:        asir_assert(ARG0(arg),O_R,"dn");
        !            51:        if ( !(t = (Obj)ARG0(arg)) )
        !            52:                *rp = (Obj)ONE;
        !            53:        else
        !            54:                switch ( OID(t) ) {
        !            55:                        case O_N:
        !            56:                                switch ( NID(t) ) {
        !            57:                                        case N_Q:
        !            58:                                                if ( DN((Q)t) )
        !            59:                                                        NTOQ(DN((Q)t),1,q);
        !            60:                                                else
        !            61:                                                        q = ONE;
        !            62:                                                *rp = (Obj)q; break;
        !            63:                                        default:
        !            64:                                                *rp = (Obj)ONE; break;
        !            65:                                }
        !            66:                                break;
        !            67:                        case O_P:
        !            68:                                *rp = (Obj)ONE; break;
        !            69:                        case O_R:
        !            70:                                *rp = (Obj)DN((R)t); break;
        !            71:                        default:
        !            72:                                *rp = 0;
        !            73:                }
        !            74: }
        !            75:
        !            76: void Pderiv(arg,rp)
        !            77: NODE arg;
        !            78: Obj *rp;
        !            79: {
        !            80:        Obj a,t;
        !            81:        LIST l;
        !            82:        P v;
        !            83:        NODE n;
        !            84:
        !            85:        if ( !arg ) {
        !            86:                *rp = 0; return;
        !            87:        }
        !            88:        asir_assert(ARG0(arg),O_R,"diff");
        !            89:        reductr(CO,(Obj)ARG0(arg),&a);
        !            90:        n = NEXT(arg);
        !            91:        if ( n && (l = (LIST)ARG0(n)) && OID(l) == O_LIST )
        !            92:                n = BDY(l);
        !            93:        for ( ; n; n = NEXT(n) ) {
        !            94:                if ( !(v = (P)BDY(n)) || OID(v) != O_P )
        !            95:                        error("diff : invalid argument");
        !            96:                derivr(CO,a,VR(v),&t); a = t;
        !            97:        }
        !            98:        *rp = a;
        !            99: }

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