=================================================================== RCS file: /home/cvs/OpenXM/src/phc/phc6.c,v retrieving revision 1.3 retrieving revision 1.4 diff -u -p -r1.3 -r1.4 --- OpenXM/src/phc/phc6.c 2000/10/31 12:22:05 1.3 +++ OpenXM/src/phc/phc6.c 2002/05/02 02:51:37 1.4 @@ -1,5 +1,5 @@ /* phc6.c , yama:1999/sm1-prog/phc6.c */ -/* $OpenXM$ */ +/* $OpenXM: OpenXM/src/phc/phc6.c,v 1.3 2000/10/31 12:22:05 takayama Exp $ */ /* This is a simple C interface to the black-box solver of phc. ** Requirements: ** 1) executable version of phc will be searched in the following order: @@ -26,7 +26,7 @@ union cell { int ival; char *str; struct phc_object *op; - long double longdouble; + double longdouble; }; struct phc_object{ int tag; /* class identifier */ @@ -42,12 +42,12 @@ struct phc_object{ /********** macros to use Sarray **************/ /* put to Object Array */ #define phc_putoa(ob,i,cc) {\ -if ((ob).tag != Sarray) {fprintf(stderr,"Warning: PUTOA is for an array of objects\n");} else \ -{if ((0 <= (i)) && ((i) < (ob).lc.ival)) {\ - (ob.rc.op)[i] = cc;\ -}else{\ - fprintf(stderr,"Warning: PUTOA, the size is %d.\n",(ob).lc.ival);\ -}}} + if ((ob).tag != Sarray) {fprintf(stderr,"Warning: PUTOA is for an array of objects\n");} else \ + {if ((0 <= (i)) && ((i) < (ob).lc.ival)) {\ + (ob.rc.op)[i] = cc;\ + }else{\ + fprintf(stderr,"Warning: PUTOA, the size is %d.\n",(ob).lc.ival);\ + }}} #define phc_getoa(ob,i) ((ob.rc.op)[i]) #define phc_getoaSize(ob) ((ob).lc.ival) @@ -56,7 +56,7 @@ struct phc_object phc_newObjectArray(int size); void phc_printObject(FILE *fp,struct phc_object ob); char *phc_generateUniqueFileName(char *s); char *phc_which(char *s); /* search a path for the file s */ -struct phc_object phc_complexTo(long double r, long double i); +struct phc_object phc_complexTo(double r, double i); int phc_scan_for_string(FILE *fp, char str[]); @@ -66,13 +66,14 @@ struct phc_object phc_call_phc(char *sys); int phc_verbose = 0; int phc_overwrite = 1; /* Always use tmp.input.0 and tmp.output.0 - for work files. */ + for work files. */ main(int argc, char *argv[]) { struct phc_object ob; int n,i,dim; #define INPUTSIZE 4096 char input[INPUTSIZE]; + char fname[INPUTSIZE]; #define A_SIZE 1024 char a[A_SIZE]; int message = 0; @@ -81,13 +82,26 @@ main(int argc, char *argv[]) { phc_verbose = 1; message=1; }else if (strcmp(argv[i],"-g") == 0) { phc_overwrite = 0; + }else if (strcmp(argv[i],"-file") == 0) { + /* For debugging. */ + i++; + strncpy(fname,argv[i],INPUTSIZE-1); + ob = phc_scan_output_of_phc(fname); + n = phc_getoaSize(ob); + printf("[\n"); + for (i=0; i= INPUTSIZE) { - fprintf(stderr,"Too big input for the input buffer input.\n"); exit(10); - } - sprintf(input+strlen(input),"%s\n",a); + if (message) {printf("eq[%d] = ",i); fflush(stdout);} + do { + fgets(a,A_SIZE-1, stdin); + } while (strlen(a) == 0); + if (strlen(a) >= A_SIZE-3) { + fprintf(stderr,"Too big input for the input buffer a.\n"); exit(10); + } + if (strlen(input)+strlen(a) >= INPUTSIZE) { + fprintf(stderr,"Too big input for the input buffer input.\n"); exit(10); + } + sprintf(input+strlen(input),"%s\n",a); } ob = phc_call_phc(input); if (message) { @@ -130,13 +144,44 @@ main(int argc, char *argv[]) { } } -int phc_scan_for_string(FILE *fp, char str[]) +int phc_scan_for_string(FILE *fp, char s[]) /* ** Scans the file fp for a certain string str of length lenstr+1. ** Reading stops when the string has been found, then the variable ** on return equals 1, otherwise 0 is returned. */ +#define BUF_SIZE 1024 { + char buf[BUF_SIZE]; + int pt,n,c,i; + pt = 0; + n=strlen(s); + if (n > BUF_SIZE-2) { + fprintf(stderr,"Too long string for scan_for_string.\n"); + exit(1); + } + for (i=0; i= BUF_SIZE-1) { - fprintf(stderr,"Too long string in phc_scan_for_string\n"); - exit(-1); + fprintf(stderr,"Too long string in phc_scan_for_string\n"); + exit(-1); } index = -1; found = 0; while (((ch = fgetc(fp))!=EOF) && found == 0) - { - if (index == -1 && ch == str[0]) - { - index = 0; - buf[index] = ch; - } - else - { - if (index == lenstr) - { - compare = 0; - for (i=0; str[i] != '\0'; i++) - { - if (buf[i]!=str[i]) - { - compare = compare+1; - } - } - if (compare == 0) - { - found = 1; - } - index = -1; - } - else - if (index > -1 && index < lenstr) - { - index = index+1; - buf[index] = ch; - } - } - if (found == 1) break; - } + { + if (index == -1 && ch == str[0]) + { + index = 0; + buf[index] = ch; + } + else + { + if (index == lenstr) + { + compare = 0; + for (i=0; str[i] != '\0'; i++) + { + if (buf[i]!=str[i]) + { + compare = compare+1; + } + } + if (compare == 0) + { + found = 1; + } + index = -1; + } + else + if (index > -1 && index < lenstr) + { + index = index+1; + buf[index] = ch; + } + } + if (found == 1) break; + } return found; } struct phc_object phc_scan_solutions(FILE *fp, int npaths, int dim ) @@ -192,44 +237,55 @@ struct phc_object phc_scan_solutions(FILE *fp, int npa ** The tolerance for the residual to a solution is set to 1.0E-12. ** Returns solutions. */ +#define BUFSIZE 1024 { struct phc_object rob,sob; char ch; int fnd,i,j,nsols; double res; - long double realpart; - long double imagpart; - long double realparts[npaths][dim]; - long double imagparts[npaths][dim]; + double realpart; + double imagpart; + /* double realparts[npaths][dim]; + double imagparts[npaths][dim]; */ + double *realparts; + double *imagparts; + char buf[BUFSIZE]; nsols = 0; + realparts = (double *)sGC_malloc(sizeof(double)*npaths*dim+1); + imagparts = (double *)sGC_malloc(sizeof(double)*npaths*dim+1); while ((ch = fgetc(fp)) != EOF) { fnd = phc_scan_for_string(fp,"start residual :"); if (fnd==1) - { - fscanf(fp,"%E",&res); - /* printf(" residual = "); printf("%E\n",res); */ - if (res < 1.0E-12) { - nsols = nsols+1; - if (nsols > npaths) { - fprintf(stderr,"Something is wrong in phc_scan_solutions\n"); - fprintf(stderr,"npaths=%d, nsols=%d \n",npaths,nsols); - exit(-1); - } - } - fnd = phc_scan_for_string(fp,"the solution for t :"); - for (i=0;i npaths) { + fprintf(stderr,"Something is wrong in phc_scan_solutions\n"); + fprintf(stderr,"npaths=%d, nsols=%d \n",npaths,nsols); + exit(-1); + } + } + fnd = phc_scan_for_string(fp,"the solution for t :"); + for (i=0;i