mseek : update after https://codereview.scilab.org/#/c/12551/ 35/12535/6
Cedric Delamarre [Fri, 13 Sep 2013 15:01:16 +0000 (17:01 +0200)]
/!\ LONG TIME EXECUTION  /!\
exec("/home/ced/work/scilab/scilab/modules/fileio/tests/nonreg_tests/bug_6511.tst")

Change-Id: I8ef6f2d7dc4531bdaee269cb199b43d1dece3c7a

scilab/modules/fileio/includes/mget.h
scilab/modules/fileio/includes/mseek.h
scilab/modules/fileio/includes/mtell.h
scilab/modules/fileio/sci_gateway/cpp/sci_mseek.cpp
scilab/modules/fileio/sci_gateway/cpp/sci_mtell.cpp
scilab/modules/fileio/src/cpp/mget.cpp
scilab/modules/fileio/src/cpp/mgetl.cpp
scilab/modules/fileio/src/cpp/mseek.cpp
scilab/modules/fileio/src/cpp/mtell.cpp
scilab/modules/spreadsheet/src/c/xls.c

index 3e933be..4f5bb67 100644 (file)
 * or can be used to read in little or big endian
 * if read fails *ierr contains the number of properly read items
 */
-FILEIO_IMPEXP void C2F(mget) (int *fd, double *res, int *n, char *type, int *ierr);
+FILEIO_IMPEXP void C2F(mget) (int *fd, double *res, int *n, const char *type, int *ierr);
 
-FILEIO_IMPEXP void C2F(mgetnc)(int *fd, void * res, int *n1, char *type, int *ierr);
+FILEIO_IMPEXP void C2F(mgetnc)(int *fd, void * res, int *n1, const char *type, int *ierr);
 
-FILEIO_IMPEXP void mget2(FILE *fa, int swap, double *res, int n, char *type, int *ierr);
+FILEIO_IMPEXP void mget2(FILE *fa, int swap, double *res, int n, const char *type, int *ierr);
 
 #endif /* __MGET_H__ */
 /*--------------------------------------------------------------------------*/
index dd71a61..363fe96 100644 (file)
@@ -19,7 +19,7 @@
 * seek function
 */
 
-FILEIO_IMPEXP int mseek(int fd, int offset, int flag);
+FILEIO_IMPEXP int mseek(int fd, long long offset, int flag);
 
 #endif /* __MSEEK_H__ */
 /*--------------------------------------------------------------------------*/
index 3787fde..1cfb212 100644 (file)
@@ -19,7 +19,7 @@
 * tell function
 */
 
-FILEIO_IMPEXP long int mtell(int fd);
+FILEIO_IMPEXP long long mtell(int fd);
 
 #endif /* __MTELL_H__ */
 /*--------------------------------------------------------------------------*/
index ed1bde1..1e946fd 100644 (file)
@@ -42,7 +42,7 @@ Function::ReturnValue sci_mseek(types::typed_list &in, int _iRetCount, types::ty
 {
     int iFile           = -1; //default file : last opened file
     int iRet            = 0;
-    int iWhere          = 0;
+    long long iWhere    = 0;
     int iFlag           = 0;
     wchar_t* wcsFlag    = NULL;
 
@@ -58,7 +58,7 @@ Function::ReturnValue sci_mseek(types::typed_list &in, int _iRetCount, types::ty
         return types::Function::Error;
     }
 
-    iWhere = static_cast<int>(in[0]->getAs<types::Double>()->get(0));
+    iWhere = static_cast<long long>(in[0]->getAs<types::Double>()->get(0));
 
     if (in.size() == 2)
     {
index 2725a2f..ecc0123 100644 (file)
@@ -59,7 +59,7 @@ types::Function::ReturnValue sci_mtell(types::typed_list &in, int _iRetCount, ty
             return types::Function::Error;
     }
 
-    long int offset = mtell(iFile);
+    long long offset = mtell(iFile);
     if (offset < 0)
     {
         Scierror(999, _("%s: Error while opening, reading or writing.\n"), "mtell");
@@ -67,7 +67,7 @@ types::Function::ReturnValue sci_mtell(types::typed_list &in, int _iRetCount, ty
     }
 
     pOut = new types::Double(dims, dimsArray);
-    pOut->set(0, offset);
+    pOut->set(0, (double)offset);
 
     out.push_back(pOut);
     return Function::OK;
index a654903..27c1e8e 100644 (file)
@@ -74,7 +74,7 @@ extern "C"
     }                                                          \
 }
 /*--------------------------------------------------------------------------*/
-void C2F(mgetnc)(int* fd, void* res, int* n1, char* type, int* ierr)
+void C2F(mgetnc)(int* fd, void* res, int* n1, const char* type, int* ierr)
 {
     char c1;
     char c2;
@@ -171,7 +171,7 @@ void C2F(mgetnc)(int* fd, void* res, int* n1, char* type, int* ierr)
 #define MGET_CHAR(NumType)    MGET_CHAR_NC(NumType);   CONVGD(NumType);
 /*--------------------------------------------------------------------------*/
 /* reads data and store them in double  */
-void mget2(FILE *fa, int swap, double *res, int n, char *type, int *ierr)
+void mget2(FILE *fa, int swap, double *res, int n, const char *type, int *ierr)
 {
     char c1, c2;
     int i, items = n;
@@ -234,7 +234,7 @@ void mget2(FILE *fa, int swap, double *res, int n, char *type, int *ierr)
     return;
 }
 /*--------------------------------------------------------------------------*/
-void C2F(mget) (int *fd, double *res, int *n, char *type, int *ierr)
+void C2F(mget) (int *fd, double *res, int *n, const char *type, int *ierr)
 {
     *ierr = 0;
     if (strlen(type) == 0)
index d456e33..9e71eca 100644 (file)
@@ -96,7 +96,7 @@ wchar_t **mgetl(int fd, int nbLinesIn, int *nbLinesOut, int *ierr)
     {
         wchar_t* Line = (wchar_t*)MALLOC(LINE_MAX * iLineSizeMult * sizeof(wchar_t));
         int nbLines = 0;
-        int iPos = 0;
+        long long iPos = 0;
         if (nbLinesIn < 0)
         {
             strLines = (wchar_t **)MALLOC(sizeof(wchar_t *));
index 126ff54..2319937 100644 (file)
@@ -26,7 +26,7 @@ extern "C"
 }
 /*--------------------------------------------------------------------------*/
 
-int mseek(int fd, int offset, int iflag)
+int mseek(int fd, long long offset, int iflag)
 {
 #if (defined(sun) && !defined(SYSV)) || defined(sgi)
     int irep;
@@ -51,7 +51,7 @@ int mseek(int fd, int offset, int iflag)
     }
 
 #if (defined(sun) && !defined(SYSV)) || defined(sgi)
-    irep = fseek(fa, (long) offset, iflag) ;
+    irep = fseek(fa, (long)offset, iflag) ;
     if (irep != 0 )
     {
         return 1;
@@ -63,12 +63,12 @@ int mseek(int fd, int offset, int iflag)
 #else
 #ifdef _MSC_VER
 #if _WIN64
-    if (_fseeki64(fa, (long) offset, iflag) == -1 )
+    if (_fseeki64(fa, offset, iflag) == -1 )
 #else
-    if (fseek(fa, (long) offset, iflag) == -1 )
+    if (fseek(fa, (long)offset, iflag) == -1 )
 #endif
 #else
-    if (fseek(fa, (long) offset, iflag) == -1)
+    if (fseek(fa, (long)offset, iflag) == -1)
 #endif
     {
         return errno; // global variable produced by fseek
index 701da7b..eeadc24 100644 (file)
@@ -23,10 +23,10 @@ extern "C"
 }
 
 /*--------------------------------------------------------------------------*/
-long int mtell(int fd)
+long long mtell(int fd)
 {
     File* pF        = FileManager::getFile(fd);
-    long int offset = -1;
+    long long offset = -1;
 
     if (pF == NULL)
     {
@@ -41,12 +41,12 @@ long int mtell(int fd)
 
 #ifdef _MSC_VER
 #if _WIN64
-    offset = (long)_ftelli64(fa) ;
+    offset = (long long)_ftelli64(fa);
 #else
-    offset = ftell(fa) ;
+    offset = (long long)ftell(fa);
 #endif
 #else
-    offset = ftell(fa) ;
+    offset = (long long)ftell(fa);
 #endif
 
     return offset;
index a5f5ac2..48802e7 100644 (file)
@@ -35,7 +35,7 @@ extern int ripole(char *inputfile, char *outputfile, int debug, int verbose);
 /*------------------------------------------------------------------*/
 /*Prototype*/
 static double NumFromRk2(long rk);
-static void getBoundsheets(int * fd, char ***Sheetnames, int** Abspos, int *nsheets, int *cur_pos, int *err);
+static void getBoundsheets(int * fd, char ***Sheetnames, int** Abspos, int *nsheets, long long *cur_pos, int *err);
 static void getSST(int *fd, short Len, int BIFF, int *ns, char ***sst, int *err);
 static void getBOF(int *fd , int* Data, int *err);
 static void getString(int *fd, short *count, short *Len, int flag, char **str, int *err);
@@ -50,7 +50,7 @@ void xls_read(int *fd, int *cur_pos, double **data, int **chainesind, int *N, in
     /*---------------Declaration Des Variables*--------------------*/
     unsigned short Opcode = 0, Len = 0;   /*Code Operationnel et Longueur du tag a lire*/
     double *valeur = NULL;    /*Tableau Recapitulatif (Final) des valeurs de la feuille Excel*/
-    double pos = 0;
+    long long pos = 0;
 
     int one = 1;
     int three = 3;
@@ -84,8 +84,7 @@ void xls_read(int *fd, int *cur_pos, double **data, int **chainesind, int *N, in
     *chainesind = (int *) NULL;
     *err = 0;
 
-    *cur_pos = *cur_pos;
-    *err = mseek(*fd, *cur_pos, SEEK_SET);
+    *err = mseek(*fd, (long long) * cur_pos, SEEK_SET);
     if (*err > 0)
     {
         goto ErrL;
@@ -114,11 +113,10 @@ void xls_read(int *fd, int *cur_pos, double **data, int **chainesind, int *N, in
     {
         goto ErrL;
     }
-    *cur_pos = (int)pos;
 
     while (1)
     {
-        *err = mseek(*fd, *cur_pos, SEEK_SET);
+        *err = mseek(*fd, pos, SEEK_SET);
         if (*err > 0)
         {
             goto ErrL;
@@ -140,7 +138,8 @@ void xls_read(int *fd, int *cur_pos, double **data, int **chainesind, int *N, in
                 *N = hauteur;
                 *M = longueur;
                 *data = valeur;
-                *cur_pos = *cur_pos + 4 + Len;
+                pos = pos + 4 + Len;
+                *cur_pos = (int)pos;
                 return;
             case 638: /*RK*/
                 C2F(mgetnc) (fd, (void*)&row, &one, typ_ushort, err);
@@ -364,8 +363,10 @@ void xls_read(int *fd, int *cur_pos, double **data, int **chainesind, int *N, in
 
                 break;
         }
-        *cur_pos = *cur_pos + 4 + Len;
+        pos = pos + 4 + Len;
     }
+
+    *cur_pos = (int)pos;
     return;
 ErrL:
     {
@@ -406,8 +407,7 @@ void xls_open(int *err, int *fd, char ***sst, int *ns, char ***Sheetnames, int**
      */
     /*---------------D´┐Żclaration Des Variables*--------------------*/
     int k, one = 1;
-    int cur_pos, init_pos;
-    double pos;
+    long long cur_pos, init_pos;
     unsigned short Opcode, Len;
     /*BOF data*/
     int BOFData[7]; /*[BIFF  Version DataType Identifier Year HistoryFlags LowestXlsVersion]*/
@@ -420,8 +420,7 @@ void xls_open(int *err, int *fd, char ***sst, int *ns, char ***Sheetnames, int**
       *err=1;
       return;
       }*/
-    pos = mtell(*fd);
-    cur_pos = (int)pos;
+    cur_pos = mtell(*fd);
     init_pos = cur_pos;
 
     /* first record should be a BOF */
@@ -442,12 +441,11 @@ void xls_open(int *err, int *fd, char ***sst, int *ns, char ***Sheetnames, int**
         return;
     }
 
-    pos = mtell(*fd);
+    cur_pos = mtell(*fd);
     if (*err > 0)
     {
         goto Err2;
     }
-    cur_pos = (int)pos;
 
     /* loops on records till an EOF is found */
     while (1)
@@ -936,12 +934,14 @@ static void getString(int *fd, short *PosInRecord, short *RecordLen, int flag, c
     l1 = 4 * rt;
     if (richString)
     {
-        *err = mseek(*fd, l1, SEEK_CUR);
+        long long lll1 = (long long)l1;
+        *err = mseek(*fd, lll1, SEEK_CUR);
         *PosInRecord += (short)l1;
     }
     if (extendedString)
     {
-        *err = mseek(*fd, sz, SEEK_CUR);
+        long long llsz = (long long)sz;
+        *err = mseek(*fd, llsz, SEEK_CUR);
         *PosInRecord += (short)sz;
     }
 
@@ -973,13 +973,13 @@ ErrL:
     }
 }
 
-static void getBoundsheets(int * fd, char ***Sheetnames, int** Abspos, int *nsheets, int *cur_pos, int *err)
+static void getBoundsheets(int * fd, char ***Sheetnames, int** Abspos, int *nsheets, long long *cur_pos, int *err)
 {
     /* the global workbook contains a sequence of boudsheets this procedure reads all
     * the sequence and returns a vector o sheetnames, a vector of absolute sheet positions*/
     int abspos; /* Absolute stream position of BoF*/
     char visibility, sheettype; /*Visiblity , Sheet type*/
-    int pos;
+    long long pos;
     unsigned short Opcode;
     unsigned short Len;
     int one = 1;