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