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