Millepede-II  V04-00-00
 All Classes Files Functions Variables Enumerator
readc.c
Go to the documentation of this file.
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)