Millepede-II  V04-00-00_preview
 All Classes Files Functions Variables Enumerator Pages
readc.c
Go to the documentation of this file.
1 
30 #ifdef USE_SHIFT_RFIO
31 #include <shift.h>
32 // or this??
33 // // needed?#define _LARGEFILE64_SOURCE
34 //#include <sys/types.h>
35 //#include "rfio_api.h"
36 #else
37 #include <stdio.h>
38 #endif
39 #include "cfortran.h"
40 #ifdef USE_ZLIB
41 #include <zlib.h>
42 #endif
43 
44 /* ________ global variables used for file handling __________ */
45 
46 #ifdef USE_ZLIB
47 gzFile **files;
48 #else
49 FILE **files;
50 #endif
51 
52 unsigned int maxNumFiles;
53 unsigned int numAllFiles;
54 
55 
56 /*______________________________________________________________*/
58 
61 void initC(int *nFiles)
62 {
63  maxNumFiles = *nFiles;
64 #ifdef USE_ZLIB
65  printf(" initC: using zlib version %s\n",ZLIB_VERSION);
66  files = (gzFile **) malloc(sizeof(gzFile *)*maxNumFiles);
67 #else
68  files = (FILE **) malloc(sizeof(FILE *)*maxNumFiles);
69 #endif
70  {
71  int i = 0;
72  for ( ; i < maxNumFiles; ++i) {
73  files[i] = 0;
74  }
75  }
76  numAllFiles = 0;
77 }
78 FCALLSCSUB1(initC,INITC,initc,PINT)
79 
80 /*______________________________________________________________*/
81 
82 /* void rewinC() */
83 /* { */
84 /* /\* rewind all open files and start again with first file *\/ */
85 
86 /* unsigned int i = numAllFiles; */
87 /* while (i--) rewind(files[i]); /\* postfix decrement! *\/ */
88 /* fileIndex = 0; */
89 /* } */
90 /* FCALLSCSUB0(rewinC,REWINC,rewinc) */
91 
92 /*______________________________________________________________*/
94 
97 void resetC(int *nFileIn)
98 {
99  int fileIndex = *nFileIn-1; /* index of current file */
100  if (fileIndex < 0) return; /* no file opened at all... */
101 #ifdef USE_ZLIB
102  gzrewind(files[fileIndex]);
103 #else
104  /* rewind(files[fileIndex]); Does not work with rfio, so call: */
105  fseek(files[fileIndex], 0L, SEEK_SET);
106  clearerr(files[fileIndex]); /* These two should be the same as rewind... */
107 #endif
108 }
109 FCALLSCSUB1(resetC,RESETC,resetc,PINT)
110 
111 /*______________________________________________________________*/
113 void openC(const char *fileName, int *errorFlag)
122 {
123  /* No return value since to be called as subroutine from fortran */
124 
125  if (!errorFlag) return; /* 'printout' error? */
126 
127  if (numAllFiles >= maxNumFiles) {
128  *errorFlag = 1;
129  } else {
130 #ifdef USE_ZLIB
131  files[numAllFiles] = gzopen(fileName, "rb");
132  if (!files[numAllFiles]) {
133  *errorFlag = 2;
134  } else
135 #else
136  files[numAllFiles] = fopen(fileName, "rb");
137  if (!files[numAllFiles]) {
138  *errorFlag = 2;
139  } else if (ferror(files[numAllFiles])) {
140  fclose(files[numAllFiles]);
141  files[numAllFiles] = 0;
142  *errorFlag = 3;
143  } else
144 #endif
145  {
146  ++numAllFiles; /* We have one more opened file! */
147  *errorFlag = 0;
148  }
149  }
150 }
151 FCALLSCSUB2(openC,OPENC,openc,STRING,PINT)
152 
153 /*______________________________________________________________*/
155 
170  void readC(float *bufferFloat, int *bufferInt, int *lengthBuffers,
171  int *nFileIn, int *errorFlag)
172 {
173  /* No return value since to be called as subroutine from fortran,
174  negative *errorFlag are errors, otherwise fine.
175 
176  *nFileIn: number of the file the record is read from,
177  starting from 1 (not 0)
178  */
179 
180  if (!errorFlag) return;
181  *errorFlag = 0;
182  int fileIndex = *nFileIn-1; /* index of current file */
183  if (fileIndex < 0) return; /* no file opened at all... */
184  if (!bufferFloat || !bufferInt || !lengthBuffers) {
185  *errorFlag = -1;
186  return;
187  }
188 
189  /* read length of 'record' */
190  int recordLength = 0; /* becomes number of words following in file */
191 #ifdef USE_ZLIB
192  int nCheckR = gzread(files[fileIndex], &recordLength, sizeof(recordLength));
193  if (gzeof(files[fileIndex])) {
194  gzrewind(files[fileIndex]);
195  *errorFlag = 0; /* Means EOF of file. */
196  return;
197  }
198 
199  if (sizeof(recordLength) != nCheckR) {
200  printf("readC: problem reading length of record file %d\n", fileIndex);
201  *errorFlag = -2;
202  return;
203  }
204 
205  if (recordLength/2 > *lengthBuffers) {
206 /* printf("readC: given buffers too short (%d, need > %d)\n", *lengthBuffers,
207  recordLength/2); */
208  /* skip floats */
209  int i=0;
210  for ( ; i< recordLength/2; ++i)
211  {
212  int nCheckF = gzread(files[fileIndex], bufferFloat, sizeof(bufferFloat[0]));
213  if (nCheckF != sizeof(bufferFloat[0])) {
214  printf("readC: problem with stream or EOF skiping floats\n");
215  *errorFlag = -8;
216  return;
217  }
218  }
219  i=0;
220  /* skip ints */
221  for ( ; i< recordLength/2; ++i)
222  {
223  int nCheckI = gzread(files[fileIndex], bufferInt, sizeof(bufferInt[0]));
224  if (nCheckI != sizeof(bufferInt[0])) {
225  printf("readC: problem with stream or EOF skiping ints\n");
226  *errorFlag = -16;
227  return;
228  }
229  }
230 
231  *errorFlag = -4;
232  *lengthBuffers = recordLength/2;
233  return;
234  } else {
235  *lengthBuffers = recordLength/2;
236  }
237 
238  /* read floats (i.e. derivatives + value + sigma) */
239  int nCheckF = gzread(files[fileIndex], bufferFloat, *lengthBuffers*4);
240  if (nCheckF != *lengthBuffers*4) {
241  printf("readC: problem with stream or EOF reading floats\n");
242  *errorFlag = -8;
243  return;
244  }
245 
246  /* read ints (i.e. parameter lables) */
247  int nCheckI = gzread(files[fileIndex], bufferInt, *lengthBuffers*4);
248  if (nCheckI != *lengthBuffers*4) {
249  printf("readC: problem with stream or EOF reading ints\n");
250  *errorFlag = -16;
251  return;
252  }
253 #else
254  size_t nCheckR = fread(&recordLength, sizeof(recordLength), 1,
255  files[fileIndex]);
256  if (feof(files[fileIndex])) {
257  /* rewind(files[fileIndex]); Does not work with rfio, so call: */
258  fseek(files[fileIndex], 0L, SEEK_SET);
259  clearerr(files[fileIndex]); /* These two should be the same as rewind... */
260  *errorFlag = 0; /* Means EOF of file. */
261  return;
262  }
263 
264  if (1 != nCheckR || ferror(files[fileIndex])) {
265  printf("readC: problem reading length of record, file %d\n",
266  fileIndex);
267  *errorFlag = -2;
268  return;
269  }
270 
271  if (recordLength/2 > *lengthBuffers) {
272  /* printf("readC: given buffers too short (%d, need > %d)\n", *lengthBuffers,
273  recordLength/2); */
274  /* skip floats */
275  int i=0;
276  for ( ; i< recordLength/2; ++i)
277  {
278  size_t nCheckF = fread(bufferFloat, sizeof(bufferFloat[0]), 1,
279  files[fileIndex]);
280  if (ferror(files[fileIndex]) || feof(files[fileIndex])
281  || nCheckF != *lengthBuffers) {
282  printf("readC: problem with stream or EOF skiping floats\n");
283  *errorFlag = -8;
284  return;
285  }
286  }
287  i=0;
288  /* skip ints */
289  for ( ; i< recordLength/2; ++i)
290  {
291  size_t nCheckI = fread(bufferInt, sizeof(bufferInt[0]), 1,
292  files[fileIndex]);
293  if (ferror(files[fileIndex]) || feof(files[fileIndex])
294  || nCheckI != *lengthBuffers) {
295  printf("readC: problem with stream or EOF skiping ints\n");
296  *errorFlag = -16;
297  return;
298  }
299  }
300 
301  *errorFlag = -4;
302  *lengthBuffers = recordLength/2;
303  return;
304  } else {
305  *lengthBuffers = recordLength/2;
306  }
307 
308  /* read floats (i.e. derivatives + value + sigma) */
309  size_t nCheckF = fread(bufferFloat, sizeof(bufferFloat[0]), *lengthBuffers,
310  files[fileIndex]);
311  if (ferror(files[fileIndex]) || feof(files[fileIndex])
312  || nCheckF != *lengthBuffers) {
313  printf("readC: problem with stream or EOF reading floats\n");
314  *errorFlag = -8;
315  return;
316  }
317 
318  /* read ints (i.e. parameter lables) */
319  size_t nCheckI = fread(bufferInt, sizeof(bufferInt[0]), *lengthBuffers,
320  files[fileIndex]);
321  if (ferror(files[fileIndex]) || feof(files[fileIndex])
322  || nCheckI != *lengthBuffers) {
323  printf("readC: problem with stream or EOF reading ints\n");
324  *errorFlag = -16;
325  return;
326  }
327 #endif
328 
329  *errorFlag = *lengthBuffers;
330  }
331 FCALLSCSUB5(readC,READC,readc,PFLOAT,PINT,PINT,PINT,PINT)