mseek parameter offset passed as double for file size more than 2GB. 51/12551/5
Cedric Delamarre [Mon, 16 Sep 2013 10:59:09 +0000 (12:59 +0200)]
test_run("spreadsheet",[],["no_check_error_output"]);
test_run("io",[],["no_check_error_output"]);
test_run("fileio",[],["no_check_error_output"]);
test_run("core",[],["no_check_error_output"]);

Change-Id: I15aa39924a0c5313b2ad5d70c36c2ebe6edd6dca

scilab/modules/core/src/fortran/getfun.f
scilab/modules/fileio/includes/mget.h
scilab/modules/fileio/includes/mseek.h
scilab/modules/fileio/sci_gateway/c/sci_mseek.c
scilab/modules/fileio/src/c/mget.c
scilab/modules/fileio/src/c/mseek.c
scilab/modules/fileio/tests/nonreg_tests/bug_6511.tst
scilab/modules/io/sci_gateway/fortran/intfile.f
scilab/modules/io/src/fortran/newsave.f
scilab/modules/spreadsheet/src/c/xls.c

index 087a7bc..7e86ce2 100644 (file)
@@ -1,20 +1,20 @@
 c Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
 c Copyright (C) INRIA
-c 
+c
 c This file must be used under the terms of the CeCILL.
 c This source file is licensed as described in the file COPYING, which
 c you should have received as part of this distribution.  The terms
-c are also available at    
+c are also available at
 c http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.txt
 
       subroutine getfun(lunit,nlines,caller)
 c
-c ======================================================================     
+c ======================================================================
 c     get a user defined function
-c ======================================================================    
-c     
+c ======================================================================
+c
       include 'stack.h'
-c     
+c
       character *(*) caller
       integer lrecl,id(nsiz),retu(6),icount
       integer slash,dot,blank,equal,lparen,rparen
@@ -27,7 +27,7 @@ c
 
       external getfastcode
       integer  getfastcode
-c     
+c
       data slash/48/,dot/51/,blank/40/,equal/50/,lparen/41/,rparen/42/
       data comma/52/,semi/43/,less/59/,great/60/,left/54/,right/55/
       data name/1/,cmt/2/,eol/99/,lrecl/4096/
@@ -39,12 +39,12 @@ c     ennd/14,23,13/
 c
       lmax=iadr(lstk(bot)-1)
       isopened=.false.
-c     
+c
       if(top-rhs+lhs+1.ge.bot) then
          call error(18)
          return
       endif
-c     
+c
       job=0
       call icopy(6,lpt,1,slpt,1)
       ssym=sym
@@ -56,12 +56,12 @@ c
       first=1
       l = lpt(1)
       if(lunit.eq.0) goto 30
-c     
+c
 c     get macro deff from file (getf)
 c     ------------------------
 c     acquisition d'une ligne du fichier
       call getfiletype(lunit,ltype,info)
-      if(info.ne.0) goto 90 
+      if(info.ne.0) goto 90
       icount=0
 
  11   buf=' '
@@ -91,7 +91,7 @@ c     strip blanks at the beginning of the line
       if(buf(m:m).eq.' ') goto 16
 c
       if(buf(m:m+10).eq.'endfunction'.and.m+11.gt.n) then
-         if(first.eq.0) then  
+         if(first.eq.0) then
             istk(l)=blank
             istk(l+1)=eol
             l=l+2
@@ -101,23 +101,23 @@ c
       if(buf(m:m+8).eq.'function ') then
          if(first.eq.1) then
             j=m+7
-            goto 25            
+            goto 25
          else
             if( ltype.eq.1) then
                call myback(lunit)
             else
-               call mseek(lunit,-nr,'cur',ierr)
+               call mseek(lunit,dble(-nr),'cur',ierr)
             endif
             nlines=max(0,nlines-1)
             goto 61
          endif
       endif
-c     
+c
 c     boucle de conversion des caracteres de la ligne
       j=m-1
  17   j=j+1
       if(j.gt.n) goto 27
-c     
+c
 *     modif Bruno : appel a getfastcode au lieu de la boucle
       k = getfastcode(buf(j:j))
       if (k .eq. eol) go to 11
@@ -157,7 +157,7 @@ c     comments mark (//)
 c     it is not a continuation line
       if(first.eq.1) goto 24
       istk(l) = k
-c     
+c
       l = l + 1
       if(l.gt.lmax) then
          ierr=5
@@ -186,7 +186,7 @@ c     first line
         goto 90
       endif
       goto 17
-c     
+c
 c     line conversion finished
  27   if(first.eq.1) goto 40
 
@@ -213,15 +213,15 @@ C     .  lines into account
       icount=0
 c
       goto 11
-      
-c     
+
+c
 c     get macro deff from stk
 c     -----------------------
  30   if(rhs.ne.2) then
          call error(39)
          return
       endif
-c     
+c
       ilt=iadr(lstk(top))
       if(istk(ilt).ne.10) then
          err=2
@@ -248,7 +248,7 @@ c
          l=l+1
  31   continue
       goto 40
-c     
+c
  33   mn=istk(ilt+1)*istk(ilt+2)
       ili=ilt+4+mn
       ilt=ilt+4
@@ -281,7 +281,7 @@ c     . add a final empty line for backward compatiblity
       endif
 
       goto 61
-c     
+c
 c     analyse de la ligne de declaration
  40   continue
       if(ddt.ge.2) call basout(io,wte,buf(1:n))
@@ -295,10 +295,10 @@ c     analyse de la ligne de declaration
       lpt(3) = lpt(1)
       lpt(2) = lpt(1)
       lct(1) = 0
-cMAJ  
+cMAJ
       fin=0
       call fortrangetch
-c     
+c
       if(top+2.ge.bot) then
          call error(18)
          return
@@ -312,13 +312,13 @@ c
          ierr=5
          goto 90
       endif
-c     
+c
       call getsym
       mlhs=0
       if(sym.eq.name) then
 c     a=func(..) ou func(..)
          if(char1.eq.equal) then
-c     a=func(..) 
+c     a=func(..)
             mlhs=mlhs+1
             l=l+nsiz
             if(l.gt.lmax) then
@@ -346,7 +346,7 @@ c     [..]=func()
             ierr=4
             goto  90
          endif
-c     
+c
          call getsym
          if(sym.ne.equal) then
             ierr=4
@@ -364,7 +364,7 @@ c
       endif
       istk(il+1)=mlhs
       call putid(id,syn(1))
-c     
+c
       mrhs=0
       il=l
       l=l+1
@@ -399,10 +399,10 @@ c
      $     sym.ne.comma.and.sym.ne.cmt) then
          ierr=4
          goto  90
-      endif 
+      endif
  46   continue
       istk(il)=mrhs
-c     
+c
       il=l
       l=l+1
 
@@ -414,7 +414,7 @@ c     caller = 'getf' add an empty line for backward compatiblity
 
       first=0
       goto 11
-c     
+c
 c     fin
  60   if(first.eq.1) then
          job=-1
@@ -442,7 +442,7 @@ c
       fin=job
       return
 
-c     
+c
  90   continue
 c gestion des erreurs
 c
@@ -468,7 +468,7 @@ c     invalid syntax
       return
  95   call error(28)
       return
-c     
+c
+
       end
 
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 da22b66..59a9d93 100644 (file)
@@ -18,7 +18,7 @@
 /**
 * seek function
 */
-FILEIO_IMPEXP void C2F(mseek) (int *fd, int *offset, char *flag, int *err);
+FILEIO_IMPEXP void C2F(mseek) (int *fd, double *offset, const char *flag, int *err);
 
 #endif /* __MSEEK_H__ */
 /*--------------------------------------------------------------------------*/
index 42144c5..b61b7c3 100644 (file)
@@ -36,7 +36,7 @@ int sci_mseek(char *fname, unsigned long fname_len)
 
     if (GetType(1) == sci_matrix)
     {
-        GetRhsVar(1, MATRIX_OF_INTEGER_DATATYPE, &m1, &n1, &l1);
+        GetRhsVar(1, MATRIX_OF_DOUBLE_DATATYPE, &m1, &n1, &l1);
         if (m1*n1 != 1)
         {
             Scierror(999, _("%s: Wrong size for input argument #%d: An integer expected.\n"), fname, 1);
@@ -80,7 +80,7 @@ int sci_mseek(char *fname, unsigned long fname_len)
         flag = "set";
     }
 
-    C2F(mseek)(&fd, istk(l1), flag, &err);
+    C2F(mseek)(&fd, stk(l1), flag, &err);
 
     if (err >  0)
     {
index 7a3ec4f..8c2293f 100644 (file)
@@ -67,7 +67,7 @@ int swap = 0;
     }                                                                         \
 }
 /*--------------------------------------------------------------------------*/
-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, c2;
     int i, items, n = *n1;
@@ -167,7 +167,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 swap2, double *res, int n, char *type, int *ierr)
+void mget2(FILE * fa, int swap2, double *res, int n, const char *type, int *ierr)
 {
     char c1, c2;
     int i, items = n;
@@ -242,7 +242,7 @@ void mget2(FILE * fa, int swap2, double *res, int n, char *type, int *ierr)
 }
 
 /*--------------------------------------------------------------------------*/
-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)
 {
     int nc, swap2;
     FILE *fa;
index b238208..2645795 100644 (file)
@@ -29,7 +29,7 @@ char *strerror (int errcode);
 #define SEEK_END 2
 #endif
 /*--------------------------------------------------------------------------*/
-void C2F(mseek) (int *fd, int *offset, char *flag, int *err)
+void C2F(mseek) (int *fd, double *offset, const char *flag, int *err)
 {
     int iflag;
 #if (defined(sun) && !defined(SYSV)) || defined(sgi)
@@ -84,7 +84,7 @@ void C2F(mseek) (int *fd, int *offset, char *flag, int *err)
 #else
 #ifdef _MSC_VER
 #if _WIN64
-    if (_fseeki64(fa, (long) *offset, iflag) == -1 )
+    if (_fseeki64(fa, (long long) *offset, iflag) == -1 )
 #else
     if (fseek(fa, (long) *offset, iflag) == -1 )
 #endif
index ba5685c..c301ca1 100644 (file)
@@ -4,7 +4,7 @@
 //
 //  This file is distributed under the same license as the Scilab package.
 // =============================================================================
-// <-- INTERACTIVE TEST -->
+// <-- LONG TIME EXECUTION -->
 // <-- Non-regression test for bug 6511 -->
 //
 // <-- Bugzilla URL -->
 // 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 
+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');
+mput(678,"d");
+mseek(0,fd1,"end");
 lastpos = mtell(fd1);
-mput(932,'d');
+mput(932,"d");
 mtell(fd1);
 mclose(fd1);
 
-fd2= mopen(file3,'rb');
+fd2= mopen(file3,"rb");
 
-mseek(0,fd2,'set');
-res = mget(1,'d',fd2);
+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);
+res = mget(1,"d",fd2);
 if res <> 932 then pause,end;
 
 mclose(fd2);
index 28b4b7f..d334758 100644 (file)
@@ -1,16 +1,16 @@
 c Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
 c Copyright (C) INRIA
-c 
+c
 c This file must be used under the terms of the CeCILL.
 c This source file is licensed as described in the file COPYING, which
 c you should have received as part of this distribution.  The terms
-c are also available at    
+c are also available at
 c http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.txt
       subroutine intfile
 c     interface for builtin file
 
       INCLUDE 'stack.h'
-c     
+c
       integer status,access,form,recl,old,new,scratc,unknow
       integer sequen,direct,forma1,unform
       integer clo,rew,bak,ope,mode(2)
@@ -18,16 +18,15 @@ c
       logical getscalar
 
       integer iadr,sadr
-c     
+c
       data old/857368/,new/2100759/,scratc/1707037/,unknow/1316638/
       data sequen/1707548/,direct/1774093/,forma1/1775631/
       data unform/988958/
       data clo/12/,ope/24/,rew/27/,bak/11/,last/21/
-c     
+c
       iadr(l)=l+l-1
       sadr(l)=(l/2)+1
-c     
-
+c
       tops=top
       top0=top-rhs+1
 c
@@ -79,7 +78,7 @@ c     .  count opened files
  05         continue
             return
          endif
-         
+
 c     .  allocate lhs variables
 c
 c     .  vector of units
@@ -229,7 +228,7 @@ c     action
          err=1
          call error(55)
          return
-      endif      
+      endif
       if(istk(il+1)*istk(il+2).ne.1) then
          err=1
          call error(36)
@@ -240,7 +239,7 @@ c     action
 c
 
       if(itype.eq.ope) then
-c     
+c
 c     open
          if(rhs.gt.6) then
             call error(39)
@@ -321,7 +320,7 @@ c     path
                istk(il+2)=0
                istk(il+3)=0
                l=sadr(il+4)
-               lstk(top+1)=l+1 
+               lstk(top+1)=l+1
 
                top=top+1
                il=iadr(lstk(top))
@@ -409,7 +408,7 @@ c     rewind
             call getfiletype(lunit,ltype,info)
             if(info.eq.0) then
                if(ltype.eq.2) then
-                  call mseek(lunit,0,'set'//char(0),err)
+                  call mseek(lunit,0.0,'set'//char(0),err)
                else
                   rewind(lunit)
                endif
@@ -448,7 +447,7 @@ c     backspace
                endif
             endif
          endif
-c     
+c
          istk(il)=0
       elseif(itype.eq.last) then
 c     last
@@ -472,7 +471,7 @@ c     last
             call getfiletype(lunit,ltype,info)
             if(info.eq.0) then
                if(ltype.eq.2) then
-                  call mseek(lunit,0,'end'//char(0),err)
+                  call mseek(lunit,0.0,'end'//char(0),err)
                else
  154              read(lunit,'(a)',err=156,end=155)
                   go to 154
index cbabfea..facbb10 100644 (file)
@@ -1,12 +1,12 @@
 c Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
 c Copyright (C) INRIA
-c 
+c
 c This file must be used under the terms of the CeCILL.
 c This source file is licensed as described in the file COPYING, which
 c you should have received as part of this distribution.  The terms
-c are also available at    
+c are also available at
 c http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.txt
-      
+
       subroutine intsave
       include 'stack.h'
       logical opened,ptover,cremat
@@ -15,7 +15,7 @@ c http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.txt
       logical eqid
       integer iadr,sadr
       data bl/nsiz*673720360/
-c     
+c
       iadr(l)=l+l-1
       sadr(l)=(l/2)+1
 c
@@ -31,7 +31,7 @@ c
       top0=top-rhs
 
 
-      call v2cunit(top0+1,'wb',fd,opened,ierr) 
+      call v2cunit(top0+1,'wb',fd,opened,ierr)
       if(ierr.gt.0) return
       if(ierr.lt.0) then
 c     file has been opened by fortran, oldsave (return a error)
@@ -106,7 +106,7 @@ c     create a variable with fd
 c     *call* parse
  24   continue
       ilrec=pstk(pt)
-      lstk(top+1)= istk(ilrec)  
+      lstk(top+1)= istk(ilrec)
       fd         = istk(ilrec+1)
       kmin       = istk(ilrec+2)
       kmax       = istk(ilrec+3)
@@ -114,7 +114,7 @@ c     *call* parse
       top0       = istk(ilrec+5)
       vol        = istk(ilrec+6)
       opened     = (istk(ilrec+7).eq.1)
-      pt=pt-1 
+      pt=pt-1
       if(rstk(pt).eq.911) goto 21
 
  25   if(k.lt.kmax) goto 20
@@ -144,7 +144,7 @@ c
       double precision res,offset
       integer iadr,sadr
       data semi/43/,blank/40/
-c     
+c
       iadr(l)=l+l-1
       sadr(l)=(l/2)+1
 c
@@ -161,7 +161,7 @@ c
       endif
       top0=top
       top=top-rhs+1
-      
+
       call v2cunit(top,'rb',fd,opened,ierr)
       if(ierr.gt.0) return
       if(ierr.lt.0) then
@@ -183,10 +183,10 @@ c     .  old mode (returns a error)
          call error(43)
          return
       else
-         call mseek(fd,int(offset),'set'//char(0),ierr)
+         call mseek(fd,offset,'set'//char(0),ierr)
       endif
 
-      
+
       if(rhs.gt.1) then
          ilt=iadr(lstk(top0+1))
          err=sadr(ilt+nsiz*rhs-1)-lstk(bot)
@@ -243,7 +243,7 @@ c     store it into ids (used by the function called)
       ids(2,pt)=ilv
 c     preserve variable type
       ids(3,pt)=istk(ilv)
-c     set the end of the variable temporarily 
+c     set the end of the variable temporarily
       lstk(top+1)=sadr(ilv)
 c     preserve value of top
       ids(5,pt)=top
@@ -285,7 +285,7 @@ c     .  load has been done by a scilab function
       endif
       ilv=ids(2,pt)
       istk(ilv)=ids(3,pt)
-      pt=pt-1 
+      pt=pt-1
       ilt=pstk(pt)
       call putid(id,ids(1,pt))
       pt=pt-1
@@ -306,13 +306,15 @@ c     .  check if loaded variable is required
 c     .        yes, remove it out of the table and save it
                istk(ilt+(i-1)*nsiz)=0
 c     .        rewind the file
-               if(.not.opened)  call mseek(fd,0,'set'//char(0),ierr)
+               if(.not.opened) then
+                 call mseek(fd,0.0,'set'//char(0),ierr)
+               endif
                goto 30
             endif
  27      continue
 c     .  no skip it
          goto 10
-      endif  
+      endif
 
  30   ssym=sym
       sym = semi
@@ -393,13 +395,13 @@ c     write id and type
          call savefun(fd,il1,ierr)
       elseif(istk(il1).eq.13) then
          call savecfun(fd,il1,ierr)
-      elseif(istk(il1).eq.14) then 
+      elseif(istk(il1).eq.14) then
          call savelib(fd,il1,ierr)
       elseif(istk(il1).ge.15.and.istk(il1).le.17) then
  10      call savelist(fd,il1,ierr)
-      elseif(istk(il1).eq.128) then 
+      elseif(istk(il1).eq.128) then
          call saveptr(fd,il1,ierr)
-      elseif(istk(il1).eq.130) then 
+      elseif(istk(il1).eq.130) then
          call savefptr(fd,il1,ierr)
       else
 c     .  call an external function
@@ -455,13 +457,13 @@ c     read id and type
          call loadfun(fd,il1,nn,ierr)
       elseif(istk(il1).eq.13) then
          call loadcfun(fd,il1,nn,ierr)
-      elseif(istk(il1).eq.14) then 
+      elseif(istk(il1).eq.14) then
          call loadlib(fd,il1,nn,ierr)
-      elseif(istk(il1).ge.15.and.istk(il1).le.17) then   
+      elseif(istk(il1).ge.15.and.istk(il1).le.17) then
          call loadlist(fd,il1,nn,ierr)
-      elseif(istk(il1).eq.128) then 
+      elseif(istk(il1).eq.128) then
          call loadptr(fd,il1,nn,ierr)
-      elseif(istk(il1).eq.130) then 
+      elseif(istk(il1).eq.130) then
          call loadfptr(fd,il1,nn,ierr)
       else
          fun=-il1
@@ -535,9 +537,9 @@ c     write type
          call savefun(fd,il1,ierr)
       elseif(istk(il1).eq.13) then
          call savecfun(fd,il1,ierr)
-      elseif(istk(il1).eq.14) then 
+      elseif(istk(il1).eq.14) then
          call savelib(fd,il1,ierr)
-      elseif(istk(il1).ge.15.and.istk(il1).le.17) then   
+      elseif(istk(il1).ge.15.and.istk(il1).le.17) then
 c     .  a sublist
          if(istk(il1).lt.0) il1=iadr(istk(il1+1))
          if (ptover(1,psiz)) return
@@ -547,9 +549,9 @@ c     .  a sublist
          ids(3,pt)=i
          il=il1
          goto 10
-      elseif(istk(il1).eq.128) then 
+      elseif(istk(il1).eq.128) then
          call saveptr(fd,il1,ierr)
-      elseif(istk(il1).eq.130) then 
+      elseif(istk(il1).eq.130) then
          call savefptr(fd,il1,ierr)
       else
 c     .  call an external function
@@ -565,7 +567,7 @@ c     .  call an external function
       endif
       if(ierr.ne.0) return
       goto 20
-c     
+c
  30   continue
 c     end of current list reached
       if(rstk(pt).ne.408) goto 40
@@ -614,7 +616,7 @@ c     .  manage recursion
          top=top-1
          goto 20
       endif
-      
+
  10   il0=il
 c     read list header without type
       err=sadr(il+3)-lstk(bot)
@@ -667,10 +669,10 @@ c     read  type
          call loadfun(fd,il1,nne,ierr)
       elseif(istk(il1).eq.13) then
          call loadcfun(fd,il1,nne,ierr)
-      elseif(istk(il1).eq.14) then 
+      elseif(istk(il1).eq.14) then
          call loadlib(fd,il1,nne,ierr)
-      elseif(istk(il1).ge.15.and.istk(il1).le.17) then   
-c     .  a sublist 
+      elseif(istk(il1).ge.15.and.istk(il1).le.17) then
+c     .  a sublist
          if (ptover(1,psiz)) return
          rstk(pt)=408
          ids(1,pt)=n
@@ -679,9 +681,9 @@ c     .  a sublist
          ids(4,pt)=il0
          il=il1
          goto 10
-      elseif(istk(il1).eq.128) then 
+      elseif(istk(il1).eq.128) then
          call loadptr(fd,il1,nne,ierr)
-      elseif(istk(il1).eq.130) then 
+      elseif(istk(il1).eq.130) then
          call loadfptr(fd,il1,nne,ierr)
       else
 c     .  call an external function
@@ -702,7 +704,7 @@ c     *call* parse
       if(err.gt.0) ierr=1
       if(ierr.ne.0) return
       goto 20
-c     
+c
  30   continue
 c     end of current list reached
       if(rstk(pt).ne.408) goto 40
@@ -756,18 +758,18 @@ c     Save a matrix of numbers
       integer fd
       character*3 fmti,fmtd
       integer sadr
-      
+
       double precision dblNaN
-      
+
       integer isanan
       external isanan
-      
+
 c
       iadr(l)=l+l-1
       sadr(l)=(l/2)+1
 c
       call returnananfortran(dblNaN)
-      
+
       fmti='il'//char(0)
       fmtd='dl'//char(0)
 
@@ -788,14 +790,14 @@ c     read matrix elements
       endif
       l=sadr(il+4)
       call mgetnc(fd,istk(il+4),mn,fmtd,ierr)
-      
+
 c     convert all NaN to Signaling NaN
       do 10 i = 0, mn-1
           if(isanan(stk(l+i)).eq.1) then
               stk(l+i) = dblNaN
           endif
-10    continue        
-      
+10    continue
+
 c      call mgetnc(fd,stk(l),mn,fmtd,ierr)
       n=iadr(l+mn)-il
 c      n=4+2*mn
@@ -836,16 +838,16 @@ c     Load a matrix of polynomials
       character*3 fmti,fmtd
       integer sadr
       double precision dblNaN
-      
+
       integer isanan
       external isanan
-      
+
 c
       iadr(l)=l+l-1
       sadr(l)=(l/2)+1
 c
       call returnananfortran(dblNaN)
-      
+
       fmti='il'//char(0)
       fmtd='dl'//char(0)
 
@@ -877,14 +879,14 @@ c     read polynomials coefficients
       endif
       l=sadr(il+9+mn)
       call mgetnc(fd,istk(iadr(l)),mn1,fmtd,ierr)
-      
+
 c     convert all NaN to Signaling NaN
       do 10 i = 0, mn1-1
           if(isanan(stk(l+i)).eq.1) then
               stk(l+i) = dblNaN
           endif
-10    continue        
-      
+10    continue
+
       n=iadr(l+mn1)-il
 c      n=9+mn+2*mn1
       return
@@ -928,7 +930,7 @@ c      iadr(l)=l+l-1
       sadr(l)=(l/2)+1
 c
       fmti='il'//char(0)
-c     
+c
 c     read matrix header without type
       err=sadr(il+4)-lstk(bot)
       if(err.gt.0) then
@@ -1286,7 +1288,7 @@ c     Load a sparse matrix of boolean
       include 'stack.h'
       integer fd
       character*3 fmti,fmtd
-      integer sadr 
+      integer sadr
 
 c
 c      iadr(l)=l+l-1
@@ -1470,7 +1472,7 @@ c     Save a pointer on sparse lu factorization
 c
       integer fd
       character*3 fmti,fmtd
-c      
+c
       fmti='il'//char(0)
       fmtd='dl'//char(0)
 c
@@ -1509,7 +1511,7 @@ c     read pointer
 c      n=4+2*1
       return
       end
-      
+
       subroutine savefptr(fd,il,ierr)
 c     Copyright INRIA
 c     Save a pointer on  a primitive
index 87f36a2..4a8b738 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, double *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);
@@ -84,8 +84,8 @@ void xls_read(int *fd, int *cur_pos, double **data, int **chainesind, int *N, in
     *chainesind = (int *) NULL;
     *err = 0;
 
-    *cur_pos = *cur_pos;
-    C2F(mseek) (fd, cur_pos, "set", err);
+    pos = (double)(*cur_pos);
+    C2F(mseek) (fd, &pos, "set", err);
     if (*err > 0)
     {
         goto ErrL;
@@ -114,11 +114,10 @@ void xls_read(int *fd, int *cur_pos, double **data, int **chainesind, int *N, in
     {
         goto ErrL;
     }
-    *cur_pos = (int)pos;
 
     while (1)
     {
-        C2F(mseek) (fd, cur_pos, "set", err);
+        C2F(mseek) (fd, &pos, "set", err);
         if (*err > 0)
         {
             goto ErrL;
@@ -140,6 +139,7 @@ void xls_read(int *fd, int *cur_pos, double **data, int **chainesind, int *N, in
                 *N = hauteur;
                 *M = longueur;
                 *data = valeur;
+                *cur_pos = (int)pos;
                 *cur_pos = *cur_pos + 4 + Len;
                 return;
             case 638: /*RK*/
@@ -364,8 +364,11 @@ 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,22 +409,19 @@ 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;
+    double cur_pos, init_pos;
     unsigned short Opcode, Len;
     /*BOF data*/
     int BOFData[7]; /*[BIFF  Version DataType Identifier Year HistoryFlags LowestXlsVersion]*/
     *nsheets = 0;
     *err = 0;
     /*---------------D�claration Des Variables*--------------------*/
-    cur_pos = 0;
 
     /*  if (get_oleheader(fd)) {
       *err=1;
       return;
       }*/
-    C2F(mtell) (fd, &pos, err);
-    cur_pos = (int)pos;
+    C2F(mtell) (fd, &cur_pos, err);
     init_pos = cur_pos;
 
     /* first record should be a BOF */
@@ -442,12 +442,11 @@ void xls_open(int *err, int *fd, char ***sst, int *ns, char ***Sheetnames, int**
         return;
     }
 
-    C2F(mtell) (fd, &pos, err);
+    C2F(mtell) (fd, &cur_pos, err);
     if (*err > 0)
     {
         goto Err2;
     }
-    cur_pos = (int)pos;
 
     /* loops on records till an EOF is found */
     while (1)
@@ -936,12 +935,14 @@ static void getString(int *fd, short *PosInRecord, short *RecordLen, int flag, c
     l1 = 4 * rt;
     if (richString)
     {
-        C2F(mseek) (fd, &l1, "cur", err);
+        double dl1 = (double)l1;
+        C2F(mseek) (fd, &dl1, "cur", err);
         *PosInRecord += (short)l1;
     }
     if (extendedString)
     {
-        C2F(mseek) (fd, &sz, "cur", err);
+        double dsz = (double)sz;
+        C2F(mseek) (fd, &dsz, "cur", err);
         *PosInRecord += (short)sz;
     }
 
@@ -973,13 +974,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, double *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;
+    double pos;
     unsigned short Opcode;
     unsigned short Len;
     int one = 1;