[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.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>