mseek parameter offset passed as double for file size more than 2GB.
[scilab.git] / scilab / modules / fileio / src / c / mseek.c
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) 2007 - INRIA
4  * Copyright (C) 2010 - DIGITEO - Allan CORNET
5  *
6  * This file must be used under the terms of the CeCILL.
7  * This source file is licensed as described in the file COPYING, which
8  * you should have received as part of this distribution.  The terms
9  * are also available at
10  * http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.txt
11  *
12  */
13 /*--------------------------------------------------------------------------*/
14 #include <string.h>
15 #include <stdio.h>
16 #include <errno.h>
17 #include "mseek.h"
18 #include "filesmanagement.h"
19 #include "sciprint.h"
20 #include "localization.h"
21 /*--------------------------------------------------------------------------*/
22 #if (defined(sun) && !defined(SYSV))
23 char *strerror (int errcode);
24 #endif
25 /*--------------------------------------------------------------------------*/
26 #if (defined(sun) && !defined(SYSV)) || defined(sgi)
27 #define SEEK_SET 0
28 #define SEEK_CUR 1
29 #define SEEK_END 2
30 #endif
31 /*--------------------------------------------------------------------------*/
32 void C2F(mseek) (int *fd, double *offset, const char *flag, int *err)
33 {
34     int iflag;
35 #if (defined(sun) && !defined(SYSV)) || defined(sgi)
36     int irep;
37 #endif
38     FILE *fa = GetFileOpenedInScilab(*fd);
39     *err = 0;
40     if ( fa == (FILE *) 0 )
41     {
42         char *filename = GetFileNameOpenedInScilab(*fd);
43         if (filename)
44         {
45             sciprint(_("%s: Error while opening, reading or writing '%s'.\n"), "mseek", filename);
46         }
47         else
48         {
49             sciprint(_("%s: Error while opening, reading or writing.\n"), "mseek");
50         }
51
52         *err = 1;
53         return;
54     }
55     if ( strncmp(flag, "set", 3) == 0 )
56     {
57         iflag = SEEK_SET;
58     }
59     else if ( strncmp(flag, "cur", 3) == 0 )
60     {
61         iflag = SEEK_CUR;
62     }
63     else if ( strncmp(flag, "end", 3) == 0 )
64     {
65         iflag = SEEK_END;
66     }
67     else
68     {
69         sciprint(_("%s: Wrong value for input argument #%d: '%s', '%s' or '%s' expected.\n"), "mseek", 3, "set", "cur", "end");
70         *err = 1;
71         return;
72     }
73 #if (defined(sun) && !defined(SYSV)) || defined(sgi)
74     irep = fseek(fa, (long) * offset, iflag) ;
75     if ( irep != 0 )
76     {
77         sciprint(strerror(irep));
78         *err = 1;
79     }
80     else
81     {
82         *err = 0;
83     }
84 #else
85 #ifdef _MSC_VER
86 #if _WIN64
87     if (_fseeki64(fa, (long long) *offset, iflag) == -1 )
88 #else
89     if (fseek(fa, (long) *offset, iflag) == -1 )
90 #endif
91 #else
92     if (fseek(fa, (long) *offset, iflag) == -1 )
93 #endif
94     {
95         int errnum = errno; /* global variable produced by fseek */
96         sciprint(_("%s: An error occurred in %s: errno=%s\n"), "mseek", "fseek", strerror(errnum));
97         *err = 1;
98     }
99     else
100     {
101         *err = 0;
102     }
103 #endif
104 }
105 /*--------------------------------------------------------------------------*/