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