RML_END_LABEL RML_BEGIN_LABEL(External__strtok) { char *s; char *delimit = RML_STRINGDATA(rmlA1); char *str = strdup(RML_STRINGDATA(rmlA0)); void * res = (void*)mk_nil(); s=strtok(str,delimit); if (s == NULL) { /* adrpo added 2004-10-27 */ free(str); rmlA0=res; RML_TAILCALLK(rmlFC); } res = (void*)mk_cons(mk_scon(s),res); while (s=strtok(NULL,delimit)) { res = (void*)mk_cons(mk_scon(s),res); } rmlA0=res; /* adrpo added 2004-10-27 */ free(str); /* adrpo changed 2004-10-29 rml_prim_once(RML__list_5freverse); RML_TAILCALLK(rmlSC); */ RML_TAILCALLQ(RML__list_5freverse,1); }
RML_END_LABEL RML_BEGIN_LABEL(Assertions__exampleId) { FILE* stream = popen("$BBBPATH/find_example.rb id", "r"); char* id[5] = {'\0'}; int read = fread((void*)id, 4, sizeof(char), stream); pclose(stream); rmlA0 = mk_scon((const char*)id); RML_TAILCALLK(rmlSC); }
DataField getData(const char *varname,const char *filename, unsigned int size, SimulationResult_Globals* srg) { DataField res; void *cmpvar,*dataset,*lst,*datasetBackup; double *newvars; double d; unsigned int i; unsigned int ncmpvars = 0; res.n = 0; res.data = NULL; /* fprintf(stderr, "getData of Var: %s from file %s\n", varname,filename); */ cmpvar = mk_nil(); cmpvar = mk_cons(mk_scon(varname),cmpvar); dataset = SimulationResultsImpl__readDataset(filename,cmpvar,size,srg); if (dataset==NULL) { /* fprintf(stderr, "getData of Var: %s failed!\n",varname); */ return res; } /* fprintf(stderr, "Data of Var: %s\n", varname); First calculate the length of the matrix */ datasetBackup = dataset; while (RML_NILHDR != RML_GETHDR(dataset)) { lst = RML_CAR(dataset); while (RML_NILHDR != RML_GETHDR(lst)) { res.n++; lst = RML_CDR(lst); } dataset = RML_CDR(dataset); } if (res.n == 0) return res; /* The allocate and read the values */ dataset = datasetBackup; i = res.n; res.data = (double*) malloc(sizeof(double)*res.n); while (RML_NILHDR != RML_GETHDR(dataset)) { lst = RML_CAR(dataset); while (RML_NILHDR != RML_GETHDR(lst)) { res.data[--i] = rml_prim_get_real(RML_CAR(lst)); lst = RML_CDR(lst); } dataset = RML_CDR(dataset); } assert(i == 0); /* for (i=0;i<res.n;i++) fprintf(stderr, "%d: %.6g\n", i, res.data[i]); */ return res; }
void* SimulationResultsCmp_compareResults(const char *filename, const char *reffilename, const char *resultfilename, double reltol, double abstol, void *vars) { char **cmpvars=NULL; char **cmpdiffvars=NULL; unsigned int vardiffindx=0; unsigned int ncmpvars = 0; void *allvars,*cmpvar,*res; unsigned int i,size,size_ref,len,oldlen,j,k; char *var,*var1,*var2; DataField time,timeref,data,dataref; DiffDataField ddf; const char *msg[2] = {"",""}; ddf.data=NULL; ddf.n=0; oldlen = 0; len = 1; /* open files */ /* fprintf(stderr, "Open File %s\n", filename); */ if (UNKNOWN_PLOT == SimulationResultsImpl__openFile(filename,&simresglob_c)) return mk_cons(mk_scon("Error Open File!"),mk_nil()); /* fprintf(stderr, "Open File %s\n", reffilename); */ if (UNKNOWN_PLOT == SimulationResultsImpl__openFile(reffilename,&simresglob_ref)) return mk_cons(mk_scon("Error Open RefFile!"),mk_nil()); size = SimulationResultsImpl__readSimulationResultSize(filename,&simresglob_c); /* fprintf(stderr, "Read size of File %s size= %d\n", filename,size); */ size_ref = SimulationResultsImpl__readSimulationResultSize(reffilename,&simresglob_ref); /* fprintf(stderr, "Read size of File %s size= %d\n", reffilename,size_ref); */ /* get vars to compare */ cmpvars = getVars(vars,&ncmpvars); /* if no var compare all vars */ if (ncmpvars==0){ allvars = SimulationResultsImpl__readVars(filename,&simresglob_c); cmpvars = getVars(vars,&ncmpvars); if (ncmpvars==0) return mk_cons(mk_scon("Error Get Vars!"),mk_nil()); } cmpdiffvars = (char**)malloc(sizeof(char*)*(ncmpvars)); /* fprintf(stderr, "Compare Vars:\n"); /* /* for(i=0;i<ncmpvars;i++) fprintf(stderr, "Var: %s\n", cmpvars[i]); */ /* get time */ /* fprintf(stderr, "get time\n"); */ time = getData("time",filename,size,&simresglob_c); if (time.n==0) { time = getData("Time",filename,size,&simresglob_c); if (time.n==0){ /* fprintf(stderr, "Cannot get var time\n"); */ return mk_cons(mk_scon("Error get time!"),mk_nil()); } } /* fprintf(stderr, "get reftime\n"); */ timeref = getData("time",reffilename,size_ref,&simresglob_ref); if (timeref.n==0) { timeref = getData("Time",reffilename,size_ref,&simresglob_ref); if (timeref.n==0){ /* fprintf(stderr, "Cannot get var reftime\n"); */ return mk_cons(mk_scon("Error get ref time!"),mk_nil()); } } var1=NULL; var2=NULL; /* compare vars */ /* fprintf(stderr, "compare vars\n"); */ for (i=0;i<ncmpvars;i++) { var = cmpvars[i]; len = strlen(var); if (oldlen < len) { if (var1) free(var1); var1 = (char*) malloc(len+1); oldlen = len; } memset(var1,0,len); k = 0; for (j=0;j<len;j++) { if (var[j] !='\"' ) { var1[k] = var[j]; k +=1; } } /* fprintf(stderr, "compare var: %s\n",var); */ /* check if in ref_file */ dataref = getData(var1,reffilename,size_ref,&simresglob_ref); if (dataref.n==0) { if (var2) free(var2); var2 = (char*) malloc(len+1); strncpy(var2,var1,len+1); fixDerInName(var2,len); fixCommaInName(&var2,len); dataref = getData(var2,reffilename,size_ref,&simresglob_ref); if (dataref.n==0) { fprintf(stderr, "Get Data of Var %s from file %s failed\n",var,reffilename); c_add_message(-1, ErrorType_scripting, ErrorLevel_warning, "Get Data of Var failed!\n", msg, 0); continue; } } /* check if in file */ data = getData(var1,filename,size,&simresglob_c); if (data.n==0) { fixDerInName(var1,len); fixCommaInName(&var1,len); data = getData(var1,filename,size,&simresglob_c); if (data.n==0) { if (data.data) free(data.data); fprintf(stderr, "Get Data of Var %s from file %s failed\n",var,filename); c_add_message(-1, ErrorType_scripting, ErrorLevel_warning, "Get Data of Var failed!\n", msg, 0); continue; } } /* compare */ vardiffindx = cmpData(var,&time,&timeref,&data,&dataref,reltol,abstol,&ddf,cmpdiffvars,vardiffindx); /* free */ if (dataref.data) free(dataref.data); if (data.data) free(data.data); } if (writeLogFile(resultfilename,&ddf,filename,reffilename,reltol,abstol)) { c_add_message(-1, ErrorType_scripting, ErrorLevel_warning, "Cannot write result file!\n", msg, 0); } if (ddf.n > 0){ /* fprintf(stderr, "diff: %d\n",ddf.n); */ /* for (i=0;i<vardiffindx;i++) fprintf(stderr, "diffVar: %s\n",cmpdiffvars[i]); */ res = mk_nil(); for (i=0;i<vardiffindx;i++){ res = (void*)mk_cons(mk_scon(cmpdiffvars[i]),res); } res = mk_cons(mk_scon("Files not Equal!"),res); c_add_message(-1, ErrorType_scripting, ErrorLevel_warning, "Files not Equal\n", msg, 0); } else res = mk_cons(mk_scon("Files Equal!"),mk_nil()); if (var1) free(var1); if (var2) free(var2); if (ddf.data) free(ddf.data); if(cmpvars) free(cmpvars); if (time.data) free(time.data); if (timeref.data) free(timeref.data); if (cmpdiffvars) free(cmpdiffvars); /* close files */ SimulationResultsImpl__close(&simresglob_c); SimulationResultsImpl__close(&simresglob_ref); return res; }