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

Annotation of OpenXM_contrib2/asir2000/parse/arith.c, Revision 1.1

1.1     ! noro        1: /* $OpenXM: OpenXM/src/asir99/parse/arith.c,v 1.2 1999/11/18 05:42:02 noro Exp $ */
        !             2: #include "ca.h"
        !             3: #include "parse.h"
        !             4:
        !             5: struct oAFUNC {
        !             6:        void (*add)();
        !             7:        void (*sub)();
        !             8:        void (*mul)();
        !             9:        void (*div)();
        !            10:        void (*pwr)();
        !            11:        void (*chsgn)();
        !            12:        int (*comp)();
        !            13: };
        !            14:
        !            15: struct oARF arf[6];
        !            16: ARF addfs, subfs, mulfs, divfs, remfs, pwrfs;
        !            17:
        !            18: void divsdc();
        !            19:
        !            20: struct oAFUNC afunc[] = {
        !            21: /* ??? */      {0,0,0,0,0,0,0},
        !            22: /* O_N */      {addnum,subnum,mulnum,divnum,pwrnum,chsgnnum,compnum},
        !            23: /* O_P */      {addp,subp,mulp,divr,pwrp,chsgnp,compp},
        !            24: /* O_R */      {addr,subr,mulr,divr,pwrr,chsgnr,compr},
        !            25: /* O_LIST */   {notdef,notdef,notdef,notdef,notdef,notdef,complist},
        !            26: /* O_VECT */   {addvect,subvect,mulvect,divvect,notdef,chsgnvect,compvect},
        !            27: /* O_MAT */    {addmat,submat,mulmat,divmat,pwrmat,chsgnmat,compmat},
        !            28: /* O_STR */    {addstr,notdef,notdef,notdef,notdef,notdef,compstr},
        !            29: /* O_COMP */   {addcomp,subcomp,mulcomp,divcomp,pwrcomp,chsgncomp,compcomp},
        !            30: /* O_DP */   {addd,subd,muld,divsdc,notdef,chsgnd,compd},
        !            31: /* O_UI */     {notdef,notdef,notdef,notdef,notdef,notdef,compui},
        !            32: /* O_GF2MAT */ {notdef,notdef,notdef,notdef,notdef,notdef,(int(*)())notdef},
        !            33: /* O_ERR */    {notdef,notdef,notdef,notdef,notdef,notdef,(int(*)())notdef},
        !            34: /* O_GFMMAT */ {notdef,notdef,notdef,notdef,notdef,notdef,(int(*)())notdef},
        !            35: };
        !            36:
        !            37: void arf_init() {
        !            38:        addfs = &arf[0]; addfs->name = "+"; addfs->fp = arf_add;
        !            39:        subfs = &arf[1]; subfs->name = "-"; subfs->fp = arf_sub;
        !            40:        mulfs = &arf[2]; mulfs->name = "*"; mulfs->fp = arf_mul;
        !            41:        divfs = &arf[3]; divfs->name = "/"; divfs->fp = arf_div;
        !            42:        remfs = &arf[4]; remfs->name = "%"; remfs->fp = arf_remain;
        !            43:        pwrfs = &arf[5]; pwrfs->name = "^"; pwrfs->fp = arf_pwr;
        !            44: }
        !            45:
        !            46: void arf_add(vl,a,b,r)
        !            47: VL vl;
        !            48: Obj a,b,*r;
        !            49: {
        !            50:        int mid;
        !            51:
        !            52:        if ( !a )
        !            53:                *r = b;
        !            54:        else if ( !b )
        !            55:                *r = a;
        !            56:        else if ( OID(a) == OID(b) )
        !            57:                (*afunc[OID(a)].add)(vl,a,b,r);
        !            58:        else if ( (mid = MAX(OID(a),OID(b))) <= O_R )
        !            59:                (*afunc[mid].add)(vl,a,b,r);
        !            60:        else
        !            61:                notdef(vl,a,b,r);
        !            62: }
        !            63:
        !            64: void arf_sub(vl,a,b,r)
        !            65: VL vl;
        !            66: Obj a,b,*r;
        !            67: {
        !            68:        int mid;
        !            69:
        !            70:        if ( !a )
        !            71:                if ( !b )
        !            72:                        *r = 0;
        !            73:                else
        !            74:                        (*afunc[OID(b)].chsgn)(b,r);
        !            75:        else if ( !b )
        !            76:                *r = a;
        !            77:        else if ( OID(a) == OID(b) )
        !            78:                (*afunc[OID(a)].sub)(vl,a,b,r);
        !            79:        else if ( (mid = MAX(OID(a),OID(b))) <= O_R )
        !            80:                (*afunc[mid].sub)(vl,a,b,r);
        !            81:        else
        !            82:                notdef(vl,a,b,r);
        !            83: }
        !            84:
        !            85: void arf_mul(vl,a,b,r)
        !            86: VL vl;
        !            87: Obj a,b,*r;
        !            88: {
        !            89:        int mid;
        !            90:
        !            91:        if ( !a || !b )
        !            92:                *r = 0;
        !            93:        else if ( OID(a) == OID(b) )
        !            94:                (*(afunc[OID(a)].mul))(vl,a,b,r);
        !            95:        else if ( (mid = MAX(OID(a),OID(b))) <= O_R ||
        !            96:                (mid == O_MAT) || (mid == O_VECT) || (mid == O_DP) )
        !            97:                (*afunc[mid].mul)(vl,a,b,r);
        !            98:        else
        !            99:                notdef(vl,a,b,r);
        !           100: }
        !           101:
        !           102: void arf_div(vl,a,b,r)
        !           103: VL vl;
        !           104: Obj a,b,*r;
        !           105: {
        !           106:        int mid;
        !           107:
        !           108:        if ( !b )
        !           109:                error("div : division by 0");
        !           110:        if ( !a )
        !           111:                *r = 0;
        !           112:        else if ( (OID(a) == OID(b)) )
        !           113:                (*(afunc[OID(a)].div))(vl,a,b,r);
        !           114:        else if ( (mid = MAX(OID(a),OID(b))) <= O_R ||
        !           115:                (mid == O_MAT) || (mid == O_VECT) || (mid == O_DP) )
        !           116:                (*afunc[mid].div)(vl,a,b,r);
        !           117:        else
        !           118:                notdef(vl,a,b,r);
        !           119: }
        !           120:
        !           121: void arf_remain(vl,a,b,r)
        !           122: VL vl;
        !           123: Obj a,b,*r;
        !           124: {
        !           125:        if ( !b )
        !           126:                error("rem : division by 0");
        !           127:        else if ( !a )
        !           128:                *r = 0;
        !           129:        else if ( MAX(OID(a),OID(b)) <= O_P )
        !           130:                cmp((Q)b,(P)a,(P *)r);
        !           131:        else
        !           132:                notdef(vl,a,b,r);
        !           133: }
        !           134:
        !           135: void arf_pwr(vl,a,e,r)
        !           136: VL vl;
        !           137: Obj a,e,*r;
        !           138: {
        !           139:        R t;
        !           140:
        !           141:        if ( !a )
        !           142:                *r = 0;
        !           143:        else if ( !e )
        !           144:                *r = (pointer)ONE;
        !           145:        else if ( (OID(e) <= O_N) && INT(e) ) {
        !           146:                if ( (OID(a) == O_P) && (SGN((Q)e) < 0) ) {
        !           147:                        MKRAT((P)a,(P)ONE,1,t);
        !           148:                        (*(afunc[O_R].pwr))(vl,t,e,r);
        !           149:                } else
        !           150:                        (*(afunc[OID(a)].pwr))(vl,a,e,r);
        !           151:        } else if ( OID(a) <= O_R )
        !           152:                mkpow(vl,a,e,r);
        !           153:        else
        !           154:                notdef(vl,a,e,r);
        !           155: }
        !           156:
        !           157: void arf_chsgn(a,r)
        !           158: Obj a,*r;
        !           159: {
        !           160:        if ( !a )
        !           161:                *r = 0;
        !           162:        else
        !           163:                (*(afunc[OID(a)].chsgn))(a,r);
        !           164: }
        !           165:
        !           166: int arf_comp(vl,a,b)
        !           167: VL vl;
        !           168: Obj a,b;
        !           169: {
        !           170:        if ( !a )
        !           171:                if ( !b )
        !           172:                        return 0;
        !           173:                else
        !           174:                        return (*afunc[OID(b)].comp)(vl,a,b);
        !           175:        else if ( !b )
        !           176:                        return (*afunc[OID(a)].comp)(vl,a,b);
        !           177:        else if ( OID(a) != OID(b) )
        !           178:                return OID(a)>OID(b) ? 1 : -1;
        !           179:        else
        !           180:                return (*afunc[OID(a)].comp)(vl,a,b);
        !           181: }
        !           182:
        !           183: int complist(vl,a,b)
        !           184: VL vl;
        !           185: LIST a,b;
        !           186: {
        !           187:        int i,t;
        !           188:        NODE an,bn;
        !           189:
        !           190:        if ( !a )
        !           191:                if ( !b )
        !           192:                        return 0;
        !           193:                else
        !           194:                        return -1;
        !           195:        else if ( !b )
        !           196:                return 1;
        !           197:        for ( i = 0, an = BDY(a); an; i++, an = NEXT(an) );
        !           198:        for ( an = BDY(b); an; i--, an = NEXT(an) );
        !           199:        if ( i )
        !           200:                return i > 0 ? 1 : -1;
        !           201:        for ( an = BDY(a), bn = BDY(b); an; an = NEXT(an), bn = NEXT(bn) )
        !           202:                if ( t = arf_comp(vl,BDY(an),BDY(bn)) )
        !           203:                        return t;
        !           204:        return 0;
        !           205: }

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