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