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