Annotation of OpenXM_contrib2/asir2000/parse/quote.c, Revision 1.9
1.9 ! noro 1: /* $OpenXM: OpenXM_contrib2/asir2000/parse/quote.c,v 1.8 2004/03/04 01:41:32 noro Exp $ */
1.3 noro 2:
1.1 noro 3: #include "ca.h"
4: #include "parse.h"
5:
1.6 noro 6: void addquote(VL vl,QUOTE a,QUOTE b,QUOTE *c)
1.1 noro 7: {
8: FNODE fn;
9:
10: fn = mkfnode(3,I_BOP,addfs,BDY(a),BDY(b));
11: MKQUOTE(*c,fn);
12: }
13:
1.6 noro 14: void subquote(VL vl,QUOTE a,QUOTE b,QUOTE *c)
1.1 noro 15: {
16: FNODE fn;
17:
18: fn = mkfnode(3,I_BOP,subfs,BDY(a),BDY(b));
19: MKQUOTE(*c,fn);
20: }
21:
1.6 noro 22: void mulquote(VL vl,QUOTE a,QUOTE b,QUOTE *c)
1.1 noro 23: {
24: FNODE fn;
25:
26: fn = mkfnode(3,I_BOP,mulfs,BDY(a),BDY(b));
27: MKQUOTE(*c,fn);
28: }
29:
1.6 noro 30: void divquote(VL vl,QUOTE a,QUOTE b,QUOTE *c)
1.1 noro 31: {
32: FNODE fn;
33:
34: fn = mkfnode(3,I_BOP,divfs,BDY(a),BDY(b));
35: MKQUOTE(*c,fn);
36: }
37:
1.6 noro 38: void pwrquote(VL vl,QUOTE a,QUOTE b,QUOTE *c)
1.1 noro 39: {
40: FNODE fn;
41:
42: if ( !b || OID(b) != O_QUOTE )
43: error("pwrquote : invalid argument");
44: fn = mkfnode(3,I_BOP,pwrfs,BDY(a),BDY(b));
45: MKQUOTE(*c,fn);
46: }
47:
1.6 noro 48: void chsgnquote(QUOTE a,QUOTE *c)
1.1 noro 49: {
50: FNODE fn;
51:
52: fn = mkfnode(3,I_BOP,subfs,0,BDY(a));
53: MKQUOTE(*c,fn);
54: }
1.2 noro 55:
1.6 noro 56: void objtoquote(Obj a,QUOTE *c)
1.2 noro 57: {
58: QUOTE nm,dn;
1.4 noro 59: NODE arg,t0,t,t1,t2,t3;
60: FNODE fn;
1.5 noro 61: Obj obj;
1.4 noro 62: Obj *b;
63: Obj **m;
64: int i,j,len,row,col;
65: Q q,qrow,qcol;
66: FUNC f;
1.2 noro 67:
68: if ( !a ) {
69: MKQUOTE(*c,mkfnode(1,I_FORMULA,(pointer)a));
70: return;
71: }
72: switch ( OID(a) ) {
73: case O_N:
1.5 noro 74: if ( negative_number((Num)a) ) {
75: arf_chsgn(a,&obj);
76: MKQUOTE(*c,mkfnode(1,I_MINUS,
77: mkfnode(1,I_FORMULA,(pointer)obj)));
78: } else {
79: MKQUOTE(*c,mkfnode(1,I_FORMULA,(pointer)a));
80: }
81: break;
1.4 noro 82: case O_STR:
1.2 noro 83: MKQUOTE(*c,mkfnode(1,I_FORMULA,(pointer)a));
84: break;
85: case O_P:
86: polytoquote((P)a,c);
87: break;
88: case O_R:
89: polytoquote(NM((R)a),&nm);
90: polytoquote(DN((R)a),&dn);
91: divquote(CO,nm,dn,c);
92: break;
1.4 noro 93: case O_LIST:
94: t0 = 0;
95: for ( arg = BDY((LIST)a); arg; arg = NEXT(arg) ) {
96: NEXTNODE(t0,t);
97: objtoquote(BDY(arg),&nm);
98: BDY(t) = BDY(nm);
99: }
100: if ( t0 )
101: NEXT(t) = 0;
102: MKQUOTE(*c,mkfnode(1,I_LIST,t0));
103: break;
104: case O_VECT:
105: len = ((VECT)a)->len;
106: b = (Obj *)BDY(((VECT)a));
107: t = 0;
108: for ( i = len-1; i >= 0; i-- ) {
109: objtoquote(b[i],&nm);
110: MKNODE(t1,BDY(nm),t);
111: t = t1;
112: }
113: STOQ(len,q);
114: t = mknode(2,mkfnode(1,I_FORMULA,q),mkfnode(1,I_LIST,t));
115: gen_searchf("vector",&f);
116: MKQUOTE(*c,mkfnode(2,I_FUNC,f,mkfnode(1,I_LIST,t)));
117: break;
118: case O_MAT:
119: row = ((MAT)a)->row;
120: col = ((MAT)a)->row;
121: m = (Obj **)BDY(((MAT)a));
122: t2 = 0;
123: for ( i = row-1; i >= 0; i-- ) {
124: t = 0;
125: for ( j = col-1; j >= 0; j-- ) {
126: objtoquote(m[i][j],&nm);
127: MKNODE(t1,BDY(nm),t);
128: t = t1;
129: }
130: fn = mkfnode(1,I_LIST,t);
131: MKNODE(t3,fn,t2);
132: t2 = t3;
133: }
134: fn = mkfnode(1,I_LIST,t2);
135:
136: STOQ(row,qrow);
137: STOQ(col,qcol);
138: t = mknode(3,
139: mkfnode(1,I_FORMULA,qrow),mkfnode(1,I_FORMULA,qcol),fn);
140: gen_searchf("matrix",&f);
141: MKQUOTE(*c,mkfnode(2,I_FUNC,f,mkfnode(1,I_LIST,t)));
142: break;
143: case O_DP:
144: dptoquote((DP)a,c);
145: break;
1.2 noro 146: case O_QUOTE:
147: *c = (QUOTE)a;
148: break;
149: default:
150: error("objtoquote : not implemented");
151: }
152: }
153:
1.6 noro 154: void polytoquote(P a,QUOTE *c)
1.2 noro 155: {
156: DCP dc,t;
157: DCP *dca;
1.7 noro 158: int n,i,sgn;
1.2 noro 159: QUOTE v,r,s,u;
160:
161: if ( !a || (OID(a) == O_N) ) {
162: MKQUOTE(*c,mkfnode(1,I_FORMULA,(pointer)a));
163: return;
164: }
1.7 noro 165: vartoquote(VR((P)a),&v);
1.2 noro 166: dc = DC((P)a);
1.7 noro 167: dctoquote(dc,v,&r,&sgn);
168: if ( sgn == -1 ) {
169: MKQUOTE(u,mkfnode(1,I_MINUS,BDY(r)));
170: r = u;
171: }
172: for (dc = NEXT(dc); dc; dc = NEXT(dc) ) {
173: dctoquote(dc,v,&s,&sgn);
174: if ( sgn == -1 )
175: subquote(CO,r,s,&u);
176: else
177: addquote(CO,r,s,&u);
1.2 noro 178: r = u;
179: }
180: *c = r;
181: }
182:
1.6 noro 183: void dptoquote(DP a,QUOTE *c)
1.4 noro 184: {
185: MP t;
1.8 noro 186: MP m;
187: int i,n,nv,sgn;
1.4 noro 188: QUOTE s,r,u;
189:
190: if ( !a ) {
191: MKQUOTE(*c,mkfnode(1,I_FORMULA,(pointer)a));
192: return;
193: }
194: nv = NV(a);
1.8 noro 195: m = BDY(a);
196: mptoquote(m,nv,&r,&sgn);
197: if ( sgn == -1 ) {
198: MKQUOTE(u,mkfnode(1,I_MINUS,BDY(r)));
199: r = u;
200: }
201: for ( m = NEXT(m); m; m = NEXT(m) ) {
202: mptoquote(m,nv,&s,&sgn);
203: if ( sgn < 0 )
204: subquote(CO,r,s,&u);
205: else
206: addquote(CO,r,s,&u);
1.4 noro 207: r = u;
208: }
209: *c = r;
210: }
211:
1.7 noro 212: void dctoquote(DCP dc,QUOTE v,QUOTE *q,int *sgn)
1.2 noro 213: {
1.7 noro 214: QUOTE t,s,u,r;
215: P c;
216: Q d;
217:
218: if ( mmono(COEF(dc)) ) {
219: /* -xyz... */
220: chsgnp(COEF(dc),&c);
221: *sgn = -1;
222: } else {
223: c = COEF(dc);
224: *sgn = 1;
225: }
226: d = DEG(dc);
227: if ( UNIQ(c) ) {
228: if ( d ) {
229: if ( UNIQ(d) )
230: r = v;
1.4 noro 231: else {
1.7 noro 232: objtoquote((Obj)d,&t);
233: pwrquote(CO,v,t,&r);
1.4 noro 234: }
235: } else
1.7 noro 236: objtoquote((Obj)ONE,&r);
1.4 noro 237: } else {
1.7 noro 238: objtoquote((Obj)c,&u);
239: if ( !NUM(c) && NEXT(DC(c)) ) {
240: MKQUOTE(t,mkfnode(1,I_PAREN,BDY(u)));
241: u = t;
242: }
243: if ( d ) {
244: if ( UNIQ(d) )
1.4 noro 245: s = v;
246: else {
1.7 noro 247: objtoquote((Obj)d,&t);
248: pwrquote(CO,v,t,&s);
1.4 noro 249: }
1.7 noro 250: mulquote(CO,u,s,&r);
1.4 noro 251: } else
1.7 noro 252: r = u;
1.4 noro 253: }
1.7 noro 254: *q = r;
1.4 noro 255: }
256:
1.8 noro 257: void mptoquote(MP m,int n,QUOTE *r,int *sgn)
1.4 noro 258: {
259: QUOTE s,u;
1.8 noro 260: P c;
1.4 noro 261: NODE t,t1;
262: FNODE f;
263: Q q;
264: DL dl;
265: int i;
266:
1.8 noro 267: if ( mmono(C(m)) ) {
268: chsgnp(C(m),&c);
269: *sgn = -1;
270: } else {
271: c = C(m);
272: *sgn = 1;
273: }
274: objtoquote((Obj)c,&s);
275: if ( !NUM(c) && NEXT(DC(c)) ) {
276: MKQUOTE(u,mkfnode(1,I_PAREN,BDY(s)));
277: s = u;
278: }
1.4 noro 279: dl = m->dl;
1.9 ! noro 280: for ( i = n-1, t = 0; i >= 0; i-- ) {
! 281: STOQ(dl->d[i],q);
! 282: f = mkfnode(1,I_FORMULA,q);
! 283: MKNODE(t1,f,t);
! 284: t = t1;
! 285: }
! 286: MKQUOTE(u,mkfnode(1,I_EV,t));
! 287: if ( UNIQ(c) )
! 288: *r = u;
! 289: else
! 290: mulquote(CO,s,u,r);
1.2 noro 291: }
292:
1.6 noro 293: void vartoquote(V v,QUOTE *c)
1.2 noro 294: {
295: P x;
296: PF pf;
297: PFAD ad;
298: QUOTE a,b;
299: int i;
300: FUNC f;
301: NODE t,t1;
302:
303: if ( NAME(v) ) {
304: MKV(v,x);
305: MKQUOTE(*c,mkfnode(1,I_FORMULA,(pointer)x));
306: } else if ( (vid)v->attr == V_PF ) {
307: /* pure function */
308: pf = ((PFINS)v->priv)->pf;
309: ad = ((PFINS)v->priv)->ad;
310: if ( !strcmp(NAME(pf),"pow") ) {
311: /* pow(a,b) = a^b */
312: objtoquote(ad[0].arg,&a); objtoquote(ad[1].arg,&b);
313: pwrquote(CO,a,b,c);
314: } else {
315: for ( i = 0; i < pf->argc; i++ )
316: if ( ad[i].d )
317: break;
318: if ( i < pf->argc )
319: error("vartoquote : not implemented");
320: gen_searchf(NAME(pf),&f);
321: t = 0;
322: for ( i = pf->argc-1; i >= 0; i-- ) {
323: objtoquote(ad[i].arg,&a);
324: MKNODE(t1,BDY(a),t);
325: t = t1;
326: }
327: MKQUOTE(*c,mkfnode(2,I_FUNC,f,mkfnode(1,I_LIST,t)));
328: }
329: }
330: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>