Annotation of OpenXM_contrib2/asir2000/parse/quote.c, Revision 1.6
1.6 ! noro 1: /* $OpenXM: OpenXM_contrib2/asir2000/parse/quote.c,v 1.5 2001/09/05 09:01:28 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;
158: int n,i;
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: }
165: dc = DC((P)a);
166: vartoquote(VR((P)a),&v);
167: for ( t = dc, n = 0; t; t = NEXT(t), n++ );
168: dca = (DCP *)ALLOCA(n*sizeof(DCP));
169: for ( t = dc, i = 0; t; t = NEXT(t), i++ )
170: dca[i] = t;
171: dctoquote(dca[n-1],v,&r);
172: for ( i = n-2; i >= 0; i-- ) {
173: dctoquote(dca[i],v,&s);
174: addquote(CO,s,r,&u);
175: r = u;
176: }
177: *c = r;
178: }
179:
1.6 ! noro 180: void dptoquote(DP a,QUOTE *c)
1.4 noro 181: {
182: MP t;
183: MP *m;
184: int i,n,nv;
185: QUOTE s,r,u;
186:
187: if ( !a ) {
188: MKQUOTE(*c,mkfnode(1,I_FORMULA,(pointer)a));
189: return;
190: }
191: for ( t = BDY(a), n = 0; t; t = NEXT(t), n++ );
192: m = (MP *)ALLOCA(n*sizeof(MP));
193: for ( t = BDY(a), i = 0; t; t = NEXT(t), i++ )
194: m[i] = t;
195: nv = NV(a);
196: mptoquote(m[n-1],nv,&r);
197: for ( i = n-2; i >= 0; i-- ) {
198: mptoquote(m[i],nv,&s);
199: addquote(CO,s,r,&u);
200: r = u;
201: }
202: *c = r;
203: }
204:
1.6 ! noro 205: void dctoquote(DCP dc,QUOTE v,QUOTE *c)
1.2 noro 206: {
1.6 ! noro 207: QUOTE d,s,u;
1.2 noro 208:
1.4 noro 209: if ( UNIQ(COEF(dc)) ) {
210: if ( DEG(dc) ) {
211: if ( UNIQ(DEG(dc)) )
212: *c = v;
213: else {
1.6 ! noro 214: objtoquote((Obj)DEG(dc),&d);
1.4 noro 215: pwrquote(CO,v,d,c);
216: }
217: } else
1.6 ! noro 218: objtoquote((Obj)ONE,c);
1.4 noro 219: } else {
1.6 ! noro 220: objtoquote((Obj)COEF(dc),&u);
1.4 noro 221: if ( DEG(dc) ) {
222: if ( UNIQ(DEG(dc)) )
223: s = v;
224: else {
1.6 ! noro 225: objtoquote((Obj)DEG(dc),&d);
1.4 noro 226: pwrquote(CO,v,d,&s);
227: }
228: mulquote(CO,u,s,c);
229: } else
230: *c = u;
231: }
232: }
233:
1.6 ! noro 234: void mptoquote(MP m,int n,QUOTE *c)
1.4 noro 235: {
236: QUOTE s,u;
237: NODE t,t1;
238: FNODE f;
239: Q q;
240: DL dl;
241: int i;
242:
1.6 ! noro 243: objtoquote((Obj)C(m),&s);
1.4 noro 244: dl = m->dl;
1.6 ! noro 245: for ( i = n-1, t = 0; i >= 0; i-- ) {
1.4 noro 246: STOQ(dl->d[i],q);
247: f = mkfnode(1,I_FORMULA,q);
248: MKNODE(t1,f,t);
249: t = t1;
1.2 noro 250: }
1.4 noro 251: MKQUOTE(u,mkfnode(1,I_EV,t));
252: mulquote(CO,s,u,c);
1.2 noro 253: }
254:
1.6 ! noro 255: void vartoquote(V v,QUOTE *c)
1.2 noro 256: {
257: P x;
258: PF pf;
259: PFAD ad;
260: QUOTE a,b;
261: int i;
262: FUNC f;
263: NODE t,t1;
264:
265: if ( NAME(v) ) {
266: MKV(v,x);
267: MKQUOTE(*c,mkfnode(1,I_FORMULA,(pointer)x));
268: } else if ( (vid)v->attr == V_PF ) {
269: /* pure function */
270: pf = ((PFINS)v->priv)->pf;
271: ad = ((PFINS)v->priv)->ad;
272: if ( !strcmp(NAME(pf),"pow") ) {
273: /* pow(a,b) = a^b */
274: objtoquote(ad[0].arg,&a); objtoquote(ad[1].arg,&b);
275: pwrquote(CO,a,b,c);
276: } else {
277: for ( i = 0; i < pf->argc; i++ )
278: if ( ad[i].d )
279: break;
280: if ( i < pf->argc )
281: error("vartoquote : not implemented");
282: gen_searchf(NAME(pf),&f);
283: t = 0;
284: for ( i = pf->argc-1; i >= 0; i-- ) {
285: objtoquote(ad[i].arg,&a);
286: MKNODE(t1,BDY(a),t);
287: t = t1;
288: }
289: MKQUOTE(*c,mkfnode(2,I_FUNC,f,mkfnode(1,I_LIST,t)));
290: }
291: }
292: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>