bug 6511
Allan CORNET [Wed, 27 Jan 2010 18:36:58 +0000 (19:36 +0100)]
scilab/CHANGES_5.3.X
scilab/modules/fileio/src/c/mseek.c
scilab/modules/fileio/src/c/mtell.c
scilab/modules/fileio/tests/nonreg_tests/bug_6511.tst [new file with mode: 0644]

index 84d0f88..c0fe107 100644 (file)
@@ -28,3 +28,4 @@ Bug fixes:
 
 * bug 6484 fixed - file did not return filenale of a opened fortran file.
 
+* bug 6511 fixed - mseek and mtell did not manage files > 2 Gbytes on 64 bits.
index 1825288..d332833 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
  * Copyright (C) 2007 - INRIA
- * ...
+ * Copyright (C) 2010 - DIGITEO - Allan CORNET
  * 
  * This file must be used under the terms of the CeCILL.
  * This source file is licensed as described in the file COPYING, which
@@ -72,16 +72,28 @@ void C2F(mseek) (int *fd, int *offset, char *flag, int *err)
                *err=1;
        }
        else
+       {
                *err=0;
+       }
 #else
+       #ifdef _MSC_VER
+               #if _WIN64 
+                       if (_fseeki64(fa,(long) *offset,iflag) == -1 ) 
+               #else
+                       if (fseek(fa,(long) *offset,iflag) == -1 ) 
+               #endif
+       #else
        if (fseek(fa,(long) *offset,iflag) == -1 ) 
+       #endif
        {
-               int errnum=errno; /* global variable produced by fseek */
-               sciprint(_("%s: An error occurred in %s: errno=%s\n"),"mseek","fseek",strerror(errnum));
-               *err=1;
+               int errnum = errno; /* global variable produced by fseek */
+               sciprint(_("%s: An error occurred in %s: errno=%s\n"), "mseek", "fseek", strerror(errnum));
+               *err = 1;
        }
        else 
-               *err=0;
+       {
+               *err = 0;
+       }
 #endif
 }
 /*--------------------------------------------------------------------------*/
index e3be265..826b840 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
  * Copyright (C) 2007 - INRIA
- * ...
+ * Copyright (C) 2010 - DIGITEO - Allan CORNET
  * 
  * This file must be used under the terms of the CeCILL.
  * This source file is licensed as described in the file COPYING, which
@@ -35,7 +35,15 @@ void C2F(mtell) (int *fd, double *offset, int *err)
                *err=1;
                return;
        }
-       *err=0;
+       *err = 0;
+       #ifdef _MSC_VER
+               #if _WIN64 
+                       *offset = (double) _ftelli64(fa) ;
+               #else
+                       *offset = (double) ftell(fa) ;
+               #endif
+       #else
        *offset = (double) ftell(fa) ;
+       #endif
 }
 /*--------------------------------------------------------------------------*/
diff --git a/scilab/modules/fileio/tests/nonreg_tests/bug_6511.tst b/scilab/modules/fileio/tests/nonreg_tests/bug_6511.tst
new file mode 100644 (file)
index 0000000..ba5685c
--- /dev/null
@@ -0,0 +1,44 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2010 - DIGITEO - Allan CORNET
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+// <-- INTERACTIVE TEST -->
+// <-- Non-regression test for bug 6511 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/show_bug.cgi?id=6511
+//
+// <-- Short Description -->
+// mseek and mtell do not manage files > 2 Gbytes on 64 bits
+// creates a very big file > 2 Go and try to read
+// resquires 10 minutes or more to execute
+
+SIZE_FILE = 4e8; 
+file3 = TMPDIR + '/test3.bin';
+fd1= mopen(file3,'wb');
+for i=1:SIZE_FILE, mput(i,'d'); end 
+mseek(0);
+mput(678,'d');
+mseek(0,fd1,'end');
+lastpos = mtell(fd1);
+mput(932,'d');
+mtell(fd1);
+mclose(fd1);
+
+fd2= mopen(file3,'rb');
+
+mseek(0,fd2,'set');
+res = mget(1,'d',fd2);
+if res <> 678 then pause,end;
+
+mseek(0,fd2);
+mseek(lastpos,fd2);
+res = mget(1,'d',fd2);
+if res <> 932 then pause,end;
+
+mclose(fd2);
+
+// delete file after (to save space on disk)
+mdelete(file3);