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