[BACK]Return to tree.c CVS log [TXT][DIR] Up to [local] / OpenXM / src / kan96xx / Kan / Kclass

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>