Annotation of OpenXM_contrib2/asir2000/io/spexpr.c, Revision 1.30
1.3 noro 1: /*
2: * Copyright (c) 1994-2000 FUJITSU LABORATORIES LIMITED
3: * All rights reserved.
4: *
5: * FUJITSU LABORATORIES LIMITED ("FLL") hereby grants you a limited,
6: * non-exclusive and royalty-free license to use, copy, modify and
7: * redistribute, solely for non-commercial and non-profit purposes, the
8: * computer program, "Risa/Asir" ("SOFTWARE"), subject to the terms and
9: * conditions of this Agreement. For the avoidance of doubt, you acquire
10: * only a limited right to use the SOFTWARE hereunder, and FLL or any
11: * third party developer retains all rights, including but not limited to
12: * copyrights, in and to the SOFTWARE.
13: *
14: * (1) FLL does not grant you a license in any way for commercial
15: * purposes. You may use the SOFTWARE only for non-commercial and
16: * non-profit purposes only, such as academic, research and internal
17: * business use.
18: * (2) The SOFTWARE is protected by the Copyright Law of Japan and
19: * international copyright treaties. If you make copies of the SOFTWARE,
20: * with or without modification, as permitted hereunder, you shall affix
21: * to all such copies of the SOFTWARE the above copyright notice.
22: * (3) An explicit reference to this SOFTWARE and its copyright owner
23: * shall be made on your publication or presentation in any form of the
24: * results obtained by use of the SOFTWARE.
25: * (4) In the event that you modify the SOFTWARE, you shall notify FLL by
1.4 noro 26: * e-mail at risa-admin@sec.flab.fujitsu.co.jp of the detailed specification
1.3 noro 27: * for such modification or the source code of the modified part of the
28: * SOFTWARE.
29: *
30: * THE SOFTWARE IS PROVIDED AS IS WITHOUT ANY WARRANTY OF ANY KIND. FLL
31: * MAKES ABSOLUTELY NO WARRANTIES, EXPRESSED, IMPLIED OR STATUTORY, AND
32: * EXPRESSLY DISCLAIMS ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS
33: * FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT OF THIRD PARTIES'
34: * RIGHTS. NO FLL DEALER, AGENT, EMPLOYEES IS AUTHORIZED TO MAKE ANY
35: * MODIFICATIONS, EXTENSIONS, OR ADDITIONS TO THIS WARRANTY.
36: * UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, TORT, CONTRACT,
37: * OR OTHERWISE, SHALL FLL BE LIABLE TO YOU OR ANY OTHER PERSON FOR ANY
38: * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, PUNITIVE OR CONSEQUENTIAL
39: * DAMAGES OF ANY CHARACTER, INCLUDING, WITHOUT LIMITATION, DAMAGES
40: * ARISING OUT OF OR RELATING TO THE SOFTWARE OR THIS AGREEMENT, DAMAGES
41: * FOR LOSS OF GOODWILL, WORK STOPPAGE, OR LOSS OF DATA, OR FOR ANY
42: * DAMAGES, EVEN IF FLL SHALL HAVE BEEN INFORMED OF THE POSSIBILITY OF
43: * SUCH DAMAGES, OR FOR ANY CLAIM BY ANY OTHER PARTY. EVEN IF A PART
44: * OF THE SOFTWARE HAS BEEN DEVELOPED BY A THIRD PARTY, THE THIRD PARTY
45: * DEVELOPER SHALL HAVE NO LIABILITY IN CONNECTION WITH THE USE,
46: * PERFORMANCE OR NON-PERFORMANCE OF THE SOFTWARE.
1.30 ! noro 47: * $OpenXM: OpenXM_contrib2/asir2000/io/spexpr.c,v 1.29 2004/03/03 09:25:30 noro Exp $
1.3 noro 48: */
1.1 noro 49: #include "ca.h"
1.2 noro 50: #include "al.h"
1.1 noro 51: #include "parse.h"
52: #include "comp.h"
53: #include "base.h"
1.26 noro 54:
55: #if defined(PARI)
1.25 noro 56: #include "genpari.h"
57: #endif
1.1 noro 58:
59: #ifndef SPRINT
60: #define SPRINT
61: #endif
62:
1.2 noro 63: #define PRINTHAT (fortran_output?PUTS("**"):PUTS("^"))
1.23 saito 64: extern int outputstyle;
1.2 noro 65:
1.1 noro 66: #ifdef FPRINT
67: FILE *asir_out;
68: #define OUT asir_out
69: char DFORMAT[BUFSIZ];
1.2 noro 70: int hex_output;
71: int fortran_output;
1.14 noro 72: int double_output;
73: int real_digit;
1.26 noro 74: int real_binary;
1.14 noro 75: int print_quote;
1.1 noro 76:
77: #define TAIL
78: #define PUTS(s) fputs(s,OUT)
79: #define PRINTF fprintf
80: #define PRINTN printn
81: #define PRINTBF printbf
82: #define PRINTCPLX printcplx
1.2 noro 83: #define PRINTLM printlm
84: #define PRINTUP2 printup2
1.1 noro 85: #define PRINTV printv
86: #define PRINTEXPR printexpr
87: #define PRINTNUM printnum
1.20 noro 88: #define PRINTP asir_printp
1.1 noro 89: #define PRINTR printr
90: #define PRINTLIST printlist
91: #define PRINTVECT printvect
92: #define PRINTMAT printmat
93: #define PRINTSTR printstr
94: #define PRINTCOMP printcomp
95: #define PRINTDP printdp
1.2 noro 96: #define PRINTUI printui
97: #define PRINTGF2MAT printgf2mat
98: #define PRINTGFMMAT printgfmmat
1.5 noro 99: #define PRINTBYTEARRAY printbytearray
1.13 noro 100: #define PRINTQUOTE printquote
1.2 noro 101: #define PRINTERR printerr
102: #define PRINTLF printlf
103: #define PRINTLOP printlop
104: #define PRINTFOP printfop
105: #define PRINTEOP printeop
106: #define PRINTQOP printqop
107: #define PRINTUP printup
1.16 noro 108: #define PRINTUM printum
109: #define PRINTSF printsf
1.26 noro 110: #define PRINTSYMBOL printsymbol
1.27 noro 111: #define PRINTRANGE printrange
1.29 noro 112: #define PRINTTB printtb
1.30 ! noro 113: #define PRINTFNODE printfnode
! 114: #define PRINTFNODENODE printfnodenode
! 115: #define PRINTFARGS printfargs
1.1 noro 116: #endif
117:
118: #ifdef SPRINT
119: static char *buf;
120: #define OUT buf
121: extern char DFORMAT[BUFSIZ];
1.2 noro 122: extern int hex_output;
123: extern int fortran_output;
1.6 noro 124: extern int double_output;
1.10 noro 125: extern int real_digit;
1.26 noro 126: extern int real_binary;
1.14 noro 127: extern int print_quote;
1.1 noro 128:
1.22 saito 129:
1.1 noro 130: #define TAIL while ( *OUT ) OUT++;
131: #define PUTS(s) strcat(OUT,s)
132: #define PRINTF sprintf
133: #define PRINTN sprintn
134: #define PRINTBF sprintbf
135: #define PRINTCPLX sprintcplx
1.2 noro 136: #define PRINTLM sprintlm
137: #define PRINTUP2 sprintup2
1.1 noro 138: #define PRINTV sprintv
139: #define PRINTEXPR sprintexpr
140: #define PRINTNUM sprintnum
1.20 noro 141: #define PRINTP asir_sprintp
1.1 noro 142: #define PRINTR sprintr
143: #define PRINTLIST sprintlist
144: #define PRINTVECT sprintvect
145: #define PRINTMAT sprintmat
146: #define PRINTSTR sprintstr
147: #define PRINTCOMP sprintcomp
148: #define PRINTDP sprintdp
1.2 noro 149: #define PRINTUI sprintui
150: #define PRINTGF2MAT sprintgf2mat
151: #define PRINTGFMMAT sprintgfmmat
1.5 noro 152: #define PRINTBYTEARRAY sprintbytearray
1.13 noro 153: #define PRINTQUOTE sprintquote
1.2 noro 154: #define PRINTERR sprinterr
155: #define PRINTLF sprintlf
156: #define PRINTLOP sprintlop
157: #define PRINTFOP sprintfop
158: #define PRINTEOP sprinteop
159: #define PRINTQOP sprintqop
160: #define PRINTUP sprintup
1.16 noro 161: #define PRINTUM sprintum
162: #define PRINTSF sprintsf
1.26 noro 163: #define PRINTSYMBOL sprintsymbol
1.27 noro 164: #define PRINTRANGE sprintrange
1.29 noro 165: #define PRINTTB sprinttb
1.30 ! noro 166: #define PRINTFNODE sprintfnode
! 167: #define PRINTFNODENODE sprintfnodenode
! 168: #define PRINTFARGS sprintfargs
1.1 noro 169: #endif
170:
171: void PRINTEXPR();
172: void PRINTNUM();
173: void PRINTN();
174: void PRINTV();
175: void PRINTP();
176: void PRINTR();
177: void PRINTLIST();
178: void PRINTVECT();
179: void PRINTMAT();
180: void PRINTSTR();
181: void PRINTCOMP();
182: void PRINTDP();
1.2 noro 183: void PRINTUI();
184: void PRINTGF2MAT();
185: void PRINTGFMMAT();
1.5 noro 186: void PRINTBYTEARRAY();
1.13 noro 187: void PRINTQUOTE();
1.2 noro 188: void PRINTERR();
1.1 noro 189: void PRINTCPLX();
1.2 noro 190: void PRINTLM();
191: void PRINTLF();
192: void PRINTUP2();
1.17 noro 193: void PRINTUP();
194: void PRINTUM();
195: void PRINTFOP();
196: void PRINTEOP();
197: void PRINTLOP();
198: void PRINTQOP();
199: void PRINTSF();
1.26 noro 200: void PRINTSYMBOL();
1.27 noro 201: void PRINTRANGE();
1.29 noro 202: void PRINTTB();
1.30 ! noro 203: void PRINTFNODE();
1.1 noro 204:
205: #ifdef FPRINT
206: void output_init() {
207: OUT = stdout;
208: sprintf(DFORMAT,"%%0%dd",DLENGTH);
209: }
210:
211: int mmono(p)
212: P p;
213: {
214: if ( NUM(p) )
1.9 saito 215: #if defined(INTERVAL)
1.18 kondoh 216: if ( NID(p) != N_IP && NID(p) != N_IntervalDouble && NID(p) != N_IntervalQuad && NID(p) != N_IntervalBigFloat
1.14 noro 217: && compnum(CO,(Num)p,0) < 0 )
1.9 saito 218: #else
1.1 noro 219: if ( compnum(CO,(Num)p,0) < 0 )
1.9 saito 220: #endif
1.1 noro 221: return ( 1 );
222: else
223: return ( 0 );
224: else if ( NEXT(DC(p)) )
225: return ( 0 );
226: else
227: return (mmono(COEF(DC(p))));
228: }
229:
1.21 ohara 230: #if defined(PARI)
1.2 noro 231: void printbf(a)
1.1 noro 232: BF a;
233: {
1.7 noro 234: sor(a->body,double_output ? 'f' : 'g',-1,0);
1.1 noro 235: }
236: #endif
237: #endif
238:
239: #ifdef SPRINT
240: void soutput_init(s)
241: char *s;
242: {
243: s[0] = 0; buf = s;
244: }
245:
1.21 ohara 246: #if defined(PARI)
1.8 noro 247: void myoutbrute(g)
248: GEN g;
249: {
1.28 saito 250: # if PARI_VERSION_CODE > 131588
251: brute(g, 'f', -1);
252: # else
1.8 noro 253: bruteall(g,'f',-1,1);
1.28 saito 254: # endif
1.8 noro 255: }
256:
1.1 noro 257: void sprintbf(a)
258: BF a;
259: {
260: char *str;
1.8 noro 261: char *GENtostr0();
1.1 noro 262:
1.8 noro 263: if ( double_output ) {
264: str = GENtostr0(a->body,myoutbrute);
265: } else {
266: str = GENtostr(a->body);
267: }
1.1 noro 268: TAIL PRINTF(OUT,"%s",str);
269: free(str);
270: }
271: #endif
272: #endif
273:
274: void PRINTEXPR(vl,p)
275: VL vl;
276: Obj p;
277: {
278: if ( !p ) {
279: PRINTR(vl,(R)p);
280: return;
281: }
282:
283: switch ( OID(p) ) {
284: case O_N:
285: PRINTNUM((Num)p); break;
286: case O_P:
287: PRINTP(vl,(P)p); break;
288: case O_R:
289: PRINTR(vl,(R)p); break;
290: case O_LIST:
291: PRINTLIST(vl,(LIST)p); break;
292: case O_VECT:
293: PRINTVECT(vl,(VECT)p); break;
294: case O_MAT:
295: PRINTMAT(vl,(MAT)p); break;
296: case O_STR:
297: PRINTSTR((STRING)p); break;
298: case O_COMP:
299: PRINTCOMP(vl,(COMP)p); break;
300: case O_DP:
301: PRINTDP(vl,(DP)p); break;
1.2 noro 302: case O_USINT:
303: PRINTUI(vl,(USINT)p); break;
304: case O_GF2MAT:
305: PRINTGF2MAT(vl,(GF2MAT)p); break;
306: case O_ERR:
307: PRINTERR(vl,(ERR)p); break;
308: case O_MATHCAP:
309: PRINTLIST(vl,((MATHCAP)p)->body); break;
310: case O_F:
311: PRINTLF(vl,(F)p); break;
312: case O_GFMMAT:
313: PRINTGFMMAT(vl,(GFMMAT)p); break;
1.5 noro 314: case O_BYTEARRAY:
315: PRINTBYTEARRAY(vl,(BYTEARRAY)p); break;
1.13 noro 316: case O_QUOTE:
317: PRINTQUOTE(vl,(QUOTE)p); break;
1.26 noro 318: case O_SYMBOL:
1.27 noro 319: PRINTSYMBOL((SYMBOL)p); break;
320: case O_RANGE:
321: PRINTRANGE(vl,(RANGE)p); break;
1.29 noro 322: case O_TB:
323: PRINTTB(vl,(TB)p); break;
1.1 noro 324: default:
325: break;
326: }
327: }
328:
329: void PRINTN(n)
330: N n;
331: {
332: register int i,*ptr;
333: N tn;
334:
335: if ( !n ) {
336: PUTS("0");
337: return;
338: }
1.2 noro 339: if ( hex_output ) {
340: ptr = BD(n);
341: TAIL PRINTF(OUT,"0x%x",ptr[PL(n)-1]);
342: if ( hex_output < 0 )
343: for ( i = PL(n) - 2; i >= 0; i-- ) {
344: TAIL PRINTF(OUT,"|%08x",ptr[i]);
345: }
346: else
347: for ( i = PL(n) - 2; i >= 0; i-- ) {
348: TAIL PRINTF(OUT,"%08x",ptr[i]);
349: }
350: } else {
351: ntobn(DBASE,n,&tn);
352: ptr = BD(tn);
353: TAIL PRINTF(OUT,"%d",ptr[PL(tn) - 1]);
354: for ( i = PL(tn) - 2; i >= 0; i-- ) {
355: TAIL PRINTF(OUT,DFORMAT,ptr[i]);
356: }
1.1 noro 357: }
358: }
359:
1.15 noro 360: #if defined(FPRINT)
361: #if defined(ITVDEBUG)
362: void printbin(double z)
363: {
364: int i, j, mask;
365: union {
366: double x;
367: char c[8];
368: } a;
369:
370: a.x = z;
371: for(i=7;i>=0;i--) {
372: mask = 0x80;
373: for(j=0;j<8;j++) {
374: if (a.c[i] & mask) fprintf(stderr,"1");
375: else fprintf(stderr,"0");
376: mask >>= 1;
377: }
378: }
379: fprintf(stderr,"\n");
380: }
381: #endif
382: #endif
383:
384: #if defined(FPRINT)
385: #if 0
386: int printmode = PRINTF_E;
387: #else
388: int printmode = PRINTF_G;
389: #endif
390: #else
391: extern int printmode;
392: #endif
1.9 saito 393:
1.1 noro 394: void PRINTNUM(q)
395: Num q;
396: {
1.10 noro 397: char real_format[20];
398:
1.1 noro 399: if ( !q ) {
400: PUTS("0");
401: return;
402: }
403: switch ( NID(q) ) {
404: case N_Q:
405: if ( SGN((Q)q) == -1 )
406: PUTS("-");
407: PRINTN(NM((Q)q));
408: if ( !INT((Q)q) ) {
409: PUTS("/"); PRINTN(DN((Q)q));
410: }
411: break;
412: case N_R:
1.9 saito 413: switch (printmode) {
414: case PRINTF_E:
415: #if defined(INTERVAL)
416: case MID_PRINTF_E:
417: #endif
1.14 noro 418: TAIL PRINTF(OUT,"%.16e",BDY((Real)q));
1.9 saito 419: break;
420: case PRINTF_G:
421: #if defined(INTERVAL)
422: case MID_PRINTF_G:
423: #endif
424: default:
1.26 noro 425: if ( real_binary ) {
426: unsigned int *m;
427: unsigned int u,l,mask;
428: int i,expo;
429:
430: m = (unsigned int *)&BDY((Real)q);
431: #if defined(__i386__) || defined(MIPSEL) || defined(VISUAL) || defined(__alpha) || defined(__FreeBSD__) || defined(__NetBSD__) || defined(__x86_64)
432: u = m[1]; l = m[0];
433: #else
434: u = m[0]; l = m[1];
435: #endif
436: if (u&0x80000000) {
437: TAIL PRINTF(OUT,"-");
438: }
439: u &= 0x7fffffff;
440: expo = ((int)(u>>20));
441: u &= 0xfffff;
442: if ( expo == 2047 ) {
443: if ( u || l ) {
444: TAIL PRINTF(OUT,"NaN");
445: } else {
446: TAIL PRINTF(OUT,"Inf");
447: }
448: } else if ( expo == 0 ) {
449: if ( u || l ) {
450: TAIL PRINTF(OUT,"0b0.");
451: for ( i = 0, mask = 0x80000; i < 20;
452: i++, mask >>= 1) {
453: TAIL
454: if ( u&mask )
455: PRINTF(OUT,"1");
456: else
457: PRINTF(OUT,"0");
458: }
459: for ( i = 0, mask = 0x80000000; i < 32;
460: i++, mask >>= 1) {
461: TAIL
462: if ( l&mask )
463: PRINTF(OUT,"1");
464: else
465: PRINTF(OUT,"0");
466: }
467: TAIL PRINTF(OUT,"*2^%d",-1022);
468: } else {
469: TAIL PRINTF(OUT,"0");
470: }
471: } else {
472: expo -= 1023;
473: TAIL PRINTF(OUT,"0b1.");
474: for ( i = 0, mask = 0x80000; i < 20;
475: i++, mask >>= 1) {
476: TAIL
477: if ( u&mask )
478: PRINTF(OUT,"1");
479: else
480: PRINTF(OUT,"0");
481: }
482: for ( i = 0, mask = 0x80000000; i < 32;
483: i++, mask >>= 1) {
484: TAIL
485: if ( l&mask )
486: PRINTF(OUT,"1");
487: else
488: PRINTF(OUT,"0");
489: }
490: if ( expo ) {
491: TAIL PRINTF(OUT,"*2^%d",expo);
492: }
493: }
494: } else if ( real_digit ) {
1.14 noro 495: sprintf(real_format,
496: double_output?"%%.%df":"%%.%dg",real_digit);
497: TAIL PRINTF(OUT,real_format,BDY((Real)q));
498: } else {
499: TAIL PRINTF(OUT,double_output?"%f":"%g",BDY((Real)q));
500: }
501: break;
1.9 saito 502: }
1.1 noro 503: break;
504: case N_A:
505: PUTS("("); PRINTR(ALG,(R)BDY((Alg)q)); PUTS(")");
506: break;
1.21 ohara 507: #if defined(PARI)
1.1 noro 508: case N_B:
509: PRINTBF((BF)q); break;
1.9 saito 510: #endif
511: #if defined(INTERVAL)
512: case N_IP:
1.18 kondoh 513: case N_IntervalBigFloat:
1.23 saito 514: switch ( outputstyle ) {
515: case 1:
516: PUTS("intval(");
517: PRINTNUM(INF((Itv)q));
518: PUTS(",");
519: PRINTNUM(SUP((Itv)q));
520: PUTS(")");
521: break;
1.24 saito 522: case 0:
1.23 saito 523: default:
524: PUTS("[");
525: PRINTNUM(INF((Itv)q));
526: PUTS(",");
527: PRINTNUM(SUP((Itv)q));
528: PUTS("]");
529: break;
1.22 saito 530: }
1.9 saito 531: break;
1.18 kondoh 532: case N_IntervalDouble:
1.9 saito 533: switch (printmode) {
534: case PRINTF_E:
1.23 saito 535: switch ( outputstyle ) {
536: case 1:
537: TAIL PRINTF(OUT, "intval(%.16e,%.16e)",
538: INF((IntervalDouble)q),SUP((IntervalDouble)q));
539: break;
1.24 saito 540: case 0:
1.23 saito 541: default:
542: TAIL PRINTF(OUT, "[%.16e,%.16e]",
543: INF((IntervalDouble)q),SUP((IntervalDouble)q));
544: break;
1.22 saito 545: }
1.9 saito 546: #if defined(ITVDEBUG)
1.18 kondoh 547: printbin(INF((IntervalDouble)q));
548: printbin(SUP((IntervalDouble)q));
1.9 saito 549: #endif
550: break;
551: case MID_PRINTF_G:
1.23 saito 552: switch ( outputstyle ) {
553: case 1:
554: TAIL PRINTF(OUT, "intvalm(%g,%g)",
555: (SUP((IntervalDouble)q)+INF((IntervalDouble)q))*0.5,
556: (SUP((IntervalDouble)q)-INF((IntervalDouble)q))*0.5);
557: break;
1.24 saito 558: case 0:
1.23 saito 559: default:
560: TAIL PRINTF(OUT, "<%g,%g>",
561: (SUP((IntervalDouble)q)+INF((IntervalDouble)q))*0.5,
562: (SUP((IntervalDouble)q)-INF((IntervalDouble)q))*0.5);
563: break;
1.22 saito 564: }
1.9 saito 565: break;
566: case MID_PRINTF_E:
1.23 saito 567: switch ( outputstyle ) {
568: case 1:
569: TAIL PRINTF(OUT, "intvalm(%.16e,%.16e)",
570: (SUP((IntervalDouble)q)+INF((IntervalDouble)q))*0.5,
571: (SUP((IntervalDouble)q)-INF((IntervalDouble)q))*0.5);
572: break;
1.24 saito 573: case 0:
1.23 saito 574: default:
575: TAIL PRINTF(OUT, "<%.16e,%.16e>",
576: (SUP((IntervalDouble)q)+INF((IntervalDouble)q))*0.5,
577: (SUP((IntervalDouble)q)-INF((IntervalDouble)q))*0.5);
578: break;
1.22 saito 579: }
1.9 saito 580: break;
581: case PRINTF_G:
582: default:
1.23 saito 583: switch ( outputstyle ) {
584: case 1:
585: TAIL PRINTF(OUT, "intval(%g,%g)",
586: INF((IntervalDouble)q),SUP((IntervalDouble)q));
587: break;
1.24 saito 588: case 0:
1.23 saito 589: default:
590: TAIL PRINTF(OUT, "[%g,%g]",
591: INF((IntervalDouble)q),SUP((IntervalDouble)q));
592: break;
1.22 saito 593: }
1.9 saito 594: break;
595: }
596: break;
1.1 noro 597: #endif
598: case N_C:
599: PRINTCPLX((C)q); break;
600: case N_M:
1.2 noro 601: TAIL PRINTF(OUT,"%d",CONT((MQ)q)); break;
602: case N_LM:
603: PRINTN(((LM)q)->body); break;
604: case N_GF2N:
605: if ( hex_output )
606: PRINTN((N)(((GF2N)q)->body));
607: else
608: PRINTUP2(((GF2N)q)->body);
609: break;
610: case N_GFPN:
611: PRINTUP((UP)(((GFPN)q)->body));
1.1 noro 612: break;
1.11 noro 613: case N_GFS:
1.14 noro 614: TAIL PRINTF(OUT,"@_%d",CONT((GFS)q));
615: break;
1.16 noro 616: case N_GFSN:
617: PRINTUM(BDY((GFSN)q));
618: break;
1.1 noro 619: }
620: }
621:
622: void PRINTCPLX(a)
623: C a;
624: {
625: PUTS("(");
626: if ( a->r )
627: PRINTNUM(a->r);
628: if ( a->i ) {
1.14 noro 629: #if defined(INTERVAL)
630: if ( a->r && ((compnum(0,a->i,0) > 0)
1.18 kondoh 631: || NID(a->i) == N_IP || NID(a->i) == N_IntervalDouble
632: || NID(a->i) == N_IntervalQuad || NID(a->i) == N_IntervalBigFloat) )
1.14 noro 633: #else
1.1 noro 634: if ( a->r && (compnum(0,a->i,0) > 0) )
1.14 noro 635: #endif
1.1 noro 636: PUTS("+");
637: PRINTNUM(a->i); PUTS("*@i");
638: }
639: PUTS(")");
640: }
641:
642: void PRINTP(vl,p)
643: VL vl;
644: P p;
645: {
646: V v;
647: DCP dc;
648:
649: if ( !p )
650: PUTS("0");
651: else if ( NUM(p) )
652: PRINTNUM((Num)p);
653: else
654: for ( dc = DC(p), v = VR(p); dc; dc = NEXT(dc) ) {
655: if ( !DEG(dc) )
656: PRINTP(vl,COEF(dc));
657: else {
658: if ( NUM(COEF(dc)) && UNIQ((Q)COEF(dc)) ) {
659: ;
660: } else if ( NUM(COEF(dc)) && MUNIQ((Q)COEF(dc)) )
661: PUTS("-");
662: else if ( NUM(COEF(dc)) || !NEXT(DC(COEF(dc)))) {
663: PRINTP(vl,COEF(dc)); PUTS("*");
664: } else {
665: PUTS("("); PRINTP(vl,COEF(dc)); PUTS(")*");
666: }
667: PRINTV(vl,v);
668: if ( cmpq(DEG(dc),ONE) ) {
1.2 noro 669: PRINTHAT;
1.1 noro 670: if ( INT(DEG(dc)) && SGN(DEG(dc))>0 )
671: PRINTNUM((Num)DEG(dc));
672: else {
673: PUTS("("); PRINTNUM((Num)DEG(dc)); PUTS(")");
674: }
675: }
676: }
677: if ( NEXT(dc) ) {
678: P t;
679:
680: t = COEF(NEXT(dc));
681: if (!DEG(NEXT(dc))) {
682: if ( NUM(t) ) {
683: if ( !mmono(t) )
684: PUTS("+");
685: } else {
686: if (!mmono(COEF(DC(t))))
687: PUTS("+");
688: }
689: } else {
690: if ( !mmono(t) )
691: PUTS("+");
692: }
693: }
694: }
695: }
696:
1.2 noro 697: int hideargs;
698:
1.1 noro 699: void PRINTV(vl,v)
700: VL vl;
701: V v;
702: {
703: PF pf;
704: PFAD ad;
705: int i;
706:
707: if ( NAME(v) )
708: PUTS(NAME(v));
709: else if ( (vid)v->attr == V_PF ) {
710: pf = ((PFINS)v->priv)->pf; ad = ((PFINS)v->priv)->ad;
711: if ( !strcmp(NAME(pf),"pow") ) {
1.19 noro 712: PUTS("(("); PRINTR(vl,(R)ad[0].arg); PUTS(")"); PRINTHAT; PUTS("(");
713: PRINTR(vl,(R)ad[1].arg); PUTS("))");
1.1 noro 714: } else if ( !pf->argc ) {
715: TAIL PRINTF(OUT,"%s",NAME(pf));
716: } else {
1.2 noro 717: if ( hideargs ) {
718: for ( i = 0; i < pf->argc; i++ )
719: if ( ad[i].d )
720: break;
721: if ( i < pf->argc ) {
722: TAIL PRINTF(OUT,"%s{%d",NAME(pf),ad[0].d);
723: for ( i = 1; i < pf->argc; i++ ) {
724: TAIL PRINTF(OUT,",%d",ad[i].d);
725: }
726: PUTS("}");
727: } else {
728: TAIL PRINTF(OUT,"%s",NAME(pf));
729: }
730: } else {
731: for ( i = 0; i < pf->argc; i++ )
732: if ( ad[i].d )
733: break;
734: if ( i < pf->argc ) {
735: TAIL PRINTF(OUT,"%s{%d",NAME(pf),ad[0].d);
736: for ( i = 1; i < pf->argc; i++ ) {
737: TAIL PRINTF(OUT,",%d",ad[i].d);
738: }
739: PUTS("}(");
740: } else {
741: TAIL PRINTF(OUT,"%s(",NAME(pf));
742: }
743: PRINTR(vl,(R)ad[0].arg);
1.1 noro 744: for ( i = 1; i < pf->argc; i++ ) {
1.2 noro 745: PUTS(","); PRINTR(vl,(R)ad[i].arg);
1.1 noro 746: }
1.2 noro 747: PUTS(")");
1.1 noro 748: }
749: }
750: }
751: }
752:
753: void PRINTR(vl,a)
754: VL vl;
755: R a;
756: {
757: if ( !a )
758: PUTS("0");
759: else
760: switch (OID(a)) {
761: case O_N: case O_P:
762: PRINTP(vl,(P)a); break;
763: default:
764: PUTS("("); PRINTP(vl,NM((R)a)); PUTS(")/("); PRINTP(vl,DN((R)a)); PUTS(")");
765: break;
766: }
767: }
768:
769: void PRINTVECT(vl,vect)
770: VL vl;
771: VECT vect;
772: {
773: int i;
774: pointer *ptr;
775:
1.23 saito 776: switch ( outputstyle ) {
777: case 1:
778: PUTS("vect(");
779: for ( i = 0, ptr = BDY(vect); i < vect->len; i++ ) {
1.24 saito 780: if ( i != 0 ) PUTS(",");
1.23 saito 781: PRINTEXPR(vl,ptr[i]);
782: }
783: PUTS(")");
784: break;
1.24 saito 785: case 0:
1.23 saito 786: default:
787: PUTS("[ ");
788: for ( i = 0, ptr = BDY(vect); i < vect->len; i++ ) {
789: PRINTEXPR(vl,ptr[i]); PUTS(" ");
790: }
791: PUTS("]");
792: break;
1.1 noro 793: }
794: }
795:
796: void PRINTMAT(vl,mat)
797: VL vl;
798: MAT mat;
799: {
800: int i,j,r,c;
801: pointer *ptr;
802:
1.23 saito 803: switch ( outputstyle ) {
804: case 1:
805: PUTS("mat(\n");
806: for ( i = 0, r = mat->row, c = mat->col; i < r; i++ ) {
807: if ( i != 0 ) PUTS(",\n");
808: PUTS("[ ");
809: for ( j = 0, ptr = BDY(mat)[i]; j < c; j++ ) {
1.24 saito 810: if ( j != 0 ) PUTS(",");
1.23 saito 811: PRINTEXPR(vl,ptr[j]);
812: }
1.24 saito 813: PUTS(" ]");
1.22 saito 814: }
1.23 saito 815: PUTS(")");
816: break;
1.24 saito 817: case 0:
1.23 saito 818: default:
819: for ( i = 0, r = mat->row, c = mat->col; i < r; i++ ) {
820: PUTS("[ ");
821: for ( j = 0, ptr = BDY(mat)[i]; j < c; j++ ) {
822: PRINTEXPR(vl,ptr[j]); PUTS(" ");
823: }
824: PUTS("]");
825: if ( i < r - 1 )
826: PUTS("\n");
1.22 saito 827: }
1.23 saito 828: break;
1.1 noro 829: }
830: }
831:
832: void PRINTLIST(vl,list)
833: VL vl;
834: LIST list;
835: {
836: NODE tnode;
837:
838: PUTS("[");
839: for ( tnode = (NODE)list->body; tnode; tnode = NEXT(tnode) ) {
840: PRINTEXPR(vl,tnode->body);
841: if ( NEXT(tnode) )
842: PUTS(",");
843: }
844: PUTS("]");
845: }
846:
847: void PRINTSTR(str)
848: STRING str;
849: {
850: char *p;
851:
852: for ( p = BDY(str); *p; p++ )
853: if ( *p == '"' )
854: PUTS("\"");
855: else {
856: TAIL PRINTF(OUT,"%c",*p);
857: }
858: }
859:
860: void PRINTCOMP(vl,c)
861: VL vl;
862: COMP c;
863: {
864: int n,i;
865:
866: n = getcompsize((int)c->type);
867: PUTS("{");
868: for ( i = 0; i < n; i++ ) {
869: PRINTEXPR(vl,(pointer)c->member[i]);
870: if ( i < n-1 )
871: PUTS(",");
872: }
873: PUTS("}");
874: }
875:
876: void PRINTDP(vl,d)
877: VL vl;
878: DP d;
879: {
880: int n,i;
881: MP m;
882: DL dl;
883:
884: for ( n = d->nv, m = BDY(d); m; m = NEXT(m) ) {
885: PUTS("("); PRINTEXPR(vl,(pointer)m->c); PUTS(")*<<");
886: for ( i = 0, dl = m->dl; i < n-1; i++ ) {
887: TAIL PRINTF(OUT,"%d,",dl->d[i]);
888: }
889: TAIL PRINTF(OUT,"%d",dl->d[i]);
890: PUTS(">>");
891: if ( NEXT(m) )
892: PUTS("+");
1.2 noro 893: }
894: }
895:
896: void PRINTUI(vl,u)
897: VL vl;
898: USINT u;
899: {
900: TAIL PRINTF(OUT,"%u",BDY(u));
901: }
902:
903: void PRINTGF2MAT(vl,mat)
904: VL vl;
905: GF2MAT mat;
906: {
907: int row,col,w,i,j,k,m;
908: unsigned int t;
909: unsigned int **b;
910:
911: row = mat->row;
912: col = mat->col;
913: w = (col+BSH-1)/BSH;
914: b = mat->body;
915: for ( i = 0; i < row; i++ ) {
916: for ( j = 0, m = 0; j < w; j++ ) {
917: t = b[i][j];
918: for ( k = 0; m < col && k < BSH; k++, m++ )
919: if ( t & (1<<k) )
920: PUTS("1");
921: else
922: PUTS("0");
923: }
924: PUTS("\n");
925: }
926: }
927:
928: void PRINTGFMMAT(vl,mat)
929: VL vl;
930: GFMMAT mat;
931: {
932: int row,col,i,j;
933: unsigned int **b;
934:
935: row = mat->row;
936: col = mat->col;
937: b = mat->body;
938: for ( i = 0; i < row; i++ ) {
939: PUTS("[");
940: for ( j = 0; j < col; j++ ) {
941: TAIL PRINTF(OUT,"%8d",b[i][j]);
942: }
943: PUTS("]\n");
944: }
1.5 noro 945: }
946:
947: void PRINTBYTEARRAY(vl,array)
948: VL vl;
949: BYTEARRAY array;
950: {
951: int len,i;
952: unsigned char *b;
953:
954: len = array->len;
1.8 noro 955: b = array->body;
1.5 noro 956: PUTS("|");
957: for ( i = 0; i < len-1; i++ ) {
1.8 noro 958: TAIL PRINTF(OUT,"%02x ",(unsigned int)b[i]);
1.5 noro 959: }
1.8 noro 960: TAIL PRINTF(OUT,"%02x",(unsigned int)b[i]);
1.5 noro 961: PUTS("|");
1.13 noro 962: }
963:
964: void PRINTQUOTE(vl,quote)
965: VL vl;
966: QUOTE quote;
967: {
1.15 noro 968: LIST list;
969:
1.30 ! noro 970: if ( print_quote == 1 ) {
1.15 noro 971: fnodetotree(BDY(quote),&list);
972: PRINTEXPR(vl,(Obj)list);
1.30 ! noro 973: } else if ( print_quote == 2 ) {
! 974: PRINTFNODE(BDY(quote),0);
1.15 noro 975: } else {
976: PUTS("<...quoted...>");
977: }
1.2 noro 978: }
979:
980: void PRINTERR(vl,e)
981: VL vl;
982: ERR e;
983: {
984: PUTS("error("); PRINTEXPR(vl,e->body); PUTS(")");
985: }
986:
987: void PRINTUP2(p)
988: UP2 p;
989: {
990: int d,i;
991:
992: if ( !p ) {
993: TAIL PRINTF(OUT,"0");
994: } else {
995: d = degup2(p);
996: TAIL PRINTF(OUT,"(");
997: if ( !d ) {
998: TAIL PRINTF(OUT,"1");
999: } else if ( d == 1 ) {
1000: TAIL PRINTF(OUT,"@");
1001: } else {
1002: PUTS("@"); PRINTHAT; TAIL PRINTF(OUT,"%d",d);
1003: }
1004: for ( i = d-1; i >= 0; i-- ) {
1005: if ( p->b[i/BSH] & (1<<(i%BSH)) )
1006: if ( !i ) {
1007: TAIL PRINTF(OUT,"+1");
1008: } else if ( i == 1 ) {
1009: TAIL PRINTF(OUT,"+@");
1010: } else {
1011: PUTS("+@"); PRINTHAT; TAIL PRINTF(OUT,"%d",i);
1012: }
1013: }
1014: TAIL PRINTF(OUT,")");
1015: }
1016: }
1017:
1018: void PRINTLF(vl,f)
1019: VL vl;
1020: F f;
1021: {
1022: switch ( FOP(f) ) {
1023: case AL_TRUE:
1024: TAIL PRINTF(OUT,"@true");
1025: break;
1026: case AL_FALSE:
1027: TAIL PRINTF(OUT,"@false");
1028: break;
1029:
1030: case AL_OR: case AL_AND:
1031: PRINTFOP(vl,f); break;
1032: case AL_NOT: case AL_IMPL: case AL_REPL: case AL_EQUIV:
1033: PRINTEOP(vl,f); break;
1034:
1035: case AL_EQUAL: case AL_NEQ: case AL_LESSP:
1036: case AL_GREATERP: case AL_LEQ: case AL_GEQ:
1037: PRINTLOP(vl,f); break;
1038:
1039: case AL_EX: case AL_ALL:
1040: PRINTQOP(vl,f); break;
1041: default:
1042: break;
1043: }
1044: }
1045:
1.17 noro 1046: void PRINTFOP(vl,f)
1.2 noro 1047: VL vl;
1048: F f;
1049: {
1050: char *op;
1051: NODE n;
1052:
1053: op = FOP(f)==AL_OR?" @|| ":" @&& ";
1054: n = FJARG(f);
1055: PUTS("("); PRINTEXPR(vl,BDY(n)); PUTS(")");
1056: for ( n = NEXT(n); n; n = NEXT(n) ) {
1057: PUTS(op); PUTS("("); PRINTEXPR(vl,BDY(n)); PUTS(")");
1058: }
1059: }
1060:
1.17 noro 1061: void PRINTEOP(vl,f)
1.2 noro 1062: VL vl;
1063: F f;
1064: {
1065: oFOP op;
1066: char *sop;
1067:
1068: if ( (op = FOP(f)) == AL_NOT ) {
1069: PUTS("(@! "); PRINTEXPR(vl,(Obj)FARG(f)); PUTS(")"); return;
1070: }
1071: switch ( op ) {
1072: case AL_IMPL:
1073: sop = " @impl "; break;
1074: case AL_REPL:
1075: sop = " @repl "; break;
1076: case AL_EQUIV:
1077: sop = " @equiv "; break;
1078: default:
1079: break;
1080: }
1081: PUTS("(");
1082: PRINTEXPR(vl,(Obj)FLHS(f));
1083: PUTS(sop);
1084: PRINTEXPR(vl,(Obj)FRHS(f));
1085: PUTS(")");
1086: }
1087:
1.17 noro 1088: void PRINTLOP(vl,f)
1.2 noro 1089: VL vl;
1090: F f;
1091: {
1092: char *op;
1093:
1094: switch ( FOP(f) ) {
1095: case AL_EQUAL:
1096: op = " @== "; break;
1097: case AL_NEQ:
1098: op = " @!= "; break;
1099: case AL_LESSP:
1100: op = " @< "; break;
1101: case AL_GREATERP:
1102: op = " @> "; break;
1103: case AL_LEQ:
1104: op = " @<= "; break;
1105: case AL_GEQ:
1106: op = " @>= "; break;
1107: default:
1108: error("PRINTLOP : invalid operator");
1109: break;
1110: }
1111: PRINTEXPR(vl,(Obj)FPL(f)); PUTS(op); PUTS("0");
1112: }
1113:
1.17 noro 1114: void PRINTQOP(vl,f)
1.2 noro 1115: VL vl;
1116: F f;
1117: {
1118: char *op;
1119:
1120: op = FOP(f)==AL_EX?"ex":"all";
1121: TAIL PRINTF(OUT,"%s(%s,",op,NAME(FQVR(f)));
1122: PRINTEXPR(vl,(Obj)FQMAT(f)); PUTS(")");
1123: }
1124:
1.17 noro 1125: void PRINTUP(n)
1.2 noro 1126: UP n;
1127: {
1128: int i,d;
1129:
1130: if ( !n )
1131: PUTS("0");
1132: else if ( !n->d )
1133: PRINTNUM(n->c[0]);
1134: else {
1135: d = n->d;
1136: PUTS("(");
1137: if ( !d ) {
1138: PRINTNUM(n->c[d]);
1139: } else if ( d == 1 ) {
1140: PRINTNUM(n->c[d]);
1141: PUTS("*@p");
1142: } else {
1143: PRINTNUM(n->c[d]);
1144: PUTS("*@p"); PRINTHAT; TAIL PRINTF(OUT,"%d",d);
1145: }
1146: for ( i = d-1; i >= 0; i-- ) {
1147: if ( n->c[i] ) {
1148: PUTS("+("); PRINTNUM(n->c[i]); PUTS(")");
1149: if ( i >= 2 ) {
1150: PUTS("*@p"); PRINTHAT; TAIL PRINTF(OUT,"%d",i);
1151: } else if ( i == 1 )
1152: PUTS("*@p");
1153: }
1154: }
1155: PUTS(")");
1.16 noro 1156: }
1157: }
1158:
1.17 noro 1159: void PRINTUM(n)
1.16 noro 1160: UM n;
1161: {
1162: int i,d;
1163:
1164: if ( !n )
1165: PUTS("0");
1166: else if ( !n->d )
1167: PRINTSF(n->c[0]);
1168: else {
1169: d = n->d;
1170: PUTS("(");
1171: if ( !d ) {
1172: PRINTSF(n->c[d]);
1173: } else if ( d == 1 ) {
1174: PRINTSF(n->c[d]);
1175: PUTS("*@s");
1176: } else {
1177: PRINTSF(n->c[d]);
1178: PUTS("*@s"); PRINTHAT; TAIL PRINTF(OUT,"%d",d);
1179: }
1180: for ( i = d-1; i >= 0; i-- ) {
1181: if ( n->c[i] ) {
1182: PUTS("+("); PRINTSF(n->c[i]); PUTS(")");
1183: if ( i >= 2 ) {
1184: PUTS("*@s"); PRINTHAT; TAIL PRINTF(OUT,"%d",i);
1185: } else if ( i == 1 )
1186: PUTS("*@s");
1187: }
1188: }
1189: PUTS(")");
1190: }
1191: }
1192:
1.17 noro 1193: void PRINTSF(i)
1.16 noro 1194: unsigned int i;
1195: {
1196: if ( !i ) {
1197: PUTS("0");
1198: } else {
1199: TAIL PRINTF(OUT,"@_%d",IFTOF(i));
1.1 noro 1200: }
1.26 noro 1201: }
1202:
1.27 noro 1203: void PRINTSYMBOL(SYMBOL sym)
1.26 noro 1204: {
1.27 noro 1205: PUTS(sym->name);
1206: }
1207:
1208: void PRINTRANGE(VL vl,RANGE p)
1209: {
1210: PUTS("range(");
1211: PRINTEXPR(vl,p->start);
1212: PUTS(",");
1213: PRINTEXPR(vl,p->end);
1214: PUTS(")");
1.29 noro 1215: }
1216:
1217: void PRINTTB(VL vl,TB p)
1218: {
1219: int i;
1220:
1221: for ( i = 0; i < p->next; i++ ) {
1222: PUTS(p->body[i]);
1223: }
1.30 ! noro 1224: }
! 1225:
! 1226: void PRINTFNODENODE(NODE n)
! 1227: {
! 1228: for ( ; n; n = NEXT(n) ) {
! 1229: PRINTFNODE((FNODE)BDY(n),0);
! 1230: if ( NEXT(n) ) PUTS(",");
! 1231: }
! 1232: }
! 1233:
! 1234: void PRINTFARGS(FNODE f)
! 1235: {
! 1236: NODE n;
! 1237:
! 1238: if ( f->id == I_LIST ) {
! 1239: n = (NODE)FA0(f);
! 1240: PRINTFNODENODE(n);
! 1241: } else
! 1242: PRINTFNODE(f,0);
! 1243: }
! 1244:
! 1245: void PRINTFNODE(FNODE f,int paren)
! 1246: {
! 1247: NODE n,t,t0;
! 1248: char vname[BUFSIZ],prefix[BUFSIZ];
! 1249: char *opname,*vname_conv,*prefix_conv;
! 1250: Obj obj;
! 1251: int i,len,allzero,elen,elen2;
! 1252: C cplx;
! 1253: char *r;
! 1254: FNODE fi,f2;
! 1255:
! 1256: if ( !f ) {
! 1257: PUTS("(0)");
! 1258: return;
! 1259: }
! 1260: if ( paren ) PUTS("(");
! 1261: switch ( f->id ) {
! 1262: /* unary operators */
! 1263: case I_NOT: PRINTFNODE((FNODE)FA0(f),1); break;
! 1264: case I_PAREN: PRINTFNODE((FNODE)FA0(f),0); break;
! 1265: case I_MINUS: PUTS("-"); PRINTFNODE((FNODE)FA0(f),1); break;
! 1266: /* binary operators */
! 1267: /* arg list */
! 1268: /* I_AND, I_OR => FA0(f), FA1(f) */
! 1269: /* otherwise => FA1(f), FA2(f) */
! 1270: case I_BOP:
! 1271: PRINTFNODE((FNODE)FA1(f),1);
! 1272: PUTS(((ARF)FA0(f))->name);
! 1273: PRINTFNODE((FNODE)FA2(f),1);
! 1274: break;
! 1275: case I_COP:
! 1276: switch( (cid)FA0(f) ) {
! 1277: case C_EQ: opname = ("=="); break;
! 1278: case C_NE: opname = ("!="); break;
! 1279: case C_GT: opname = (">"); break;
! 1280: case C_LT: opname = ("<"); break;
! 1281: case C_GE: opname = (">="); break;
! 1282: case C_LE: opname = ("<="); break;
! 1283: }
! 1284: PRINTFNODE((FNODE)FA1(f),1);
! 1285: PUTS(opname);
! 1286: PRINTFNODE((FNODE)FA2(f),1);
! 1287: break;
! 1288: case I_LOP:
! 1289: switch( (lid)FA0(f) ) {
! 1290: case L_EQ: opname = ("@=="); break;
! 1291: case L_NE: opname = ("@!="); break;
! 1292: case L_GT: opname = ("@>"); break;
! 1293: case L_LT: opname = ("@<"); break;
! 1294: case L_GE: opname = ("@>="); break;
! 1295: case L_LE: opname = ("@<="); break;
! 1296: case L_AND: opname = ("@&&"); break;
! 1297: case L_OR: opname = ("@||"); break;
! 1298: case L_NOT: opname = ("@!"); break;
! 1299: }
! 1300: if ( (lid)FA0(f)==L_NOT ) {
! 1301: PUTS(opname); PRINTFNODE((FNODE)FA1(f),1);
! 1302: } else {
! 1303: PRINTFNODE((FNODE)FA1(f),1);
! 1304: PUTS(opname);
! 1305: PRINTFNODE((FNODE)FA2(f),1);
! 1306: }
! 1307: break;
! 1308: case I_AND:
! 1309: PRINTFNODE((FNODE)FA0(f),1);
! 1310: PUTS("&&");
! 1311: PRINTFNODE((FNODE)FA1(f),1);
! 1312: break;
! 1313: case I_OR:
! 1314: PRINTFNODE((FNODE)FA0(f),1);
! 1315: PUTS("!!");
! 1316: PRINTFNODE((FNODE)FA1(f),1);
! 1317: break;
! 1318: /* ternary operators */
! 1319: case I_CE:
! 1320: PRINTFNODE((FNODE)FA0(f),1); PUTS("?"); PRINTFNODE((FNODE)FA1(f),1);
! 1321: PUTS(":"); PRINTFNODE((FNODE)FA2(f),1);
! 1322: break;
! 1323: /* lists */
! 1324: case I_LIST: PUTS("["); PRINTFNODENODE((NODE)FA0(f)); PUTS("]"); break;
! 1325: /* function */
! 1326: case I_FUNC:
! 1327: if ( !strcmp(((FUNC)FA0(f))->name,"@pi") ) PUTS("@pi");
! 1328: else if ( !strcmp(((FUNC)FA0(f))->name,"@e") ) PUTS("@e");
! 1329: else {
! 1330: PUTS(((FUNC)FA0(f))->name);
! 1331: PUTS("("); PRINTFARGS(FA1(f)); PUTS(")");
! 1332: }
! 1333: break;
! 1334: /* XXX */
! 1335: case I_CAR: PUTS("car("); PRINTFNODE(FA0(f),0); PUTS(")"); break;
! 1336: case I_CDR: PUTS("cdr("); PRINTFNODE(FA0(f),0); PUTS(")"); break;
! 1337: /* exponent vector */
! 1338: case I_EV: PUTS("<<"); PRINTFNODENODE((NODE)FA0(f)); PUTS(">>"); break;
! 1339: /* string */
! 1340: case I_STR: PUTS((char *)FA0(f)); break;
! 1341: /* internal object */
! 1342: case I_FORMULA: obj = (Obj)FA0(f); PRINTEXPR(CO,obj); break;
! 1343: /* program variable */
! 1344: case I_PVAR:
! 1345: if ( FA1(f) )
! 1346: error("printfnode : not implemented yet");
! 1347: GETPVNAME(FA0(f),opname);
! 1348: PUTS(opname);
! 1349: break;
! 1350: default: error("printfnode : not implemented yet");
! 1351: }
! 1352: if ( paren ) PUTS(")");
1.1 noro 1353: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>