Annotation of OpenXM_contrib2/asir2018/io/pexpr_body.c, Revision 1.3
1.3 ! noro 1: /* $OpenXM: OpenXM_contrib2/asir2018/io/pexpr_body.c,v 1.2 2019/11/12 10:53:23 kondoh 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;
571: }
572: if ( (lid)FA0(f)==L_NOT ) {
573: PUTS(opname); PRINTFNODE((FNODE)FA1(f),1);
574: } else {
575: PRINTFNODE((FNODE)FA1(f),1);
576: PUTS(opname);
577: PRINTFNODE((FNODE)FA2(f),1);
578: }
579: break;
580: case I_AND:
581: PRINTFNODE((FNODE)FA0(f),1);
582: PUTS("&&");
583: PRINTFNODE((FNODE)FA1(f),1);
584: break;
585: case I_OR:
586: PRINTFNODE((FNODE)FA0(f),1);
587: PUTS("!!");
588: PRINTFNODE((FNODE)FA1(f),1);
589: break;
590: /* ternary operators */
591: case I_CE:
592: PRINTFNODE((FNODE)FA0(f),1); PUTS("?"); PRINTFNODE((FNODE)FA1(f),1);
593: PUTS(":"); PRINTFNODE((FNODE)FA2(f),1);
594: break;
595: /* lists */
596: case I_LIST: PUTS("["); PRINTFNODENODE((NODE)FA0(f)); PUTS("]"); break;
597: /* function */
598: case I_FUNC: case I_FUNC_QARG:
599: if ( !strcmp(((FUNC)FA0(f))->name,"@pi") ) PUTS("@pi");
600: else if ( !strcmp(((FUNC)FA0(f))->name,"@e") ) PUTS("@e");
601: else {
602: PUTS(((FUNC)FA0(f))->name);
603: PUTS("("); PRINTFARGS(FA1(f)); PUTS(")");
604: }
605: break;
606: /* XXX */
607: case I_CAR: PUTS("car("); PRINTFNODE(FA0(f),0); PUTS(")"); break;
608: case I_CDR: PUTS("cdr("); PRINTFNODE(FA0(f),0); PUTS(")"); break;
609: /* exponent vector */
610: case I_EV: PUTS("<<"); PRINTFNODENODE((NODE)FA0(f)); PUTS(">>"); break;
611: /* string */
612: case I_STR: PUTS((char *)FA0(f)); break;
613: /* internal object */
614: case I_FORMULA: obj = (Obj)FA0(f); PRINTEXPR(CO,obj); break;
615: /* program variable */
616: case I_PVAR:
617: if ( FA1(f) )
618: error("printfnode : not implemented yet");
619: GETPVNAME(FA0(f),opname);
620: PUTS(opname);
621: break;
622: default: error("printfnode : not implemented yet");
623: }
624: if ( paren ) PUTS(")");
625: }
626:
627: /* functions not used in cpexpr.c */
628:
629: #if !defined(CPRINT)
630:
631: void PRINTNUM(Num q)
632: {
633: char real_format[20];
634: DAlg d;
635: DP nm;
636: Z num,den;
637:
638: if ( !q ) {
639: PUTS("0");
640: return;
641: }
642: switch ( NID(q) ) {
643: case N_Q:
644: nmq((Q)q,&num); PRINTZ(num);
645: if ( !INT((Q)q) ) {
646: PUTS("/"); dnq((Q)q,&den); PRINTZ(den);
647: }
648: break;
649: case N_R:
650: switch (printmode) {
651: case PRINTF_E:
652: #if defined(INTERVAL)
653: case MID_PRINTF_E:
654: #endif
655: TAIL PRINTF(OUT,"%.16e",BDY((Real)q));
656: break;
657: case PRINTF_G:
658: #if defined(INTERVAL)
659: case MID_PRINTF_G:
660: #endif
661: default:
662: if ( real_binary ) {
663: unsigned int *m;
664: unsigned int u,l,mask;
665: int i,expo;
666:
667: m = (unsigned int *)&BDY((Real)q);
668: #if defined(__i386__) || defined(MIPSEL) || defined(VISUAL) || defined(__MINGW32__) || defined(__alpha) || defined(__FreeBSD__) || defined(__NetBSD__) || defined(__x86_64) || defined(__ARM_ARCH) || defined(ANDROID)
669: u = m[1]; l = m[0];
670: #else
671: u = m[0]; l = m[1];
672: #endif
673: if (u&0x80000000) {
674: TAIL PRINTF(OUT,"-");
675: }
676: u &= 0x7fffffff;
677: expo = ((int)(u>>20));
678: u &= 0xfffff;
679: if ( expo == 2047 ) {
680: if ( u || l ) {
681: TAIL PRINTF(OUT,"NaN");
682: } else {
683: TAIL PRINTF(OUT,"Inf");
684: }
685: } else if ( expo == 0 ) {
686: if ( u || l ) {
687: TAIL PRINTF(OUT,"0b0.");
688: for ( i = 0, mask = 0x80000; i < 20;
689: i++, mask >>= 1) {
690: TAIL
691: if ( u&mask )
692: PRINTF(OUT,"1");
693: else
694: PRINTF(OUT,"0");
695: }
696: for ( i = 0, mask = 0x80000000; i < 32;
697: i++, mask >>= 1) {
698: TAIL
699: if ( l&mask )
700: PRINTF(OUT,"1");
701: else
702: PRINTF(OUT,"0");
703: }
704: TAIL PRINTF(OUT,"*2^%d",-1022);
705: } else {
706: TAIL PRINTF(OUT,"0");
707: }
708: } else {
709: expo -= 1023;
710: TAIL PRINTF(OUT,"0b1.");
711: for ( i = 0, mask = 0x80000; i < 20;
712: i++, mask >>= 1) {
713: TAIL
714: if ( u&mask )
715: PRINTF(OUT,"1");
716: else
717: PRINTF(OUT,"0");
718: }
719: for ( i = 0, mask = 0x80000000; i < 32;
720: i++, mask >>= 1) {
721: TAIL
722: if ( l&mask )
723: PRINTF(OUT,"1");
724: else
725: PRINTF(OUT,"0");
726: }
727: if ( expo ) {
728: TAIL PRINTF(OUT,"*2^%d",expo);
729: }
730: }
731: } else if ( real_digit ) {
732: sprintf(real_format,"%%.%d%c",
733: real_digit,(double_output==1)?'f':(double_output==2)?'e':'g');
734: TAIL PRINTF(OUT,real_format,BDY((Real)q));
735: } else {
736: TAIL PRINTF(OUT,(double_output==1)?"%f":(double_output==2)?"%e":"%g",BDY((Real)q));
737: }
738: break;
739: }
740: break;
741: case N_A:
742: PUTS("("); PRINTR(ALG,(R)BDY((Alg)q)); PUTS(")");
743: break;
744: case N_B:
745: PRINTBF((BF)q); break;
746: #if defined(INTERVAL)
747: case N_IP:
1.2 kondoh 748: PUTS("[");
749: PRINTNUM(INF((Itv)q));
750: PUTS(",");
751: PRINTNUM(SUP((Itv)q));
752: PUTS("]");
753: break;
1.1 noro 754: case N_IntervalBigFloat:
755: switch ( outputstyle ) {
756: case 1:
757: PUTS("intval(");
1.2 kondoh 758: PRINTBF4ITV(INF((IntervalBigFloat)q));
1.1 noro 759: PUTS(",");
1.2 kondoh 760: PRINTBF4ITV(SUP((IntervalBigFloat)q));
1.1 noro 761: PUTS(")");
762: break;
763: case 0:
764: default:
765: PUTS("[");
1.2 kondoh 766: PRINTBF4ITV(INF((IntervalBigFloat)q));
1.1 noro 767: PUTS(",");
1.2 kondoh 768: PRINTBF4ITV(SUP((IntervalBigFloat)q));
1.1 noro 769: PUTS("]");
770: break;
771: }
772: break;
773: case N_IntervalDouble:
774: switch (printmode) {
775: case PRINTF_E:
776: switch ( outputstyle ) {
777: case 1:
778: TAIL PRINTF(OUT, "intval(%.16e,%.16e)",
779: INF((IntervalDouble)q),SUP((IntervalDouble)q));
780: break;
781: case 0:
782: default:
783: TAIL PRINTF(OUT, "[%.16e,%.16e]",
784: INF((IntervalDouble)q),SUP((IntervalDouble)q));
785: break;
786: }
787: #if defined(ITVDEBUG)
788: printbin(INF((IntervalDouble)q));
789: printbin(SUP((IntervalDouble)q));
790: #endif
791: break;
792: case MID_PRINTF_G:
793: switch ( outputstyle ) {
794: case 1:
795: TAIL PRINTF(OUT, "intvalm(%g,%g)",
796: (SUP((IntervalDouble)q)+INF((IntervalDouble)q))*0.5,
797: (SUP((IntervalDouble)q)-INF((IntervalDouble)q))*0.5);
798: break;
799: case 0:
800: default:
801: TAIL PRINTF(OUT, "<%g,%g>",
802: (SUP((IntervalDouble)q)+INF((IntervalDouble)q))*0.5,
803: (SUP((IntervalDouble)q)-INF((IntervalDouble)q))*0.5);
804: break;
805: }
806: break;
807: case MID_PRINTF_E:
808: switch ( outputstyle ) {
809: case 1:
810: TAIL PRINTF(OUT, "intvalm(%.16e,%.16e)",
811: (SUP((IntervalDouble)q)+INF((IntervalDouble)q))*0.5,
812: (SUP((IntervalDouble)q)-INF((IntervalDouble)q))*0.5);
813: break;
814: case 0:
815: default:
816: TAIL PRINTF(OUT, "<%.16e,%.16e>",
817: (SUP((IntervalDouble)q)+INF((IntervalDouble)q))*0.5,
818: (SUP((IntervalDouble)q)-INF((IntervalDouble)q))*0.5);
819: break;
820: }
821: break;
822: case PRINTF_G:
823: default:
824: switch ( outputstyle ) {
825: case 1:
826: TAIL PRINTF(OUT, "intval(%g,%g)",
827: INF((IntervalDouble)q),SUP((IntervalDouble)q));
828: break;
829: case 0:
830: default:
831: TAIL PRINTF(OUT, "[%g,%g]",
832: INF((IntervalDouble)q),SUP((IntervalDouble)q));
833: break;
834: }
835: break;
836: }
837: break;
838: #endif
839: case N_C:
840: PRINTCPLX((C)q); break;
841: case N_M:
842: TAIL PRINTF(OUT,"%d",CONT((MQ)q)); break;
843: case N_LM:
844: PRINTMPZ(BDY((LM)q)); break;
845: case N_GF2N:
846: PRINTUP2(BDY((GF2N)q));
847: break;
848: case N_GFPN:
849: PRINTUP((UP)BDY((GFPN)q));
850: break;
851: case N_GFS:
852: TAIL PRINTF(OUT,"@_%d",CONT((GFS)q));
853: break;
854: case N_GFSN:
855: PRINTUM(BDY((GFSN)q));
856: break;
857: case N_DA:
858: d = (DAlg)q;
859: nm = d->nm;
860: den = d->dn;
861: if ( sgnq((Q)den) < 0 ) PUTS("-");
862: PUTS("(");
863: PRINTDP(CO,((DAlg)q)->nm);
864: PUTS(")");
865: if ( !UNIQ(den) ) {
866: PUTS("/");
867: PRINTZ(den);
868: }
869: break;
870: default:
871: break;
872: }
873: }
874:
875: void PRINTV(VL vl,V v)
876: {
877: PF pf;
878: PFAD ad;
879: int i;
880:
881: if ( NAME(v) )
882: PUTS(NAME(v));
883: else if ( (vid)v->attr == V_PF ) {
884: pf = ((PFINS)v->priv)->pf; ad = ((PFINS)v->priv)->ad;
885: if ( !strcmp(NAME(pf),"pow") ) {
886: PUTS("(("); PRINTR(vl,(R)ad[0].arg); PUTS(")"); PRINTHAT; PUTS("(");
887: PRINTR(vl,(R)ad[1].arg); PUTS("))");
888: } else if ( !pf->argc ) {
889: TAIL PRINTF(OUT,"%s",NAME(pf));
890: } else {
891: if ( hideargs ) {
892: for ( i = 0; i < pf->argc; i++ )
893: if ( ad[i].d )
894: break;
895: if ( i < pf->argc ) {
896: TAIL PRINTF(OUT,"%s{%d",NAME(pf),ad[0].d);
897: for ( i = 1; i < pf->argc; i++ ) {
898: TAIL PRINTF(OUT,",%d",ad[i].d);
899: }
900: PUTS("}");
901: } else {
902: TAIL PRINTF(OUT,"%s",NAME(pf));
903: }
904: } else {
905: for ( i = 0; i < pf->argc; i++ )
906: if ( ad[i].d )
907: break;
908: if ( i < pf->argc ) {
909: TAIL PRINTF(OUT,"%s{%d",NAME(pf),ad[0].d);
910: for ( i = 1; i < pf->argc; i++ ) {
911: TAIL PRINTF(OUT,",%d",ad[i].d);
912: }
913: PUTS("}(");
914: } else {
915: TAIL PRINTF(OUT,"%s(",NAME(pf));
916: }
917: PRINTR(vl,(R)ad[0].arg);
918: for ( i = 1; i < pf->argc; i++ ) {
919: PUTS(","); PRINTR(vl,(R)ad[i].arg);
920: }
921: PUTS(")");
922: }
923: }
924: }
925: }
926:
927: void PRINTSTR(STRING str)
928: {
929: char *p;
930:
931: for ( p = BDY(str); *p; p++ )
932: if ( *p == '"' )
933: PUTS("\"");
934: else {
935: TAIL PRINTF(OUT,"%c",*p);
936: }
937: }
938:
939: void PRINTDP(VL vl,DP d)
940: {
941: int n,i;
942: MP m;
943: DL dl;
944:
945: for ( n = d->nv, m = BDY(d); m; m = NEXT(m) ) {
946: PUTS("("); PRINTEXPR(vl,(pointer)m->c); PUTS(")*<<");
947: for ( i = 0, dl = m->dl; i < n-1; i++ ) {
948: TAIL PRINTF(OUT,"%d,",dl->d[i]);
949: }
950: TAIL PRINTF(OUT,"%d",dl->d[i]);
951: PUTS(">>");
952: if ( NEXT(m) )
953: PUTS("+");
954: }
955: }
956:
957: void PRINTDPM(VL vl,DPM d)
958: {
959: int n,i;
960: DMM m;
961: DL dl;
962:
963: for ( n = d->nv, m = BDY(d); m; m = NEXT(m) ) {
964: PUTS("("); PRINTEXPR(vl,(pointer)m->c); PUTS(")*<<");
965: for ( i = 0, dl = m->dl; i < n-1; i++ ) {
966: TAIL PRINTF(OUT,"%d,",dl->d[i]);
967: }
968: TAIL PRINTF(OUT,"%d:%d",dl->d[i],m->pos);
969: PUTS(">>");
970: if ( NEXT(m) )
971: PUTS("+");
972: }
973: }
974:
975: void PRINTUI(VL vl,USINT u)
976: {
977: TAIL PRINTF(OUT,"%u",BDY(u));
978: }
979:
980: void PRINTGFMMAT(VL vl,GFMMAT mat)
981: {
982: int row,col,i,j;
983: unsigned int **b;
984:
985: row = mat->row;
986: col = mat->col;
987: b = mat->body;
988: for ( i = 0; i < row; i++ ) {
989: PUTS("[");
990: for ( j = 0; j < col; j++ ) {
991: TAIL PRINTF(OUT,"%8d",b[i][j]);
992: }
993: PUTS("]\n");
994: }
995: }
996:
997: void PRINTBYTEARRAY(VL vl,BYTEARRAY array)
998: {
999: int len,i;
1000: unsigned char *b;
1001:
1002: len = array->len;
1003: b = array->body;
1004: PUTS("|");
1005: for ( i = 0; i < len-1; i++ ) {
1006: TAIL PRINTF(OUT,"%02x ",(unsigned int)b[i]);
1007: }
1008: TAIL PRINTF(OUT,"%02x",(unsigned int)b[i]);
1009: PUTS("|");
1010: }
1011:
1012: void PRINTQUOTE(VL vl,QUOTE quote)
1013: {
1014: LIST list;
1015:
1016: if ( print_quote == 1 ) {
1.3 ! noro 1017: fnodetotree(BDY(quote),quote->pvs,&list);
1.1 noro 1018: PRINTEXPR(vl,(Obj)list);
1019: } else if ( print_quote == 2 ) {
1020: PRINTFNODE(BDY(quote),0);
1021: } else {
1022: PUTS("<...quoted...>");
1023: }
1024: }
1025:
1026: void PRINTQUOTEARG(VL vl,QUOTEARG quote)
1027: {
1028: PUTS("<...quoted...>");
1029: }
1030:
1031: void PRINTNBP(VL vl,NBP p)
1032: {
1033: NODE t;
1034: NBM m;
1035: int d,i;
1036: unsigned int *b;
1037: if ( !p ) PUTS("0");
1038: else {
1039: for ( t = BDY(p); t; t = NEXT(t) ) {
1040: m = (NBM)BDY(t);
1041: PUTS("(");
1042: PRINTEXPR(vl,(Obj)m->c);
1043: PUTS(")*");
1044: d = m->d;
1045: b = m->b;
1046: if ( d )
1047: for ( i = 0; i < d; i++ ) {
1048: if ( NBM_GET(b,i) ) PUTS("x");
1049: else PUTS("y");
1050: }
1051: else PUTS("1");
1052: if ( NEXT(t) ) PUTS("+");
1053: }
1054: }
1055: }
1056:
1057: void PRINTTB(VL vl,TB p)
1058: {
1059: int i;
1060: #if defined(SPRINT)
1061: char *ptr,*e;
1062:
1063: for ( i = 0, ptr = buf+strlen(OUT); i < p->next; i++ )
1064: for ( e = p->body[i]; *e; *ptr++ = *e++ );
1065: *ptr = 0;
1066: #else
1067: for ( i = 0; i < p->next; i++ ) {
1068: PUTS(p->body[i]);
1069: }
1070: #endif
1071: }
1072:
1073: void PRINTUP2(UP2 p)
1074: {
1075: int d,i;
1076:
1077: if ( !p ) {
1078: TAIL PRINTF(OUT,"0");
1079: } else if ( hex_output ) {
1080: d = p->w;
1081: TAIL PRINTF(OUT,"0x%x",p->b[d-1]);
1082: if ( hex_output < 0 )
1083: for ( i = d - 2; i >= 0; i-- ) {
1084: TAIL PRINTF(OUT,"|%08x",p->b[i]);
1085: }
1086: else
1087: for ( i = d - 2; i >= 0; i-- ) {
1088: TAIL PRINTF(OUT,"%08x",p->b[i]);
1089: }
1090: } else {
1091: d = degup2(p);
1092: TAIL PRINTF(OUT,"(");
1093: if ( !d ) {
1094: TAIL PRINTF(OUT,"1");
1095: } else if ( d == 1 ) {
1096: TAIL PRINTF(OUT,"@");
1097: } else {
1098: PUTS("@"); PRINTHAT; TAIL PRINTF(OUT,"%d",d);
1099: }
1100: for ( i = d-1; i >= 0; i-- ) {
1101: if ( p->b[i/BSH] & (1<<(i%BSH)) )
1102: if ( !i ) {
1103: TAIL PRINTF(OUT,"+1");
1104: } else if ( i == 1 ) {
1105: TAIL PRINTF(OUT,"+@");
1106: } else {
1107: PUTS("+@"); PRINTHAT; TAIL PRINTF(OUT,"%d",i);
1108: }
1109: }
1110: TAIL PRINTF(OUT,")");
1111: }
1112: }
1113:
1114: void PRINTQOP(VL vl,F f)
1115: {
1116: char *op;
1117:
1118: op = FOP(f)==AL_EX?"ex":"all";
1119: TAIL PRINTF(OUT,"%s(%s,",op,NAME(FQVR(f)));
1120: PRINTEXPR(vl,(Obj)FQMAT(f)); PUTS(")");
1121: }
1122:
1123: void PRINTUP(UP n)
1124: {
1125: int i,d;
1126:
1127: if ( !n )
1128: PUTS("0");
1129: else if ( !n->d )
1130: PRINTNUM(n->c[0]);
1131: else {
1132: d = n->d;
1133: PUTS("(");
1134: if ( !d ) {
1135: PRINTNUM(n->c[d]);
1136: } else if ( d == 1 ) {
1137: PRINTNUM(n->c[d]);
1138: PUTS("*@p");
1139: } else {
1140: PRINTNUM(n->c[d]);
1141: PUTS("*@p"); PRINTHAT; TAIL PRINTF(OUT,"%d",d);
1142: }
1143: for ( i = d-1; i >= 0; i-- ) {
1144: if ( n->c[i] ) {
1145: PUTS("+("); PRINTNUM(n->c[i]); PUTS(")");
1146: if ( i >= 2 ) {
1147: PUTS("*@p"); PRINTHAT; TAIL PRINTF(OUT,"%d",i);
1148: } else if ( i == 1 )
1149: PUTS("*@p");
1150: }
1151: }
1152: PUTS(")");
1153: }
1154: }
1155:
1156: void PRINTUM(UM n)
1157: {
1158: int i,d;
1159:
1160: if ( !n )
1161: PUTS("0");
1162: else if ( !n->d )
1163: PRINTSF(n->c[0]);
1164: else {
1165: d = n->d;
1166: PUTS("(");
1167: if ( !d ) {
1168: PRINTSF(n->c[d]);
1169: } else if ( d == 1 ) {
1170: PRINTSF(n->c[d]);
1171: PUTS("*@s");
1172: } else {
1173: PRINTSF(n->c[d]);
1174: PUTS("*@s"); PRINTHAT; TAIL PRINTF(OUT,"%d",d);
1175: }
1176: for ( i = d-1; i >= 0; i-- ) {
1177: if ( n->c[i] ) {
1178: PUTS("+("); PRINTSF(n->c[i]); PUTS(")");
1179: if ( i >= 2 ) {
1180: PUTS("*@s"); PRINTHAT; TAIL PRINTF(OUT,"%d",i);
1181: } else if ( i == 1 )
1182: PUTS("*@s");
1183: }
1184: }
1185: PUTS(")");
1186: }
1187: }
1188:
1189: void PRINTSF(unsigned int i)
1190: {
1191: if ( !i ) {
1192: PUTS("0");
1193: } else {
1194: TAIL PRINTF(OUT,"@_%d",IFTOF(i));
1195: }
1196: }
1197:
1198: void PRINTSYMBOL(SYMBOL sym)
1199: {
1200: PUTS(sym->name);
1201: }
1202:
1203: #endif /* CPRINT */
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>