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