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