Annotation of OpenXM_contrib2/asir2000/parse/quote.c, Revision 1.4
1.4 ! noro 1: /* $OpenXM: OpenXM_contrib2/asir2000/parse/quote.c,v 1.3 2001/09/04 02:46:15 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;
! 83: Obj *b;
! 84: Obj **m;
! 85: int i,j,len,row,col;
! 86: Q q,qrow,qcol;
! 87: FUNC f;
1.2 noro 88:
89: if ( !a ) {
90: MKQUOTE(*c,mkfnode(1,I_FORMULA,(pointer)a));
91: return;
92: }
93: switch ( OID(a) ) {
94: case O_N:
1.4 ! noro 95: case O_STR:
1.2 noro 96: MKQUOTE(*c,mkfnode(1,I_FORMULA,(pointer)a));
97: break;
98: case O_P:
99: polytoquote((P)a,c);
100: break;
101: case O_R:
102: polytoquote(NM((R)a),&nm);
103: polytoquote(DN((R)a),&dn);
104: divquote(CO,nm,dn,c);
105: break;
1.4 ! noro 106: case O_LIST:
! 107: t0 = 0;
! 108: for ( arg = BDY((LIST)a); arg; arg = NEXT(arg) ) {
! 109: NEXTNODE(t0,t);
! 110: objtoquote(BDY(arg),&nm);
! 111: BDY(t) = BDY(nm);
! 112: }
! 113: if ( t0 )
! 114: NEXT(t) = 0;
! 115: MKQUOTE(*c,mkfnode(1,I_LIST,t0));
! 116: break;
! 117: case O_VECT:
! 118: len = ((VECT)a)->len;
! 119: b = (Obj *)BDY(((VECT)a));
! 120: t = 0;
! 121: for ( i = len-1; i >= 0; i-- ) {
! 122: objtoquote(b[i],&nm);
! 123: MKNODE(t1,BDY(nm),t);
! 124: t = t1;
! 125: }
! 126: STOQ(len,q);
! 127: t = mknode(2,mkfnode(1,I_FORMULA,q),mkfnode(1,I_LIST,t));
! 128: gen_searchf("vector",&f);
! 129: MKQUOTE(*c,mkfnode(2,I_FUNC,f,mkfnode(1,I_LIST,t)));
! 130: break;
! 131: case O_MAT:
! 132: row = ((MAT)a)->row;
! 133: col = ((MAT)a)->row;
! 134: m = (Obj **)BDY(((MAT)a));
! 135: t2 = 0;
! 136: for ( i = row-1; i >= 0; i-- ) {
! 137: t = 0;
! 138: for ( j = col-1; j >= 0; j-- ) {
! 139: objtoquote(m[i][j],&nm);
! 140: MKNODE(t1,BDY(nm),t);
! 141: t = t1;
! 142: }
! 143: fn = mkfnode(1,I_LIST,t);
! 144: MKNODE(t3,fn,t2);
! 145: t2 = t3;
! 146: }
! 147: fn = mkfnode(1,I_LIST,t2);
! 148:
! 149: STOQ(row,qrow);
! 150: STOQ(col,qcol);
! 151: t = mknode(3,
! 152: mkfnode(1,I_FORMULA,qrow),mkfnode(1,I_FORMULA,qcol),fn);
! 153: gen_searchf("matrix",&f);
! 154: MKQUOTE(*c,mkfnode(2,I_FUNC,f,mkfnode(1,I_LIST,t)));
! 155: break;
! 156: case O_DP:
! 157: dptoquote((DP)a,c);
! 158: break;
1.2 noro 159: case O_QUOTE:
160: *c = (QUOTE)a;
161: break;
162: default:
163: error("objtoquote : not implemented");
164: }
165: }
166:
167: void polytoquote(a,c)
168: P a;
169: QUOTE *c;
170: {
171: DCP dc,t;
172: DCP *dca;
173: int n,i;
174: QUOTE v,r,s,u;
175:
176: if ( !a || (OID(a) == O_N) ) {
177: MKQUOTE(*c,mkfnode(1,I_FORMULA,(pointer)a));
178: return;
179: }
180: dc = DC((P)a);
181: vartoquote(VR((P)a),&v);
182: for ( t = dc, n = 0; t; t = NEXT(t), n++ );
183: dca = (DCP *)ALLOCA(n*sizeof(DCP));
184: for ( t = dc, i = 0; t; t = NEXT(t), i++ )
185: dca[i] = t;
186: dctoquote(dca[n-1],v,&r);
187: for ( i = n-2; i >= 0; i-- ) {
188: dctoquote(dca[i],v,&s);
189: addquote(CO,s,r,&u);
190: r = u;
191: }
192: *c = r;
193: }
194:
1.4 ! noro 195: void dptoquote(a,c)
! 196: DP a;
! 197: QUOTE *c;
! 198: {
! 199: MP t;
! 200: MP *m;
! 201: int i,n,nv;
! 202: QUOTE s,r,u;
! 203:
! 204: if ( !a ) {
! 205: MKQUOTE(*c,mkfnode(1,I_FORMULA,(pointer)a));
! 206: return;
! 207: }
! 208: for ( t = BDY(a), n = 0; t; t = NEXT(t), n++ );
! 209: m = (MP *)ALLOCA(n*sizeof(MP));
! 210: for ( t = BDY(a), i = 0; t; t = NEXT(t), i++ )
! 211: m[i] = t;
! 212: nv = NV(a);
! 213: mptoquote(m[n-1],nv,&r);
! 214: for ( i = n-2; i >= 0; i-- ) {
! 215: mptoquote(m[i],nv,&s);
! 216: addquote(CO,s,r,&u);
! 217: r = u;
! 218: }
! 219: *c = r;
! 220: }
! 221:
1.2 noro 222: void dctoquote(dc,v,c)
223: DCP dc;
224: QUOTE v;
225: QUOTE *c;
226: {
227: QUOTE r,d,s,u;
228:
1.4 ! noro 229: if ( UNIQ(COEF(dc)) ) {
! 230: if ( DEG(dc) ) {
! 231: if ( UNIQ(DEG(dc)) )
! 232: *c = v;
! 233: else {
! 234: objtoquote(DEG(dc),&d);
! 235: pwrquote(CO,v,d,c);
! 236: }
! 237: } else
! 238: objtoquote(ONE,c);
! 239: } else {
! 240: objtoquote(COEF(dc),&u);
! 241: if ( DEG(dc) ) {
! 242: if ( UNIQ(DEG(dc)) )
! 243: s = v;
! 244: else {
! 245: objtoquote(DEG(dc),&d);
! 246: pwrquote(CO,v,d,&s);
! 247: }
! 248: mulquote(CO,u,s,c);
! 249: } else
! 250: *c = u;
! 251: }
! 252: }
! 253:
! 254: void mptoquote(m,n,c)
! 255: MP m;
! 256: int n;
! 257: QUOTE *c;
! 258: {
! 259: QUOTE s,u;
! 260: NODE t,t1;
! 261: FNODE f;
! 262: Q q;
! 263: DL dl;
! 264: int i;
! 265:
! 266: objtoquote(C(m),&s);
! 267: dl = m->dl;
! 268: for ( i = n-1; i >= 0; i-- ) {
! 269: STOQ(dl->d[i],q);
! 270: f = mkfnode(1,I_FORMULA,q);
! 271: MKNODE(t1,f,t);
! 272: t = t1;
1.2 noro 273: }
1.4 ! noro 274: MKQUOTE(u,mkfnode(1,I_EV,t));
! 275: mulquote(CO,s,u,c);
1.2 noro 276: }
277:
278: void vartoquote(v,c)
279: V v;
280: QUOTE *c;
281: {
282: P x;
283: PF pf;
284: PFAD ad;
285: QUOTE a,b;
286: int i;
287: FUNC f;
288: NODE t,t1;
289:
290: if ( NAME(v) ) {
291: MKV(v,x);
292: MKQUOTE(*c,mkfnode(1,I_FORMULA,(pointer)x));
293: } else if ( (vid)v->attr == V_PF ) {
294: /* pure function */
295: pf = ((PFINS)v->priv)->pf;
296: ad = ((PFINS)v->priv)->ad;
297: if ( !strcmp(NAME(pf),"pow") ) {
298: /* pow(a,b) = a^b */
299: objtoquote(ad[0].arg,&a); objtoquote(ad[1].arg,&b);
300: pwrquote(CO,a,b,c);
301: } else {
302: for ( i = 0; i < pf->argc; i++ )
303: if ( ad[i].d )
304: break;
305: if ( i < pf->argc )
306: error("vartoquote : not implemented");
307: gen_searchf(NAME(pf),&f);
308: t = 0;
309: for ( i = pf->argc-1; i >= 0; i-- ) {
310: objtoquote(ad[i].arg,&a);
311: MKNODE(t1,BDY(a),t);
312: t = t1;
313: }
314: MKQUOTE(*c,mkfnode(2,I_FUNC,f,mkfnode(1,I_LIST,t)));
315: }
316: }
317: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>