21c318ed0557f364f756a738a3f3b7047f18bbb0
[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 #include "filemanager.hxx"
19 #include "fileio_gw.hxx"
20 #include "string.hxx"
21 #include "double.hxx"
22 #include "int.hxx"
23 #include "function.hxx"
24
25 extern "C"
26 {
27 #include "sci_malloc.h"
28 #include "mput.h"
29 #include "localization.h"
30 #include "Scierror.h"
31 #include "charEncoding.h"
32 #include "os_string.h"
33 }
34
35 /*--------------------------------------------------------------------------*/
36 types::Function::ReturnValue sci_mput(types::typed_list &in, int _iRetCount, types::typed_list &out)
37 {
38     char* pstType   = os_strdup("l");//default type value : long
39     int iSize       = 0;
40     int iFile       = -1; //default file : last opened file
41     double* pData   = NULL;
42     int iErr        = 0;
43
44     if (in.size() < 1 || in.size() > 3)
45     {
46         Scierror(77, _("%s: Wrong number of input argument(s): %d to %d expected.\n"), "mput", 1, 3);
47         FREE(pstType);
48         return types::Function::Error;
49     }
50
51     //check parameter 1
52     if ((in[0]->isDouble() == false) && (in[0]->isInt() == false))
53     {
54         Scierror(999, _("%s: Wrong type for input argument #%d: A integer expected.\n"), "mput", 1);
55         FREE(pstType);
56         return types::Function::Error;
57     }
58
59     iSize = in[0]->getAs<types::GenericType>()->getSize();
60
61     if (in.size() >= 2)
62     {
63         //export format
64         if (in[1]->isString() == false || in[1]->getAs<types::String>()->getSize() != 1)
65         {
66             Scierror(999, _("%s: Wrong type for input argument #%d: string expected.\n"), "mput", 2);
67             FREE(pstType);
68             return types::Function::Error;
69         }
70
71         FREE(pstType);
72         pstType = wide_string_to_UTF8(in[1]->getAs<types::String>()->get(0));
73
74     }
75
76     if (in.size() == 3)
77     {
78         if (in[2]->isDouble() == false || in[2]->getAs<types::Double>()->getSize() != 1)
79         {
80             Scierror(999, _("%s: Wrong type for input argument #%d: A integer expected.\n"), "mput", 3);
81             FREE(pstType);
82             return types::Function::Error;
83         }
84
85         iFile = static_cast<int>(in[2]->getAs<types::Double>()->get(0));
86     }
87
88     switch (iFile)
89     {
90         case 5: // stdin
91             Scierror(999, _("%s: Wrong file descriptor: %d.\n"), "mput", iFile);
92             FREE(pstType);
93             return types::Function::Error;
94     }
95
96     if (in[0]->isDouble())
97     {
98         pData = in[0]->getAs<types::Double>()->get();
99     }
100     else
101     {
102         pData = (double*)malloc(iSize * sizeof(double));
103         if (in[0]->isInt8())
104         {
105             char* piData = in[0]->getAs<types::Int8>()->get();
106             for (int i = 0; i < iSize; i++)
107             {
108                 pData[i] = (double)piData[i];
109             }
110         }
111         else if (in[0]->isUInt8())
112         {
113             unsigned char* piData = in[0]->getAs<types::UInt8>()->get();
114             for (int i = 0; i < iSize; i++)
115             {
116                 pData[i] = (double)piData[i];
117             }
118         }
119         else if (in[0]->isInt16())
120         {
121             short* piData = in[0]->getAs<types::Int16>()->get();
122             for (int i = 0; i < iSize; i++)
123             {
124                 pData[i] = (double)piData[i];
125             }
126         }
127         else if (in[0]->isUInt16())
128         {
129             unsigned short* piData = in[0]->getAs<types::UInt16>()->get();
130             for (int i = 0; i < iSize; i++)
131             {
132                 pData[i] = (double)piData[i];
133             }
134         }
135         else if (in[0]->isInt32())
136         {
137             int* piData = in[0]->getAs<types::Int32>()->get();
138             for (int i = 0; i < iSize; i++)
139             {
140                 pData[i] = (double)piData[i];
141             }
142         }
143         else if (in[0]->isUInt32())
144         {
145             unsigned int* piData = in[0]->getAs<types::UInt32>()->get();
146             for (int i = 0; i < iSize; i++)
147             {
148                 pData[i] = (double)piData[i];
149             }
150         }
151         else if (in[0]->isInt64())
152         {
153             long long* piData = in[0]->getAs<types::Int64>()->get();
154             for (int i = 0; i < iSize; i++)
155             {
156                 pData[i] = (double)piData[i];
157             }
158         }
159         else if (in[0]->isUInt64())
160         {
161             unsigned long long* piData = in[0]->getAs<types::UInt64>()->get();
162             for (int i = 0; i < iSize; i++)
163             {
164                 pData[i] = (double)piData[i];
165             }
166         }
167     }
168
169     C2F(mput)(&iFile, pData, &iSize, pstType, &iErr);
170
171     FREE(pstType);
172     if (in[0]->isDouble() == false)
173     {
174         free(pData);
175     }
176
177     if (iErr)
178     {
179         Scierror(10000, "");
180         return types::Function::Error;
181     }
182
183     return types::Function::OK;
184 }
185 /*--------------------------------------------------------------------------*/