27 #define MAX_LINE_SIZE 160 28 #define MAX_BREAKS 100 52 int max_breaks,
int *n_breaks);
61 static int getNumber(
char **pbeg,
double *
value)
65 while(isspace((
int)**pbeg) && **pbeg!=
'\0') (*pbeg)++;
66 if(**pbeg ==
'!' || **pbeg ==
'\0')
return(-1);
67 if(sscanf(*pbeg,
"%lf%n",value,&nchars)!=1)
return(-1);
72 static void errExit(
char *pmessage)
74 fprintf(
stderr,
"%s\n", pmessage);
79 int main(
int argc,
char **argv)
100 fprintf(
stderr,
"usage: makeBpt file.data [outfile]\n");
104 plastSlash = strrchr(argv[1],
'/');
105 plastSlash = (plastSlash ? plastSlash+1 : argv[1]);
106 outFilename = calloc(1,strlen(plastSlash)+2);
108 fprintf(
stderr,
"calloc failed\n");
111 strcpy(outFilename,plastSlash);
112 pext = strstr(outFilename,
".data");
114 fprintf(
stderr,
"Input file MUST have .data extension\n");
119 outFilename = calloc(1,strlen(argv[2])+1);
121 fprintf(
stderr,
"calloc failed\n");
124 strcpy(outFilename,argv[2]);
126 inFile = fopen(argv[1],
"r");
128 fprintf(
stderr,
"Error opening %s\n",argv[1]);
131 outFile = fopen(outFilename,
"w");
133 fprintf(
stderr,
"Error opening %s\n",outFilename);
139 while(isspace((
int)*pbeg) && *pbeg!=
'\0') pbeg++;
140 if(*pbeg ==
'!' || *pbeg ==
'\0')
continue;
141 while(*pbeg!=
'"' && *pbeg!=
'\0') pbeg++;
142 if(*pbeg!=
'"' ) errExit(
"Illegal Header");
144 while(*pend!=
'"' && *pend!=
'\0') pend++;
145 if(*pend!=
'"') errExit(
"Illegal Header");
147 if(len<=1) errExit(
"Illegal Header");
148 pname = calloc(len+1,
sizeof(
char));
150 fprintf(
stderr,
"calloc failed while processing line %d\n",linenum);
153 strncpy(pname,pbeg,len);
156 if(getNumber(&pbeg,&value)) errExit(
"Illegal Header");
158 if(getNumber(&pbeg,&value)) errExit(
"Illegal Header");
160 if(getNumber(&pbeg,&value)) errExit(
"Illegal Header");
162 if(getNumber(&pbeg,&value)) errExit(
"Illegal Header");
164 if(getNumber(&pbeg,&value)) errExit(
"Illegal Header");
166 if(getNumber(&pbeg,&value)) errExit(
"Illegal Header");
168 if(getNumber(&pbeg,&value)) errExit(
"Illegal Header");
170 if(getNumber(&pbeg,&value)) errExit(
"Illegal Header");
174 errExit(
"Illegal Header");
184 while(!getNumber(&pbeg,&value)) {
188 fprintf(
stderr,
"calloc failed (after header)" 189 " while processing line %d\n",linenum);
195 pnext->
next = pdataList;
201 errExit(
"create_break failed: no name specified\n");
211 pdata[n] = pnext->
value;
214 free((
void *)pdataList);
218 errExit(
"create_break failed\n");
219 fprintf(outFile,
"breaktable(%s) {\n",pname);
220 for(n=0; n<nBreak; n++) {
221 fprintf(outFile,
"\t%f %f\n",brkint[n].raw,brkint[n].eng);
223 fprintf(outFile,
"}\n");
230 int max_breaks,
int *n_breaks)
233 double *table = pbci->
pTable;
234 long ntable = pbci->
nTable;
259 errExit(
"create_break: engLow >= engHigh");
264 errExit(
"create_break: engLow > engHigh");
268 errExit(
"create_break: tblEngDelta <= 0.0");
272 errExit(
"raw data must have at least 3 elements");
300 tbllow = table[
i] + (table[i + 1] - table[
i]) * (ilow - (
double)
i);
306 tblhigh = table[
i] + (table[i + 1] - table[
i]) * (ihigh - (
double)
i);
309 offset = pbci->
rawHigh - slope * tblhigh;
311 for (i = 0; i < ntable; i++)
312 table[i] = table[i] * slope + offset;
341 rawBeg = table[
i] + (table[i + 1] - table[
i]) * (ilow - (
double)
i);
344 if( ibeg < ilow ) ibeg = ibeg + 1;
348 pbrkInt->
raw = rawBeg;
349 pbrkInt->
eng = engBeg;
351 while ((engBeg <= pbci->
engHigh) && (ibeg < ntable - 1)) {
356 inc = (int) ((ihigh - ilow) / 10.0);
365 if (imax >= ntable) {
368 inc = ntable - iend - 1;
371 if (imax > (
int) (ihigh + 1.0)) {
373 imax = (int) (ihigh + 1.0);
374 inc = (int) (ihigh + 1.0) - iend;
379 rawEnd = table[imax];
381 slope = (engEnd - engBeg) / (rawEnd - rawBeg);
383 for (i = ibeg + 1; i <= imax; i++) {
384 engCalc = engBeg + slope * (table[
i] - rawBeg);
386 error = engCalc - engActual;
407 if ((iend <= ibeg) && (iend < (int) ihigh)) {
408 errExit(
"Could not meet accuracy criteria");
411 pbrkInt->
slope = slope;
413 if (n++ >= max_breaks) {
414 errExit(
"Break point table too large");
421 pbrkInt->
raw = rawBeg;
422 pbrkInt->
eng = engBeg + (pbrkInt->
raw - rawBeg) * slope;
424 pbrkInt->
slope = 0.0;
Miscellaneous macro definitions.
A doubly-linked list library.
struct brkCreateInfo brkCreateInfo
int main(int argc, char **argv)
brkInt brkint[MAX_BREAKS]