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

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

1.1       noro        1: /* $OpenXM: OpenXM/src/asir99/parse/comp.c,v 1.1.1.1 1999/11/10 08:12:34 noro Exp $ */
                      2: #include "ca.h"
                      3: #include "parse.h"
                      4: #include "comp.h"
                      5: #if defined(THINK_C) || defined(VISUAL)
                      6: #include <stdarg.h>
                      7: #else
                      8: #include <varargs.h>
                      9: #endif
                     10:
                     11: extern f_return;
                     12:
                     13: #if defined(THINK_C) || defined(VISUAL)
                     14: void call_usrf(FUNC f,...)
                     15: {
                     16:        va_list ap;
                     17:        int ac,i;
                     18:        pointer *c;
                     19:        NODE tn;
                     20:
                     21:        va_start(ap,f);
                     22:        if ( !f )
                     23:                notdef(0,0,0,0);
                     24:        else {
                     25:                pushpvs(f);
                     26:                ac = va_arg(ap,int);
                     27:                for ( i = 0, tn = f->f.usrf->args; i < ac;
                     28:                        i++, tn = NEXT(tn) )
                     29:                        ASSPV((int)FA0((FNODE)BDY(tn)),va_arg(ap,pointer));
                     30:                c = va_arg(ap,pointer *); *c = evalstat(BDY(f->f.usrf));
                     31:                va_end(ap);
                     32:                f_return = 0; poppvs();
                     33:        }
                     34: }
                     35: #else
                     36: void call_usrf(va_alist)
                     37: va_dcl
                     38: {
                     39:        va_list ap;
                     40:        int ac,i;
                     41:        FUNC f;
                     42:        pointer a,b,*c;
                     43:        NODE tn;
                     44:
                     45:        va_start(ap); f = va_arg(ap,FUNC);
                     46:        if ( !f )
                     47:                notdef(0,0,0,0);
                     48:        else {
                     49:                pushpvs(f);
                     50:                ac = va_arg(ap,int);
                     51:                for ( i = 0, tn = f->f.usrf->args; i < ac;
                     52:                        i++, tn = NEXT(tn) )
                     53:                        ASSPV((int)FA0((FNODE)BDY(tn)),va_arg(ap,pointer));
                     54:                c = va_arg(ap,pointer *); *c = evalstat(BDY(f->f.usrf));
                     55:                f_return = 0; poppvs();
                     56:        }
                     57: }
                     58: #endif
                     59:
                     60: void addcomp(vl,a,b,c)
                     61: VL vl;
                     62: COMP a,b,*c;
                     63: {
                     64:        if ( a->type != b->type )
                     65:                error("addcomp : types different");
                     66:        else
                     67:                call_usrf(LSS->sa[a->type].arf.add,2,a,b,c);
                     68: }
                     69:
                     70: void subcomp(vl,a,b,c)
                     71: VL vl;
                     72: COMP a,b,*c;
                     73: {
                     74:        if ( a->type != b->type )
                     75:                error("subcomp : types different");
                     76:        else
                     77:                call_usrf(LSS->sa[a->type].arf.sub,2,a,b,c);
                     78: }
                     79:
                     80: void mulcomp(vl,a,b,c)
                     81: VL vl;
                     82: COMP a,b,*c;
                     83: {
                     84:        if ( a->type != b->type )
                     85:                error("mulcomp : types different");
                     86:        else
                     87:                call_usrf(LSS->sa[a->type].arf.mul,2,a,b,c);
                     88: }
                     89:
                     90: void divcomp(vl,a,b,c)
                     91: VL vl;
                     92: COMP a,b,*c;
                     93: {
                     94:        if ( a->type != b->type )
                     95:                error("divcomp : types different");
                     96:        else
                     97:                call_usrf(LSS->sa[a->type].arf.div,2,a,b,c);
                     98: }
                     99:
                    100: void chsgncomp(a,b)
                    101: COMP a,*b;
                    102: {
                    103:        call_usrf(LSS->sa[a->type].arf.chsgn,1,a,b);
                    104: }
                    105:
                    106: void pwrcomp(vl,a,r,c)
                    107: VL vl;
                    108: COMP a;
                    109: Obj r;
                    110: COMP *c;
                    111: {
                    112:        call_usrf(LSS->sa[a->type].arf.pwr,2,a,r,c);
                    113: }
                    114:
                    115: int compcomp(vl,a,b)
                    116: VL vl;
                    117: COMP a,b;
                    118: {
                    119:        Q c;
                    120:        int s;
                    121:
                    122:        if ( a->type > b->type )
                    123:                return 1;
                    124:        else if ( a->type < b->type )
                    125:                return -1;
                    126:        else {
                    127:                call_usrf(LSS->sa[a->type].arf.comp,2,a,b,&c);
                    128:                s = QTOS(c);
                    129:                if ( s > 0 )
                    130:                        return 1;
                    131:                else if ( s < 0 )
                    132:                        return -1;
                    133:                else
                    134:                        return 0;
                    135:        }
                    136: }

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