Annotation of OpenXM_contrib2/asir2000/io/pexpr_body.c, Revision 1.11
1.11 ! noro 1: /* $OpenXM: OpenXM_contrib2/asir2000/io/pexpr_body.c,v 1.10 2005/11/16 23:42:54 noro Exp $ */
1.1 noro 2:
3: #define PRINTHAT (fortran_output?PUTS("**"):PUTS("^"))
4:
5: void PRINTEXPR();
6: void PRINTNUM();
7: void PRINTN();
8: void PRINTV();
9: void PRINTP();
10: void PRINTR();
11: void PRINTLIST();
12: void PRINTVECT();
13: void PRINTMAT();
1.7 saito 14: void PRINTIMAT(); /* IMAT */
1.1 noro 15: void PRINTSTR();
16: void PRINTCOMP();
17: void PRINTDP();
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);
692: #if defined(__i386__) || defined(MIPSEL) || defined(VISUAL) || defined(__alpha) || defined(__FreeBSD__) || defined(__NetBSD__) || defined(__x86_64)
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: #if defined(PARI)
769: case N_B:
770: PRINTBF((BF)q); break;
771: #endif
772: #if defined(INTERVAL)
773: case N_IP:
774: case N_IntervalBigFloat:
775: switch ( outputstyle ) {
776: case 1:
777: PUTS("intval(");
778: PRINTNUM(INF((Itv)q));
779: PUTS(",");
780: PRINTNUM(SUP((Itv)q));
781: PUTS(")");
782: break;
783: case 0:
784: default:
785: PUTS("[");
786: PRINTNUM(INF((Itv)q));
787: PUTS(",");
788: PRINTNUM(SUP((Itv)q));
789: PUTS("]");
790: break;
791: }
792: break;
793: case N_IntervalDouble:
794: switch (printmode) {
795: case PRINTF_E:
796: switch ( outputstyle ) {
797: case 1:
798: TAIL PRINTF(OUT, "intval(%.16e,%.16e)",
799: INF((IntervalDouble)q),SUP((IntervalDouble)q));
800: break;
801: case 0:
802: default:
803: TAIL PRINTF(OUT, "[%.16e,%.16e]",
804: INF((IntervalDouble)q),SUP((IntervalDouble)q));
805: break;
806: }
807: #if defined(ITVDEBUG)
808: printbin(INF((IntervalDouble)q));
809: printbin(SUP((IntervalDouble)q));
810: #endif
811: break;
812: case MID_PRINTF_G:
813: switch ( outputstyle ) {
814: case 1:
815: TAIL PRINTF(OUT, "intvalm(%g,%g)",
816: (SUP((IntervalDouble)q)+INF((IntervalDouble)q))*0.5,
817: (SUP((IntervalDouble)q)-INF((IntervalDouble)q))*0.5);
818: break;
819: case 0:
820: default:
821: TAIL PRINTF(OUT, "<%g,%g>",
822: (SUP((IntervalDouble)q)+INF((IntervalDouble)q))*0.5,
823: (SUP((IntervalDouble)q)-INF((IntervalDouble)q))*0.5);
824: break;
825: }
826: break;
827: case MID_PRINTF_E:
828: switch ( outputstyle ) {
829: case 1:
830: TAIL PRINTF(OUT, "intvalm(%.16e,%.16e)",
831: (SUP((IntervalDouble)q)+INF((IntervalDouble)q))*0.5,
832: (SUP((IntervalDouble)q)-INF((IntervalDouble)q))*0.5);
833: break;
834: case 0:
835: default:
836: TAIL PRINTF(OUT, "<%.16e,%.16e>",
837: (SUP((IntervalDouble)q)+INF((IntervalDouble)q))*0.5,
838: (SUP((IntervalDouble)q)-INF((IntervalDouble)q))*0.5);
839: break;
840: }
841: break;
842: case PRINTF_G:
843: default:
844: switch ( outputstyle ) {
845: case 1:
846: TAIL PRINTF(OUT, "intval(%g,%g)",
847: INF((IntervalDouble)q),SUP((IntervalDouble)q));
848: break;
849: case 0:
850: default:
851: TAIL PRINTF(OUT, "[%g,%g]",
852: INF((IntervalDouble)q),SUP((IntervalDouble)q));
853: break;
854: }
855: break;
856: }
857: break;
858: #endif
859: case N_C:
860: PRINTCPLX((C)q); break;
861: case N_M:
862: TAIL PRINTF(OUT,"%d",CONT((MQ)q)); break;
863: case N_LM:
864: PRINTN(((LM)q)->body); break;
865: case N_GF2N:
866: if ( hex_output )
867: PRINTN((N)(((GF2N)q)->body));
868: else
869: PRINTUP2(((GF2N)q)->body);
870: break;
871: case N_GFPN:
872: PRINTUP((UP)(((GFPN)q)->body));
873: break;
874: case N_GFS:
875: TAIL PRINTF(OUT,"@_%d",CONT((GFS)q));
876: break;
877: case N_GFSN:
878: PRINTUM(BDY((GFSN)q));
1.5 noro 879: break;
880: case N_DA:
881: d = (DAlg)q;
882: nm = d->nm;
883: dn = d->dn;
884: if ( SGN((Q)dn) == -1 ) PUTS("-");
885: PUTS("(");
886: PRINTDP(CO,((DAlg)q)->nm);
887: PUTS(")");
888: if ( !UNIN(NM(dn)) ) {
889: PUTS("/");
890: PRINTN(NM(dn));
891: }
1.1 noro 892: break;
893: }
894: }
895:
896: void PRINTN(n)
897: N n;
898: {
899: register int i,*ptr;
900: N tn;
901:
902: if ( !n ) {
903: PUTS("0");
904: return;
905: }
906: if ( hex_output ) {
907: ptr = BD(n);
908: TAIL PRINTF(OUT,"0x%x",ptr[PL(n)-1]);
909: if ( hex_output < 0 )
910: for ( i = PL(n) - 2; i >= 0; i-- ) {
911: TAIL PRINTF(OUT,"|%08x",ptr[i]);
912: }
913: else
914: for ( i = PL(n) - 2; i >= 0; i-- ) {
915: TAIL PRINTF(OUT,"%08x",ptr[i]);
916: }
917: } else {
918: ntobn(DBASE,n,&tn);
919: ptr = BD(tn);
920: TAIL PRINTF(OUT,"%d",ptr[PL(tn) - 1]);
921: for ( i = PL(tn) - 2; i >= 0; i-- ) {
922: TAIL PRINTF(OUT,DFORMAT,ptr[i]);
923: }
924: }
925: }
926:
927: void PRINTV(vl,v)
928: VL vl;
929: V v;
930: {
931: PF pf;
932: PFAD ad;
933: int i;
934:
935: if ( NAME(v) )
936: PUTS(NAME(v));
937: else if ( (vid)v->attr == V_PF ) {
938: pf = ((PFINS)v->priv)->pf; ad = ((PFINS)v->priv)->ad;
939: if ( !strcmp(NAME(pf),"pow") ) {
940: PUTS("(("); PRINTR(vl,(R)ad[0].arg); PUTS(")"); PRINTHAT; PUTS("(");
941: PRINTR(vl,(R)ad[1].arg); PUTS("))");
942: } else if ( !pf->argc ) {
943: TAIL PRINTF(OUT,"%s",NAME(pf));
944: } else {
945: if ( hideargs ) {
946: for ( i = 0; i < pf->argc; i++ )
947: if ( ad[i].d )
948: break;
949: if ( i < pf->argc ) {
950: TAIL PRINTF(OUT,"%s{%d",NAME(pf),ad[0].d);
951: for ( i = 1; i < pf->argc; i++ ) {
952: TAIL PRINTF(OUT,",%d",ad[i].d);
953: }
954: PUTS("}");
955: } else {
956: TAIL PRINTF(OUT,"%s",NAME(pf));
957: }
958: } else {
959: for ( i = 0; i < pf->argc; i++ )
960: if ( ad[i].d )
961: break;
962: if ( i < pf->argc ) {
963: TAIL PRINTF(OUT,"%s{%d",NAME(pf),ad[0].d);
964: for ( i = 1; i < pf->argc; i++ ) {
965: TAIL PRINTF(OUT,",%d",ad[i].d);
966: }
967: PUTS("}(");
968: } else {
969: TAIL PRINTF(OUT,"%s(",NAME(pf));
970: }
971: PRINTR(vl,(R)ad[0].arg);
972: for ( i = 1; i < pf->argc; i++ ) {
973: PUTS(","); PRINTR(vl,(R)ad[i].arg);
974: }
975: PUTS(")");
976: }
977: }
978: }
979: }
980:
981: void PRINTSTR(str)
982: STRING str;
983: {
984: char *p;
985:
986: for ( p = BDY(str); *p; p++ )
987: if ( *p == '"' )
988: PUTS("\"");
989: else {
990: TAIL PRINTF(OUT,"%c",*p);
991: }
992: }
993:
994: void PRINTDP(vl,d)
995: VL vl;
996: DP d;
997: {
998: int n,i;
999: MP m;
1000: DL dl;
1001:
1002: for ( n = d->nv, m = BDY(d); m; m = NEXT(m) ) {
1003: PUTS("("); PRINTEXPR(vl,(pointer)m->c); PUTS(")*<<");
1004: for ( i = 0, dl = m->dl; i < n-1; i++ ) {
1005: TAIL PRINTF(OUT,"%d,",dl->d[i]);
1006: }
1007: TAIL PRINTF(OUT,"%d",dl->d[i]);
1008: PUTS(">>");
1009: if ( NEXT(m) )
1010: PUTS("+");
1011: }
1012: }
1013:
1014: void PRINTUI(vl,u)
1015: VL vl;
1016: USINT u;
1017: {
1018: TAIL PRINTF(OUT,"%u",BDY(u));
1019: }
1020:
1021: void PRINTGFMMAT(vl,mat)
1022: VL vl;
1023: GFMMAT mat;
1024: {
1025: int row,col,i,j;
1026: unsigned int **b;
1027:
1028: row = mat->row;
1029: col = mat->col;
1030: b = mat->body;
1031: for ( i = 0; i < row; i++ ) {
1032: PUTS("[");
1033: for ( j = 0; j < col; j++ ) {
1034: TAIL PRINTF(OUT,"%8d",b[i][j]);
1035: }
1036: PUTS("]\n");
1037: }
1038: }
1039:
1040: void PRINTBYTEARRAY(vl,array)
1041: VL vl;
1042: BYTEARRAY array;
1043: {
1044: int len,i;
1045: unsigned char *b;
1046:
1047: len = array->len;
1048: b = array->body;
1049: PUTS("|");
1050: for ( i = 0; i < len-1; i++ ) {
1051: TAIL PRINTF(OUT,"%02x ",(unsigned int)b[i]);
1052: }
1053: TAIL PRINTF(OUT,"%02x",(unsigned int)b[i]);
1054: PUTS("|");
1055: }
1056:
1057: void PRINTQUOTE(vl,quote)
1058: VL vl;
1059: QUOTE quote;
1060: {
1061: LIST list;
1062:
1063: if ( print_quote == 1 ) {
1064: fnodetotree(BDY(quote),&list);
1065: PRINTEXPR(vl,(Obj)list);
1066: } else if ( print_quote == 2 ) {
1067: PRINTFNODE(BDY(quote),0);
1068: } else {
1069: PUTS("<...quoted...>");
1070: }
1.4 noro 1071: }
1072:
1073: void PRINTQUOTEARG(vl,quote)
1074: VL vl;
1075: QUOTEARG quote;
1076: {
1077: PUTS("<...quoted...>");
1.10 noro 1078: }
1079:
1080: void PRINTNBP(VL vl,NBP p)
1081: {
1082: NODE t;
1083: NBM m;
1084: int d,i;
1085: unsigned int *b;
1086: if ( !p ) PUTS("0");
1087: else {
1088: for ( t = BDY(p); t; t = NEXT(t) ) {
1089: m = (NBM)BDY(t);
1090: PRINTEXPR(vl,(Obj)m->c);
1091: d = m->d;
1092: b = m->b;
1093: for ( i = 0; i < d; i++ ) {
1094: if ( NBM_GET(b,i) ) PUTS("x");
1095: else PUTS("y");
1096: }
1097: if ( NEXT(t) ) PUTS("+");
1098: }
1099: }
1.1 noro 1100: }
1101:
1102: void PRINTTB(VL vl,TB p)
1103: {
1104: int i;
1.2 noro 1105: #if defined(SPRINT)
1106: char *ptr,*e;
1.1 noro 1107:
1.2 noro 1108: for ( i = 0, ptr = buf+strlen(OUT); i < p->next; i++ )
1109: for ( e = p->body[i]; *e; *ptr++ = *e++ );
1110: *ptr = 0;
1111: #else
1.1 noro 1112: for ( i = 0; i < p->next; i++ ) {
1113: PUTS(p->body[i]);
1114: }
1.2 noro 1115: #endif
1.1 noro 1116: }
1117:
1118: void PRINTUP2(p)
1119: UP2 p;
1120: {
1121: int d,i;
1122:
1123: if ( !p ) {
1124: TAIL PRINTF(OUT,"0");
1125: } else {
1126: d = degup2(p);
1127: TAIL PRINTF(OUT,"(");
1128: if ( !d ) {
1129: TAIL PRINTF(OUT,"1");
1130: } else if ( d == 1 ) {
1131: TAIL PRINTF(OUT,"@");
1132: } else {
1133: PUTS("@"); PRINTHAT; TAIL PRINTF(OUT,"%d",d);
1134: }
1135: for ( i = d-1; i >= 0; i-- ) {
1136: if ( p->b[i/BSH] & (1<<(i%BSH)) )
1137: if ( !i ) {
1138: TAIL PRINTF(OUT,"+1");
1139: } else if ( i == 1 ) {
1140: TAIL PRINTF(OUT,"+@");
1141: } else {
1142: PUTS("+@"); PRINTHAT; TAIL PRINTF(OUT,"%d",i);
1143: }
1144: }
1145: TAIL PRINTF(OUT,")");
1146: }
1147: }
1148:
1149: void PRINTQOP(vl,f)
1150: VL vl;
1151: F f;
1152: {
1153: char *op;
1154:
1155: op = FOP(f)==AL_EX?"ex":"all";
1156: TAIL PRINTF(OUT,"%s(%s,",op,NAME(FQVR(f)));
1157: PRINTEXPR(vl,(Obj)FQMAT(f)); PUTS(")");
1158: }
1159:
1160: void PRINTUP(n)
1161: UP n;
1162: {
1163: int i,d;
1164:
1165: if ( !n )
1166: PUTS("0");
1167: else if ( !n->d )
1168: PRINTNUM(n->c[0]);
1169: else {
1170: d = n->d;
1171: PUTS("(");
1172: if ( !d ) {
1173: PRINTNUM(n->c[d]);
1174: } else if ( d == 1 ) {
1175: PRINTNUM(n->c[d]);
1176: PUTS("*@p");
1177: } else {
1178: PRINTNUM(n->c[d]);
1179: PUTS("*@p"); PRINTHAT; TAIL PRINTF(OUT,"%d",d);
1180: }
1181: for ( i = d-1; i >= 0; i-- ) {
1182: if ( n->c[i] ) {
1183: PUTS("+("); PRINTNUM(n->c[i]); PUTS(")");
1184: if ( i >= 2 ) {
1185: PUTS("*@p"); PRINTHAT; TAIL PRINTF(OUT,"%d",i);
1186: } else if ( i == 1 )
1187: PUTS("*@p");
1188: }
1189: }
1190: PUTS(")");
1191: }
1192: }
1193:
1194: void PRINTUM(n)
1195: UM n;
1196: {
1197: int i,d;
1198:
1199: if ( !n )
1200: PUTS("0");
1201: else if ( !n->d )
1202: PRINTSF(n->c[0]);
1203: else {
1204: d = n->d;
1205: PUTS("(");
1206: if ( !d ) {
1207: PRINTSF(n->c[d]);
1208: } else if ( d == 1 ) {
1209: PRINTSF(n->c[d]);
1210: PUTS("*@s");
1211: } else {
1212: PRINTSF(n->c[d]);
1213: PUTS("*@s"); PRINTHAT; TAIL PRINTF(OUT,"%d",d);
1214: }
1215: for ( i = d-1; i >= 0; i-- ) {
1216: if ( n->c[i] ) {
1217: PUTS("+("); PRINTSF(n->c[i]); PUTS(")");
1218: if ( i >= 2 ) {
1219: PUTS("*@s"); PRINTHAT; TAIL PRINTF(OUT,"%d",i);
1220: } else if ( i == 1 )
1221: PUTS("*@s");
1222: }
1223: }
1224: PUTS(")");
1225: }
1226: }
1227:
1228: void PRINTSF(i)
1229: unsigned int i;
1230: {
1231: if ( !i ) {
1232: PUTS("0");
1233: } else {
1234: TAIL PRINTF(OUT,"@_%d",IFTOF(i));
1235: }
1236: }
1237:
1238: void PRINTSYMBOL(SYMBOL sym)
1239: {
1240: PUTS(sym->name);
1241: }
1242:
1243: #endif /* CPRINT */
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>