Annotation of OpenXM_contrib2/asir2000/io/pexpr.c, Revision 1.14
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.14 ! noro 47: * $OpenXM: OpenXM_contrib2/asir2000/io/pexpr.c,v 1.13 2001/04/20 02:34:23 noro Exp $
1.3 noro 48: */
1.1 noro 49: #include "ca.h"
50: #include "al.h"
51: #include "parse.h"
52: #include "comp.h"
53: #include "base.h"
54:
55: #ifndef FPRINT
56: #define FPRINT
57: #endif
58:
1.2 noro 59: #define PRINTHAT (fortran_output?PUTS("**"):PUTS("^"))
1.1 noro 60:
61: #ifdef FPRINT
62: FILE *asir_out;
63: #define OUT asir_out
64: char DFORMAT[BUFSIZ];
1.2 noro 65: int hex_output;
66: int fortran_output;
1.6 noro 67: int double_output;
1.10 noro 68: int real_digit;
1.14 ! noro 69: int print_quote;
1.1 noro 70:
71: #define TAIL
72: #define PUTS(s) fputs(s,OUT)
73: #define PRINTF fprintf
74: #define PRINTN printn
75: #define PRINTBF printbf
76: #define PRINTCPLX printcplx
77: #define PRINTLM printlm
78: #define PRINTUP2 printup2
79: #define PRINTV printv
80: #define PRINTEXPR printexpr
81: #define PRINTNUM printnum
82: #define PRINTP printp
83: #define PRINTR printr
84: #define PRINTLIST printlist
85: #define PRINTVECT printvect
86: #define PRINTMAT printmat
87: #define PRINTSTR printstr
88: #define PRINTCOMP printcomp
89: #define PRINTDP printdp
90: #define PRINTUI printui
91: #define PRINTGF2MAT printgf2mat
92: #define PRINTGFMMAT printgfmmat
1.5 noro 93: #define PRINTBYTEARRAY printbytearray
1.13 noro 94: #define PRINTQUOTE printquote
1.1 noro 95: #define PRINTERR printerr
96: #define PRINTLF printlf
97: #define PRINTLOP printlop
98: #define PRINTFOP printfop
99: #define PRINTEOP printeop
100: #define PRINTQOP printqop
101: #define PRINTUP printup
102: #endif
103:
104: #ifdef SPRINT
105: static char *buf;
106: #define OUT buf
107: extern char DFORMAT[BUFSIZ];
1.2 noro 108: extern int hex_output;
109: extern int fortran_output;
1.14 ! noro 110: extern int double_output;
! 111: extern int real_digit;
! 112: extern int print_quote;
1.1 noro 113:
114: #define TAIL while ( *OUT ) OUT++;
115: #define PUTS(s) strcat(OUT,s)
116: #define PRINTF sprintf
117: #define PRINTN sprintn
118: #define PRINTBF sprintbf
119: #define PRINTCPLX sprintcplx
120: #define PRINTLM sprintlm
121: #define PRINTUP2 sprintup2
122: #define PRINTV sprintv
123: #define PRINTEXPR sprintexpr
124: #define PRINTNUM sprintnum
125: #define PRINTP sprintp
126: #define PRINTR sprintr
127: #define PRINTLIST sprintlist
128: #define PRINTVECT sprintvect
129: #define PRINTMAT sprintmat
130: #define PRINTSTR sprintstr
131: #define PRINTCOMP sprintcomp
132: #define PRINTDP sprintdp
133: #define PRINTUI sprintui
134: #define PRINTGF2MAT sprintgf2mat
135: #define PRINTGFMMAT sprintgfmmat
1.5 noro 136: #define PRINTBYTEARRAY sprintbytearray
1.13 noro 137: #define PRINTQUOTE sprintquote
1.1 noro 138: #define PRINTERR sprinterr
139: #define PRINTLF sprintlf
140: #define PRINTLOP sprintlop
141: #define PRINTFOP sprintfop
142: #define PRINTEOP sprinteop
143: #define PRINTQOP sprintqop
1.2 noro 144: #define PRINTUP sprintup
1.1 noro 145: #endif
146:
147: void PRINTEXPR();
148: void PRINTNUM();
149: void PRINTN();
150: void PRINTV();
151: void PRINTP();
152: void PRINTR();
153: void PRINTLIST();
154: void PRINTVECT();
155: void PRINTMAT();
156: void PRINTSTR();
157: void PRINTCOMP();
158: void PRINTDP();
159: void PRINTUI();
160: void PRINTGF2MAT();
161: void PRINTGFMMAT();
1.5 noro 162: void PRINTBYTEARRAY();
1.13 noro 163: void PRINTQUOTE();
1.1 noro 164: void PRINTERR();
165: void PRINTCPLX();
166: void PRINTLM();
167: void PRINTLF();
1.2 noro 168: void PRINTUP2();
1.1 noro 169:
170: #ifdef FPRINT
171: void output_init() {
172: OUT = stdout;
173: sprintf(DFORMAT,"%%0%dd",DLENGTH);
174: }
175:
176: int mmono(p)
177: P p;
178: {
179: if ( NUM(p) )
1.9 saito 180: #if defined(INTERVAL)
181: if ( NID(p) != N_IP && NID(p) != N_ID && NID(p) != N_IT && NID(p) != N_IF
182: && compnum(CO,(Num)p,0) < 0 )
183: #else
1.1 noro 184: if ( compnum(CO,(Num)p,0) < 0 )
1.9 saito 185: #endif
1.1 noro 186: return ( 1 );
187: else
188: return ( 0 );
189: else if ( NEXT(DC(p)) )
190: return ( 0 );
191: else
192: return (mmono(COEF(DC(p))));
193: }
194:
195: #if PARI
196: void printbf(a)
197: BF a;
198: {
1.8 noro 199: sor(a->body,double_output ? 'f' : 'g',-1,0);
1.1 noro 200: }
201: #endif
202: #endif
203:
204: #ifdef SPRINT
205: void soutput_init(s)
206: char *s;
207: {
208: s[0] = 0; buf = s;
209: }
210:
211: #if PARI
1.8 noro 212: #include "genpari.h"
213:
214: void myoutbrute(g)
215: GEN g;
216: {
217: bruteall(g,'f',-1,1);
218: }
219:
1.1 noro 220: void sprintbf(a)
221: BF a;
222: {
1.2 noro 223: char *str;
224: char *GENtostr();
1.8 noro 225: char *GENtostr0();
1.2 noro 226:
1.8 noro 227: if ( double_output ) {
228: str = GENtostr0(a->body,myoutbrute);
229: } else {
230: str = GENtostr(a->body);
231: }
1.2 noro 232: TAIL PRINTF(OUT,"%s",str);
233: free(str);
1.1 noro 234: }
235: #endif
236: #endif
237:
238: void PRINTEXPR(vl,p)
239: VL vl;
240: Obj p;
241: {
242: if ( !p ) {
243: PRINTR(vl,(R)p);
244: return;
245: }
246:
247: switch ( OID(p) ) {
248: case O_N:
249: PRINTNUM((Num)p); break;
250: case O_P:
251: PRINTP(vl,(P)p); break;
252: case O_R:
253: PRINTR(vl,(R)p); break;
254: case O_LIST:
255: PRINTLIST(vl,(LIST)p); break;
256: case O_VECT:
257: PRINTVECT(vl,(VECT)p); break;
258: case O_MAT:
259: PRINTMAT(vl,(MAT)p); break;
260: case O_STR:
261: PRINTSTR((STRING)p); break;
262: case O_COMP:
263: PRINTCOMP(vl,(COMP)p); break;
264: case O_DP:
265: PRINTDP(vl,(DP)p); break;
266: case O_USINT:
267: PRINTUI(vl,(USINT)p); break;
268: case O_GF2MAT:
269: PRINTGF2MAT(vl,(GF2MAT)p); break;
270: case O_ERR:
271: PRINTERR(vl,(ERR)p); break;
272: case O_MATHCAP:
273: PRINTLIST(vl,((MATHCAP)p)->body); break;
274: case O_F:
275: PRINTLF(vl,(F)p); break;
276: case O_GFMMAT:
277: PRINTGFMMAT(vl,(GFMMAT)p); break;
1.5 noro 278: case O_BYTEARRAY:
279: PRINTBYTEARRAY(vl,(BYTEARRAY)p); break;
1.13 noro 280: case O_QUOTE:
281: PRINTQUOTE(vl,(QUOTE)p); break;
1.1 noro 282: default:
283: break;
284: }
285: }
286:
287: void PRINTN(n)
288: N n;
289: {
290: register int i,*ptr;
291: N tn;
292:
293: if ( !n ) {
294: PUTS("0");
295: return;
296: }
297: if ( hex_output ) {
298: ptr = BD(n);
299: TAIL PRINTF(OUT,"0x%x",ptr[PL(n)-1]);
300: if ( hex_output < 0 )
301: for ( i = PL(n) - 2; i >= 0; i-- ) {
302: TAIL PRINTF(OUT,"|%08x",ptr[i]);
303: }
304: else
305: for ( i = PL(n) - 2; i >= 0; i-- ) {
306: TAIL PRINTF(OUT,"%08x",ptr[i]);
307: }
308: } else {
309: ntobn(DBASE,n,&tn);
310: ptr = BD(tn);
311: TAIL PRINTF(OUT,"%d",ptr[PL(tn) - 1]);
312: for ( i = PL(tn) - 2; i >= 0; i-- ) {
313: TAIL PRINTF(OUT,DFORMAT,ptr[i]);
314: }
315: }
316: }
317:
1.9 saito 318: #if defined(ITVDEBUG)
319: void printbin(double z)
320: {
321: int i, j, mask;
322: union {
323: double x;
324: char c[8];
325: } a;
326:
327: a.x = z;
328: for(i=7;i>=0;i--) {
329: mask = 0x80;
330: for(j=0;j<8;j++) {
331: if (a.c[i] & mask) fprintf(stderr,"1");
332: else fprintf(stderr,"0");
333: mask >>= 1;
334: }
335: }
336: fprintf(stderr,"\n");
337: }
338: #endif
339:
340: #if 0
341: int printmode = PRINTF_E;
342: #else
343: int printmode = PRINTF_G;
344: #endif
345:
1.1 noro 346: void PRINTNUM(q)
347: Num q;
348: {
1.10 noro 349: char real_format[20];
350:
1.1 noro 351: if ( !q ) {
352: PUTS("0");
353: return;
354: }
355: switch ( NID(q) ) {
356: case N_Q:
357: if ( SGN((Q)q) == -1 )
358: PUTS("-");
359: PRINTN(NM((Q)q));
360: if ( !INT((Q)q) ) {
361: PUTS("/"); PRINTN(DN((Q)q));
362: }
363: break;
364: case N_R:
1.9 saito 365: switch (printmode) {
366: case PRINTF_E:
367: #if defined(INTERVAL)
368: case MID_PRINTF_E:
369: #endif
370: TAIL PRINTF(OUT,"%.16e",BDY((Real)q));
371: break;
372: case PRINTF_G:
373: #if defined(INTERVAL)
374: case MID_PRINTF_G:
375: #endif
376: default:
1.10 noro 377: if ( real_digit ) {
378: sprintf(real_format,
379: double_output?"%%.%df":"%%.%dg",real_digit);
380: TAIL PRINTF(OUT,real_format,BDY((Real)q));
381: } else {
382: TAIL PRINTF(OUT,double_output?"%f":"%g",BDY((Real)q));
383: }
1.9 saito 384: break;
385: }
1.1 noro 386: break;
387: case N_A:
388: PUTS("("); PRINTR(ALG,(R)BDY((Alg)q)); PUTS(")");
389: break;
390: #if PARI
391: case N_B:
392: PRINTBF((BF)q); break;
393: #endif
1.9 saito 394: #if defined(INTERVAL)
395: case N_IP:
396: case N_IF:
397: PUTS("[");
398: PRINTNUM(INF((Itv)q));
399: PUTS(",");
400: PRINTNUM(SUP((Itv)q));
401: PUTS("]");
402: break;
403: case N_ID:
404: switch (printmode) {
405: case PRINTF_E:
406: TAIL PRINTF(OUT, "[%.16e,%.16e]",INF((ItvD)q),SUP((ItvD)q));
407: #if defined(ITVDEBUG)
408: printbin(INF((ItvD)q));
409: printbin(SUP((ItvD)q));
410: #endif
411: break;
412: case MID_PRINTF_G:
413: TAIL PRINTF(OUT, "<%g,%g>", (SUP((ItvD)q)+INF((ItvD)q))*0.5,(SUP((ItvD)q)-INF((ItvD)q))*0.5);
414: break;
415: case MID_PRINTF_E:
416: TAIL PRINTF(OUT, "<%.16e,%.16e>", (SUP((ItvD)q)+INF((ItvD)q))*0.5,(SUP((ItvD)q)-INF((ItvD)q))*0.5);
417: break;
418: case PRINTF_G:
419: default:
420: TAIL PRINTF(OUT, "[%g,%g]",INF((ItvD)q),SUP((ItvD)q));
421: break;
422: }
423: break;
424: #endif
1.1 noro 425: case N_C:
426: PRINTCPLX((C)q); break;
427: case N_M:
428: TAIL PRINTF(OUT,"%d",CONT((MQ)q)); break;
429: case N_LM:
430: PRINTN(((LM)q)->body); break;
431: case N_GF2N:
432: if ( hex_output )
433: PRINTN((N)(((GF2N)q)->body));
434: else
435: PRINTUP2(((GF2N)q)->body);
436: break;
437: case N_GFPN:
438: PRINTUP((UP)(((GFPN)q)->body));
1.11 noro 439: break;
440: case N_GFS:
1.14 ! noro 441: TAIL PRINTF(OUT,"@_%d",CONT((GFS)q));
1.1 noro 442: break;
443: }
444: }
445:
446: void PRINTCPLX(a)
447: C a;
448: {
449: PUTS("(");
450: if ( a->r )
451: PRINTNUM(a->r);
452: if ( a->i ) {
1.9 saito 453: #if defined(INTERVAL)
454: if ( a->r && ((compnum(0,a->i,0) > 0)
455: || NID(a->i) == N_IP || NID(a->i) == N_ID
456: || NID(a->i) == N_IT || NID(a->i) == N_IF) )
457: #else
1.1 noro 458: if ( a->r && (compnum(0,a->i,0) > 0) )
1.9 saito 459: #endif
1.1 noro 460: PUTS("+");
461: PRINTNUM(a->i); PUTS("*@i");
462: }
463: PUTS(")");
464: }
465:
466: void PRINTP(vl,p)
467: VL vl;
468: P p;
469: {
470: V v;
471: DCP dc;
472:
473: if ( !p )
474: PUTS("0");
475: else if ( NUM(p) )
476: PRINTNUM((Num)p);
477: else
478: for ( dc = DC(p), v = VR(p); dc; dc = NEXT(dc) ) {
479: if ( !DEG(dc) )
480: PRINTP(vl,COEF(dc));
481: else {
482: if ( NUM(COEF(dc)) && UNIQ((Q)COEF(dc)) ) {
483: ;
484: } else if ( NUM(COEF(dc)) && MUNIQ((Q)COEF(dc)) )
485: PUTS("-");
486: else if ( NUM(COEF(dc)) || !NEXT(DC(COEF(dc)))) {
487: PRINTP(vl,COEF(dc)); PUTS("*");
488: } else {
489: PUTS("("); PRINTP(vl,COEF(dc)); PUTS(")*");
490: }
491: PRINTV(vl,v);
492: if ( cmpq(DEG(dc),ONE) ) {
1.2 noro 493: PRINTHAT;
1.1 noro 494: if ( INT(DEG(dc)) && SGN(DEG(dc))>0 )
495: PRINTNUM((Num)DEG(dc));
496: else {
497: PUTS("("); PRINTNUM((Num)DEG(dc)); PUTS(")");
498: }
499: }
500: }
501: if ( NEXT(dc) ) {
502: P t;
503:
504: t = COEF(NEXT(dc));
505: if (!DEG(NEXT(dc))) {
506: if ( NUM(t) ) {
507: if ( !mmono(t) )
508: PUTS("+");
509: } else {
510: if (!mmono(COEF(DC(t))))
511: PUTS("+");
512: }
513: } else {
514: if ( !mmono(t) )
515: PUTS("+");
516: }
517: }
518: }
519: }
520:
521: int hideargs;
522:
523: void PRINTV(vl,v)
524: VL vl;
525: V v;
526: {
527: PF pf;
528: PFAD ad;
529: int i;
530:
531: if ( NAME(v) )
532: PUTS(NAME(v));
533: else if ( (vid)v->attr == V_PF ) {
534: pf = ((PFINS)v->priv)->pf; ad = ((PFINS)v->priv)->ad;
535: if ( !strcmp(NAME(pf),"pow") ) {
1.2 noro 536: PUTS("("); PRINTR(vl,(R)ad[0].arg); PUTS(")"); PRINTHAT; PUTS("(");
1.1 noro 537: PRINTR(vl,(R)ad[1].arg); PUTS(")");
538: } else if ( !pf->argc ) {
539: TAIL PRINTF(OUT,"%s",NAME(pf));
540: } else {
541: if ( hideargs ) {
542: for ( i = 0; i < pf->argc; i++ )
543: if ( ad[i].d )
544: break;
545: if ( i < pf->argc ) {
546: TAIL PRINTF(OUT,"%s{%d",NAME(pf),ad[0].d);
547: for ( i = 1; i < pf->argc; i++ ) {
548: TAIL PRINTF(OUT,",%d",ad[i].d);
549: }
550: PUTS("}");
551: } else {
552: TAIL PRINTF(OUT,"%s",NAME(pf));
553: }
554: } else {
555: for ( i = 0; i < pf->argc; i++ )
556: if ( ad[i].d )
557: break;
558: if ( i < pf->argc ) {
559: TAIL PRINTF(OUT,"%s{%d",NAME(pf),ad[0].d);
560: for ( i = 1; i < pf->argc; i++ ) {
561: TAIL PRINTF(OUT,",%d",ad[i].d);
562: }
563: PUTS("}(");
564: } else {
565: TAIL PRINTF(OUT,"%s(",NAME(pf));
566: }
567: PRINTR(vl,(R)ad[0].arg);
568: for ( i = 1; i < pf->argc; i++ ) {
569: PUTS(","); PRINTR(vl,(R)ad[i].arg);
570: }
571: PUTS(")");
572: }
573: }
574: }
575: }
576:
577: void PRINTR(vl,a)
578: VL vl;
579: R a;
580: {
581: if ( !a )
582: PUTS("0");
583: else
584: switch (OID(a)) {
585: case O_N: case O_P:
586: PRINTP(vl,(P)a); break;
587: default:
588: PUTS("("); PRINTP(vl,NM((R)a)); PUTS(")/("); PRINTP(vl,DN((R)a)); PUTS(")");
589: break;
590: }
591: }
592:
593: void PRINTVECT(vl,vect)
594: VL vl;
595: VECT vect;
596: {
597: int i;
598: pointer *ptr;
599:
600: PUTS("[ ");
601: for ( i = 0, ptr = BDY(vect); i < vect->len; i++ ) {
602: PRINTEXPR(vl,ptr[i]); PUTS(" ");
603: }
604: PUTS("]");
605: }
606:
607: void PRINTMAT(vl,mat)
608: VL vl;
609: MAT mat;
610: {
611: int i,j,r,c;
612: pointer *ptr;
613:
614: for ( i = 0, r = mat->row, c = mat->col; i < r; i++ ) {
615: PUTS("[ ");
616: for ( j = 0, ptr = BDY(mat)[i]; j < c; j++ ) {
617: PRINTEXPR(vl,ptr[j]); PUTS(" ");
618: }
619: PUTS("]");
620: if ( i < r - 1 )
621: PUTS("\n");
622: }
623: }
624:
625: void PRINTLIST(vl,list)
626: VL vl;
627: LIST list;
628: {
629: NODE tnode;
630:
631: PUTS("[");
632: for ( tnode = (NODE)list->body; tnode; tnode = NEXT(tnode) ) {
633: PRINTEXPR(vl,tnode->body);
634: if ( NEXT(tnode) )
635: PUTS(",");
636: }
637: PUTS("]");
638: }
639:
640: void PRINTSTR(str)
641: STRING str;
642: {
643: char *p;
644:
645: for ( p = BDY(str); *p; p++ )
646: if ( *p == '"' )
647: PUTS("\"");
648: else {
649: TAIL PRINTF(OUT,"%c",*p);
650: }
651: }
652:
653: void PRINTCOMP(vl,c)
654: VL vl;
655: COMP c;
656: {
657: int n,i;
658:
659: n = getcompsize((int)c->type);
660: PUTS("{");
661: for ( i = 0; i < n; i++ ) {
662: PRINTEXPR(vl,(pointer)c->member[i]);
663: if ( i < n-1 )
664: PUTS(",");
665: }
666: PUTS("}");
667: }
668:
669: void PRINTDP(vl,d)
670: VL vl;
671: DP d;
672: {
673: int n,i;
674: MP m;
675: DL dl;
676:
677: for ( n = d->nv, m = BDY(d); m; m = NEXT(m) ) {
678: PUTS("("); PRINTEXPR(vl,(pointer)m->c); PUTS(")*<<");
679: for ( i = 0, dl = m->dl; i < n-1; i++ ) {
680: TAIL PRINTF(OUT,"%d,",dl->d[i]);
681: }
682: TAIL PRINTF(OUT,"%d",dl->d[i]);
683: PUTS(">>");
684: if ( NEXT(m) )
685: PUTS("+");
686: }
687: }
688:
689: void PRINTUI(vl,u)
690: VL vl;
691: USINT u;
692: {
693: TAIL PRINTF(OUT,"%u",BDY(u));
694: }
695:
696: void PRINTGF2MAT(vl,mat)
697: VL vl;
698: GF2MAT mat;
699: {
700: int row,col,w,i,j,k,m;
701: unsigned int t;
702: unsigned int **b;
703:
704: row = mat->row;
705: col = mat->col;
706: w = (col+BSH-1)/BSH;
707: b = mat->body;
708: for ( i = 0; i < row; i++ ) {
709: for ( j = 0, m = 0; j < w; j++ ) {
710: t = b[i][j];
711: for ( k = 0; m < col && k < BSH; k++, m++ )
712: if ( t & (1<<k) )
713: PUTS("1");
714: else
715: PUTS("0");
716: }
717: PUTS("\n");
718: }
719: }
720:
721: void PRINTGFMMAT(vl,mat)
722: VL vl;
723: GFMMAT mat;
724: {
725: int row,col,i,j;
726: unsigned int t;
727: unsigned int **b;
728:
729: row = mat->row;
730: col = mat->col;
731: b = mat->body;
732: for ( i = 0; i < row; i++ ) {
733: PUTS("[");
734: for ( j = 0; j < col; j++ ) {
735: TAIL PRINTF(OUT,"%8d",b[i][j]);
736: }
737: PUTS("]\n");
738: }
1.5 noro 739: }
740:
741: void PRINTBYTEARRAY(vl,array)
742: VL vl;
743: BYTEARRAY array;
744: {
745: int len,i;
746: unsigned int t;
747: unsigned char *b;
748:
749: len = array->len;
750: b = array->body;
751: PUTS("|");
752: for ( i = 0; i < len-1; i++ ) {
753: TAIL PRINTF(OUT,"%02x ",(unsigned int)b[i]);
754: }
755: TAIL PRINTF(OUT,"%02x",(unsigned int)b[i]);
756: PUTS("|");
1.13 noro 757: }
758:
759: void PRINTQUOTE(vl,quote)
760: VL vl;
761: QUOTE quote;
762: {
1.14 ! noro 763: LIST list;
! 764:
! 765: if ( print_quote ) {
! 766: fnodetotree(BDY(quote),&list);
! 767: PRINTEXPR(vl,(Obj)list);
! 768: } else {
! 769: PUTS("<...quoted...>");
! 770: }
1.1 noro 771: }
772:
773: void PRINTERR(vl,e)
774: VL vl;
775: ERR e;
776: {
777: PUTS("error("); PRINTEXPR(vl,e->body); PUTS(")");
778: }
779:
780: void PRINTUP2(p)
781: UP2 p;
782: {
783: int d,i;
784:
1.2 noro 785: if ( !p ) {
786: TAIL PRINTF(OUT,"0");
787: } else {
1.1 noro 788: d = degup2(p);
1.2 noro 789: TAIL PRINTF(OUT,"(");
790: if ( !d ) {
791: TAIL PRINTF(OUT,"1");
792: } else if ( d == 1 ) {
793: TAIL PRINTF(OUT,"@");
794: } else {
795: PUTS("@"); PRINTHAT; TAIL PRINTF(OUT,"%d",d);
796: }
1.1 noro 797: for ( i = d-1; i >= 0; i-- ) {
798: if ( p->b[i/BSH] & (1<<(i%BSH)) )
1.2 noro 799: if ( !i ) {
800: TAIL PRINTF(OUT,"+1");
801: } else if ( i == 1 ) {
802: TAIL PRINTF(OUT,"+@");
803: } else {
804: PUTS("+@"); PRINTHAT; TAIL PRINTF(OUT,"%d",i);
805: }
1.1 noro 806: }
1.2 noro 807: TAIL PRINTF(OUT,")");
1.1 noro 808: }
809: }
810:
811: void PRINTLF(vl,f)
812: VL vl;
813: F f;
814: {
815: switch ( FOP(f) ) {
816: case AL_TRUE:
817: TAIL PRINTF(OUT,"@true");
818: break;
819: case AL_FALSE:
820: TAIL PRINTF(OUT,"@false");
821: break;
822:
823: case AL_OR: case AL_AND:
824: PRINTFOP(vl,f); break;
825: case AL_NOT: case AL_IMPL: case AL_REPL: case AL_EQUIV:
826: PRINTEOP(vl,f); break;
827:
828: case AL_EQUAL: case AL_NEQ: case AL_LESSP:
829: case AL_GREATERP: case AL_LEQ: case AL_GEQ:
830: PRINTLOP(vl,f); break;
831:
832: case AL_EX: case AL_ALL:
833: PRINTQOP(vl,f); break;
834: default:
835: break;
836: }
837: }
838:
839: PRINTFOP(vl,f)
840: VL vl;
841: F f;
842: {
843: char *op;
844: NODE n;
845:
846: op = FOP(f)==AL_OR?" @|| ":" @&& ";
847: n = FJARG(f);
848: PUTS("("); PRINTEXPR(vl,BDY(n)); PUTS(")");
849: for ( n = NEXT(n); n; n = NEXT(n) ) {
850: PUTS(op); PUTS("("); PRINTEXPR(vl,BDY(n)); PUTS(")");
851: }
852: }
853:
854: PRINTEOP(vl,f)
855: VL vl;
856: F f;
857: {
858: oFOP op;
859: char *sop;
860:
861: if ( (op = FOP(f)) == AL_NOT ) {
862: PUTS("(@! "); PRINTEXPR(vl,(Obj)FARG(f)); PUTS(")"); return;
863: }
864: switch ( op ) {
865: case AL_IMPL:
866: sop = " @impl "; break;
867: case AL_REPL:
868: sop = " @repl "; break;
869: case AL_EQUIV:
870: sop = " @equiv "; break;
871: default:
872: break;
873: }
874: PUTS("(");
875: PRINTEXPR(vl,(Obj)FLHS(f));
876: PUTS(sop);
877: PRINTEXPR(vl,(Obj)FRHS(f));
878: PUTS(")");
879: }
880:
881: PRINTLOP(vl,f)
882: VL vl;
883: F f;
884: {
885: char *op;
886:
887: switch ( FOP(f) ) {
888: case AL_EQUAL:
889: op = " @== "; break;
890: case AL_NEQ:
891: op = " @!= "; break;
892: case AL_LESSP:
893: op = " @< "; break;
894: case AL_GREATERP:
895: op = " @> "; break;
896: case AL_LEQ:
897: op = " @<= "; break;
898: case AL_GEQ:
899: op = " @>= "; break;
900: default:
901: error("PRINTLOP : invalid operator");
902: break;
903: }
904: PRINTEXPR(vl,(Obj)FPL(f)); PUTS(op); PUTS("0");
905: }
906:
907: PRINTQOP(vl,f)
908: VL vl;
909: F f;
910: {
911: char *op;
912:
913: op = FOP(f)==AL_EX?"ex":"all";
914: TAIL PRINTF(OUT,"%s(%s,",op,NAME(FQVR(f)));
915: PRINTEXPR(vl,(Obj)FQMAT(f)); PUTS(")");
916: }
917:
918: PRINTUP(n)
919: UP n;
920: {
921: int i,d;
922:
923: if ( !n )
924: PUTS("0");
925: else if ( !n->d )
926: PRINTNUM(n->c[0]);
927: else {
928: d = n->d;
929: PUTS("(");
930: if ( !d ) {
931: PRINTNUM(n->c[d]);
932: } else if ( d == 1 ) {
933: PRINTNUM(n->c[d]);
934: PUTS("*@p");
935: } else {
936: PRINTNUM(n->c[d]);
1.2 noro 937: PUTS("*@p"); PRINTHAT; TAIL PRINTF(OUT,"%d",d);
1.1 noro 938: }
939: for ( i = d-1; i >= 0; i-- ) {
940: if ( n->c[i] ) {
941: PUTS("+("); PRINTNUM(n->c[i]); PUTS(")");
942: if ( i >= 2 ) {
1.2 noro 943: PUTS("*@p"); PRINTHAT; TAIL PRINTF(OUT,"%d",i);
1.1 noro 944: } else if ( i == 1 )
945: PUTS("*@p");
946: }
947: }
948: PUTS(")");
949: }
950: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>