9c4a97653ee7e5be4742508703075fdeb85e648a
[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     char        *endptr;
35     FILE * fa;
36
37     /* bug 4846 */
38     if (file == NULL)
39     {
40         *error = (int)MOPEN_INVALID_FILENAME;
41         return;
42     }
43
44     if ( getWarningMode() && IsAlreadyOpenedInScilab(file) )
45     {
46         sciprint(_("Warning: file '%s' already opened in Scilab.\n"), file);
47     }
48
49     swap = 0;
50     *error = (int)MOPEN_NO_ERROR;
51     endptr = (char *) &littlendian;
52     if ( (!*endptr) )
53     {
54         if ( *f_swap == 1 )
55         {
56             swap = 1;
57         }
58         else
59         {
60             swap = 0;
61         }
62     }
63
64     C2F(getfiledesc)(fd);
65
66     if ( *fd == -1 )
67     {
68         *error = (int)MOPEN_NO_MORE_LOGICAL_UNIT;
69         return;
70     }
71
72     if (strlen(file) == 0)
73     {
74         *error = (int)MOPEN_INVALID_FILENAME;
75         return;
76     }
77
78     if (status == NULL)
79     {
80         *error = (int)MOPEN_INVALID_STATUS;
81         return;
82     }
83
84     if (strlen(status) == 0)
85     {
86         *error = (int)MOPEN_INVALID_STATUS;
87         return;
88     }
89
90     if ((status[0] != 'a') && (status[0] != 'r') && (status[0] != 'w'))
91     {
92         *error = (int)MOPEN_INVALID_STATUS;
93         return;
94     }
95
96     if (isdir(file))
97     {
98         *error = (int)MOPEN_CAN_NOT_OPEN_FILE;
99         return;
100     }
101
102     wcfopen(fa , file, status);
103
104     if (! fa )
105     {
106         *error = (int)MOPEN_CAN_NOT_OPEN_FILE;
107         return;
108     }
109     mode = Status2Mode(status);
110     C2F(addfile)(fd, fa, &swap, &type, &mode, file, &ierr);
111     if (ierr)
112     {
113         *error = (int)MOPEN_NO_MORE_MEMORY;
114         return;
115     }
116     SetCurrentFileId(*fd);
117     *res = (double)ferror(fa);
118 }
119 /*--------------------------------------------------------------------------*/
120