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