fix mput/mputi for (u)int64 > 53 bits
[scilab.git] / scilab / modules / fileio / sci_gateway / cpp / sci_mput.cpp
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  * Copyright (C) 2010 - DIGITEO - Antoine ELIAS
6  *
7  * Copyright (C) 2012 - 2016 - Scilab Enterprises
8  *
9  * This file is hereby licensed under the terms of the GNU GPL v2.0,
10  * pursuant to article 5.3.4 of the CeCILL v.2.1.
11  * This file was originally licensed under the terms of the CeCILL v2.1,
12  * and continues to be available under such terms.
13  * For more information, see the COPYING file which you should have received
14  * along with this program.
15  *
16  */
17
18 /*--------------------------------------------------------------------------*/
19 #include "filemanager.hxx"
20 #include "fileio_gw.hxx"
21 #include "string.hxx"
22 #include "double.hxx"
23 #include "int.hxx"
24 #include "function.hxx"
25 #include "mputi.hxx"
26
27 extern "C"
28 {
29 #include "sci_malloc.h"
30 #include "mput.h"
31 #include "localization.h"
32 #include "Scierror.h"
33 #include "charEncoding.h"
34 #include "os_string.h"
35 }
36
37 /*--------------------------------------------------------------------------*/
38 types::Function::ReturnValue sci_mput(types::typed_list &in, int _iRetCount, types::typed_list &out)
39 {
40     char* pstType = os_strdup("l");//default type value : long
41     int iSize = 0;
42     int iFile = -1; //default file : last opened file
43     double* pData = NULL;
44     int iErr = 0;
45
46     if (in.size() < 1 || in.size() > 3)
47     {
48         Scierror(77, _("%s: Wrong number of input argument(s): %d to %d expected.\n"), "mput", 1, 3);
49         FREE(pstType);
50         return types::Function::Error;
51     }
52
53     //check parameter 1
54     if ((in[0]->isDouble() == false) && (in[0]->isInt() == false))
55     {
56         Scierror(999, _("%s: Wrong type for input argument #%d: A integer expected.\n"), "mput", 1);
57         FREE(pstType);
58         return types::Function::Error;
59     }
60
61     iSize = in[0]->getAs<types::GenericType>()->getSize();
62
63     if (in.size() >= 2)
64     {
65         //export format
66         if (in[1]->isString() == false || in[1]->getAs<types::String>()->getSize() != 1)
67         {
68             Scierror(999, _("%s: Wrong type for input argument #%d: string expected.\n"), "mput", 2);
69             FREE(pstType);
70             return types::Function::Error;
71         }
72
73         FREE(pstType);
74         pstType = wide_string_to_UTF8(in[1]->getAs<types::String>()->get(0));
75
76     }
77
78     if (in.size() == 3)
79     {
80         if (in[2]->isDouble() == false || in[2]->getAs<types::Double>()->getSize() != 1)
81         {
82             Scierror(999, _("%s: Wrong type for input argument #%d: A integer expected.\n"), "mput", 3);
83             FREE(pstType);
84             return types::Function::Error;
85         }
86
87         iFile = static_cast<int>(in[2]->getAs<types::Double>()->get(0));
88     }
89
90     switch (iFile)
91     {
92         case 5: // stdin
93             Scierror(999, _("%s: Wrong file descriptor: %d.\n"), "mput", iFile);
94             FREE(pstType);
95             return types::Function::Error;
96     }
97
98     if (in[0]->isDouble())
99     {
100         int iErr = 0;
101         pData = in[0]->getAs<types::Double>()->get();
102         C2F(mput)(&iFile, pData, &iSize, pstType, &iErr);
103
104         if (iErr)
105         {
106             FREE(pstType);
107             Scierror(10000, "");
108             return types::Function::Error;
109         }
110     }
111     else
112     {
113         int err = 0;
114         switch (in[0]->getType())
115         {
116             case types::InternalType::ScilabInt8:
117             {
118                 char* piData = NULL;
119                 piData = in[0]->getAs<types::Int8>()->get();
120                 err = mputi(iFile, piData, iSize, pstType);
121                 break;
122             }
123             case types::InternalType::ScilabInt16:
124             {
125                 short* piData = NULL;
126                 piData = in[0]->getAs<types::Int16>()->get();
127                 err = mputi(iFile, piData, iSize, pstType);
128                 break;
129             }
130             case types::InternalType::ScilabInt32:
131             {
132                 int* piData = NULL;
133                 piData = in[0]->getAs<types::Int32>()->get();
134                 err = mputi(iFile, piData, iSize, pstType);
135                 break;
136             }
137             case types::InternalType::ScilabInt64:
138             {
139                 long long* piData = NULL;
140                 piData = in[0]->getAs<types::Int64>()->get();
141                 err = mputi(iFile, piData, iSize, pstType);
142                 break;
143             }
144             case types::InternalType::ScilabUInt8:
145             {
146                 unsigned char* piData = NULL;
147                 piData = in[0]->getAs<types::UInt8>()->get();
148                 err = mputi(iFile, piData, iSize, pstType);
149                 break;
150             }
151             case types::InternalType::ScilabUInt16:
152             {
153                 unsigned short* piData = NULL;
154                 piData = in[0]->getAs<types::UInt16>()->get();
155                 err = mputi(iFile, piData, iSize, pstType);
156                 break;
157             }
158             case types::InternalType::ScilabUInt32:
159             {
160                 unsigned int* piData = NULL;
161                 piData = in[0]->getAs<types::UInt32>()->get();
162                 err = mputi(iFile, piData, iSize, pstType);
163                 break;
164             }
165             case types::InternalType::ScilabUInt64:
166             {
167                 unsigned long long* piData = NULL;
168                 piData = in[0]->getAs<types::UInt64>()->get();
169                 err = mputi(iFile, piData, iSize, pstType);
170                 break;
171             }
172         }
173
174         if (err)
175         {
176             FREE(pstType);
177             Scierror(10000, "");
178             return types::Function::Error;
179         }
180     }
181
182     FREE(pstType);
183     return types::Function::OK;
184 }
185 /*--------------------------------------------------------------------------*/