![]() |
Millepede-II
V04-00-00
|
00001 00030 #ifdef USE_SHIFT_RFIO 00031 #include <shift.h> 00032 // or this?? 00033 // // needed?#define _LARGEFILE64_SOURCE 00034 //#include <sys/types.h> 00035 //#include "rfio_api.h" 00036 #else 00037 #include <stdio.h> 00038 #endif 00039 #include "cfortran.h" 00040 #ifdef USE_ZLIB 00041 #include <zlib.h> 00042 #endif 00043 00044 /* ________ global variables used for file handling __________ */ 00045 00046 #ifdef USE_ZLIB 00047 gzFile **files; 00048 #else 00049 FILE **files; 00050 #endif 00051 00052 unsigned int maxNumFiles; 00053 unsigned int numAllFiles; 00054 00055 00056 /*______________________________________________________________*/ 00058 00061 void initC(int *nFiles) 00062 { 00063 maxNumFiles = *nFiles; 00064 #ifdef USE_ZLIB 00065 printf(" initC: using zlib version %s\n",ZLIB_VERSION); 00066 files = (gzFile **) malloc(sizeof(gzFile *)*maxNumFiles); 00067 #else 00068 files = (FILE **) malloc(sizeof(FILE *)*maxNumFiles); 00069 #endif 00070 { 00071 int i = 0; 00072 for ( ; i < maxNumFiles; ++i) { 00073 files[i] = 0; 00074 } 00075 } 00076 numAllFiles = 0; 00077 } 00078 FCALLSCSUB1(initC,INITC,initc,PINT) 00079 00080 /*______________________________________________________________*/ 00081 00082 /* void rewinC() */ 00083 /* { */ 00084 /* /\* rewind all open files and start again with first file *\/ */ 00085 00086 /* unsigned int i = numAllFiles; */ 00087 /* while (i--) rewind(files[i]); /\* postfix decrement! *\/ */ 00088 /* fileIndex = 0; */ 00089 /* } */ 00090 /* FCALLSCSUB0(rewinC,REWINC,rewinc) */ 00091 00092 /*______________________________________________________________*/ 00094 00097 void resetC(int *nFileIn) 00098 { 00099 int fileIndex = *nFileIn-1; /* index of current file */ 00100 if (fileIndex < 0) return; /* no file opened at all... */ 00101 #ifdef USE_ZLIB 00102 gzrewind(files[fileIndex]); 00103 #else 00104 /* rewind(files[fileIndex]); Does not work with rfio, so call: */ 00105 fseek(files[fileIndex], 0L, SEEK_SET); 00106 clearerr(files[fileIndex]); /* These two should be the same as rewind... */ 00107 #endif 00108 } 00109 FCALLSCSUB1(resetC,RESETC,resetc,PINT) 00110 00111 /*______________________________________________________________*/ 00113 void openC(const char *fileName, int *errorFlag) 00122 { 00123 /* No return value since to be called as subroutine from fortran */ 00124 00125 if (!errorFlag) return; /* 'printout' error? */ 00126 00127 if (numAllFiles >= maxNumFiles) { 00128 *errorFlag = 1; 00129 } else { 00130 #ifdef USE_ZLIB 00131 files[numAllFiles] = gzopen(fileName, "rb"); 00132 if (!files[numAllFiles]) { 00133 *errorFlag = 2; 00134 } else 00135 #else 00136 files[numAllFiles] = fopen(fileName, "rb"); 00137 if (!files[numAllFiles]) { 00138 *errorFlag = 2; 00139 } else if (ferror(files[numAllFiles])) { 00140 fclose(files[numAllFiles]); 00141 files[numAllFiles] = 0; 00142 *errorFlag = 3; 00143 } else 00144 #endif 00145 { 00146 ++numAllFiles; /* We have one more opened file! */ 00147 *errorFlag = 0; 00148 } 00149 } 00150 } 00151 FCALLSCSUB2(openC,OPENC,openc,STRING,PINT) 00152 00153 /*______________________________________________________________*/ 00155 00170 void readC(float *bufferFloat, int *bufferInt, int *lengthBuffers, 00171 int *nFileIn, int *errorFlag) 00172 { 00173 /* No return value since to be called as subroutine from fortran, 00174 negative *errorFlag are errors, otherwise fine. 00175 00176 *nFileIn: number of the file the record is read from, 00177 starting from 1 (not 0) 00178 */ 00179 00180 if (!errorFlag) return; 00181 *errorFlag = 0; 00182 int fileIndex = *nFileIn-1; /* index of current file */ 00183 if (fileIndex < 0) return; /* no file opened at all... */ 00184 if (!bufferFloat || !bufferInt || !lengthBuffers) { 00185 *errorFlag = -1; 00186 return; 00187 } 00188 00189 /* read length of 'record' */ 00190 int recordLength = 0; /* becomes number of words following in file */ 00191 #ifdef USE_ZLIB 00192 int nCheckR = gzread(files[fileIndex], &recordLength, sizeof(recordLength)); 00193 if (gzeof(files[fileIndex])) { 00194 gzrewind(files[fileIndex]); 00195 *errorFlag = 0; /* Means EOF of file. */ 00196 return; 00197 } 00198 00199 if (sizeof(recordLength) != nCheckR) { 00200 printf("readC: problem reading length of record file %d\n", fileIndex); 00201 *errorFlag = -2; 00202 return; 00203 } 00204 00205 if (recordLength/2 > *lengthBuffers) { 00206 /* printf("readC: given buffers too short (%d, need > %d)\n", *lengthBuffers, 00207 recordLength/2); */ 00208 /* skip floats */ 00209 int i=0; 00210 for ( ; i< recordLength/2; ++i) 00211 { 00212 int nCheckF = gzread(files[fileIndex], bufferFloat, sizeof(bufferFloat[0])); 00213 if (nCheckF != sizeof(bufferFloat[0])) { 00214 printf("readC: problem with stream or EOF skiping floats\n"); 00215 *errorFlag = -8; 00216 return; 00217 } 00218 } 00219 i=0; 00220 /* skip ints */ 00221 for ( ; i< recordLength/2; ++i) 00222 { 00223 int nCheckI = gzread(files[fileIndex], bufferInt, sizeof(bufferInt[0])); 00224 if (nCheckI != sizeof(bufferInt[0])) { 00225 printf("readC: problem with stream or EOF skiping ints\n"); 00226 *errorFlag = -16; 00227 return; 00228 } 00229 } 00230 00231 *errorFlag = -4; 00232 *lengthBuffers = recordLength/2; 00233 return; 00234 } else { 00235 *lengthBuffers = recordLength/2; 00236 } 00237 00238 /* read floats (i.e. derivatives + value + sigma) */ 00239 int nCheckF = gzread(files[fileIndex], bufferFloat, *lengthBuffers*4); 00240 if (nCheckF != *lengthBuffers*4) { 00241 printf("readC: problem with stream or EOF reading floats\n"); 00242 *errorFlag = -8; 00243 return; 00244 } 00245 00246 /* read ints (i.e. parameter lables) */ 00247 int nCheckI = gzread(files[fileIndex], bufferInt, *lengthBuffers*4); 00248 if (nCheckI != *lengthBuffers*4) { 00249 printf("readC: problem with stream or EOF reading ints\n"); 00250 *errorFlag = -16; 00251 return; 00252 } 00253 #else 00254 size_t nCheckR = fread(&recordLength, sizeof(recordLength), 1, 00255 files[fileIndex]); 00256 if (feof(files[fileIndex])) { 00257 /* rewind(files[fileIndex]); Does not work with rfio, so call: */ 00258 fseek(files[fileIndex], 0L, SEEK_SET); 00259 clearerr(files[fileIndex]); /* These two should be the same as rewind... */ 00260 *errorFlag = 0; /* Means EOF of file. */ 00261 return; 00262 } 00263 00264 if (1 != nCheckR || ferror(files[fileIndex])) { 00265 printf("readC: problem reading length of record, file %d\n", 00266 fileIndex); 00267 *errorFlag = -2; 00268 return; 00269 } 00270 00271 if (recordLength/2 > *lengthBuffers) { 00272 /* printf("readC: given buffers too short (%d, need > %d)\n", *lengthBuffers, 00273 recordLength/2); */ 00274 /* skip floats */ 00275 int i=0; 00276 for ( ; i< recordLength/2; ++i) 00277 { 00278 size_t nCheckF = fread(bufferFloat, sizeof(bufferFloat[0]), 1, 00279 files[fileIndex]); 00280 if (ferror(files[fileIndex]) || feof(files[fileIndex]) 00281 || nCheckF != *lengthBuffers) { 00282 printf("readC: problem with stream or EOF skiping floats\n"); 00283 *errorFlag = -8; 00284 return; 00285 } 00286 } 00287 i=0; 00288 /* skip ints */ 00289 for ( ; i< recordLength/2; ++i) 00290 { 00291 size_t nCheckI = fread(bufferInt, sizeof(bufferInt[0]), 1, 00292 files[fileIndex]); 00293 if (ferror(files[fileIndex]) || feof(files[fileIndex]) 00294 || nCheckI != *lengthBuffers) { 00295 printf("readC: problem with stream or EOF skiping ints\n"); 00296 *errorFlag = -16; 00297 return; 00298 } 00299 } 00300 00301 *errorFlag = -4; 00302 *lengthBuffers = recordLength/2; 00303 return; 00304 } else { 00305 *lengthBuffers = recordLength/2; 00306 } 00307 00308 /* read floats (i.e. derivatives + value + sigma) */ 00309 size_t nCheckF = fread(bufferFloat, sizeof(bufferFloat[0]), *lengthBuffers, 00310 files[fileIndex]); 00311 if (ferror(files[fileIndex]) || feof(files[fileIndex]) 00312 || nCheckF != *lengthBuffers) { 00313 printf("readC: problem with stream or EOF reading floats\n"); 00314 *errorFlag = -8; 00315 return; 00316 } 00317 00318 /* read ints (i.e. parameter lables) */ 00319 size_t nCheckI = fread(bufferInt, sizeof(bufferInt[0]), *lengthBuffers, 00320 files[fileIndex]); 00321 if (ferror(files[fileIndex]) || feof(files[fileIndex]) 00322 || nCheckI != *lengthBuffers) { 00323 printf("readC: problem with stream or EOF reading ints\n"); 00324 *errorFlag = -16; 00325 return; 00326 } 00327 #endif 00328 00329 *errorFlag = *lengthBuffers; 00330 } 00331 FCALLSCSUB5(readC,READC,readc,PFLOAT,PINT,PINT,PINT,PINT)