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

Annotation of OpenXM_contrib2/asir2000/io/spexpr.c, Revision 1.1.1.1

1.1       noro        1: /* $OpenXM: OpenXM/src/asir99/io/spexpr.c,v 1.1.1.1 1999/11/10 08:12:30 noro Exp $ */
                      2: #include "ca.h"
                      3: #include "parse.h"
                      4: #include "comp.h"
                      5: #include "base.h"
                      6:
                      7: #ifndef SPRINT
                      8: #define SPRINT
                      9: #endif
                     10:
                     11: #ifdef FPRINT
                     12: FILE *asir_out;
                     13: #define OUT asir_out
                     14: char DFORMAT[BUFSIZ];
                     15:
                     16: #define TAIL
                     17: #define PUTS(s) fputs(s,OUT)
                     18: #define PRINTF fprintf
                     19: #define PRINTN printn
                     20: #define PRINTBF printbf
                     21: #define PRINTCPLX printcplx
                     22: #define PRINTV printv
                     23: #define PRINTEXPR printexpr
                     24: #define PRINTNUM printnum
                     25: #define PRINTP printp
                     26: #define PRINTR printr
                     27: #define PRINTLIST printlist
                     28: #define PRINTVECT printvect
                     29: #define PRINTMAT printmat
                     30: #define PRINTSTR printstr
                     31: #define PRINTCOMP printcomp
                     32: #define PRINTDP printdp
                     33: #endif
                     34:
                     35: #ifdef SPRINT
                     36: static char *buf;
                     37: #define OUT buf
                     38: extern char DFORMAT[BUFSIZ];
                     39:
                     40: #define TAIL while ( *OUT ) OUT++;
                     41: #define PUTS(s) strcat(OUT,s)
                     42: #define PRINTF sprintf
                     43: #define PRINTN sprintn
                     44: #define PRINTBF sprintbf
                     45: #define PRINTCPLX sprintcplx
                     46: #define PRINTV sprintv
                     47: #define PRINTEXPR sprintexpr
                     48: #define PRINTNUM sprintnum
                     49: #define PRINTP sprintp
                     50: #define PRINTR sprintr
                     51: #define PRINTLIST sprintlist
                     52: #define PRINTVECT sprintvect
                     53: #define PRINTMAT sprintmat
                     54: #define PRINTSTR sprintstr
                     55: #define PRINTCOMP sprintcomp
                     56: #define PRINTDP sprintdp
                     57: #endif
                     58:
                     59: #if defined(THINK_C)
                     60: void PRINTEXPR(VL,Obj);
                     61: void PRINTNUM(Num);
                     62: void PRINTN(N);
                     63: void PRINTV(VL,V);
                     64: void PRINTP(VL,P);
                     65: void PRINTR(VL,R);
                     66: void PRINTLIST(VL,LIST);
                     67: void PRINTVECT(VL,VECT);
                     68: void PRINTMAT(VL,MAT);
                     69: void PRINTSTR(STRING);
                     70: void PRINTCOMP(VL,COMP);
                     71: void PRINTDP(VL,DP);
                     72: void PRINTCPLX(C);
                     73: #else
                     74: void PRINTEXPR();
                     75: void PRINTNUM();
                     76: void PRINTN();
                     77: void PRINTV();
                     78: void PRINTP();
                     79: void PRINTR();
                     80: void PRINTLIST();
                     81: void PRINTVECT();
                     82: void PRINTMAT();
                     83: void PRINTSTR();
                     84: void PRINTCOMP();
                     85: void PRINTDP();
                     86: void PRINTCPLX();
                     87: #endif
                     88:
                     89: #ifdef FPRINT
                     90: void output_init() {
                     91:        OUT = stdout;
                     92:        sprintf(DFORMAT,"%%0%dd",DLENGTH);
                     93: }
                     94:
                     95: int mmono(p)
                     96: P p;
                     97: {
                     98:        if ( NUM(p) )
                     99:                if ( compnum(CO,(Num)p,0) < 0 )
                    100:                        return ( 1 );
                    101:                else
                    102:                        return ( 0 );
                    103:        else if ( NEXT(DC(p)) )
                    104:                return ( 0 );
                    105:        else
                    106:                return (mmono(COEF(DC(p))));
                    107: }
                    108:
                    109: #if PARI
                    110: printbf(a)
                    111: BF a;
                    112: {
                    113:        sor(a->body,'g',-1,0);
                    114: }
                    115: #endif
                    116: #endif
                    117:
                    118: #ifdef SPRINT
                    119: void soutput_init(s)
                    120: char *s;
                    121: {
                    122:        s[0] = 0; buf = s;
                    123: }
                    124:
                    125: #if PARI
                    126: void sprintbf(a)
                    127: BF a;
                    128: {
                    129:        char *str;
                    130:        char *GENtostr();
                    131:
                    132:        str = GENtostr(a->body);
                    133:        TAIL PRINTF(OUT,"%s",str);
                    134:        free(str);
                    135: }
                    136: #endif
                    137: #endif
                    138:
                    139: void PRINTEXPR(vl,p)
                    140: VL vl;
                    141: Obj p;
                    142: {
                    143:        if ( !p ) {
                    144:                PRINTR(vl,(R)p);
                    145:                return;
                    146:        }
                    147:
                    148:        switch ( OID(p) ) {
                    149:                case O_N:
                    150:                        PRINTNUM((Num)p); break;
                    151:                case O_P:
                    152:                        PRINTP(vl,(P)p); break;
                    153:                case O_R:
                    154:                        PRINTR(vl,(R)p); break;
                    155:                case O_LIST:
                    156:                        PRINTLIST(vl,(LIST)p); break;
                    157:                case O_VECT:
                    158:                        PRINTVECT(vl,(VECT)p); break;
                    159:                case O_MAT:
                    160:                        PRINTMAT(vl,(MAT)p); break;
                    161:                case O_STR:
                    162:                        PRINTSTR((STRING)p); break;
                    163:                case O_COMP:
                    164:                        PRINTCOMP(vl,(COMP)p); break;
                    165:                case O_DP:
                    166:                        PRINTDP(vl,(DP)p); break;
                    167:                default:
                    168:                        break;
                    169:        }
                    170: }
                    171:
                    172: void PRINTN(n)
                    173: N n;
                    174: {
                    175:        register int i,*ptr;
                    176:        N tn;
                    177:
                    178:        if ( !n ) {
                    179:                PUTS("0");
                    180:                return;
                    181:        }
                    182:        ntobn(DBASE,n,&tn);
                    183:        ptr = BD(tn);
                    184:        TAIL PRINTF(OUT,"%d",ptr[PL(tn) - 1]);
                    185:        for ( i = PL(tn) - 2; i >= 0; i-- ) {
                    186:                TAIL PRINTF(OUT,DFORMAT,ptr[i]);
                    187:        }
                    188: }
                    189:
                    190: void PRINTNUM(q)
                    191: Num q;
                    192: {
                    193:        if ( !q ) {
                    194:                PUTS("0");
                    195:                return;
                    196:        }
                    197:        switch ( NID(q) ) {
                    198:                case N_Q:
                    199:                        if ( SGN((Q)q) == -1 )
                    200:                                PUTS("-");
                    201:                        PRINTN(NM((Q)q));
                    202:                        if ( !INT((Q)q) ) {
                    203:                                PUTS("/"); PRINTN(DN((Q)q));
                    204:                        }
                    205:                        break;
                    206:                case N_R:
                    207:                        TAIL PRINTF(OUT,"%g",BDY((Real)q));
                    208:                        break;
                    209:                case N_A:
                    210:                        PUTS("("); PRINTR(ALG,(R)BDY((Alg)q)); PUTS(")");
                    211:                        break;
                    212: #if PARI
                    213:                case N_B:
                    214:                        PRINTBF((BF)q); break;
                    215: #endif
                    216:                case N_C:
                    217:                        PRINTCPLX((C)q); break;
                    218:                case N_M:
                    219:                        TAIL PRINTF(OUT,"%d",CONT((MQ)q));
                    220:                        break;
                    221:        }
                    222: }
                    223:
                    224: void PRINTCPLX(a)
                    225: C a;
                    226: {
                    227:        PUTS("(");
                    228:        if ( a->r )
                    229:                PRINTNUM(a->r);
                    230:        if ( a->i ) {
                    231:                if ( a->r && (compnum(0,a->i,0) > 0) )
                    232:                        PUTS("+");
                    233:                PRINTNUM(a->i); PUTS("*@i");
                    234:        }
                    235:        PUTS(")");
                    236: }
                    237:
                    238: void PRINTP(vl,p)
                    239: VL vl;
                    240: P p;
                    241: {
                    242:        V v;
                    243:        DCP dc;
                    244:
                    245:        if ( !p )
                    246:                PUTS("0");
                    247:        else if ( NUM(p) )
                    248:                PRINTNUM((Num)p);
                    249:        else
                    250:                for ( dc = DC(p), v = VR(p); dc; dc = NEXT(dc) ) {
                    251:                        if ( !DEG(dc) )
                    252:                                PRINTP(vl,COEF(dc));
                    253:                        else {
                    254:                                if ( NUM(COEF(dc)) && UNIQ((Q)COEF(dc)) ) {
                    255:                                        ;
                    256:                                } else if ( NUM(COEF(dc)) && MUNIQ((Q)COEF(dc)) )
                    257:                                        PUTS("-");
                    258:                                else if ( NUM(COEF(dc)) || !NEXT(DC(COEF(dc)))) {
                    259:                                        PRINTP(vl,COEF(dc)); PUTS("*");
                    260:                                } else {
                    261:                                        PUTS("("); PRINTP(vl,COEF(dc)); PUTS(")*");
                    262:                                }
                    263:                                PRINTV(vl,v);
                    264:                                if ( cmpq(DEG(dc),ONE) ) {
                    265:                                        PUTS("^");
                    266:                                        if ( INT(DEG(dc)) && SGN(DEG(dc))>0 )
                    267:                                                PRINTNUM((Num)DEG(dc));
                    268:                                        else {
                    269:                                                PUTS("("); PRINTNUM((Num)DEG(dc)); PUTS(")");
                    270:                                        }
                    271:                                }
                    272:                        }
                    273:                        if ( NEXT(dc) ) {
                    274:                                P t;
                    275:
                    276:                                t = COEF(NEXT(dc));
                    277:                                if (!DEG(NEXT(dc))) {
                    278:                                        if ( NUM(t) ) {
                    279:                                                if ( !mmono(t) )
                    280:                                                        PUTS("+");
                    281:                                        } else {
                    282:                                                if (!mmono(COEF(DC(t))))
                    283:                                                        PUTS("+");
                    284:                                        }
                    285:                                } else {
                    286:                                        if ( !mmono(t) )
                    287:                                                PUTS("+");
                    288:                                }
                    289:                        }
                    290:                }
                    291: }
                    292:
                    293: void PRINTV(vl,v)
                    294: VL vl;
                    295: V v;
                    296: {
                    297:        PF pf;
                    298:        PFAD ad;
                    299:        int i;
                    300:
                    301:        if ( NAME(v) )
                    302:                PUTS(NAME(v));
                    303:        else if ( (vid)v->attr == V_PF ) {
                    304:                pf = ((PFINS)v->priv)->pf; ad = ((PFINS)v->priv)->ad;
                    305:                if ( !strcmp(NAME(pf),"pow") ) {
                    306:                        PUTS("("); PRINTR(vl,(R)ad[0].arg); PUTS(")^(");
                    307:                        PRINTR(vl,(R)ad[1].arg); PUTS(")");
                    308:                } else if ( !pf->argc ) {
                    309:                        TAIL PRINTF(OUT,"%s",NAME(pf));
                    310:                } else {
                    311:                        for ( i = 0; i < pf->argc; i++ )
                    312:                                if ( ad[i].d )
                    313:                                        break;
                    314:                        if ( i < pf->argc ) {
                    315:                                TAIL PRINTF(OUT,"%s(%d",NAME(pf),ad[0].d);
                    316:                                for ( i = 1; i < pf->argc; i++ ) {
                    317:                                        TAIL PRINTF(OUT,",%d",ad[i].d);
                    318:                                }
                    319:                                PUTS(")(");
                    320:                        } else {
                    321:                                TAIL PRINTF(OUT,"%s(",NAME(pf));
                    322:                        }
                    323:                        PRINTR(vl,(R)ad[0].arg);
                    324:                        for ( i = 1; i < pf->argc; i++ ) {
                    325:                                PUTS(","); PRINTR(vl,(R)ad[i].arg);
                    326:                        }
                    327:                        PUTS(")");
                    328:                }
                    329:        }
                    330: }
                    331:
                    332: void PRINTR(vl,a)
                    333: VL vl;
                    334: R a;
                    335: {
                    336:        if ( !a )
                    337:                PUTS("0");
                    338:        else
                    339:                switch (OID(a)) {
                    340:                        case O_N: case O_P:
                    341:                                PRINTP(vl,(P)a); break;
                    342:                        default:
                    343:                                PUTS("("); PRINTP(vl,NM((R)a)); PUTS(")/("); PRINTP(vl,DN((R)a)); PUTS(")");
                    344:                                break;
                    345:                }
                    346: }
                    347:
                    348: void PRINTVECT(vl,vect)
                    349: VL vl;
                    350: VECT vect;
                    351: {
                    352:        int i;
                    353:        pointer *ptr;
                    354:
                    355:        PUTS("[ ");
                    356:        for ( i = 0, ptr = BDY(vect); i < vect->len; i++ ) {
                    357:                PRINTEXPR(vl,ptr[i]); PUTS(" ");
                    358:        }
                    359:        PUTS("]");
                    360: }
                    361:
                    362: void PRINTMAT(vl,mat)
                    363: VL vl;
                    364: MAT mat;
                    365: {
                    366:        int i,j,r,c;
                    367:        pointer *ptr;
                    368:
                    369:        for ( i = 0, r = mat->row, c = mat->col; i < r; i++ ) {
                    370:                PUTS("[ ");
                    371:                for ( j = 0, ptr = BDY(mat)[i]; j < c; j++ ) {
                    372:                        PRINTEXPR(vl,ptr[j]); PUTS(" ");
                    373:                }
                    374:                PUTS("]");
                    375:                if ( i < r - 1 )
                    376:                        PUTS("\n");
                    377:        }
                    378: }
                    379:
                    380: void PRINTLIST(vl,list)
                    381: VL vl;
                    382: LIST list;
                    383: {
                    384:        NODE tnode;
                    385:
                    386:        PUTS("[");
                    387:        for ( tnode = (NODE)list->body; tnode; tnode = NEXT(tnode) ) {
                    388:                PRINTEXPR(vl,tnode->body);
                    389:                if ( NEXT(tnode) )
                    390:                        PUTS(",");
                    391:        }
                    392:        PUTS("]");
                    393: }
                    394:
                    395: void PRINTSTR(str)
                    396: STRING str;
                    397: {
                    398:        char *p;
                    399:
                    400:        for ( p = BDY(str); *p; p++ )
                    401:                if ( *p == '"' )
                    402:                        PUTS("\"");
                    403:                else {
                    404:                        TAIL PRINTF(OUT,"%c",*p);
                    405:                }
                    406: }
                    407:
                    408: void PRINTCOMP(vl,c)
                    409: VL vl;
                    410: COMP c;
                    411: {
                    412:        int n,i;
                    413:
                    414:        n = getcompsize((int)c->type);
                    415:        PUTS("{");
                    416:        for ( i = 0; i < n; i++ ) {
                    417:                PRINTEXPR(vl,(pointer)c->member[i]);
                    418:                if ( i < n-1 )
                    419:                        PUTS(",");
                    420:        }
                    421:        PUTS("}");
                    422: }
                    423:
                    424: void PRINTDP(vl,d)
                    425: VL vl;
                    426: DP d;
                    427: {
                    428:        int n,i;
                    429:        MP m;
                    430:        DL dl;
                    431:
                    432:        for ( n = d->nv, m = BDY(d); m; m = NEXT(m) ) {
                    433:                PUTS("("); PRINTEXPR(vl,(pointer)m->c); PUTS(")*<<");
                    434:                for ( i = 0, dl = m->dl; i < n-1; i++ ) {
                    435:                        TAIL PRINTF(OUT,"%d,",dl->d[i]);
                    436:                }
                    437:                TAIL PRINTF(OUT,"%d",dl->d[i]);
                    438:                PUTS(">>");
                    439:                if ( NEXT(m) )
                    440:                        PUTS("+");
                    441:        }
                    442: }

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