Annotation of OpenXM_contrib2/asir2000/io/spexpr.c, Revision 1.1.1.1
1.1 noro 1: /* $OpenXM: OpenXM/src/asir99/io/spexpr.c,v 1.1.1.1 1999/11/10 08:12:30 noro Exp $ */
2: #include "ca.h"
3: #include "parse.h"
4: #include "comp.h"
5: #include "base.h"
6:
7: #ifndef SPRINT
8: #define SPRINT
9: #endif
10:
11: #ifdef FPRINT
12: FILE *asir_out;
13: #define OUT asir_out
14: char DFORMAT[BUFSIZ];
15:
16: #define TAIL
17: #define PUTS(s) fputs(s,OUT)
18: #define PRINTF fprintf
19: #define PRINTN printn
20: #define PRINTBF printbf
21: #define PRINTCPLX printcplx
22: #define PRINTV printv
23: #define PRINTEXPR printexpr
24: #define PRINTNUM printnum
25: #define PRINTP printp
26: #define PRINTR printr
27: #define PRINTLIST printlist
28: #define PRINTVECT printvect
29: #define PRINTMAT printmat
30: #define PRINTSTR printstr
31: #define PRINTCOMP printcomp
32: #define PRINTDP printdp
33: #endif
34:
35: #ifdef SPRINT
36: static char *buf;
37: #define OUT buf
38: extern char DFORMAT[BUFSIZ];
39:
40: #define TAIL while ( *OUT ) OUT++;
41: #define PUTS(s) strcat(OUT,s)
42: #define PRINTF sprintf
43: #define PRINTN sprintn
44: #define PRINTBF sprintbf
45: #define PRINTCPLX sprintcplx
46: #define PRINTV sprintv
47: #define PRINTEXPR sprintexpr
48: #define PRINTNUM sprintnum
49: #define PRINTP sprintp
50: #define PRINTR sprintr
51: #define PRINTLIST sprintlist
52: #define PRINTVECT sprintvect
53: #define PRINTMAT sprintmat
54: #define PRINTSTR sprintstr
55: #define PRINTCOMP sprintcomp
56: #define PRINTDP sprintdp
57: #endif
58:
59: #if defined(THINK_C)
60: void PRINTEXPR(VL,Obj);
61: void PRINTNUM(Num);
62: void PRINTN(N);
63: void PRINTV(VL,V);
64: void PRINTP(VL,P);
65: void PRINTR(VL,R);
66: void PRINTLIST(VL,LIST);
67: void PRINTVECT(VL,VECT);
68: void PRINTMAT(VL,MAT);
69: void PRINTSTR(STRING);
70: void PRINTCOMP(VL,COMP);
71: void PRINTDP(VL,DP);
72: void PRINTCPLX(C);
73: #else
74: void PRINTEXPR();
75: void PRINTNUM();
76: void PRINTN();
77: void PRINTV();
78: void PRINTP();
79: void PRINTR();
80: void PRINTLIST();
81: void PRINTVECT();
82: void PRINTMAT();
83: void PRINTSTR();
84: void PRINTCOMP();
85: void PRINTDP();
86: void PRINTCPLX();
87: #endif
88:
89: #ifdef FPRINT
90: void output_init() {
91: OUT = stdout;
92: sprintf(DFORMAT,"%%0%dd",DLENGTH);
93: }
94:
95: int mmono(p)
96: P p;
97: {
98: if ( NUM(p) )
99: if ( compnum(CO,(Num)p,0) < 0 )
100: return ( 1 );
101: else
102: return ( 0 );
103: else if ( NEXT(DC(p)) )
104: return ( 0 );
105: else
106: return (mmono(COEF(DC(p))));
107: }
108:
109: #if PARI
110: printbf(a)
111: BF a;
112: {
113: sor(a->body,'g',-1,0);
114: }
115: #endif
116: #endif
117:
118: #ifdef SPRINT
119: void soutput_init(s)
120: char *s;
121: {
122: s[0] = 0; buf = s;
123: }
124:
125: #if PARI
126: void sprintbf(a)
127: BF a;
128: {
129: char *str;
130: char *GENtostr();
131:
132: str = GENtostr(a->body);
133: TAIL PRINTF(OUT,"%s",str);
134: free(str);
135: }
136: #endif
137: #endif
138:
139: void PRINTEXPR(vl,p)
140: VL vl;
141: Obj p;
142: {
143: if ( !p ) {
144: PRINTR(vl,(R)p);
145: return;
146: }
147:
148: switch ( OID(p) ) {
149: case O_N:
150: PRINTNUM((Num)p); break;
151: case O_P:
152: PRINTP(vl,(P)p); break;
153: case O_R:
154: PRINTR(vl,(R)p); break;
155: case O_LIST:
156: PRINTLIST(vl,(LIST)p); break;
157: case O_VECT:
158: PRINTVECT(vl,(VECT)p); break;
159: case O_MAT:
160: PRINTMAT(vl,(MAT)p); break;
161: case O_STR:
162: PRINTSTR((STRING)p); break;
163: case O_COMP:
164: PRINTCOMP(vl,(COMP)p); break;
165: case O_DP:
166: PRINTDP(vl,(DP)p); break;
167: default:
168: break;
169: }
170: }
171:
172: void PRINTN(n)
173: N n;
174: {
175: register int i,*ptr;
176: N tn;
177:
178: if ( !n ) {
179: PUTS("0");
180: return;
181: }
182: ntobn(DBASE,n,&tn);
183: ptr = BD(tn);
184: TAIL PRINTF(OUT,"%d",ptr[PL(tn) - 1]);
185: for ( i = PL(tn) - 2; i >= 0; i-- ) {
186: TAIL PRINTF(OUT,DFORMAT,ptr[i]);
187: }
188: }
189:
190: void PRINTNUM(q)
191: Num q;
192: {
193: if ( !q ) {
194: PUTS("0");
195: return;
196: }
197: switch ( NID(q) ) {
198: case N_Q:
199: if ( SGN((Q)q) == -1 )
200: PUTS("-");
201: PRINTN(NM((Q)q));
202: if ( !INT((Q)q) ) {
203: PUTS("/"); PRINTN(DN((Q)q));
204: }
205: break;
206: case N_R:
207: TAIL PRINTF(OUT,"%g",BDY((Real)q));
208: break;
209: case N_A:
210: PUTS("("); PRINTR(ALG,(R)BDY((Alg)q)); PUTS(")");
211: break;
212: #if PARI
213: case N_B:
214: PRINTBF((BF)q); break;
215: #endif
216: case N_C:
217: PRINTCPLX((C)q); break;
218: case N_M:
219: TAIL PRINTF(OUT,"%d",CONT((MQ)q));
220: break;
221: }
222: }
223:
224: void PRINTCPLX(a)
225: C a;
226: {
227: PUTS("(");
228: if ( a->r )
229: PRINTNUM(a->r);
230: if ( a->i ) {
231: if ( a->r && (compnum(0,a->i,0) > 0) )
232: PUTS("+");
233: PRINTNUM(a->i); PUTS("*@i");
234: }
235: PUTS(")");
236: }
237:
238: void PRINTP(vl,p)
239: VL vl;
240: P p;
241: {
242: V v;
243: DCP dc;
244:
245: if ( !p )
246: PUTS("0");
247: else if ( NUM(p) )
248: PRINTNUM((Num)p);
249: else
250: for ( dc = DC(p), v = VR(p); dc; dc = NEXT(dc) ) {
251: if ( !DEG(dc) )
252: PRINTP(vl,COEF(dc));
253: else {
254: if ( NUM(COEF(dc)) && UNIQ((Q)COEF(dc)) ) {
255: ;
256: } else if ( NUM(COEF(dc)) && MUNIQ((Q)COEF(dc)) )
257: PUTS("-");
258: else if ( NUM(COEF(dc)) || !NEXT(DC(COEF(dc)))) {
259: PRINTP(vl,COEF(dc)); PUTS("*");
260: } else {
261: PUTS("("); PRINTP(vl,COEF(dc)); PUTS(")*");
262: }
263: PRINTV(vl,v);
264: if ( cmpq(DEG(dc),ONE) ) {
265: PUTS("^");
266: if ( INT(DEG(dc)) && SGN(DEG(dc))>0 )
267: PRINTNUM((Num)DEG(dc));
268: else {
269: PUTS("("); PRINTNUM((Num)DEG(dc)); PUTS(")");
270: }
271: }
272: }
273: if ( NEXT(dc) ) {
274: P t;
275:
276: t = COEF(NEXT(dc));
277: if (!DEG(NEXT(dc))) {
278: if ( NUM(t) ) {
279: if ( !mmono(t) )
280: PUTS("+");
281: } else {
282: if (!mmono(COEF(DC(t))))
283: PUTS("+");
284: }
285: } else {
286: if ( !mmono(t) )
287: PUTS("+");
288: }
289: }
290: }
291: }
292:
293: void PRINTV(vl,v)
294: VL vl;
295: V v;
296: {
297: PF pf;
298: PFAD ad;
299: int i;
300:
301: if ( NAME(v) )
302: PUTS(NAME(v));
303: else if ( (vid)v->attr == V_PF ) {
304: pf = ((PFINS)v->priv)->pf; ad = ((PFINS)v->priv)->ad;
305: if ( !strcmp(NAME(pf),"pow") ) {
306: PUTS("("); PRINTR(vl,(R)ad[0].arg); PUTS(")^(");
307: PRINTR(vl,(R)ad[1].arg); PUTS(")");
308: } else if ( !pf->argc ) {
309: TAIL PRINTF(OUT,"%s",NAME(pf));
310: } else {
311: for ( i = 0; i < pf->argc; i++ )
312: if ( ad[i].d )
313: break;
314: if ( i < pf->argc ) {
315: TAIL PRINTF(OUT,"%s(%d",NAME(pf),ad[0].d);
316: for ( i = 1; i < pf->argc; i++ ) {
317: TAIL PRINTF(OUT,",%d",ad[i].d);
318: }
319: PUTS(")(");
320: } else {
321: TAIL PRINTF(OUT,"%s(",NAME(pf));
322: }
323: PRINTR(vl,(R)ad[0].arg);
324: for ( i = 1; i < pf->argc; i++ ) {
325: PUTS(","); PRINTR(vl,(R)ad[i].arg);
326: }
327: PUTS(")");
328: }
329: }
330: }
331:
332: void PRINTR(vl,a)
333: VL vl;
334: R a;
335: {
336: if ( !a )
337: PUTS("0");
338: else
339: switch (OID(a)) {
340: case O_N: case O_P:
341: PRINTP(vl,(P)a); break;
342: default:
343: PUTS("("); PRINTP(vl,NM((R)a)); PUTS(")/("); PRINTP(vl,DN((R)a)); PUTS(")");
344: break;
345: }
346: }
347:
348: void PRINTVECT(vl,vect)
349: VL vl;
350: VECT vect;
351: {
352: int i;
353: pointer *ptr;
354:
355: PUTS("[ ");
356: for ( i = 0, ptr = BDY(vect); i < vect->len; i++ ) {
357: PRINTEXPR(vl,ptr[i]); PUTS(" ");
358: }
359: PUTS("]");
360: }
361:
362: void PRINTMAT(vl,mat)
363: VL vl;
364: MAT mat;
365: {
366: int i,j,r,c;
367: pointer *ptr;
368:
369: for ( i = 0, r = mat->row, c = mat->col; i < r; i++ ) {
370: PUTS("[ ");
371: for ( j = 0, ptr = BDY(mat)[i]; j < c; j++ ) {
372: PRINTEXPR(vl,ptr[j]); PUTS(" ");
373: }
374: PUTS("]");
375: if ( i < r - 1 )
376: PUTS("\n");
377: }
378: }
379:
380: void PRINTLIST(vl,list)
381: VL vl;
382: LIST list;
383: {
384: NODE tnode;
385:
386: PUTS("[");
387: for ( tnode = (NODE)list->body; tnode; tnode = NEXT(tnode) ) {
388: PRINTEXPR(vl,tnode->body);
389: if ( NEXT(tnode) )
390: PUTS(",");
391: }
392: PUTS("]");
393: }
394:
395: void PRINTSTR(str)
396: STRING str;
397: {
398: char *p;
399:
400: for ( p = BDY(str); *p; p++ )
401: if ( *p == '"' )
402: PUTS("\"");
403: else {
404: TAIL PRINTF(OUT,"%c",*p);
405: }
406: }
407:
408: void PRINTCOMP(vl,c)
409: VL vl;
410: COMP c;
411: {
412: int n,i;
413:
414: n = getcompsize((int)c->type);
415: PUTS("{");
416: for ( i = 0; i < n; i++ ) {
417: PRINTEXPR(vl,(pointer)c->member[i]);
418: if ( i < n-1 )
419: PUTS(",");
420: }
421: PUTS("}");
422: }
423:
424: void PRINTDP(vl,d)
425: VL vl;
426: DP d;
427: {
428: int n,i;
429: MP m;
430: DL dl;
431:
432: for ( n = d->nv, m = BDY(d); m; m = NEXT(m) ) {
433: PUTS("("); PRINTEXPR(vl,(pointer)m->c); PUTS(")*<<");
434: for ( i = 0, dl = m->dl; i < n-1; i++ ) {
435: TAIL PRINTF(OUT,"%d,",dl->d[i]);
436: }
437: TAIL PRINTF(OUT,"%d",dl->d[i]);
438: PUTS(">>");
439: if ( NEXT(m) )
440: PUTS("+");
441: }
442: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>