Annotation of OpenXM_contrib2/asir2000/io/spexpr.c, Revision 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>