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