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