Annotation of OpenXM_contrib2/asir2000/io/pexpr_body.c, Revision 1.17
1.17 ! fujimoto 1: /* $OpenXM: OpenXM_contrib2/asir2000/io/pexpr_body.c,v 1.16 2015/08/06 10:01:52 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");
1.17 ! fujimoto 128: #if defined(__MINGW32__) || defined(__MINGW64__)
! 129: fflush(stderr);
! 130: #endif
1.1 noro 131: }
132: #endif
133: #endif
134:
135: void PRINTCPLX(a)
136: C a;
137: {
138: PUTS("(");
139: if ( a->r )
140: PRINTNUM(a->r);
141: if ( a->i ) {
142: #if defined(INTERVAL)
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) )
146: #else
147: if ( a->r && (compnum(0,a->i,0) > 0) )
148: #endif
149: PUTS("+");
150: PRINTNUM(a->i); PUTS("*@i");
151: }
152: PUTS(")");
153: }
154:
155: void PRINTP(vl,p)
156: VL vl;
157: P p;
158: {
159: V v;
160: DCP dc;
161:
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: }
208: }
209:
210: void PRINTR(vl,a)
211: VL vl;
212: R a;
213: {
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: }
224: }
225:
226: void PRINTVECT(vl,vect)
227: VL vl;
228: VECT vect;
229: {
230: int i;
231: pointer *ptr;
232:
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: {
257: int i;
258: DP *ptr;
259:
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: {
272: int i,j,r,c;
273: pointer *ptr;
274:
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: }
302: }
1.7 saito 303:
304: /* IMAT */
305: #if !defined(CPRINT)
306: void PRINTIMAT(vl,xmat)
307: VL vl;
308: IMAT xmat;
309: {
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++) {
1.8 saito 332: cr = j * col + i;
1.7 saito 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: }
343: }
344: #endif
345: /* IMAT */
1.1 noro 346:
347: void PRINTLIST(vl,list)
348: VL vl;
349: LIST list;
350: {
351: NODE tnode;
352:
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("]");
360: }
361:
362: void PRINTCOMP(vl,c)
363: VL vl;
364: COMP c;
365: {
366: int n,i;
367:
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("}");
376: }
377:
378: void PRINTGF2MAT(vl,mat)
379: VL vl;
380: GF2MAT mat;
381: {
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: }
401: }
402: void PRINTERR(vl,e)
403: VL vl;
404: ERR e;
405: {
406: PUTS("error("); PRINTEXPR(vl,e->body); PUTS(")");
407: }
408:
409: void PRINTLF(vl,f)
410: VL vl;
411: F f;
412: {
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: }
435: }
436:
437: void PRINTFOP(vl,f)
438: VL vl;
439: F f;
440: {
441: char *op;
442: NODE n;
443:
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: }
450: }
451:
452: void PRINTEOP(vl,f)
453: VL vl;
454: F f;
455: {
456: oFOP op;
457: char *sop;
458:
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(")");
477: }
478:
479: void PRINTLOP(vl,f)
480: VL vl;
481: F f;
482: {
483: char *op;
484:
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");
503: }
504:
505: void PRINTRANGE(VL vl,RANGE p)
506: {
507: PUTS("range(");
508: PRINTEXPR(vl,p->start);
509: PUTS(",");
510: PRINTEXPR(vl,p->end);
511: PUTS(")");
512: }
513:
514: void PRINTFNODENODE(NODE n)
515: {
516: for ( ; n; n = NEXT(n) ) {
517: PRINTFNODE((FNODE)BDY(n),0);
518: if ( NEXT(n) ) PUTS(",");
519: }
520: }
521:
522: void PRINTFARGS(FNODE f)
523: {
524: NODE n;
525:
526: if ( f->id == I_LIST ) {
527: n = (NODE)FA0(f);
528: PRINTFNODENODE(n);
529: } else
530: PRINTFNODE(f,0);
531: }
532:
533: void PRINTFNODE(FNODE f,int paren)
534: {
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);
1.9 noro 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: }
1.1 noro 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 */
1.11 noro 622: case I_FUNC: case I_FUNC_QARG:
1.1 noro 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(")");
649: }
650:
651: /* functions not used in cpexpr.c */
652:
653: #if !defined(CPRINT)
654:
655: void PRINTNUM(q)
656: Num q;
657: {
658: char real_format[20];
1.5 noro 659: DAlg d;
660: DP nm;
661: Q dn;
1.1 noro 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:
679: #if defined(INTERVAL)
680: case MID_PRINTF_E:
681: #endif
682: TAIL PRINTF(OUT,"%.16e",BDY((Real)q));
683: break;
684: case PRINTF_G:
685: #if defined(INTERVAL)
686: case MID_PRINTF_G:
687: #endif
688: default:
689: if ( real_binary ) {
690: unsigned int *m;
691: unsigned int u,l,mask;
692: int i,expo;
693:
694: m = (unsigned int *)&BDY((Real)q);
1.16 fujimoto 695: #if defined(__i386__) || defined(MIPSEL) || defined(VISUAL) || defined(__MINGW32__) || defined(__MINGW64__) || defined(__alpha) || defined(__FreeBSD__) || defined(__NetBSD__) || defined(__x86_64)
1.1 noro 696: u = m[1]; l = m[0];
697: #else
698: u = m[0]; l = m[1];
699: #endif
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 ) {
759: sprintf(real_format,
760: double_output?"%%.%df":"%%.%dg",real_digit);
761: TAIL PRINTF(OUT,real_format,BDY((Real)q));
762: } else {
763: TAIL PRINTF(OUT,double_output?"%f":"%g",BDY((Real)q));
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;
773: #if defined(INTERVAL)
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: }
808: #if defined(ITVDEBUG)
809: printbin(INF((IntervalDouble)q));
810: printbin(SUP((IntervalDouble)q));
811: #endif
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;
859: #endif
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));
1.5 noro 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: }
1.1 noro 893: break;
1.14 noro 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;
1.1 noro 900: }
901: }
902:
903: void PRINTN(n)
904: N n;
905: {
906: register int i,*ptr;
907: N tn;
908:
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: }
932: }
933:
934: void PRINTV(vl,v)
935: VL vl;
936: V v;
937: {
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: }
986: }
987:
988: void PRINTSTR(str)
989: STRING str;
990: {
991: char *p;
992:
993: for ( p = BDY(str); *p; p++ )
994: if ( *p == '"' )
995: PUTS("\"");
996: else {
997: TAIL PRINTF(OUT,"%c",*p);
998: }
999: }
1000:
1001: void PRINTDP(vl,d)
1002: VL vl;
1003: DP d;
1004: {
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: }
1019: }
1020:
1021: void PRINTUI(vl,u)
1022: VL vl;
1023: USINT u;
1024: {
1025: TAIL PRINTF(OUT,"%u",BDY(u));
1026: }
1027:
1028: void PRINTGFMMAT(vl,mat)
1029: VL vl;
1030: GFMMAT mat;
1031: {
1032: int row,col,i,j;
1033: unsigned int **b;
1034:
1035: row = mat->row;
1036: col = mat->col;
1037: b = mat->body;
1038: for ( i = 0; i < row; i++ ) {
1039: PUTS("[");
1040: for ( j = 0; j < col; j++ ) {
1041: TAIL PRINTF(OUT,"%8d",b[i][j]);
1042: }
1043: PUTS("]\n");
1044: }
1045: }
1046:
1047: void PRINTBYTEARRAY(vl,array)
1048: VL vl;
1049: BYTEARRAY array;
1050: {
1051: int len,i;
1052: unsigned char *b;
1053:
1054: len = array->len;
1055: b = array->body;
1056: PUTS("|");
1057: for ( i = 0; i < len-1; i++ ) {
1058: TAIL PRINTF(OUT,"%02x ",(unsigned int)b[i]);
1059: }
1060: TAIL PRINTF(OUT,"%02x",(unsigned int)b[i]);
1061: PUTS("|");
1062: }
1063:
1064: void PRINTQUOTE(vl,quote)
1065: VL vl;
1066: QUOTE quote;
1067: {
1068: LIST list;
1069:
1070: if ( print_quote == 1 ) {
1071: fnodetotree(BDY(quote),&list);
1072: PRINTEXPR(vl,(Obj)list);
1073: } else if ( print_quote == 2 ) {
1074: PRINTFNODE(BDY(quote),0);
1075: } else {
1076: PUTS("<...quoted...>");
1077: }
1.4 noro 1078: }
1079:
1080: void PRINTQUOTEARG(vl,quote)
1081: VL vl;
1082: QUOTEARG quote;
1083: {
1084: PUTS("<...quoted...>");
1.10 noro 1085: }
1086:
1087: void PRINTNBP(VL vl,NBP p)
1088: {
1089: NODE t;
1090: NBM m;
1091: int d,i;
1092: unsigned int *b;
1093: if ( !p ) PUTS("0");
1094: else {
1095: for ( t = BDY(p); t; t = NEXT(t) ) {
1096: m = (NBM)BDY(t);
1.12 noro 1097: PUTS("(");
1.10 noro 1098: PRINTEXPR(vl,(Obj)m->c);
1.12 noro 1099: PUTS(")*");
1.10 noro 1100: d = m->d;
1101: b = m->b;
1.13 noro 1102: if ( d )
1103: for ( i = 0; i < d; i++ ) {
1104: if ( NBM_GET(b,i) ) PUTS("x");
1105: else PUTS("y");
1106: }
1107: else PUTS("1");
1.10 noro 1108: if ( NEXT(t) ) PUTS("+");
1109: }
1110: }
1.1 noro 1111: }
1112:
1113: void PRINTTB(VL vl,TB p)
1114: {
1115: int i;
1.2 noro 1116: #if defined(SPRINT)
1117: char *ptr,*e;
1.1 noro 1118:
1.2 noro 1119: for ( i = 0, ptr = buf+strlen(OUT); i < p->next; i++ )
1120: for ( e = p->body[i]; *e; *ptr++ = *e++ );
1121: *ptr = 0;
1122: #else
1.1 noro 1123: for ( i = 0; i < p->next; i++ ) {
1124: PUTS(p->body[i]);
1125: }
1.2 noro 1126: #endif
1.1 noro 1127: }
1128:
1129: void PRINTUP2(p)
1130: UP2 p;
1131: {
1132: int d,i;
1133:
1134: if ( !p ) {
1135: TAIL PRINTF(OUT,"0");
1136: } else {
1137: d = degup2(p);
1138: TAIL PRINTF(OUT,"(");
1139: if ( !d ) {
1140: TAIL PRINTF(OUT,"1");
1141: } else if ( d == 1 ) {
1142: TAIL PRINTF(OUT,"@");
1143: } else {
1144: PUTS("@"); PRINTHAT; TAIL PRINTF(OUT,"%d",d);
1145: }
1146: for ( i = d-1; i >= 0; i-- ) {
1147: if ( p->b[i/BSH] & (1<<(i%BSH)) )
1148: if ( !i ) {
1149: TAIL PRINTF(OUT,"+1");
1150: } else if ( i == 1 ) {
1151: TAIL PRINTF(OUT,"+@");
1152: } else {
1153: PUTS("+@"); PRINTHAT; TAIL PRINTF(OUT,"%d",i);
1154: }
1155: }
1156: TAIL PRINTF(OUT,")");
1157: }
1158: }
1159:
1160: void PRINTQOP(vl,f)
1161: VL vl;
1162: F f;
1163: {
1164: char *op;
1165:
1166: op = FOP(f)==AL_EX?"ex":"all";
1167: TAIL PRINTF(OUT,"%s(%s,",op,NAME(FQVR(f)));
1168: PRINTEXPR(vl,(Obj)FQMAT(f)); PUTS(")");
1169: }
1170:
1171: void PRINTUP(n)
1172: UP n;
1173: {
1174: int i,d;
1175:
1176: if ( !n )
1177: PUTS("0");
1178: else if ( !n->d )
1179: PRINTNUM(n->c[0]);
1180: else {
1181: d = n->d;
1182: PUTS("(");
1183: if ( !d ) {
1184: PRINTNUM(n->c[d]);
1185: } else if ( d == 1 ) {
1186: PRINTNUM(n->c[d]);
1187: PUTS("*@p");
1188: } else {
1189: PRINTNUM(n->c[d]);
1190: PUTS("*@p"); PRINTHAT; TAIL PRINTF(OUT,"%d",d);
1191: }
1192: for ( i = d-1; i >= 0; i-- ) {
1193: if ( n->c[i] ) {
1194: PUTS("+("); PRINTNUM(n->c[i]); PUTS(")");
1195: if ( i >= 2 ) {
1196: PUTS("*@p"); PRINTHAT; TAIL PRINTF(OUT,"%d",i);
1197: } else if ( i == 1 )
1198: PUTS("*@p");
1199: }
1200: }
1201: PUTS(")");
1202: }
1203: }
1204:
1205: void PRINTUM(n)
1206: UM n;
1207: {
1208: int i,d;
1209:
1210: if ( !n )
1211: PUTS("0");
1212: else if ( !n->d )
1213: PRINTSF(n->c[0]);
1214: else {
1215: d = n->d;
1216: PUTS("(");
1217: if ( !d ) {
1218: PRINTSF(n->c[d]);
1219: } else if ( d == 1 ) {
1220: PRINTSF(n->c[d]);
1221: PUTS("*@s");
1222: } else {
1223: PRINTSF(n->c[d]);
1224: PUTS("*@s"); PRINTHAT; TAIL PRINTF(OUT,"%d",d);
1225: }
1226: for ( i = d-1; i >= 0; i-- ) {
1227: if ( n->c[i] ) {
1228: PUTS("+("); PRINTSF(n->c[i]); PUTS(")");
1229: if ( i >= 2 ) {
1230: PUTS("*@s"); PRINTHAT; TAIL PRINTF(OUT,"%d",i);
1231: } else if ( i == 1 )
1232: PUTS("*@s");
1233: }
1234: }
1235: PUTS(")");
1236: }
1237: }
1238:
1239: void PRINTSF(i)
1240: unsigned int i;
1241: {
1242: if ( !i ) {
1243: PUTS("0");
1244: } else {
1245: TAIL PRINTF(OUT,"@_%d",IFTOF(i));
1246: }
1247: }
1248:
1249: void PRINTSYMBOL(SYMBOL sym)
1250: {
1251: PUTS(sym->name);
1252: }
1253:
1254: #endif /* CPRINT */
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>