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