27 {
28 const int verbose=0;
29 if(verbose>0) {printf("%s(%s, dft)\n", __func__, filename); fflush(stdout);}
30
31 FILE *fp;
32 char *cptr, *line, *lptr, temp[128];
33 int ret, i, j, c, type=0, voiNr=0, frameNr=0, longest=0;
34 double f;
36
37
38
39 if(data==NULL) {strcpy(
dfterrmsg,
"invalid data");
return 1;}
41
42
43 if(verbose>1) {printf("opening file\n"); fflush(stdout);}
44 fp=fopen(filename, "r");
45 if(fp==NULL) {strcpy(
dfterrmsg,
"cannot open file");
return 1;}
46 fclose(fp);
47
48
49 type=
dftFormat(filename);
if(verbose>1) printf(
" type := %d\n", type);
51 strcpy(
dfterrmsg,
"unknown file format");
return 1;
53 strcpy(
dfterrmsg,
"cannot read fit file");
return 1;
54 }
55
56
58 if(verbose>1) {printf("calling roikbqRead()\n"); fflush(stdout);}
59 ret=
roikbqRead(filename, data);
if(ret!=0)
return ret;
61 return(0);
63 if(verbose>1) {printf("calling idwcRead()\n"); fflush(stdout);}
64 ret=
idwcRead(filename, data);
if(ret!=0)
return ret;
66 return(0);
68 if(verbose>1) {printf("calling iftRead()\n"); fflush(stdout);}
69 ret=
ifRead(filename, data);
if(ret!=0)
return ret;
71 return(0);
75 if(verbose>1) {printf("calling csvRead()\n"); fflush(stdout);}
77 if(ret==0) ret=
csv2dft(&csv, data);
79 if(ret==0) {
80
84
86
88 return(0);
89 }
90
92 }
93
94
97 ) {
98 strcpy(
dfterrmsg,
"unsupported file format");
return 1;
99 }
100
101
102 if(verbose>1) {printf("calling iftRead()\n"); fflush(stdout);}
105
106
107 if(verbose>1) {printf("re-opening file\n"); fflush(stdout);}
108 fp=fopen(filename, "r");
109 if(fp==NULL) {
111 }
112
113
114 i=0; while((c=fgetc(fp))!=EOF) {
115 if(c==10 || c==13) {if(i>longest) longest=i; i=0;} else i++;}
116 if(i>longest) longest=i;
117 rewind(fp); longest+=2;
118 if(verbose>1) {printf(" longest := %d\n", longest); fflush(stdout);}
119
120
121 line=(char*)malloc((longest+1)*sizeof(char));
122 if(line==NULL) {strcpy(
dfterrmsg,
"out of memory");
iftEmpty(&ift); fclose(fp);
return 2;}
123
124
125 i=0; while(fgets(line, longest, fp)!=NULL && *line) {
126 if(line[0]=='#') continue;
127 cptr=strchr(line, '#'); if(cptr!=NULL) *cptr=(char)0;
128 for(j=0; j<(int)strlen(line); j++)
129 if(isalnum((int)line[j]) || line[j]=='.') {i++; break;}
130 }
131 rewind(fp); frameNr=i;
134 if(verbose>1) {printf("frameNr := %d\n", frameNr); fflush(stdout);}
135 if(frameNr<1) {
137 iftEmpty(&ift); free(line); fclose(fp);
return 1;
138 }
139
140
141
142 while(fgets(line, longest, fp)!=NULL) {
143 if(line[0]=='#') continue;
144
146
147
148 char *nline; nline=strdup(line); lptr=nline;
149 cptr=strtok(lptr, " \t\n\r"); if(cptr==NULL) {free(nline); continue;}
150 voiNr=0; while((cptr=strtok(NULL, " \t\n\r"))!=NULL) voiNr++;
151 free(nline);
152 break;
153 }
154 rewind(fp);
155 if(verbose>1) {printf("voiNr := %d\n", voiNr); fflush(stdout);}
156 if(voiNr<1) {
158 iftEmpty(&ift); free(line); fclose(fp);
return 1;
159 }
160
161
162 if(verbose>1) {printf("allocating memory\n"); fflush(stdout);}
165 iftEmpty(&ift); free(line); fclose(fp);
return 2;
166 }
167
168
170 if(verbose>1) {printf("setting title defaults for plain data\n"); fflush(stdout);}
171 int u, n; u=voiNr; n=1; while((u/=10)>=1) n++;
173 for(i=0; i<voiNr; i++) {
176 }
177
179 }
180
181
182
183
185 if(verbose>1) {printf("calling dft_fill_hdr_from_IFT\n"); fflush(stdout);}
187 }
189
190
192 if(fgets(line, longest, fp)==NULL) {
193 strcpy(
dfterrmsg,
"wrong format"); free(line); fclose(fp);
return 101;}
194 if(verbose>1) {printf("calling dftGetPmodTitle\n"); fflush(stdout);}
196
197 }
198
199
200
201
202 i=0;
204 if(verbose>1) {printf("reading DFT title lines\n"); fflush(stdout);}
205 do {
206 if(fgets(line, longest, fp)==NULL) {
207 strcpy(
dfterrmsg,
"wrong format"); free(line); fclose(fp);
return 102;}
208 lptr=line;
209
210 if(line[0]=='#') {
212 continue;
213 }
214 cptr=strchr(line, '#'); if(cptr!=NULL) *cptr=(char)0;
215
216 cptr=strtok(lptr, " \t\n\r"); if(cptr==NULL) continue; else i++;
217 if(i==1) {
218 for(j=0; j<voiNr; j++) {
219 cptr=strtok(NULL, " \t\n\r");
220 if(cptr==NULL) {strcpy(
dfterrmsg,
"wrong format"); free(line); fclose(fp);
return 103;}
221 if(strlen(cptr)>1 || *cptr!='.') {
226
233 }
234 }
235 } else {
236 int u, n; u=voiNr; n=1; while((u/=10)>=1) n++; if(n>6) n=6;
237 snprintf(data->
voi[j].
voiname, 7,
"%0*d", n, j+1);
239 }
240 }
241 } else if(i==2) {
242 if(strcmp(cptr, ".")!=0) {
244 }
else strcpy(data->
studynr,
"");
245 for(j=0; j<voiNr; j++) {
246 if((cptr=strtok(NULL, " \t\n\r"))==NULL) {
247 strcpy(
dfterrmsg,
"missing field on 2nd line");
248 free(line); fclose(fp); return 104;
249 }
250 if(strlen(cptr)>1 || *cptr!='.') {
253 strcat(data->
voi[j].
name,
" ");
255 } else {
257 }
258 }
259
260 if((cptr=strtok(NULL, " \t\n\r"))!=NULL) {
261 strcpy(
dfterrmsg,
"wrong format"); free(line); fclose(fp);
return 105;}
262 } else if(i==3) {
263
265
266 int len, ii=0;
267 j=0;
268 while(j<voiNr) {
269 if((cptr=strtok(NULL, " \t\n\r"))==NULL) {
270 strcpy(
dfterrmsg,
"missing field on 3rd line");
271 free(line); fclose(fp); return 106;
272 }
273 len=strlen(cptr);
274
275 if(ii==0 && cptr[0]=='(' && cptr[len-1]==')') {ii++; continue;}
276
277 if(len>1 || *cptr!='.') {
279
280 strcat(data->
voi[j].
name,
" ");
282 } else {
284 }
285 j++; ii++;
286 }
287 } else if(i==4) {
288
295 else {strcpy(
dfterrmsg,
"wrong format"); free(line); fclose(fp);
return 108;}
296
297 if((cptr=strtok(NULL, " \t\n\r"))==NULL) {
298 strcpy(
dfterrmsg,
"wrong format"); free(line); fclose(fp);
return 109;}
299 strcpy(temp, ""); j=sscanf(cptr, "(%127s)", temp);
300 j=strlen(temp)-1; if(j>=0 && temp[j]==')') temp[j]=(char)0;
303 strcpy(
dfterrmsg,
"wrong format"); free(line); fclose(fp);
return 110;}
304
305 for(j=0; j<voiNr; j++) {
306 if((cptr=strtok(NULL, " \t\n\r"))==NULL) {
307 strcpy(
dfterrmsg,
"wrong format"); free(line); fclose(fp);
return 111;}
308 if(strlen(cptr)==1 && *cptr==
'.') data->
voi[j].
size=0.0;
310 }
311 }
312 } while(i<4);
313 }
314
315
316 if(verbose>1) {printf("reading data lines\n"); fflush(stdout);}
317 i=0; while(fgets(line, longest, fp)!=NULL) {
318
319
320 if(line[0]=='#') {
322 continue;
323 }
324
325 cptr=strchr(line, '#'); if(cptr!=NULL) *cptr=(char)0;
326
327
328 char *nline; nline=strdup(line); lptr=nline;
329 cptr=strtok(lptr, " \t\n\r"); if(cptr==NULL) {free(nline); continue;}
330 if(i<frameNr) {
331
334 free(line); free(nline); fclose(fp); return 130;
335 }
337 data->
x1[i]=f; cptr=strtok(NULL,
" \t\n\r");
340 free(line); free(nline); fclose(fp); return 131;
341 }
342 data->
x[i]=0.5*(data->
x1[i]+data->
x2[i]);
344
345 for(j=0; j<voiNr; j++) {
346 if((cptr=strtok(NULL, " \t\n\r"))==NULL) {
348 free(line); free(nline); fclose(fp); return 132;
349 }
350 if(strlen(cptr)==1 && *cptr=='.')
351 data->
voi[j].
y[i]=nan(
"");
352 else {
355 free(line); free(nline); fclose(fp); return 133;
356 }
359 }
360 }
361 }
362 free(nline);
363 i++;
364 }
365 if(i!=frameNr) {strcpy(
dfterrmsg,
"wrong format"); fclose(fp); free((
char*)line);
return 134;}
366
367
368 fclose(fp); free((char*)line);
369
370
376
377 for(i=0; i<data->
voiNr; i++)
if(strlen(data->
voi[i].
name)<1) {
379 } else {
381 }
382
383
385
386
387 for(i=0; i<data->
voiNr; i++)
if(!strcasecmp(data->
voi[i].
voiname,
"weight")) {
389 for(j=0; j<data->
frameNr; j++) data->
w[j]=data->
voi[i].
y[j];
390
392 strcpy(
dfterrmsg,
"cannot read weight");
return 4;}
394 break;
395 }
396
398
399
400
402
403
404 for(i=0; i<data->
voiNr; i++)
407
408
410 return(0);
411}
int csv2dft(CSV *csv, DFT *dft)
int atof_with_check(char *double_as_string, double *result_value)
void dftSetComments(DFT *dft)
int dftCopyvoi(DFT *data, int from, int to)
int dftSetmem(DFT *data, int frameNr, int voiNr)
void dftFrametimes(DFT *data)
int dftFormat(char *fname)
int dft_fill_hdr_from_IFT(DFT *dft, IFT *ift)
int dftGetPmodTitle(DFT *dft, char *title_line)
int idwcRead(char *filename, DFT *dft)
int ifRead(char *filename, DFT *dft)
int iftRead(IFT *ift, char *filename, int is_key_required, int verbose)
int roikbqRead(char *fname, DFT *dft)
int rnameCatenate(char *rname, int max_rname_len, char *name1, char *name2, char *name3, char space)
int studynr_from_fname(char *fname, char *studynr)
size_t strlcat(char *dst, const char *src, size_t dstsize)