Annotation of OpenXM/src/kan96xx/Kan/Kclass/tree.c, Revision 1.9
1.9 ! takayama 1: /* $OpenXM: OpenXM/src/kan96xx/Kan/Kclass/tree.c,v 1.8 2005/06/16 05:07:24 takayama Exp $ */
1.1 takayama 2: #include <stdio.h>
1.9 ! takayama 3: #include <string.h>
1.1 takayama 4: #include "../datatype.h"
5: #include "../stackm.h"
6: #include "../extern.h"
7: #include "../gradedset.h"
8: #include "../extern2.h"
9: #include "../kclass.h"
10:
11:
12:
13: /* Data conversion function : see KclassDataConversion*/
14: struct object KpoTree(struct object ob) {
1.8 takayama 15: struct object rob = OINIT;
16: struct object ob1 = OINIT;
17: struct object ob2 = OINIT;
18: struct object ob3 = OINIT;
1.1 takayama 19: struct object *newobp;
20: rob.tag = Sclass;
21: rob.lc.ival = CLASSNAME_tree;
22: newobp = (struct object *) sGC_malloc(sizeof(struct object));
23: if (newobp == NULL) errorKan1("%s\n","Kclass/indeterminate.c, no more memory.");
24: if (ob.tag != Sarray) {
1.2 takayama 25: errorKan1("%s\n","Kclass/indeterminate.c, only properly formatted list object can be transformed into tree. [name, attr-list, arglist].");
1.1 takayama 26: }
27: if (getoaSize(ob) < 3) {
1.2 takayama 28: errorKan1("%s\n","Kclass/indeterminate.c, the length must 3 or more than 3. [name, attr-list, arglist].");
1.1 takayama 29: }
30: ob1 = getoa(ob,0); ob2 = getoa(ob,1); ob3 = getoa(ob,2);
31: if (ob1.tag != Sdollar || ob2.tag != Sarray || ob3.tag != Sarray) {
32: errorKan1("%s\n","Kclass/indeterminate.c, [string name, list attributes, list arglist].");
33: }
1.2 takayama 34: *newobp = ob; /* Add class-tag to the array */
1.1 takayama 35: rob.rc.voidp = newobp;
36: return(rob);
37: }
38:
39:
40: /* Printing function : see fprintClass */
41: void fprintTree(FILE *fp,struct object op)
42: {
43: printObject(KopTree(op),0,fp);
44: }
45:
46: int isTreeAdd(struct object ob) {
1.8 takayama 47: struct object name = OINIT;
1.1 takayama 48: if (ob.tag != Sclass) {
49: return(0);
50: }
51: if (ectag(ob) != CLASSNAME_tree) {
52: return(0);
53: }
54: ob = KopTree(ob);
55: if (ob.tag != Sarray) {
56: errorKan1("%s\n","CLASSNAME_tree is broken. Should be array.");
57: }
58: name = getoa(ob,0);
59: if (name.tag != Sdollar) {
60: errorKan1("%s\n","CLASSNAME_tree is broken. Should be string.");
61: }
1.6 takayama 62: if (strcmp(KopString(name),"plus") == 0) {
1.1 takayama 63: return(1);
64: }else{
65: return(0);
66: }
67: }
68:
69: struct object addTree(struct object ob1, struct object ob2)
70: {
1.8 takayama 71: struct object rob = OINIT;
72: struct object aob = OINIT;
73: struct object ob3 = OINIT;
74: struct object ob4 = OINIT;
75: struct object attr = OINIT;
76: struct object keyValue = OINIT;
77: struct object to = OINIT;
1.1 takayama 78: int i;
1.6 takayama 79: to = ob2; ob2=ob1; ob1=to; /* Exchange ob1 and ob2 */
1.1 takayama 80: if (isTreeAdd(ob1) && !isTreeAdd(ob2)) {
81: ob1 = KopTree(ob1);
82: ob3 = getoa(ob1,2);
83: aob = newObjectArray(getoaSize(ob3)+1);
84: for (i=0; i<getoaSize(ob3); i++) {
85: putoa(aob,i,getoa(ob3,i));
86: }
87: putoa(aob,getoaSize(ob3),ob2);
88: }else if (!isTreeAdd(ob1) && isTreeAdd(ob2)) {
89: ob2 = KopTree(ob2);
90: ob3 = getoa(ob2,2);
91: aob = newObjectArray(getoaSize(ob3)+1);
92: putoa(aob,0,ob1);
93: for (i=0; i<getoaSize(ob3); i++) {
94: putoa(aob,1+i,getoa(ob3,i));
95: }
96: }else if (isTreeAdd(ob1) && isTreeAdd(ob2)) {
97: ob1 = KopTree(ob1);
98: ob2 = KopTree(ob2);
99: ob3 = getoa(ob1,2);
100: ob4 = getoa(ob2,2);
101: aob = newObjectArray(getoaSize(ob3)+getoaSize(ob4));
102: for (i=0; i<getoaSize(ob3); i++) {
103: putoa(aob,i,getoa(ob3,i));
104: }
105: for (i=0; i<getoaSize(ob4); i++) {
106: putoa(aob,getoaSize(ob3)+i,getoa(ob4,i));
107: }
108: }else{
109: aob = newObjectArray(2);
110: putoa(aob,0,ob1);
111: putoa(aob,1,ob2);
112: }
1.5 takayama 113: attr = newObjectArray(1);
114: keyValue = newObjectArray(2);
1.6 takayama 115: putoa(keyValue,0,KpoString("cd"));
116: putoa(keyValue,1,KpoString("arith1"));
1.5 takayama 117: putoa(attr,0,keyValue);
1.1 takayama 118: rob = newObjectArray(3);
1.6 takayama 119: putoa(rob,0,KpoString("plus"));
1.5 takayama 120: putoa(rob,1,attr);
1.1 takayama 121: putoa(rob,2,aob);
122: return(KpoTree(rob));
1.7 takayama 123: }
124: struct object minusTree(struct object ob1,struct object ob2) {
1.8 takayama 125: struct object rob = OINIT;
126: struct object aob = OINIT;
127: struct object attr = OINIT;
128: struct object keyValue = OINIT;
129: struct object to = OINIT;
1.7 takayama 130:
131: rob = NullObject;
132: attr = newObjectArray(1);
133: keyValue = newObjectArray(2);
134: aob = newObjectArray(2);
135: putoa(aob,0,ob1);
136: putoa(aob,1,ob2);
137: putoa(keyValue,0,KpoString("cd"));
138: putoa(keyValue,1,KpoString("arith1"));
139: putoa(attr,0,keyValue);
140: rob = newObjectArray(3);
141: putoa(rob,0,KpoString("minus"));
142: putoa(rob,1,attr);
143: putoa(rob,2,aob);
144: return(KpoTree(rob));
145: return(rob);
146: }
147: struct object timesTree(struct object ob1,struct object ob2) {
1.8 takayama 148: struct object rob = OINIT;
149: struct object aob = OINIT;
150: struct object attr = OINIT;
151: struct object keyValue = OINIT;
152: struct object to = OINIT;
1.7 takayama 153:
154: rob = NullObject;
155: attr = newObjectArray(1);
156: keyValue = newObjectArray(2);
157: aob = newObjectArray(2);
158: putoa(aob,0,ob1);
159: putoa(aob,1,ob2);
160: putoa(keyValue,0,KpoString("cd"));
161: putoa(keyValue,1,KpoString("arith1"));
162: putoa(attr,0,keyValue);
163: rob = newObjectArray(3);
164: putoa(rob,0,KpoString("times"));
165: putoa(rob,1,attr);
166: putoa(rob,2,aob);
167: return(KpoTree(rob));
168: return(rob);
169: }
170: struct object divideTree(struct object ob1,struct object ob2) {
1.8 takayama 171: struct object rob = OINIT;
172: struct object aob = OINIT;
173: struct object attr = OINIT;
174: struct object keyValue = OINIT;
175: struct object to = OINIT;
1.7 takayama 176:
177: rob = NullObject;
178: attr = newObjectArray(1);
179: keyValue = newObjectArray(2);
180: aob = newObjectArray(2);
181: putoa(aob,0,ob1);
182: putoa(aob,1,ob2);
183: putoa(keyValue,0,KpoString("cd"));
184: putoa(keyValue,1,KpoString("arith1"));
185: putoa(attr,0,keyValue);
186: rob = newObjectArray(3);
187: putoa(rob,0,KpoString("divide"));
188: putoa(rob,1,attr);
189: putoa(rob,2,aob);
190: return(KpoTree(rob));
191: return(rob);
192: }
193: struct object powerTree(struct object ob1,struct object ob2) {
1.8 takayama 194: struct object rob = OINIT;
195: struct object aob = OINIT;
196: struct object attr = OINIT;
197: struct object keyValue = OINIT;
198: struct object to = OINIT;
1.7 takayama 199:
200: rob = NullObject;
201: attr = newObjectArray(1);
202: keyValue = newObjectArray(2);
203: aob = newObjectArray(2);
204: putoa(aob,0,ob1);
205: putoa(aob,1,ob2);
206: putoa(keyValue,0,KpoString("cd"));
207: putoa(keyValue,1,KpoString("arith1"));
208: putoa(attr,0,keyValue);
209: rob = newObjectArray(3);
210: putoa(rob,0,KpoString("power"));
211: putoa(rob,1,attr);
212: putoa(rob,2,aob);
213: return(KpoTree(rob));
214: return(rob);
215: }
216: struct object unaryminusTree(struct object ob1) {
1.8 takayama 217: struct object rob = OINIT;
218: struct object aob = OINIT;
219: struct object attr = OINIT;
220: struct object keyValue = OINIT;
221: struct object to = OINIT;
1.7 takayama 222:
223: rob = NullObject;
224: attr = newObjectArray(1);
225: keyValue = newObjectArray(2);
226: aob = newObjectArray(1);
227: putoa(aob,0,ob1);
228: putoa(keyValue,0,KpoString("cd"));
229: putoa(keyValue,1,KpoString("arith1"));
230: putoa(attr,0,keyValue);
231: rob = newObjectArray(3);
232: putoa(rob,0,KpoString("unaryminus"));
233: putoa(rob,1,attr);
234: putoa(rob,2,aob);
235: return(KpoTree(rob));
236: return(rob);
1.1 takayama 237: }
238:
1.2 takayama 239: /* XML DOM-like interfaces */
240: struct object KtreeGetDocumentElement(struct object to) {
1.8 takayama 241: struct object rob = OINIT;
242: struct object ob = OINIT;
1.3 takayama 243: if (to.tag != Sclass) errorKan1("%s\n","KtreeGetDocumentElement");
244: if (ectag(to) != CLASSNAME_tree) errorKan1("%s\n","KtreeGetDocumentElement");
1.2 takayama 245: ob = KopTree(to);
1.4 takayama 246: if (ob.tag != Sarray) errorKan1("%s\n","KtreeGetDocumentElement: not an array.");
247: if (getoaSize(ob) != 3) errorKan1("%s\n","KtreeGetDocumentElement: array is broken.");
248: ob=getoa(ob,0);
249: if (ob.tag != Sdollar) errorKan1("%s\n","KtreeGetDocumentElement: element must be a string");
250: return ob;
1.2 takayama 251: }
252:
253: struct object KtreeGetAttributes(struct object to) {
1.8 takayama 254: struct object rob = OINIT;
255: struct object ob = OINIT;
1.3 takayama 256: if (to.tag != Sclass) errorKan1("%s\n","KtreeGetAttributes:");
257: if (ectag(to) != CLASSNAME_tree) errorKan1("%s\n","KtreeGetAttributes:");
1.2 takayama 258: ob = KopTree(to);
1.3 takayama 259: if (ob.tag != Sarray) errorKan1("%s\n","KtreeGetAttributes: not an array.");
1.4 takayama 260: if (getoaSize(ob) != 3) errorKan1("%s\n","KtreeGetAttributes: array is broken.");
1.2 takayama 261: return getoa(ob,1);
262: }
263:
264: struct object KtreeGetChildNodes(struct object to) {
1.8 takayama 265: struct object rob = OINIT;
266: struct object ob = OINIT;
1.3 takayama 267: if (to.tag != Sclass) errorKan1("%s\n","KtreeGetChildNodes:");
268: if (ectag(to) != CLASSNAME_tree) errorKan1("%s\n","KtreeGetChildNodes:");
1.2 takayama 269: ob = KopTree(to);
1.3 takayama 270: if (ob.tag != Sarray) errorKan1("%s\n","KtreeGetChildNodes: not an array.");
1.4 takayama 271: if (getoaSize(ob) != 3) errorKan1("%s\n","KtreeGetChildNodes: array is broken.");
1.2 takayama 272: return getoa(ob,2);
273: }
274:
275: struct object KtreeCreateElement(struct object ostr) {
1.8 takayama 276: struct object ob = OINIT;
1.3 takayama 277: if (ostr.tag != Sdollar) errorKan1("%s\n","KtreeCreateElement: not a string.");
1.2 takayama 278: ob = newObjectArray(3);
279: getoa(ob,0)=ostr;
280: getoa(ob,1) = newObjectArray(0);
281: getoa(ob,2) = newObjectArray(0);
282: return KpoTree(ob);
283: }
1.1 takayama 284:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>