| version 1.1, 2003/11/21 02:10:37 |
version 1.8, 2005/06/16 05:07:24 |
|
|
| /* $OpenXM$ */ |
/* $OpenXM: OpenXM/src/kan96xx/Kan/Kclass/tree.c,v 1.7 2003/12/06 02:49:22 takayama Exp $ */ |
| #include <stdio.h> |
#include <stdio.h> |
| #include "../datatype.h" |
#include "../datatype.h" |
| #include "../stackm.h" |
#include "../stackm.h" |
|
|
| |
|
| /* Data conversion function : see KclassDataConversion*/ |
/* Data conversion function : see KclassDataConversion*/ |
| struct object KpoTree(struct object ob) { |
struct object KpoTree(struct object ob) { |
| struct object rob; |
struct object rob = OINIT; |
| struct object ob1,ob2,ob3; |
struct object ob1 = OINIT; |
| |
struct object ob2 = OINIT; |
| |
struct object ob3 = OINIT; |
| struct object *newobp; |
struct object *newobp; |
| rob.tag = Sclass; |
rob.tag = Sclass; |
| rob.lc.ival = CLASSNAME_tree; |
rob.lc.ival = CLASSNAME_tree; |
| newobp = (struct object *) sGC_malloc(sizeof(struct object)); |
newobp = (struct object *) sGC_malloc(sizeof(struct object)); |
| if (newobp == NULL) errorKan1("%s\n","Kclass/indeterminate.c, no more memory."); |
if (newobp == NULL) errorKan1("%s\n","Kclass/indeterminate.c, no more memory."); |
| if (ob.tag != Sarray) { |
if (ob.tag != Sarray) { |
| errorKan1("%s\n","Kclass/indeterminate.c, only properly formatted list object can be transformed into tree. [name, cdname, arglist]."); |
errorKan1("%s\n","Kclass/indeterminate.c, only properly formatted list object can be transformed into tree. [name, attr-list, arglist]."); |
| } |
} |
| if (getoaSize(ob) < 3) { |
if (getoaSize(ob) < 3) { |
| errorKan1("%s\n","Kclass/indeterminate.c, the length must 3 or more than 3. [name, cdname, arglist]."); |
errorKan1("%s\n","Kclass/indeterminate.c, the length must 3 or more than 3. [name, attr-list, arglist]."); |
| } |
} |
| ob1 = getoa(ob,0); ob2 = getoa(ob,1); ob3 = getoa(ob,2); |
ob1 = getoa(ob,0); ob2 = getoa(ob,1); ob3 = getoa(ob,2); |
| if (ob1.tag != Sdollar || ob2.tag != Sarray || ob3.tag != Sarray) { |
if (ob1.tag != Sdollar || ob2.tag != Sarray || ob3.tag != Sarray) { |
| errorKan1("%s\n","Kclass/indeterminate.c, [string name, list attributes, list arglist]."); |
errorKan1("%s\n","Kclass/indeterminate.c, [string name, list attributes, list arglist]."); |
| } |
} |
| *newobp = ob; |
*newobp = ob; /* Add class-tag to the array */ |
| rob.rc.voidp = newobp; |
rob.rc.voidp = newobp; |
| return(rob); |
return(rob); |
| } |
} |
| Line 41 void fprintTree(FILE *fp,struct object op) |
|
| Line 43 void fprintTree(FILE *fp,struct object op) |
|
| } |
} |
| |
|
| int isTreeAdd(struct object ob) { |
int isTreeAdd(struct object ob) { |
| struct object name; |
struct object name = OINIT; |
| if (ob.tag != Sclass) { |
if (ob.tag != Sclass) { |
| return(0); |
return(0); |
| } |
} |
| Line 56 int isTreeAdd(struct object ob) { |
|
| Line 58 int isTreeAdd(struct object ob) { |
|
| if (name.tag != Sdollar) { |
if (name.tag != Sdollar) { |
| errorKan1("%s\n","CLASSNAME_tree is broken. Should be string."); |
errorKan1("%s\n","CLASSNAME_tree is broken. Should be string."); |
| } |
} |
| if (strcmp(KopString(name),"add") == 0) { |
if (strcmp(KopString(name),"plus") == 0) { |
| return(1); |
return(1); |
| }else{ |
}else{ |
| return(0); |
return(0); |
| Line 65 int isTreeAdd(struct object ob) { |
|
| Line 67 int isTreeAdd(struct object ob) { |
|
| |
|
| struct object addTree(struct object ob1, struct object ob2) |
struct object addTree(struct object ob1, struct object ob2) |
| { |
{ |
| struct object rob,aob; |
struct object rob = OINIT; |
| struct object ob3,ob4; |
struct object aob = OINIT; |
| |
struct object ob3 = OINIT; |
| |
struct object ob4 = OINIT; |
| |
struct object attr = OINIT; |
| |
struct object keyValue = OINIT; |
| |
struct object to = OINIT; |
| int i; |
int i; |
| |
to = ob2; ob2=ob1; ob1=to; /* Exchange ob1 and ob2 */ |
| if (isTreeAdd(ob1) && !isTreeAdd(ob2)) { |
if (isTreeAdd(ob1) && !isTreeAdd(ob2)) { |
| ob1 = KopTree(ob1); |
ob1 = KopTree(ob1); |
| ob3 = getoa(ob1,2); |
ob3 = getoa(ob1,2); |
| Line 101 struct object addTree(struct object ob1, struct object |
|
| Line 109 struct object addTree(struct object ob1, struct object |
|
| putoa(aob,0,ob1); |
putoa(aob,0,ob1); |
| putoa(aob,1,ob2); |
putoa(aob,1,ob2); |
| } |
} |
| |
attr = newObjectArray(1); |
| |
keyValue = newObjectArray(2); |
| |
putoa(keyValue,0,KpoString("cd")); |
| |
putoa(keyValue,1,KpoString("arith1")); |
| |
putoa(attr,0,keyValue); |
| rob = newObjectArray(3); |
rob = newObjectArray(3); |
| putoa(rob,0,KpoString("add")); |
putoa(rob,0,KpoString("plus")); |
| putoa(rob,1,KpoString("basic")); |
putoa(rob,1,attr); |
| putoa(rob,2,aob); |
putoa(rob,2,aob); |
| return(KpoTree(rob)); |
return(KpoTree(rob)); |
| } |
} |
| |
struct object minusTree(struct object ob1,struct object ob2) { |
| |
struct object rob = OINIT; |
| |
struct object aob = OINIT; |
| |
struct object attr = OINIT; |
| |
struct object keyValue = OINIT; |
| |
struct object to = OINIT; |
| |
|
| |
rob = NullObject; |
| |
attr = newObjectArray(1); |
| |
keyValue = newObjectArray(2); |
| |
aob = newObjectArray(2); |
| |
putoa(aob,0,ob1); |
| |
putoa(aob,1,ob2); |
| |
putoa(keyValue,0,KpoString("cd")); |
| |
putoa(keyValue,1,KpoString("arith1")); |
| |
putoa(attr,0,keyValue); |
| |
rob = newObjectArray(3); |
| |
putoa(rob,0,KpoString("minus")); |
| |
putoa(rob,1,attr); |
| |
putoa(rob,2,aob); |
| |
return(KpoTree(rob)); |
| |
return(rob); |
| |
} |
| |
struct object timesTree(struct object ob1,struct object ob2) { |
| |
struct object rob = OINIT; |
| |
struct object aob = OINIT; |
| |
struct object attr = OINIT; |
| |
struct object keyValue = OINIT; |
| |
struct object to = OINIT; |
| |
|
| /*------------------------------------------*/ |
rob = NullObject; |
| |
attr = newObjectArray(1); |
| |
keyValue = newObjectArray(2); |
| |
aob = newObjectArray(2); |
| |
putoa(aob,0,ob1); |
| |
putoa(aob,1,ob2); |
| |
putoa(keyValue,0,KpoString("cd")); |
| |
putoa(keyValue,1,KpoString("arith1")); |
| |
putoa(attr,0,keyValue); |
| |
rob = newObjectArray(3); |
| |
putoa(rob,0,KpoString("times")); |
| |
putoa(rob,1,attr); |
| |
putoa(rob,2,aob); |
| |
return(KpoTree(rob)); |
| |
return(rob); |
| |
} |
| |
struct object divideTree(struct object ob1,struct object ob2) { |
| |
struct object rob = OINIT; |
| |
struct object aob = OINIT; |
| |
struct object attr = OINIT; |
| |
struct object keyValue = OINIT; |
| |
struct object to = OINIT; |
| |
|
| |
rob = NullObject; |
| |
attr = newObjectArray(1); |
| |
keyValue = newObjectArray(2); |
| |
aob = newObjectArray(2); |
| |
putoa(aob,0,ob1); |
| |
putoa(aob,1,ob2); |
| |
putoa(keyValue,0,KpoString("cd")); |
| |
putoa(keyValue,1,KpoString("arith1")); |
| |
putoa(attr,0,keyValue); |
| |
rob = newObjectArray(3); |
| |
putoa(rob,0,KpoString("divide")); |
| |
putoa(rob,1,attr); |
| |
putoa(rob,2,aob); |
| |
return(KpoTree(rob)); |
| |
return(rob); |
| |
} |
| |
struct object powerTree(struct object ob1,struct object ob2) { |
| |
struct object rob = OINIT; |
| |
struct object aob = OINIT; |
| |
struct object attr = OINIT; |
| |
struct object keyValue = OINIT; |
| |
struct object to = OINIT; |
| |
|
| |
rob = NullObject; |
| |
attr = newObjectArray(1); |
| |
keyValue = newObjectArray(2); |
| |
aob = newObjectArray(2); |
| |
putoa(aob,0,ob1); |
| |
putoa(aob,1,ob2); |
| |
putoa(keyValue,0,KpoString("cd")); |
| |
putoa(keyValue,1,KpoString("arith1")); |
| |
putoa(attr,0,keyValue); |
| |
rob = newObjectArray(3); |
| |
putoa(rob,0,KpoString("power")); |
| |
putoa(rob,1,attr); |
| |
putoa(rob,2,aob); |
| |
return(KpoTree(rob)); |
| |
return(rob); |
| |
} |
| |
struct object unaryminusTree(struct object ob1) { |
| |
struct object rob = OINIT; |
| |
struct object aob = OINIT; |
| |
struct object attr = OINIT; |
| |
struct object keyValue = OINIT; |
| |
struct object to = OINIT; |
| |
|
| |
rob = NullObject; |
| |
attr = newObjectArray(1); |
| |
keyValue = newObjectArray(2); |
| |
aob = newObjectArray(1); |
| |
putoa(aob,0,ob1); |
| |
putoa(keyValue,0,KpoString("cd")); |
| |
putoa(keyValue,1,KpoString("arith1")); |
| |
putoa(attr,0,keyValue); |
| |
rob = newObjectArray(3); |
| |
putoa(rob,0,KpoString("unaryminus")); |
| |
putoa(rob,1,attr); |
| |
putoa(rob,2,aob); |
| |
return(KpoTree(rob)); |
| |
return(rob); |
| |
} |
| |
|
| |
/* XML DOM-like interfaces */ |
| |
struct object KtreeGetDocumentElement(struct object to) { |
| |
struct object rob = OINIT; |
| |
struct object ob = OINIT; |
| |
if (to.tag != Sclass) errorKan1("%s\n","KtreeGetDocumentElement"); |
| |
if (ectag(to) != CLASSNAME_tree) errorKan1("%s\n","KtreeGetDocumentElement"); |
| |
ob = KopTree(to); |
| |
if (ob.tag != Sarray) errorKan1("%s\n","KtreeGetDocumentElement: not an array."); |
| |
if (getoaSize(ob) != 3) errorKan1("%s\n","KtreeGetDocumentElement: array is broken."); |
| |
ob=getoa(ob,0); |
| |
if (ob.tag != Sdollar) errorKan1("%s\n","KtreeGetDocumentElement: element must be a string"); |
| |
return ob; |
| |
} |
| |
|
| |
struct object KtreeGetAttributes(struct object to) { |
| |
struct object rob = OINIT; |
| |
struct object ob = OINIT; |
| |
if (to.tag != Sclass) errorKan1("%s\n","KtreeGetAttributes:"); |
| |
if (ectag(to) != CLASSNAME_tree) errorKan1("%s\n","KtreeGetAttributes:"); |
| |
ob = KopTree(to); |
| |
if (ob.tag != Sarray) errorKan1("%s\n","KtreeGetAttributes: not an array."); |
| |
if (getoaSize(ob) != 3) errorKan1("%s\n","KtreeGetAttributes: array is broken."); |
| |
return getoa(ob,1); |
| |
} |
| |
|
| |
struct object KtreeGetChildNodes(struct object to) { |
| |
struct object rob = OINIT; |
| |
struct object ob = OINIT; |
| |
if (to.tag != Sclass) errorKan1("%s\n","KtreeGetChildNodes:"); |
| |
if (ectag(to) != CLASSNAME_tree) errorKan1("%s\n","KtreeGetChildNodes:"); |
| |
ob = KopTree(to); |
| |
if (ob.tag != Sarray) errorKan1("%s\n","KtreeGetChildNodes: not an array."); |
| |
if (getoaSize(ob) != 3) errorKan1("%s\n","KtreeGetChildNodes: array is broken."); |
| |
return getoa(ob,2); |
| |
} |
| |
|
| |
struct object KtreeCreateElement(struct object ostr) { |
| |
struct object ob = OINIT; |
| |
if (ostr.tag != Sdollar) errorKan1("%s\n","KtreeCreateElement: not a string."); |
| |
ob = newObjectArray(3); |
| |
getoa(ob,0)=ostr; |
| |
getoa(ob,1) = newObjectArray(0); |
| |
getoa(ob,2) = newObjectArray(0); |
| |
return KpoTree(ob); |
| |
} |
| |
|