Annotation of OpenXM_contrib2/asir2000/io/pexpr_body.c, Revision 1.9
1.9 ! noro 1: /* $OpenXM: OpenXM_contrib2/asir2000/io/pexpr_body.c,v 1.8 2005/01/17 07:43:24 saito Exp $ */
1.1 noro 2:
3: #define PRINTHAT (fortran_output?PUTS("**"):PUTS("^"))
4:
5: void PRINTEXPR();
6: void PRINTNUM();
7: void PRINTN();
8: void PRINTV();
9: void PRINTP();
10: void PRINTR();
11: void PRINTLIST();
12: void PRINTVECT();
13: void PRINTMAT();
1.7 saito 14: void PRINTIMAT(); /* IMAT */
1.1 noro 15: void PRINTSTR();
16: void PRINTCOMP();
17: void PRINTDP();
18: void PRINTUI();
19: void PRINTGF2MAT();
20: void PRINTGFMMAT();
21: void PRINTBYTEARRAY();
22: void PRINTQUOTE();
1.4 noro 23: void PRINTQUOTEARG();
1.1 noro 24: void PRINTERR();
25: void PRINTCPLX();
26: void PRINTLM();
27: void PRINTLF();
28: void PRINTUP2();
29: void PRINTUP();
30: void PRINTUM();
31: void PRINTFOP();
32: void PRINTEOP();
33: void PRINTLOP();
34: void PRINTQOP();
35: void PRINTSF();
36: void PRINTSYMBOL();
37: void PRINTRANGE();
38: void PRINTTB();
1.3 noro 39: void PRINTDPV();
1.1 noro 40: void PRINTFNODE();
41: void PRINTBF();
1.5 noro 42: void PRINTDAlg();
1.1 noro 43:
44: void PRINTEXPR(vl,p)
45: VL vl;
46: Obj p;
47: {
48: if ( !p ) {
49: PRINTR(vl,(R)p);
50: } else
51: switch ( OID(p) ) {
52: case O_N:
53: PRINTNUM((Num)p); break;
54: case O_P:
55: PRINTP(vl,(P)p); break;
56: case O_R:
57: PRINTR(vl,(R)p); break;
58: case O_LIST:
59: PRINTLIST(vl,(LIST)p); break;
60: case O_VECT:
61: PRINTVECT(vl,(VECT)p); break;
62: case O_MAT:
63: PRINTMAT(vl,(MAT)p); break;
1.7 saito 64: /* IMAT */
65: case O_IMAT:
66: PRINTIMAT(vl,(IMAT)p); break;
67: /* IMAT */
1.1 noro 68: case O_STR:
69: PRINTSTR((STRING)p); break;
70: case O_COMP:
71: PRINTCOMP(vl,(COMP)p); break;
72: case O_DP:
73: PRINTDP(vl,(DP)p); break;
74: case O_USINT:
75: PRINTUI(vl,(USINT)p); break;
76: case O_GF2MAT:
77: PRINTGF2MAT(vl,(GF2MAT)p); break;
78: case O_ERR:
79: PRINTERR(vl,(ERR)p); break;
80: case O_MATHCAP:
81: PRINTLIST(vl,((MATHCAP)p)->body); break;
82: case O_F:
83: PRINTLF(vl,(F)p); break;
84: case O_GFMMAT:
85: PRINTGFMMAT(vl,(GFMMAT)p); break;
86: case O_BYTEARRAY:
87: PRINTBYTEARRAY(vl,(BYTEARRAY)p); break;
88: case O_QUOTE:
89: PRINTQUOTE(vl,(QUOTE)p); break;
1.4 noro 90: case O_QUOTEARG:
91: PRINTQUOTEARG(vl,(QUOTEARG)p); break;
1.1 noro 92: case O_SYMBOL:
93: PRINTSYMBOL((SYMBOL)p); break;
94: case O_RANGE:
95: PRINTRANGE(vl,(RANGE)p); break;
96: case O_TB:
97: PRINTTB(vl,(TB)p); break;
1.3 noro 98: case O_DPV:
99: PRINTDPV(vl,(DPV)p); break;
1.1 noro 100: default:
101: break;
102: }
103: }
104:
105: #if defined(FPRINT)
106: #if defined(ITVDEBUG)
107: void printbin(double z)
108: {
109: int i, j, mask;
110: union {
111: double x;
112: char c[8];
113: } a;
114:
115: a.x = z;
116: for(i=7;i>=0;i--) {
117: mask = 0x80;
118: for(j=0;j<8;j++) {
119: if (a.c[i] & mask) fprintf(stderr,"1");
120: else fprintf(stderr,"0");
121: mask >>= 1;
122: }
123: }
124: fprintf(stderr,"\n");
125: }
126: #endif
127: #endif
128:
129: void PRINTCPLX(a)
130: C a;
131: {
132: PUTS("(");
133: if ( a->r )
134: PRINTNUM(a->r);
135: if ( a->i ) {
136: #if defined(INTERVAL)
137: if ( a->r && ((compnum(0,a->i,0) > 0)
138: || NID(a->i) == N_IP || NID(a->i) == N_IntervalDouble
139: || NID(a->i) == N_IntervalQuad || NID(a->i) == N_IntervalBigFloat) )
140: #else
141: if ( a->r && (compnum(0,a->i,0) > 0) )
142: #endif
143: PUTS("+");
144: PRINTNUM(a->i); PUTS("*@i");
145: }
146: PUTS(")");
147: }
148:
149: void PRINTP(vl,p)
150: VL vl;
151: P p;
152: {
153: V v;
154: DCP dc;
155:
156: if ( !p )
157: PUTS("0");
158: else if ( NUM(p) )
159: PRINTNUM((Num)p);
160: else
161: for ( dc = DC(p), v = VR(p); dc; dc = NEXT(dc) ) {
162: if ( !DEG(dc) )
163: PRINTP(vl,COEF(dc));
164: else {
165: if ( NUM(COEF(dc)) && UNIQ((Q)COEF(dc)) ) {
166: ;
167: } else if ( NUM(COEF(dc)) && MUNIQ((Q)COEF(dc)) )
168: PUTS("-");
169: else if ( NUM(COEF(dc)) || !NEXT(DC(COEF(dc)))) {
170: PRINTP(vl,COEF(dc)); PUTS("*");
171: } else {
172: PUTS("("); PRINTP(vl,COEF(dc)); PUTS(")*");
173: }
174: PRINTV(vl,v);
175: if ( cmpq(DEG(dc),ONE) ) {
176: PRINTHAT;
177: if ( INT(DEG(dc)) && SGN(DEG(dc))>0 )
178: PRINTNUM((Num)DEG(dc));
179: else {
180: PUTS("("); PRINTNUM((Num)DEG(dc)); PUTS(")");
181: }
182: }
183: }
184: if ( NEXT(dc) ) {
185: P t;
186:
187: t = COEF(NEXT(dc));
188: if (!DEG(NEXT(dc))) {
189: if ( NUM(t) ) {
190: if ( !mmono(t) )
191: PUTS("+");
192: } else {
193: if (!mmono(COEF(DC(t))))
194: PUTS("+");
195: }
196: } else {
197: if ( !mmono(t) )
198: PUTS("+");
199: }
200: }
201: }
202: }
203:
204: void PRINTR(vl,a)
205: VL vl;
206: R a;
207: {
208: if ( !a )
209: PUTS("0");
210: else
211: switch (OID(a)) {
212: case O_N: case O_P:
213: PRINTP(vl,(P)a); break;
214: default:
215: PUTS("("); PRINTP(vl,NM((R)a)); PUTS(")/("); PRINTP(vl,DN((R)a)); PUTS(")");
216: break;
217: }
218: }
219:
220: void PRINTVECT(vl,vect)
221: VL vl;
222: VECT vect;
223: {
224: int i;
225: pointer *ptr;
226:
227: switch ( outputstyle ) {
228: case 1:
229: PUTS("vect(");
230: for ( i = 0, ptr = BDY(vect); i < vect->len; i++ ) {
231: if ( i != 0 ) PUTS(",");
232: PRINTEXPR(vl,ptr[i]);
233: }
234: PUTS(")");
235: break;
236: case 0:
237: default:
238: PUTS("[ ");
239: for ( i = 0, ptr = BDY(vect); i < vect->len; i++ ) {
240: PRINTEXPR(vl,ptr[i]); PUTS(" ");
241: }
242: PUTS("]");
243: break;
244: }
1.3 noro 245: }
246:
247: void PRINTDPV(vl,d)
248: VL vl;
249: DPV d;
250: {
251: int i;
252: DP *ptr;
253:
254: PUTS("modvect(");
255: for ( i = 0, ptr = BDY(d); i < d->len; i++ ) {
256: if ( i != 0 ) PUTS(",");
257: PRINTEXPR(vl,(Obj)ptr[i]);
258: }
259: PUTS(")");
1.1 noro 260: }
261:
262: void PRINTMAT(vl,mat)
263: VL vl;
264: MAT mat;
265: {
266: int i,j,r,c;
267: pointer *ptr;
268:
269: switch ( outputstyle ) {
270: case 1:
271: PUTS("mat(\n");
272: for ( i = 0, r = mat->row, c = mat->col; i < r; i++ ) {
273: if ( i != 0 ) PUTS(",\n");
274: PUTS("[ ");
275: for ( j = 0, ptr = BDY(mat)[i]; j < c; j++ ) {
276: if ( j != 0 ) PUTS(",");
277: PRINTEXPR(vl,ptr[j]);
278: }
279: PUTS(" ]");
280: }
281: PUTS(")");
282: break;
283: case 0:
284: default:
285: for ( i = 0, r = mat->row, c = mat->col; i < r; i++ ) {
286: PUTS("[ ");
287: for ( j = 0, ptr = BDY(mat)[i]; j < c; j++ ) {
288: PRINTEXPR(vl,ptr[j]); PUTS(" ");
289: }
290: PUTS("]");
291: if ( i < r - 1 )
292: PUTS("\n");
293: }
294: break;
295: }
296: }
1.7 saito 297:
298: /* IMAT */
299: #if !defined(CPRINT)
300: void PRINTIMAT(vl,xmat)
301: VL vl;
302: IMAT xmat;
303: {
304: int i,j,c;
305: int row, col, cr;
306: IMATC Im;
307: IENT ent;
308:
309: row = xmat->row;
310: col = xmat->col;
311: Im = (pointer)xmat->root;
312: if ( xmat->clen == 0 ) {
313: for(j = 0; j< row; j++) {
314: PUTS("( ");
315: for(i = 0; i < col; i++) PUTS("0 ");
316: PUTS(")");
317: if ( j < row - 1 ) PUTS("\n");
318: }
319: return;
320: }
321: c = -1;
322: GetNextIent(&Im, &ent, &c);
323: for(j = 0; j < row; j++) {
324: PUTS("( ");
325: for(i = 0; i < col; i++) {
1.8 saito 326: cr = j * col + i;
1.7 saito 327: if( ent.cr == cr ) {
328: PRINTEXPR(vl, (pointer)ent.body); PUTS(" ");
329: GetNextIent(&Im, &ent, &c);
330: } else {
331: PUTS("0 ");
332: }
333: }
334: PUTS(")");
335: if ( j < row - 1 ) PUTS("\n");
336: }
337: }
338: #endif
339: /* IMAT */
1.1 noro 340:
341: void PRINTLIST(vl,list)
342: VL vl;
343: LIST list;
344: {
345: NODE tnode;
346:
347: PUTS("[");
348: for ( tnode = (NODE)list->body; tnode; tnode = NEXT(tnode) ) {
349: PRINTEXPR(vl,tnode->body);
350: if ( NEXT(tnode) )
351: PUTS(",");
352: }
353: PUTS("]");
354: }
355:
356: void PRINTCOMP(vl,c)
357: VL vl;
358: COMP c;
359: {
360: int n,i;
361:
362: n = getcompsize((int)c->type);
363: PUTS("{");
364: for ( i = 0; i < n; i++ ) {
365: PRINTEXPR(vl,(pointer)c->member[i]);
366: if ( i < n-1 )
367: PUTS(",");
368: }
369: PUTS("}");
370: }
371:
372: void PRINTGF2MAT(vl,mat)
373: VL vl;
374: GF2MAT mat;
375: {
376: int row,col,w,i,j,k,m;
377: unsigned int t;
378: unsigned int **b;
379:
380: row = mat->row;
381: col = mat->col;
382: w = (col+BSH-1)/BSH;
383: b = mat->body;
384: for ( i = 0; i < row; i++ ) {
385: for ( j = 0, m = 0; j < w; j++ ) {
386: t = b[i][j];
387: for ( k = 0; m < col && k < BSH; k++, m++ )
388: if ( t & (1<<k) )
389: PUTS("1");
390: else
391: PUTS("0");
392: }
393: PUTS("\n");
394: }
395: }
396: void PRINTERR(vl,e)
397: VL vl;
398: ERR e;
399: {
400: PUTS("error("); PRINTEXPR(vl,e->body); PUTS(")");
401: }
402:
403: void PRINTLF(vl,f)
404: VL vl;
405: F f;
406: {
407: switch ( FOP(f) ) {
408: case AL_TRUE:
409: PUTS("@true");
410: break;
411: case AL_FALSE:
412: PUTS("@false");
413: break;
414:
415: case AL_OR: case AL_AND:
416: PRINTFOP(vl,f); break;
417: case AL_NOT: case AL_IMPL: case AL_REPL: case AL_EQUIV:
418: PRINTEOP(vl,f); break;
419:
420: case AL_EQUAL: case AL_NEQ: case AL_LESSP:
421: case AL_GREATERP: case AL_LEQ: case AL_GEQ:
422: PRINTLOP(vl,f); break;
423:
424: case AL_EX: case AL_ALL:
425: PRINTQOP(vl,f); break;
426: default:
427: break;
428: }
429: }
430:
431: void PRINTFOP(vl,f)
432: VL vl;
433: F f;
434: {
435: char *op;
436: NODE n;
437:
438: op = FOP(f)==AL_OR?" @|| ":" @&& ";
439: n = FJARG(f);
440: PUTS("("); PRINTEXPR(vl,BDY(n)); PUTS(")");
441: for ( n = NEXT(n); n; n = NEXT(n) ) {
442: PUTS(op); PUTS("("); PRINTEXPR(vl,BDY(n)); PUTS(")");
443: }
444: }
445:
446: void PRINTEOP(vl,f)
447: VL vl;
448: F f;
449: {
450: oFOP op;
451: char *sop;
452:
453: if ( (op = FOP(f)) == AL_NOT ) {
454: PUTS("(@! "); PRINTEXPR(vl,(Obj)FARG(f)); PUTS(")"); return;
455: }
456: switch ( op ) {
457: case AL_IMPL:
458: sop = " @impl "; break;
459: case AL_REPL:
460: sop = " @repl "; break;
461: case AL_EQUIV:
462: sop = " @equiv "; break;
463: default:
464: break;
465: }
466: PUTS("(");
467: PRINTEXPR(vl,(Obj)FLHS(f));
468: PUTS(sop);
469: PRINTEXPR(vl,(Obj)FRHS(f));
470: PUTS(")");
471: }
472:
473: void PRINTLOP(vl,f)
474: VL vl;
475: F f;
476: {
477: char *op;
478:
479: switch ( FOP(f) ) {
480: case AL_EQUAL:
481: op = " @== "; break;
482: case AL_NEQ:
483: op = " @!= "; break;
484: case AL_LESSP:
485: op = " @< "; break;
486: case AL_GREATERP:
487: op = " @> "; break;
488: case AL_LEQ:
489: op = " @<= "; break;
490: case AL_GEQ:
491: op = " @>= "; break;
492: default:
493: error("PRINTLOP : invalid operator");
494: break;
495: }
496: PRINTEXPR(vl,(Obj)FPL(f)); PUTS(op); PUTS("0");
497: }
498:
499: void PRINTRANGE(VL vl,RANGE p)
500: {
501: PUTS("range(");
502: PRINTEXPR(vl,p->start);
503: PUTS(",");
504: PRINTEXPR(vl,p->end);
505: PUTS(")");
506: }
507:
508: void PRINTFNODENODE(NODE n)
509: {
510: for ( ; n; n = NEXT(n) ) {
511: PRINTFNODE((FNODE)BDY(n),0);
512: if ( NEXT(n) ) PUTS(",");
513: }
514: }
515:
516: void PRINTFARGS(FNODE f)
517: {
518: NODE n;
519:
520: if ( f->id == I_LIST ) {
521: n = (NODE)FA0(f);
522: PRINTFNODENODE(n);
523: } else
524: PRINTFNODE(f,0);
525: }
526:
527: void PRINTFNODE(FNODE f,int paren)
528: {
529: NODE n,t,t0;
530: char vname[BUFSIZ],prefix[BUFSIZ];
531: char *opname,*vname_conv,*prefix_conv;
532: Obj obj;
533: int i,len,allzero,elen,elen2;
534: C cplx;
535: char *r;
536: FNODE fi,f2;
537:
538: if ( !f ) {
539: PUTS("(0)");
540: return;
541: }
542: if ( paren ) PUTS("(");
543: switch ( f->id ) {
544: /* unary operators */
545: case I_NOT: PUTS("!"); PRINTFNODE((FNODE)FA0(f),1); break;
546: case I_PAREN: PRINTFNODE((FNODE)FA0(f),0); break;
547: case I_MINUS: PUTS("-"); PRINTFNODE((FNODE)FA0(f),1); break;
548: /* binary operators */
549: /* arg list */
550: /* I_AND, I_OR => FA0(f), FA1(f) */
551: /* otherwise => FA1(f), FA2(f) */
552: case I_BOP:
553: PRINTFNODE((FNODE)FA1(f),1);
554: PUTS(((ARF)FA0(f))->name);
555: PRINTFNODE((FNODE)FA2(f),1);
1.9 ! noro 556: break;
! 557: case I_NARYOP:
! 558: t = (NODE)FA1(f);
! 559: PRINTFNODE((FNODE)BDY(t),1);
! 560: for ( t = NEXT(t); t; t = NEXT(t) ) {
! 561: PUTS(((ARF)FA0(f))->name);
! 562: PRINTFNODE((FNODE)BDY(t),1);
! 563: }
1.1 noro 564: break;
565: case I_COP:
566: switch( (cid)FA0(f) ) {
567: case C_EQ: opname = ("=="); break;
568: case C_NE: opname = ("!="); break;
569: case C_GT: opname = (">"); break;
570: case C_LT: opname = ("<"); break;
571: case C_GE: opname = (">="); break;
572: case C_LE: opname = ("<="); break;
573: }
574: PRINTFNODE((FNODE)FA1(f),1);
575: PUTS(opname);
576: PRINTFNODE((FNODE)FA2(f),1);
577: break;
578: case I_LOP:
579: switch( (lid)FA0(f) ) {
580: case L_EQ: opname = ("@=="); break;
581: case L_NE: opname = ("@!="); break;
582: case L_GT: opname = ("@>"); break;
583: case L_LT: opname = ("@<"); break;
584: case L_GE: opname = ("@>="); break;
585: case L_LE: opname = ("@<="); break;
586: case L_AND: opname = ("@&&"); break;
587: case L_OR: opname = ("@||"); break;
588: case L_NOT: opname = ("@!"); break;
589: }
590: if ( (lid)FA0(f)==L_NOT ) {
591: PUTS(opname); PRINTFNODE((FNODE)FA1(f),1);
592: } else {
593: PRINTFNODE((FNODE)FA1(f),1);
594: PUTS(opname);
595: PRINTFNODE((FNODE)FA2(f),1);
596: }
597: break;
598: case I_AND:
599: PRINTFNODE((FNODE)FA0(f),1);
600: PUTS("&&");
601: PRINTFNODE((FNODE)FA1(f),1);
602: break;
603: case I_OR:
604: PRINTFNODE((FNODE)FA0(f),1);
605: PUTS("!!");
606: PRINTFNODE((FNODE)FA1(f),1);
607: break;
608: /* ternary operators */
609: case I_CE:
610: PRINTFNODE((FNODE)FA0(f),1); PUTS("?"); PRINTFNODE((FNODE)FA1(f),1);
611: PUTS(":"); PRINTFNODE((FNODE)FA2(f),1);
612: break;
613: /* lists */
614: case I_LIST: PUTS("["); PRINTFNODENODE((NODE)FA0(f)); PUTS("]"); break;
615: /* function */
616: case I_FUNC:
617: if ( !strcmp(((FUNC)FA0(f))->name,"@pi") ) PUTS("@pi");
618: else if ( !strcmp(((FUNC)FA0(f))->name,"@e") ) PUTS("@e");
619: else {
620: PUTS(((FUNC)FA0(f))->name);
621: PUTS("("); PRINTFARGS(FA1(f)); PUTS(")");
622: }
623: break;
624: /* XXX */
625: case I_CAR: PUTS("car("); PRINTFNODE(FA0(f),0); PUTS(")"); break;
626: case I_CDR: PUTS("cdr("); PRINTFNODE(FA0(f),0); PUTS(")"); break;
627: /* exponent vector */
628: case I_EV: PUTS("<<"); PRINTFNODENODE((NODE)FA0(f)); PUTS(">>"); break;
629: /* string */
630: case I_STR: PUTS((char *)FA0(f)); break;
631: /* internal object */
632: case I_FORMULA: obj = (Obj)FA0(f); PRINTEXPR(CO,obj); break;
633: /* program variable */
634: case I_PVAR:
635: if ( FA1(f) )
636: error("printfnode : not implemented yet");
637: GETPVNAME(FA0(f),opname);
638: PUTS(opname);
639: break;
640: default: error("printfnode : not implemented yet");
641: }
642: if ( paren ) PUTS(")");
643: }
644:
645: /* functions not used in cpexpr.c */
646:
647: #if !defined(CPRINT)
648:
649: void PRINTNUM(q)
650: Num q;
651: {
652: char real_format[20];
1.5 noro 653: DAlg d;
654: DP nm;
655: Q dn;
1.1 noro 656:
657: if ( !q ) {
658: PUTS("0");
659: return;
660: }
661: switch ( NID(q) ) {
662: case N_Q:
663: if ( SGN((Q)q) == -1 )
664: PUTS("-");
665: PRINTN(NM((Q)q));
666: if ( !INT((Q)q) ) {
667: PUTS("/"); PRINTN(DN((Q)q));
668: }
669: break;
670: case N_R:
671: switch (printmode) {
672: case PRINTF_E:
673: #if defined(INTERVAL)
674: case MID_PRINTF_E:
675: #endif
676: TAIL PRINTF(OUT,"%.16e",BDY((Real)q));
677: break;
678: case PRINTF_G:
679: #if defined(INTERVAL)
680: case MID_PRINTF_G:
681: #endif
682: default:
683: if ( real_binary ) {
684: unsigned int *m;
685: unsigned int u,l,mask;
686: int i,expo;
687:
688: m = (unsigned int *)&BDY((Real)q);
689: #if defined(__i386__) || defined(MIPSEL) || defined(VISUAL) || defined(__alpha) || defined(__FreeBSD__) || defined(__NetBSD__) || defined(__x86_64)
690: u = m[1]; l = m[0];
691: #else
692: u = m[0]; l = m[1];
693: #endif
694: if (u&0x80000000) {
695: TAIL PRINTF(OUT,"-");
696: }
697: u &= 0x7fffffff;
698: expo = ((int)(u>>20));
699: u &= 0xfffff;
700: if ( expo == 2047 ) {
701: if ( u || l ) {
702: TAIL PRINTF(OUT,"NaN");
703: } else {
704: TAIL PRINTF(OUT,"Inf");
705: }
706: } else if ( expo == 0 ) {
707: if ( u || l ) {
708: TAIL PRINTF(OUT,"0b0.");
709: for ( i = 0, mask = 0x80000; i < 20;
710: i++, mask >>= 1) {
711: TAIL
712: if ( u&mask )
713: PRINTF(OUT,"1");
714: else
715: PRINTF(OUT,"0");
716: }
717: for ( i = 0, mask = 0x80000000; i < 32;
718: i++, mask >>= 1) {
719: TAIL
720: if ( l&mask )
721: PRINTF(OUT,"1");
722: else
723: PRINTF(OUT,"0");
724: }
725: TAIL PRINTF(OUT,"*2^%d",-1022);
726: } else {
727: TAIL PRINTF(OUT,"0");
728: }
729: } else {
730: expo -= 1023;
731: TAIL PRINTF(OUT,"0b1.");
732: for ( i = 0, mask = 0x80000; i < 20;
733: i++, mask >>= 1) {
734: TAIL
735: if ( u&mask )
736: PRINTF(OUT,"1");
737: else
738: PRINTF(OUT,"0");
739: }
740: for ( i = 0, mask = 0x80000000; i < 32;
741: i++, mask >>= 1) {
742: TAIL
743: if ( l&mask )
744: PRINTF(OUT,"1");
745: else
746: PRINTF(OUT,"0");
747: }
748: if ( expo ) {
749: TAIL PRINTF(OUT,"*2^%d",expo);
750: }
751: }
752: } else if ( real_digit ) {
753: sprintf(real_format,
754: double_output?"%%.%df":"%%.%dg",real_digit);
755: TAIL PRINTF(OUT,real_format,BDY((Real)q));
756: } else {
757: TAIL PRINTF(OUT,double_output?"%f":"%g",BDY((Real)q));
758: }
759: break;
760: }
761: break;
762: case N_A:
763: PUTS("("); PRINTR(ALG,(R)BDY((Alg)q)); PUTS(")");
764: break;
765: #if defined(PARI)
766: case N_B:
767: PRINTBF((BF)q); break;
768: #endif
769: #if defined(INTERVAL)
770: case N_IP:
771: case N_IntervalBigFloat:
772: switch ( outputstyle ) {
773: case 1:
774: PUTS("intval(");
775: PRINTNUM(INF((Itv)q));
776: PUTS(",");
777: PRINTNUM(SUP((Itv)q));
778: PUTS(")");
779: break;
780: case 0:
781: default:
782: PUTS("[");
783: PRINTNUM(INF((Itv)q));
784: PUTS(",");
785: PRINTNUM(SUP((Itv)q));
786: PUTS("]");
787: break;
788: }
789: break;
790: case N_IntervalDouble:
791: switch (printmode) {
792: case PRINTF_E:
793: switch ( outputstyle ) {
794: case 1:
795: TAIL PRINTF(OUT, "intval(%.16e,%.16e)",
796: INF((IntervalDouble)q),SUP((IntervalDouble)q));
797: break;
798: case 0:
799: default:
800: TAIL PRINTF(OUT, "[%.16e,%.16e]",
801: INF((IntervalDouble)q),SUP((IntervalDouble)q));
802: break;
803: }
804: #if defined(ITVDEBUG)
805: printbin(INF((IntervalDouble)q));
806: printbin(SUP((IntervalDouble)q));
807: #endif
808: break;
809: case MID_PRINTF_G:
810: switch ( outputstyle ) {
811: case 1:
812: TAIL PRINTF(OUT, "intvalm(%g,%g)",
813: (SUP((IntervalDouble)q)+INF((IntervalDouble)q))*0.5,
814: (SUP((IntervalDouble)q)-INF((IntervalDouble)q))*0.5);
815: break;
816: case 0:
817: default:
818: TAIL PRINTF(OUT, "<%g,%g>",
819: (SUP((IntervalDouble)q)+INF((IntervalDouble)q))*0.5,
820: (SUP((IntervalDouble)q)-INF((IntervalDouble)q))*0.5);
821: break;
822: }
823: break;
824: case MID_PRINTF_E:
825: switch ( outputstyle ) {
826: case 1:
827: TAIL PRINTF(OUT, "intvalm(%.16e,%.16e)",
828: (SUP((IntervalDouble)q)+INF((IntervalDouble)q))*0.5,
829: (SUP((IntervalDouble)q)-INF((IntervalDouble)q))*0.5);
830: break;
831: case 0:
832: default:
833: TAIL PRINTF(OUT, "<%.16e,%.16e>",
834: (SUP((IntervalDouble)q)+INF((IntervalDouble)q))*0.5,
835: (SUP((IntervalDouble)q)-INF((IntervalDouble)q))*0.5);
836: break;
837: }
838: break;
839: case PRINTF_G:
840: default:
841: switch ( outputstyle ) {
842: case 1:
843: TAIL PRINTF(OUT, "intval(%g,%g)",
844: INF((IntervalDouble)q),SUP((IntervalDouble)q));
845: break;
846: case 0:
847: default:
848: TAIL PRINTF(OUT, "[%g,%g]",
849: INF((IntervalDouble)q),SUP((IntervalDouble)q));
850: break;
851: }
852: break;
853: }
854: break;
855: #endif
856: case N_C:
857: PRINTCPLX((C)q); break;
858: case N_M:
859: TAIL PRINTF(OUT,"%d",CONT((MQ)q)); break;
860: case N_LM:
861: PRINTN(((LM)q)->body); break;
862: case N_GF2N:
863: if ( hex_output )
864: PRINTN((N)(((GF2N)q)->body));
865: else
866: PRINTUP2(((GF2N)q)->body);
867: break;
868: case N_GFPN:
869: PRINTUP((UP)(((GFPN)q)->body));
870: break;
871: case N_GFS:
872: TAIL PRINTF(OUT,"@_%d",CONT((GFS)q));
873: break;
874: case N_GFSN:
875: PRINTUM(BDY((GFSN)q));
1.5 noro 876: break;
877: case N_DA:
878: d = (DAlg)q;
879: nm = d->nm;
880: dn = d->dn;
881: if ( SGN((Q)dn) == -1 ) PUTS("-");
882: PUTS("(");
883: PRINTDP(CO,((DAlg)q)->nm);
884: PUTS(")");
885: if ( !UNIN(NM(dn)) ) {
886: PUTS("/");
887: PRINTN(NM(dn));
888: }
1.1 noro 889: break;
890: }
891: }
892:
893: void PRINTN(n)
894: N n;
895: {
896: register int i,*ptr;
897: N tn;
898:
899: if ( !n ) {
900: PUTS("0");
901: return;
902: }
903: if ( hex_output ) {
904: ptr = BD(n);
905: TAIL PRINTF(OUT,"0x%x",ptr[PL(n)-1]);
906: if ( hex_output < 0 )
907: for ( i = PL(n) - 2; i >= 0; i-- ) {
908: TAIL PRINTF(OUT,"|%08x",ptr[i]);
909: }
910: else
911: for ( i = PL(n) - 2; i >= 0; i-- ) {
912: TAIL PRINTF(OUT,"%08x",ptr[i]);
913: }
914: } else {
915: ntobn(DBASE,n,&tn);
916: ptr = BD(tn);
917: TAIL PRINTF(OUT,"%d",ptr[PL(tn) - 1]);
918: for ( i = PL(tn) - 2; i >= 0; i-- ) {
919: TAIL PRINTF(OUT,DFORMAT,ptr[i]);
920: }
921: }
922: }
923:
924: void PRINTV(vl,v)
925: VL vl;
926: V v;
927: {
928: PF pf;
929: PFAD ad;
930: int i;
931:
932: if ( NAME(v) )
933: PUTS(NAME(v));
934: else if ( (vid)v->attr == V_PF ) {
935: pf = ((PFINS)v->priv)->pf; ad = ((PFINS)v->priv)->ad;
936: if ( !strcmp(NAME(pf),"pow") ) {
937: PUTS("(("); PRINTR(vl,(R)ad[0].arg); PUTS(")"); PRINTHAT; PUTS("(");
938: PRINTR(vl,(R)ad[1].arg); PUTS("))");
939: } else if ( !pf->argc ) {
940: TAIL PRINTF(OUT,"%s",NAME(pf));
941: } else {
942: if ( hideargs ) {
943: for ( i = 0; i < pf->argc; i++ )
944: if ( ad[i].d )
945: break;
946: if ( i < pf->argc ) {
947: TAIL PRINTF(OUT,"%s{%d",NAME(pf),ad[0].d);
948: for ( i = 1; i < pf->argc; i++ ) {
949: TAIL PRINTF(OUT,",%d",ad[i].d);
950: }
951: PUTS("}");
952: } else {
953: TAIL PRINTF(OUT,"%s",NAME(pf));
954: }
955: } else {
956: for ( i = 0; i < pf->argc; i++ )
957: if ( ad[i].d )
958: break;
959: if ( i < pf->argc ) {
960: TAIL PRINTF(OUT,"%s{%d",NAME(pf),ad[0].d);
961: for ( i = 1; i < pf->argc; i++ ) {
962: TAIL PRINTF(OUT,",%d",ad[i].d);
963: }
964: PUTS("}(");
965: } else {
966: TAIL PRINTF(OUT,"%s(",NAME(pf));
967: }
968: PRINTR(vl,(R)ad[0].arg);
969: for ( i = 1; i < pf->argc; i++ ) {
970: PUTS(","); PRINTR(vl,(R)ad[i].arg);
971: }
972: PUTS(")");
973: }
974: }
975: }
976: }
977:
978: void PRINTSTR(str)
979: STRING str;
980: {
981: char *p;
982:
983: for ( p = BDY(str); *p; p++ )
984: if ( *p == '"' )
985: PUTS("\"");
986: else {
987: TAIL PRINTF(OUT,"%c",*p);
988: }
989: }
990:
991: void PRINTDP(vl,d)
992: VL vl;
993: DP d;
994: {
995: int n,i;
996: MP m;
997: DL dl;
998:
999: for ( n = d->nv, m = BDY(d); m; m = NEXT(m) ) {
1000: PUTS("("); PRINTEXPR(vl,(pointer)m->c); PUTS(")*<<");
1001: for ( i = 0, dl = m->dl; i < n-1; i++ ) {
1002: TAIL PRINTF(OUT,"%d,",dl->d[i]);
1003: }
1004: TAIL PRINTF(OUT,"%d",dl->d[i]);
1005: PUTS(">>");
1006: if ( NEXT(m) )
1007: PUTS("+");
1008: }
1009: }
1010:
1011: void PRINTUI(vl,u)
1012: VL vl;
1013: USINT u;
1014: {
1015: TAIL PRINTF(OUT,"%u",BDY(u));
1016: }
1017:
1018: void PRINTGFMMAT(vl,mat)
1019: VL vl;
1020: GFMMAT mat;
1021: {
1022: int row,col,i,j;
1023: unsigned int **b;
1024:
1025: row = mat->row;
1026: col = mat->col;
1027: b = mat->body;
1028: for ( i = 0; i < row; i++ ) {
1029: PUTS("[");
1030: for ( j = 0; j < col; j++ ) {
1031: TAIL PRINTF(OUT,"%8d",b[i][j]);
1032: }
1033: PUTS("]\n");
1034: }
1035: }
1036:
1037: void PRINTBYTEARRAY(vl,array)
1038: VL vl;
1039: BYTEARRAY array;
1040: {
1041: int len,i;
1042: unsigned char *b;
1043:
1044: len = array->len;
1045: b = array->body;
1046: PUTS("|");
1047: for ( i = 0; i < len-1; i++ ) {
1048: TAIL PRINTF(OUT,"%02x ",(unsigned int)b[i]);
1049: }
1050: TAIL PRINTF(OUT,"%02x",(unsigned int)b[i]);
1051: PUTS("|");
1052: }
1053:
1054: void PRINTQUOTE(vl,quote)
1055: VL vl;
1056: QUOTE quote;
1057: {
1058: LIST list;
1059:
1060: if ( print_quote == 1 ) {
1061: fnodetotree(BDY(quote),&list);
1062: PRINTEXPR(vl,(Obj)list);
1063: } else if ( print_quote == 2 ) {
1064: PRINTFNODE(BDY(quote),0);
1065: } else {
1066: PUTS("<...quoted...>");
1067: }
1.4 noro 1068: }
1069:
1070: void PRINTQUOTEARG(vl,quote)
1071: VL vl;
1072: QUOTEARG quote;
1073: {
1074: PUTS("<...quoted...>");
1.1 noro 1075: }
1076:
1077: void PRINTTB(VL vl,TB p)
1078: {
1079: int i;
1.2 noro 1080: #if defined(SPRINT)
1081: char *ptr,*e;
1.1 noro 1082:
1.2 noro 1083: for ( i = 0, ptr = buf+strlen(OUT); i < p->next; i++ )
1084: for ( e = p->body[i]; *e; *ptr++ = *e++ );
1085: *ptr = 0;
1086: #else
1.1 noro 1087: for ( i = 0; i < p->next; i++ ) {
1088: PUTS(p->body[i]);
1089: }
1.2 noro 1090: #endif
1.1 noro 1091: }
1092:
1093: void PRINTUP2(p)
1094: UP2 p;
1095: {
1096: int d,i;
1097:
1098: if ( !p ) {
1099: TAIL PRINTF(OUT,"0");
1100: } else {
1101: d = degup2(p);
1102: TAIL PRINTF(OUT,"(");
1103: if ( !d ) {
1104: TAIL PRINTF(OUT,"1");
1105: } else if ( d == 1 ) {
1106: TAIL PRINTF(OUT,"@");
1107: } else {
1108: PUTS("@"); PRINTHAT; TAIL PRINTF(OUT,"%d",d);
1109: }
1110: for ( i = d-1; i >= 0; i-- ) {
1111: if ( p->b[i/BSH] & (1<<(i%BSH)) )
1112: if ( !i ) {
1113: TAIL PRINTF(OUT,"+1");
1114: } else if ( i == 1 ) {
1115: TAIL PRINTF(OUT,"+@");
1116: } else {
1117: PUTS("+@"); PRINTHAT; TAIL PRINTF(OUT,"%d",i);
1118: }
1119: }
1120: TAIL PRINTF(OUT,")");
1121: }
1122: }
1123:
1124: void PRINTQOP(vl,f)
1125: VL vl;
1126: F f;
1127: {
1128: char *op;
1129:
1130: op = FOP(f)==AL_EX?"ex":"all";
1131: TAIL PRINTF(OUT,"%s(%s,",op,NAME(FQVR(f)));
1132: PRINTEXPR(vl,(Obj)FQMAT(f)); PUTS(")");
1133: }
1134:
1135: void PRINTUP(n)
1136: UP n;
1137: {
1138: int i,d;
1139:
1140: if ( !n )
1141: PUTS("0");
1142: else if ( !n->d )
1143: PRINTNUM(n->c[0]);
1144: else {
1145: d = n->d;
1146: PUTS("(");
1147: if ( !d ) {
1148: PRINTNUM(n->c[d]);
1149: } else if ( d == 1 ) {
1150: PRINTNUM(n->c[d]);
1151: PUTS("*@p");
1152: } else {
1153: PRINTNUM(n->c[d]);
1154: PUTS("*@p"); PRINTHAT; TAIL PRINTF(OUT,"%d",d);
1155: }
1156: for ( i = d-1; i >= 0; i-- ) {
1157: if ( n->c[i] ) {
1158: PUTS("+("); PRINTNUM(n->c[i]); PUTS(")");
1159: if ( i >= 2 ) {
1160: PUTS("*@p"); PRINTHAT; TAIL PRINTF(OUT,"%d",i);
1161: } else if ( i == 1 )
1162: PUTS("*@p");
1163: }
1164: }
1165: PUTS(")");
1166: }
1167: }
1168:
1169: void PRINTUM(n)
1170: UM n;
1171: {
1172: int i,d;
1173:
1174: if ( !n )
1175: PUTS("0");
1176: else if ( !n->d )
1177: PRINTSF(n->c[0]);
1178: else {
1179: d = n->d;
1180: PUTS("(");
1181: if ( !d ) {
1182: PRINTSF(n->c[d]);
1183: } else if ( d == 1 ) {
1184: PRINTSF(n->c[d]);
1185: PUTS("*@s");
1186: } else {
1187: PRINTSF(n->c[d]);
1188: PUTS("*@s"); PRINTHAT; TAIL PRINTF(OUT,"%d",d);
1189: }
1190: for ( i = d-1; i >= 0; i-- ) {
1191: if ( n->c[i] ) {
1192: PUTS("+("); PRINTSF(n->c[i]); PUTS(")");
1193: if ( i >= 2 ) {
1194: PUTS("*@s"); PRINTHAT; TAIL PRINTF(OUT,"%d",i);
1195: } else if ( i == 1 )
1196: PUTS("*@s");
1197: }
1198: }
1199: PUTS(")");
1200: }
1201: }
1202:
1203: void PRINTSF(i)
1204: unsigned int i;
1205: {
1206: if ( !i ) {
1207: PUTS("0");
1208: } else {
1209: TAIL PRINTF(OUT,"@_%d",IFTOF(i));
1210: }
1211: }
1212:
1213: void PRINTSYMBOL(SYMBOL sym)
1214: {
1215: PUTS(sym->name);
1216: }
1217:
1218: #endif /* CPRINT */
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>