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