| version 1.5, 2001/05/04 01:06:29 |
version 1.8, 2005/06/16 05:07:23 |
|
|
| /* $OpenXM: OpenXM/src/kan96xx/Kan/Kclass/indeterminate.c,v 1.4 2001/04/12 06:48:27 takayama Exp $ */ |
/* $OpenXM: OpenXM/src/kan96xx/Kan/Kclass/indeterminate.c,v 1.7 2003/11/21 02:10:37 takayama Exp $ */ |
| /* Kclass/indeterminate.c */ |
/* Kclass/indeterminate.c */ |
| /* This file handles indeterminate, tree, recursivePolynomial, |
/* This file handles indeterminate, recursivePolynomial, |
| polynomialInOneVariable |
polynomialInOneVariable |
| */ |
*/ |
| #include <stdio.h> |
#include <stdio.h> |
|
|
| |
|
| /* Data conversion function : see KclassDataConversion*/ |
/* Data conversion function : see KclassDataConversion*/ |
| struct object KpoIndeterminate(struct object ob) { |
struct object KpoIndeterminate(struct object ob) { |
| struct object rob; |
struct object rob = OINIT; |
| struct object *newobp; |
struct object *newobp; |
| rob.tag = Sclass; |
rob.tag = Sclass; |
| rob.lc.ival = CLASSNAME_indeterminate; |
rob.lc.ival = CLASSNAME_indeterminate; |
| Line 30 struct object KpoIndeterminate(struct object ob) { |
|
| Line 30 struct object KpoIndeterminate(struct object ob) { |
|
| |
|
| /* The second constructor. */ |
/* The second constructor. */ |
| struct object KnewIndeterminate(char *s) { |
struct object KnewIndeterminate(char *s) { |
| struct object ob; |
struct object ob = OINIT; |
| |
|
| ob = KpoString(s); /* We do not clone s */ |
ob = KpoString(s); /* We do not clone s */ |
| return(KpoIndeterminate(ob)); |
return(KpoIndeterminate(ob)); |
| Line 43 void fprintIndeterminate(FILE *fp,struct object op) |
|
| Line 43 void fprintIndeterminate(FILE *fp,struct object op) |
|
| printObject(KopIndeterminate(op),0,fp); |
printObject(KopIndeterminate(op),0,fp); |
| } |
} |
| |
|
| |
/* Functions for trees are moved to tree.c */ |
| /* ---------------------------------------------------- */ |
/* ---------------------------------------------------- */ |
| /* Data conversion function : see KclassDataConversion*/ |
|
| struct object KpoTree(struct object ob) { |
|
| struct object rob; |
|
| struct object ob1,ob2,ob3; |
|
| struct object *newobp; |
|
| rob.tag = Sclass; |
|
| rob.lc.ival = CLASSNAME_tree; |
|
| newobp = (struct object *) sGC_malloc(sizeof(struct object)); |
|
| if (newobp == NULL) errorKan1("%s\n","Kclass/indeterminate.c, no more memory."); |
|
| if (ob.tag != Sarray) { |
|
| errorKan1("%s\n","Kclass/indeterminate.c, only properly formatted list object can be transformed into tree. [name, cdname, arglist]."); |
|
| } |
|
| if (getoaSize(ob) < 3) { |
|
| errorKan1("%s\n","Kclass/indeterminate.c, the length must 3 or more than 3. [name, cdname, arglist]."); |
|
| } |
|
| ob1 = getoa(ob,0); ob2 = getoa(ob,1); ob3 = getoa(ob,2); |
|
| if (ob1.tag != Sdollar || ob2.tag != Sdollar || ob3.tag != Sarray) { |
|
| errorKan1("%s\n","Kclass/indeterminate.c, [string name, string cdname, list arglist]."); |
|
| } |
|
| *newobp = ob; |
|
| rob.rc.voidp = newobp; |
|
| return(rob); |
|
| } |
|
| |
|
| |
|
| /* Printing function : see fprintClass */ |
|
| void fprintTree(FILE *fp,struct object op) |
|
| { |
|
| printObject(KopTree(op),0,fp); |
|
| } |
|
| |
|
| int isTreeAdd(struct object ob) { |
|
| struct object name; |
|
| if (ob.tag != Sclass) { |
|
| return(0); |
|
| } |
|
| if (ectag(ob) != CLASSNAME_tree) { |
|
| return(0); |
|
| } |
|
| ob = KopTree(ob); |
|
| if (ob.tag != Sarray) { |
|
| errorKan1("%s\n","CLASSNAME_tree is broken. Should be array."); |
|
| } |
|
| name = getoa(ob,0); |
|
| if (name.tag != Sdollar) { |
|
| errorKan1("%s\n","CLASSNAME_tree is broken. Should be string."); |
|
| } |
|
| if (strcmp(KopString(name),"add") == 0) { |
|
| return(1); |
|
| }else{ |
|
| return(0); |
|
| } |
|
| } |
|
| |
|
| struct object addTree(struct object ob1, struct object ob2) |
|
| { |
|
| struct object rob,aob; |
|
| struct object ob3,ob4; |
|
| int i; |
|
| if (isTreeAdd(ob1) && !isTreeAdd(ob2)) { |
|
| ob1 = KopTree(ob1); |
|
| ob3 = getoa(ob1,2); |
|
| aob = newObjectArray(getoaSize(ob3)+1); |
|
| for (i=0; i<getoaSize(ob3); i++) { |
|
| putoa(aob,i,getoa(ob3,i)); |
|
| } |
|
| putoa(aob,getoaSize(ob3),ob2); |
|
| }else if (!isTreeAdd(ob1) && isTreeAdd(ob2)) { |
|
| ob2 = KopTree(ob2); |
|
| ob3 = getoa(ob2,2); |
|
| aob = newObjectArray(getoaSize(ob3)+1); |
|
| putoa(aob,0,ob1); |
|
| for (i=0; i<getoaSize(ob3); i++) { |
|
| putoa(aob,1+i,getoa(ob3,i)); |
|
| } |
|
| }else if (isTreeAdd(ob1) && isTreeAdd(ob2)) { |
|
| ob1 = KopTree(ob1); |
|
| ob2 = KopTree(ob2); |
|
| ob3 = getoa(ob1,2); |
|
| ob4 = getoa(ob2,2); |
|
| aob = newObjectArray(getoaSize(ob3)+getoaSize(ob4)); |
|
| for (i=0; i<getoaSize(ob3); i++) { |
|
| putoa(aob,i,getoa(ob3,i)); |
|
| } |
|
| for (i=0; i<getoaSize(ob4); i++) { |
|
| putoa(aob,getoaSize(ob3)+i,getoa(ob4,i)); |
|
| } |
|
| }else{ |
|
| aob = newObjectArray(2); |
|
| putoa(aob,0,ob1); |
|
| putoa(aob,1,ob2); |
|
| } |
|
| rob = newObjectArray(3); |
|
| putoa(rob,0,KpoString("add")); |
|
| putoa(rob,1,KpoString("basic")); |
|
| putoa(rob,2,aob); |
|
| return(KpoTree(rob)); |
|
| } |
|
| |
|
| |
|
| /*------------------------------------------*/ |
|
| |
|
| struct object KpoRecursivePolynomial(struct object ob) { |
struct object KpoRecursivePolynomial(struct object ob) { |
| struct object rob; |
struct object rob = OINIT; |
| struct object *newobp; |
struct object *newobp; |
| rob.tag = Sclass; |
rob.tag = Sclass; |
| rob.lc.ival = CLASSNAME_recursivePolynomial; |
rob.lc.ival = CLASSNAME_recursivePolynomial; |
| Line 212 void fprintRecursivePolynomial(FILE *fp,struct object |
|
| Line 111 void fprintRecursivePolynomial(FILE *fp,struct object |
|
| /* old code |
/* old code |
| printObject(KopRecursivePolynomial(op),0,fp); return; |
printObject(KopRecursivePolynomial(op),0,fp); return; |
| */ |
*/ |
| struct object ob; |
struct object ob = OINIT; |
| struct object vlist; |
struct object vlist = OINIT; |
| struct object body; |
struct object body = OINIT; |
| ob = KopRecursivePolynomial(op); |
ob = KopRecursivePolynomial(op); |
| if (ob.tag != Sarray) { |
if (ob.tag != Sarray) { |
| printObject(ob,0,fp); return; |
printObject(ob,0,fp); return; |
| Line 231 void fprintRecursivePolynomial(FILE *fp,struct object |
|
| Line 130 void fprintRecursivePolynomial(FILE *fp,struct object |
|
| /*------------------------------------------*/ |
/*------------------------------------------*/ |
| |
|
| struct object KpoPolynomialInOneVariable(struct object ob) { |
struct object KpoPolynomialInOneVariable(struct object ob) { |
| struct object rob; |
struct object rob = OINIT; |
| struct object *newobp; |
struct object *newobp; |
| rob.tag = Sclass; |
rob.tag = Sclass; |
| rob.lc.ival = CLASSNAME_polynomialInOneVariable; |
rob.lc.ival = CLASSNAME_polynomialInOneVariable; |
| Line 255 struct object polyToRecursivePoly(struct object p) { |
|
| Line 154 struct object polyToRecursivePoly(struct object p) { |
|
| int vx[N0], vd[N0]; |
int vx[N0], vd[N0]; |
| int i,j,k,n,count; |
int i,j,k,n,count; |
| POLY f; |
POLY f; |
| struct object vlist,vlist2; |
struct object vlist = OINIT; |
| struct object ob1,ob2,ob3,ob4; |
struct object vlist2 = OINIT; |
| |
struct object ob1 = OINIT; |
| |
struct object ob2 = OINIT; |
| |
struct object ob3 = OINIT; |
| |
struct object ob4 = OINIT; |
| int vn; |
int vn; |
| |
|
| if (p.tag != Spoly) return(rob); |
if (p.tag != Spoly) return(rob); |
| Line 328 struct object polyToRecursivePoly2(struct object p,str |
|
| Line 231 struct object polyToRecursivePoly2(struct object p,str |
|
| struct object rob = NullObject; |
struct object rob = NullObject; |
| POLY f; |
POLY f; |
| POLY vv; |
POLY vv; |
| struct object v; |
struct object v = OINIT; |
| struct object c; |
struct object c = OINIT; |
| struct object e; |
struct object e = OINIT; |
| int i; |
int i; |
| |
|
| |
|
| Line 363 struct object polyToRecursivePoly2(struct object p,str |
|
| Line 266 struct object polyToRecursivePoly2(struct object p,str |
|
| |
|
| static int isRecursivePolynomial2a(struct object ob2, int n) { |
static int isRecursivePolynomial2a(struct object ob2, int n) { |
| char *s = "Format error (isRecursivePolynomial2a) : "; |
char *s = "Format error (isRecursivePolynomial2a) : "; |
| struct object tmp; |
struct object tmp = OINIT; |
| int i; |
int i; |
| if (ectag(ob2) == CLASSNAME_polynomialInOneVariable) { |
if (ectag(ob2) == CLASSNAME_polynomialInOneVariable) { |
| ob2 = KopPolynomialInOneVariable(ob2); |
ob2 = KopPolynomialInOneVariable(ob2); |
| Line 417 static int isRecursivePolynomial2a(struct object ob2, |
|
| Line 320 static int isRecursivePolynomial2a(struct object ob2, |
|
| int isRecursivePolynomial2(struct object ob) { |
int isRecursivePolynomial2(struct object ob) { |
| /* This checks only the top level */ |
/* This checks only the top level */ |
| char *s = "Format error (isRecursivePolynomial2) : "; |
char *s = "Format error (isRecursivePolynomial2) : "; |
| struct object ob1, ob2,tmp; |
struct object ob1 = OINIT; |
| |
struct object ob2 = OINIT; |
| |
struct object tmp = OINIT; |
| int i; |
int i; |
| int n; |
int n; |
| if (ob.tag != Sclass) return(0); |
if (ob.tag != Sclass) return(0); |
| Line 491 struct object KrvtReplace(struct object rp_o,struct ob |
|
| Line 396 struct object KrvtReplace(struct object rp_o,struct ob |
|
| v_o : variable name (indeterminate). |
v_o : variable name (indeterminate). |
| t_o : tree. |
t_o : tree. |
| */ |
*/ |
| struct object rp, vlist, newvlist, newrp; |
struct object rp = OINIT; |
| |
struct object vlist = OINIT; |
| |
struct object newvlist = OINIT; |
| |
struct object newrp = OINIT; |
| int i,m; |
int i,m; |
| /* Check the data types. */ |
/* Check the data types. */ |
| if (ectag(rp_o) != CLASSNAME_recursivePolynomial) { |
if (ectag(rp_o) != CLASSNAME_recursivePolynomial) { |
| Line 529 struct object KrvtReplace(struct object rp_o,struct ob |
|
| Line 437 struct object KrvtReplace(struct object rp_o,struct ob |
|
| |
|
| |
|
| struct object KreplaceRecursivePolynomial(struct object of,struct object rule) { |
struct object KreplaceRecursivePolynomial(struct object of,struct object rule) { |
| struct object rob,f; |
struct object rob = OINIT; |
| |
struct object f = OINIT; |
| int i; |
int i; |
| int n; |
int n; |
| struct object trule; |
struct object trule = OINIT; |
| |
|
| |
|
| if (rule.tag != Sarray) { |
if (rule.tag != Sarray) { |