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