| version 1.2, 2000/01/16 07:55:39 |
version 1.6, 2006/01/30 10:38:36 |
|
|
| /* $OpenXM$ */ |
/* $OpenXM: OpenXM/src/kan96xx/Kan/kclass.c,v 1.5 2005/06/16 05:07:23 takayama Exp $ */ |
| /* kclass.c, 1997, 3/1 |
/* kclass.c, 1997, 3/1 |
| This module handles class data base. |
This module handles class data base. |
| This is a top level and provides an interface for sm1 for Sclass objects. |
This is a top level and provides an interface for sm1 for Sclass objects. |
| Main processing is done in Kclass/* |
Main processing is done in Kclass/* |
| See, Kclass/sample.h, Kclass/sample.c ; |
See, Kclass/sample.h, Kclass/sample.c ; |
| grep the keyword CLASSNAME_sampleClass |
grep the keyword CLASSNAME_sampleClass |
| */ |
*/ |
| #include <stdio.h> |
#include <stdio.h> |
| #include "datatype.h" |
#include "datatype.h" |
| Line 30 initClassDataBase() { |
|
| Line 30 initClassDataBase() { |
|
| ClassTypes[CLASSNAME_OPERANDSTACK] = CLASS_INTERNAL; |
ClassTypes[CLASSNAME_OPERANDSTACK] = CLASS_INTERNAL; |
| ClassNames[CLASSNAME_OPERANDSTACK] = "Class.OperandStack"; |
ClassNames[CLASSNAME_OPERANDSTACK] = "Class.OperandStack"; |
| ClassDictionaries[CLASSNAME_OPERANDSTACK] = (struct object *)NULL; |
ClassDictionaries[CLASSNAME_OPERANDSTACK] = (struct object *)NULL; |
| /* We have to creat new dictionary in a future. */ |
/* We have to creat new dictionary in a future. */ |
| |
|
| ClassTypes[CLASSNAME_ERROR_PACKET] = CLASS_OBJ; |
ClassTypes[CLASSNAME_ERROR_PACKET] = CLASS_OBJ; |
| ClassNames[CLASSNAME_ERROR_PACKET] = "Class.ErrorPacket"; |
ClassNames[CLASSNAME_ERROR_PACKET] = "Class.ErrorPacket"; |
| ClassDictionaries[CLASSNAME_ERROR_PACKET] = (struct object *)NULL; |
ClassDictionaries[CLASSNAME_ERROR_PACKET] = (struct object *)NULL; |
| /* We have to creat new dictionary in a future. */ |
/* We have to creat new dictionary in a future. */ |
| |
|
| ClassTypes[CLASSNAME_CONTEXT] = CLASS_INTERNAL; |
ClassTypes[CLASSNAME_CONTEXT] = CLASS_INTERNAL; |
| ClassNames[CLASSNAME_CONTEXT] = "Class.Context"; |
ClassNames[CLASSNAME_CONTEXT] = "Class.Context"; |
| ClassDictionaries[CLASSNAME_CONTEXT] = (struct object *)NULL; |
ClassDictionaries[CLASSNAME_CONTEXT] = (struct object *)NULL; |
| /* We have to creat new dictionary in a future. */ |
/* We have to creat new dictionary in a future. */ |
| |
|
| ClassTypes[CLASSNAME_GradedPolySet] = CLASS_INTERNAL; |
ClassTypes[CLASSNAME_GradedPolySet] = CLASS_INTERNAL; |
| ClassNames[CLASSNAME_GradedPolySet] = "Class.GradedPolySet"; |
ClassNames[CLASSNAME_GradedPolySet] = "Class.GradedPolySet"; |
| ClassDictionaries[CLASSNAME_GradedPolySet] = (struct object *)NULL; |
ClassDictionaries[CLASSNAME_GradedPolySet] = (struct object *)NULL; |
| /* We have to creat new dictionary in a future. */ |
/* We have to creat new dictionary in a future. */ |
| |
|
| ClassTypes[CLASSNAME_mathcap] = CLASS_OBJ; |
ClassTypes[CLASSNAME_mathcap] = CLASS_OBJ; |
| ClassNames[CLASSNAME_mathcap] = "Class.mathcap"; |
ClassNames[CLASSNAME_mathcap] = "Class.mathcap"; |
| ClassDictionaries[CLASSNAME_mathcap] = (struct object *)NULL; |
ClassDictionaries[CLASSNAME_mathcap] = (struct object *)NULL; |
| /* We have to creat new dictionary in a future. */ |
/* We have to creat new dictionary in a future. */ |
| |
|
| ClassTypes[CLASSNAME_CMO] = CLASS_OBJ; |
ClassTypes[CLASSNAME_CMO] = CLASS_OBJ; |
| ClassNames[CLASSNAME_CMO] = "Class.CMO"; |
ClassNames[CLASSNAME_CMO] = "Class.CMO"; |
| ClassDictionaries[CLASSNAME_CMO] = (struct object *)NULL; |
ClassDictionaries[CLASSNAME_CMO] = (struct object *)NULL; |
| /* We have to creat new dictionary in a future. */ |
/* We have to creat new dictionary in a future. */ |
| |
|
| ClassTypes[CLASSNAME_indeterminate] = CLASS_OBJ; |
ClassTypes[CLASSNAME_indeterminate] = CLASS_OBJ; |
| ClassNames[CLASSNAME_indeterminate] = "Class.indeterminate"; |
ClassNames[CLASSNAME_indeterminate] = "Class.indeterminate"; |
| Line 76 initClassDataBase() { |
|
| Line 76 initClassDataBase() { |
|
| ClassTypes[CLASSNAME_sampleClass] = CLASS_OBJ; |
ClassTypes[CLASSNAME_sampleClass] = CLASS_OBJ; |
| ClassNames[CLASSNAME_sampleClass] = "Class.sampleClass"; |
ClassNames[CLASSNAME_sampleClass] = "Class.sampleClass"; |
| ClassDictionaries[CLASSNAME_sampleClass] = (struct object *)NULL; |
ClassDictionaries[CLASSNAME_sampleClass] = (struct object *)NULL; |
| /* We have to creat new dictionary in a future. */ |
/* We have to creat new dictionary in a future. */ |
| |
|
| } |
} |
| |
|
| Line 140 int KclassEqualQ(struct object ob1,struct object ob2) |
|
| Line 140 int KclassEqualQ(struct object ob1,struct object ob2) |
|
| case CLASSNAME_sampleClass: |
case CLASSNAME_sampleClass: |
| return(eqSampleClass(KopSampleClass(ob1),KopSampleClass(ob2))); |
return(eqSampleClass(KopSampleClass(ob1),KopSampleClass(ob2))); |
| break; |
break; |
| |
case CLASSNAME_indeterminate: |
| |
return(KooEqualQ(KopIndeterminate(ob1),KopIndeterminate(ob2))); |
| |
break; |
| default: |
default: |
| errorKan1("%s\n","kclass.c (KclassEqualQ cannot compare these objects.)"); |
errorKan1("%s\n","kclass.c (KclassEqualQ cannot compare these objects.)"); |
| break; |
break; |
| Line 157 void fprintMathCap(FILE *fp,struct object *op) |
|
| Line 160 void fprintMathCap(FILE *fp,struct object *op) |
|
| } |
} |
| |
|
| struct object KpoMathCap(struct object *obp) { |
struct object KpoMathCap(struct object *obp) { |
| struct object rob; |
struct object rob = OINIT; |
| struct object *newobp; |
struct object *newobp; |
| |
|
| newobp = (struct object *) sGC_malloc(sizeof(struct object)); |
newobp = (struct object *) sGC_malloc(sizeof(struct object)); |
| Line 182 struct object KclassDataConversion(struct object ob1,s |
|
| Line 185 struct object KclassDataConversion(struct object ob1,s |
|
| ob1(with class tag) [(class) (class-name)] dc : method=2 |
ob1(with class tag) [(class) (class-name)] dc : method=2 |
| ob1(with class tag) (usual flag) dc : method=3 |
ob1(with class tag) (usual flag) dc : method=3 |
| It also create a new class object. |
It also create a new class object. |
| |
ob1 (error) dc --> ErrorObject with the contents ob1 |
| |
|
| |
ob1(with class tag) (body) dc --> [left tag, right body of ob1.] |
| */ |
*/ |
| struct object rob = NullObject; |
struct object rob = NullObject; |
| int method ; |
int method ; |
| struct object ff0; |
struct object ff0 = OINIT; |
| struct object ff1; |
struct object ff1 = OINIT; |
| struct object ob3; /* for work.*/ |
struct object ob3 = OINIT; /* for work.*/ |
| struct object ob4; |
struct object ob4 = OINIT; |
| char *ccc; |
char *ccc; |
| char *key; |
char *key; |
| |
|
| Line 228 struct object KclassDataConversion(struct object ob1,s |
|
| Line 234 struct object KclassDataConversion(struct object ob1,s |
|
| rob = KpoIndeterminate(ob1); |
rob = KpoIndeterminate(ob1); |
| }else if (strcmp(ccc,"mathcap") == 0) { |
}else if (strcmp(ccc,"mathcap") == 0) { |
| /* You should check ob1 contains mathcap data or not. |
/* You should check ob1 contains mathcap data or not. |
| I've not yet written them. |
I've not yet written them. |
| */ |
*/ |
| rob = KpoMathCap(&ob1); |
rob = KpoMathCap(&ob1); |
| }else if (strcmp(ccc,"tree") == 0) { |
}else if (strcmp(ccc,"tree") == 0) { |
| if (ob1.tag != Sarray) errorKan1("%s\n","kclass.c : KclassDataConversion , !array --> indeterminate is not supported."); |
if (ob1.tag != Sarray) errorKan1("%s\n","kclass.c : KclassDataConversion , !array --> tree is not supported."); |
| rob = KpoTree(ob1); |
rob = KpoTree(ob1); |
| }else if (strcmp(ccc,"recursivePolynomial") == 0) { |
}else if (strcmp(ccc,"recursivePolynomial") == 0) { |
| if (ob1.tag != Spoly) errorKan1("%s\n","kclass.c : KclassDataConversion , !poly --> recursivePoly is not supported."); |
if (ob1.tag != Spoly) errorKan1("%s\n","kclass.c : KclassDataConversion , !poly --> recursivePoly is not supported."); |
| Line 253 struct object KclassDataConversion(struct object ob1,s |
|
| Line 259 struct object KclassDataConversion(struct object ob1,s |
|
| switch(ectag(ob1)) { |
switch(ectag(ob1)) { |
| case CLASSNAME_sampleClass: |
case CLASSNAME_sampleClass: |
| if (strcmp(ccc,"sampleClass") == 0) { |
if (strcmp(ccc,"sampleClass") == 0) { |
| rob = KpoSampleClass(&ob1); |
rob = KpoSampleClass(&ob1); |
| }else{ |
}else{ |
| errorKan1("%s\n","KclassDataCOnversion: this type of data conversion from class object to class object is not supported."); |
errorKan1("%s\n","KclassDataCOnversion: this type of data conversion from class object to class object is not supported."); |
| } |
} |
| break; |
break; |
| default: |
default: |
| errorKan1("%s\n","KclassDataConversion: this type of data conversion from class object to class object is not supported."); |
errorKan1("%s\n","KclassDataConversion: this type of data conversion from class object to class object is not supported."); |
| } |
} |
| break; |
break; |
| case 3: |
case 3: |
| key = KopString(ob2); /* target data type */ |
key = KopString(ob2); /* target data type */ |
| if (key[0] == 't' || key[0] =='e') { |
if (key[0] == 't' || key[0] =='e') { |
| if (strcmp(key,"type?")==0) { |
if (strcmp(key,"type?")==0) { |
| rob = KpoInteger(ob1.tag); |
rob = KpoInteger(ob1.tag); |
| return(rob); |
return(rob); |
| }else if (strcmp(key,"type??")==0) { |
}else if (strcmp(key,"type??")==0) { |
| if (ob1.tag != Sclass) { |
if (ob1.tag != Sclass) { |
| rob = KpoInteger(ob1.tag); |
rob = KpoInteger(ob1.tag); |
| }else { |
}else { |
| rob = KpoInteger(ectag(ob1)); |
rob = KpoInteger(ectag(ob1)); |
| } |
} |
| return(rob); |
return(rob); |
| }else if (strcmp(key,"error")==0) { |
}else if (strcmp(key,"error")==0) { |
| rob = KnewErrorPacketObj(ob1); |
rob = KnewErrorPacketObj(ob1); |
| return(rob); |
return(rob); |
| } |
} |
| |
}else if (key[0] == 'b') { |
| |
if (strcmp(key,"body") == 0) { |
| |
rob = newObjectArray(2); |
| |
putoa(rob,0,KpoInteger(ectag(ob1))); |
| |
putoa(rob,1,*((struct object *)(ecbody(ob1)))); |
| |
return rob; |
| |
} |
| } |
} |
| |
|
| /* Class object to primtive Object */ |
/* Class object to primtive Object */ |
| switch(ectag(ob1)) { |
switch(ectag(ob1)) { |
| case CLASSNAME_sampleClass: |
case CLASSNAME_sampleClass: |
| if (strcmp(key,"array") == 0) { |
if (strcmp(key,"array") == 0) { |
| rob = *(KopSampleClass(ob1)); |
rob = *(KopSampleClass(ob1)); |
| }else{ |
}else{ |
| errorKan1("%s\n","KclassDataCOnversion: this type of data conversion from class object to primitive object is not supported."); |
errorKan1("%s\n","KclassDataCOnversion: this type of data conversion from class object to primitive object is not supported."); |
| } |
} |
| break; |
break; |
| case CLASSNAME_mathcap: |
case CLASSNAME_mathcap: |
| if (strcmp(key,"array") == 0) { |
if (strcmp(key,"array") == 0) { |
| rob = newObjectArray(2); |
rob = newObjectArray(2); |
| ob3 = KpoString("mathcap-object"); |
ob3 = KpoString("mathcap-object"); |
| putoa(rob,0,ob3); |
putoa(rob,0,ob3); |
| putoa(rob,1,*(KopMathCap(ob1))); |
putoa(rob,1,*(KopMathCap(ob1))); |
| }else{ |
}else{ |
| errorKan1("%s\n","KclassDataConversion: this type of data conversion from class object mathcap to primitive object is not supported."); |
errorKan1("%s\n","KclassDataConversion: this type of data conversion from class object mathcap to primitive object is not supported."); |
| } |
} |
| break; |
break; |
| case CLASSNAME_indeterminate: |
case CLASSNAME_indeterminate: |
| if (strcmp(key,"string") == 0) { |
if (strcmp(key,"string") == 0) { |
| rob = KopIndeterminate(ob1); |
rob = KopIndeterminate(ob1); |
| }else { |
}else { |
| errorKan1("%s\n","KclassDataConversion: interminate-->?? is not supported.."); |
errorKan1("%s\n","KclassDataConversion: interminate-->?? is not supported.."); |
| } |
} |
| break; |
break; |
| case CLASSNAME_tree: |
case CLASSNAME_tree: |
| if (strcmp(key,"array") == 0) { |
if (strcmp(key,"array") == 0) { |
| rob = KopTree(ob1); |
rob = KopTree(ob1); |
| }else { |
}else { |
| errorKan1("%s\n","KclassDataConversion: tree-->?? is not supported.."); |
errorKan1("%s\n","KclassDataConversion: tree-->?? is not supported.."); |
| } |
} |
| break; |
break; |
| case CLASSNAME_recursivePolynomial: |
case CLASSNAME_recursivePolynomial: |
| if (strcmp(key,"string") == 0) { |
if (strcmp(key,"string") == 0) { |
| errorKan1("%s\n","Translation of recursive polynomial to a string should be implemented."); |
errorKan1("%s\n","Translation of recursive polynomial to a string should be implemented."); |
| }else if (strcmp(key,"poly") == 0) { |
}else if (strcmp(key,"poly") == 0) { |
| rob = recursivePolyToPoly(ob1); |
rob = recursivePolyToPoly(ob1); |
| }else if (strcmp(key,"array") == 0) { |
}else if (strcmp(key,"array") == 0) { |
| rob = KopRecursivePolynomial(ob1); |
rob = KopRecursivePolynomial(ob1); |
| }else { |
}else { |
| errorKan1("%s\n","KclassDataConversion: recursivePoly-->?? is not supported.."); |
errorKan1("%s\n","KclassDataConversion: recursivePoly-->?? is not supported.."); |
| } |
} |
| break; |
break; |
| default: |
default: |
| errorKan1("%s\n","KclassDataConversion: this type of data conversion from class object to primitive object is not supported."); |
errorKan1("%s\n","KclassDataConversion: this type of data conversion from class object to primitive object is not supported."); |
| } |
} |
| break; |
break; |
| } |
} |