* Bug #13119 fixed - fileio: mget and mgetl accepted decimal values as number of...
[scilab.git] / scilab / modules / fileio / sci_gateway / c / sci_mget.c
1 /*
2 * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3 * Copyright (C) 2006 - INRIA - Allan CORNET
4 * Copyright (C) 2009 - DIGITEO - Allan CORNET
5 * ...
6 *
7 * This file must be used under the terms of the CeCILL.
8 * This source file is licensed as described in the file COPYING, which
9 * you should have received as part of this distribution.  The terms
10 * are also available at
11 * http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.txt
12 *
13 */
14 /*--------------------------------------------------------------------------*/
15 #include <stdio.h>
16 #include "stack-c.h"
17 #include "gw_fileio.h"
18 #include "MALLOC.h"
19 #include "mget.h"
20 #include "localization.h"
21 #include "Scierror.h"
22 /*--------------------------------------------------------------------------*/
23 #define ALL_FILES_DESCRIPTOR -1
24 /*--------------------------------------------------------------------------*/
25 int sci_mget(char *fname, unsigned long fname_len)
26 {
27     int m1 = 0, n1 = 0, l1 = 0;
28     int m2 = 0, n2 = 0, l2 = 0;
29     int m3 = 0, n3 = 0, l3 = 0;
30     int l4 = 0;
31     int err = 0;
32     char *type = NULL;
33     int fd = ALL_FILES_DESCRIPTOR;
34     int n = 1;
35     int one = 1;
36     SciIntMat varTwo;
37
38     Nbvars = 0;
39     CheckRhs(1, 3);
40     CheckLhs(1, 1);
41
42     if (Rhs >= 1)
43     {
44         if (GetType(1) == sci_matrix)
45         {
46             GetRhsVar(1, MATRIX_OF_DOUBLE_DATATYPE, &m1, &n1, &l1);
47             if (*stk(l1) != (int) *stk(l1) || *stk(l1) < 0)
48             {
49                 Scierror(999, _("%s: Wrong value for input argument #%d: A positive integer value expected.\n"), fname, 1);
50                 return 0;
51             }
52             if (m1 * n1 == 1)
53             {
54                 n  = (int) * stk(l1);
55             }
56             else
57             {
58                 Scierror(999, _("%s: Wrong size for input argument #%d: A positive integer value expected.\n"), fname, 1);
59                 return 0;
60             }
61         }
62         else
63         {
64             Scierror(999, _("%s: Wrong type for input argument #%d: A positive integer value expected.\n"), fname, 1);
65             return 0;
66         }
67     }
68
69     if ( Rhs >= 2)
70     {
71         if (GetType(2) == sci_strings)
72         {
73             GetRhsVar(2, STRING_DATATYPE, &m2, &n2, &l2);
74             type = cstk(l2);
75         }
76         else
77         {
78             Scierror(999, _("%s: Wrong type for input argument #%d: A string expected.\n"), fname, 2);
79             return 0;
80         }
81     }
82     else
83     {
84         type = LIST_DATATYPE;
85     }
86
87     if ( Rhs >= 3)
88     {
89         if (GetType(3) == sci_matrix)
90         {
91             GetRhsVar(3, MATRIX_OF_INTEGER_DATATYPE, &m3, &n3, &l3);
92             if (m3 * n3 == 1)
93             {
94                 fd = *istk(l3);
95             }
96             else
97             {
98                 Scierror(999, _("%s: Wrong size for input argument #%d: An integer expected.\n"), fname, 3);
99                 return 0;
100             }
101         }
102         else
103         {
104             Scierror(999, _("%s: Wrong type for input argument #%d: An integer expected.\n"), fname, 3);
105             return 0;
106         }
107     }
108
109     CreateVar(Rhs + 1, MATRIX_OF_DOUBLE_DATATYPE, &one, &n, &l4);
110     LhsVar(1) = Rhs + 1;
111
112     C2F(mget)(&fd, stk(l4), &n, type, &err);
113
114     if (err >  0)
115     {
116         SciError(10000);
117         return 0;
118     }
119     else if ( err < 0)
120     {
121         int n5 = 0, l5 = 0, i = 0;
122         /* n contains now the effectively read data */
123         n5 = -err - 1;
124         if ( n5 < n )
125         {
126             CreateVar(Rhs + 2, MATRIX_OF_DOUBLE_DATATYPE, &one, &n5, &l5);
127
128             for ( i = 0; i < n5 ; i++)
129             {
130                 *stk(l5 + i) = *stk(l4 + i);
131             }
132
133             LhsVar(1) = Rhs + 2;
134         }
135     }
136
137     PutLhsVar();
138
139     return 0;
140 }
141 /*--------------------------------------------------------------------------*/