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