FIX FieldExp management through assign.
[scilab.git] / scilab / modules / string / sci_gateway / cpp / sci_strtod.cpp
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) Digiteo 2011 - Cedric DELAMARRE
4  *
5  * This file must be used under the terms of the CeCILL.
6  * This source file is licensed as described in the file COPYING, which
7  * you should have received as part of this distribution.  The terms
8  * are also available at
9  * http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
10  *
11  */
12
13
14 #include "function.hxx"
15 #include "string.hxx"
16 #include "list.hxx"
17 #include "double.hxx"
18 #include "funcmanager.hxx"
19 #include "string_gw.hxx"
20
21 extern "C"
22 {
23 #include "core_math.h"
24 #include "localization.h"
25 #include "Scierror.h"
26 }
27
28
29 types::Function::ReturnValue sci_strtod(types::typed_list &in, int _iRetCount, types::typed_list &out)
30 {
31     types::Double* pOutDouble = NULL;
32     types::String* pOutString = NULL;
33     types::String* pString = NULL;
34
35     if(in.size() != 1)
36     {
37         Scierror(77, _("%s: Wrong number of input argument(s): %d expected.\n"), "strtod", 1);
38         return types::Function::Error;
39     }
40     if(_iRetCount > 2)
41     {
42         Scierror(78, _("%s: Wrong number of output argument(s): %d to %d expected.\n"), "strtod", 1, 2);
43         return types::Function::Error;
44     }
45
46     pString = in[0]->getAs<types::String>();
47
48     if(_iRetCount == 2)
49     {
50         pOutDouble = new types::Double(pString->getDims(),pString->getDimsArray());
51         pOutString = new types::String(pString->getDims(),pString->getDimsArray());
52
53         for (int i = 0 ; i < pString->getSize() ; i++)
54         {
55             wchar_t *stopstring = NULL;
56             pOutDouble->set(i,wcstod(pString->get(i),&stopstring));
57             if(stopstring)
58             {
59                 pOutString->set(i,stopstring);
60             }
61             else
62             {
63                 pOutString->set(i,L"");
64             }
65         }
66
67         out.push_back(pOutDouble);
68         out.push_back(pOutString);
69     }
70     else // _iRetCount == 1
71     {
72         pOutDouble = new types::Double(pString->getDims(),pString->getDimsArray());
73
74         for (int i = 0 ; i < pString->getSize() ; i++)
75         {
76             wchar_t *stopstring = NULL;
77             pOutDouble->set(i,wcstod(pString->get(i),&stopstring));
78         }
79
80         out.push_back(pOutDouble);
81     }
82
83     return types::Function::OK;
84 }
85