*Bug #13331 fixed - Users are no longer able to write inconsistent options
[scilab.git] / scilab / modules / fileio / src / c / mopen.c
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) 2007 - INRIA
4  * Copyright (C) 2009 - 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 <stdio.h>
15 #include <string.h>
16 #include "mopen.h"
17 #include "Status2Mode.h"
18 #include "filesmanagement.h"
19 #include "getfiledesc.h"
20 #include "addfile.h"
21 #include "sciprint.h"
22 #include "localization.h"
23 #include "warningmode.h"
24 #include "MALLOC.h"
25 #include "BOOL.h"
26 #include "charEncoding.h"
27 #include "isdir.h"
28 /*--------------------------------------------------------------------------*/
29 extern int swap;
30 /*--------------------------------------------------------------------------*/
31 void C2F(mopen)(int *fd, char *file, char *status, int *f_swap, double *res, int *error)
32 {
33     int littlendian = 1, type = 2, ierr, mode;
34     int lenChar = 0, testRep = 1;
35     char *endptr;
36     FILE * fa;
37
38     /* bug 4846 */
39     if (file == NULL)
40     {
41         *error = (int)MOPEN_INVALID_FILENAME;
42         return;
43     }
44
45     if ( getWarningMode() && IsAlreadyOpenedInScilab(file) )
46     {
47         sciprint(_("Warning: file '%s' already opened in Scilab.\n"), file);
48     }
49
50     swap = 0;
51     *error = (int)MOPEN_NO_ERROR;
52     endptr = (char *) &littlendian;
53     if ( (!*endptr) )
54     {
55         if ( *f_swap == 1 )
56         {
57             swap = 1;
58         }
59         else
60         {
61             swap = 0;
62         }
63     }
64
65     C2F(getfiledesc)(fd);
66
67     if ( *fd == -1 )
68     {
69         *error = (int)MOPEN_NO_MORE_LOGICAL_UNIT;
70         return;
71     }
72
73     if (strlen(file) == 0)
74     {
75         *error = (int)MOPEN_INVALID_FILENAME;
76         return;
77     }
78
79     if (status == NULL)
80     {
81         *error = (int)MOPEN_INVALID_STATUS;
82         return;
83     }
84
85     //#Bug 13331 //
86     lenChar = (int)strlen(status);
87     if (( lenChar == 0 ) || ( lenChar > 3 ))
88     {
89         *error = (int)MOPEN_INVALID_STATUS;
90         return;
91     }
92
93     if ((status[0] != 'a') && (status[0] != 'r') && (status[0] != 'w'))
94     {
95         *error = (int)MOPEN_INVALID_STATUS;
96         return;
97     }
98
99     for ( testRep = 1; testRep < lenChar ; testRep++ )
100     {
101         if (( status[testRep] != '+' ) && ( status[testRep] != 'b' ) && ( status[testRep] != 't' ))
102         {
103             *error = (int)MOPEN_INVALID_STATUS;
104             return;
105         }
106     }
107
108     if (isdir(file))
109     {
110         *error = (int)MOPEN_CAN_NOT_OPEN_FILE;
111         return;
112     }
113
114     wcfopen(fa , file, status);
115
116     if (! fa )
117     {
118         *error = (int)MOPEN_CAN_NOT_OPEN_FILE;
119         return;
120     }
121     mode = Status2Mode(status);
122     C2F(addfile)(fd, fa, &swap, &type, &mode, file, &ierr);
123     if (ierr)
124     {
125         *error = (int)MOPEN_NO_MORE_MEMORY;
126         return;
127     }
128     SetCurrentFileId(*fd);
129     *res = (double)ferror(fa);
130 }
131 /*--------------------------------------------------------------------------*/
132