Merge remote-tracking branch 'origin/master' into YaSp
[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     wchar_t pwstKey[] = L"1234567890";
36     unsigned long long ullNan = 0x7ff8000000000000;
37     double dblNan = *( double* )&ullNan;
38
39     if (in.size() != 1)
40     {
41         Scierror(77, _("%s: Wrong number of input argument(s): %d expected.\n"), "strtod", 1);
42         return types::Function::Error;
43     }
44     if (_iRetCount > 2)
45     {
46         Scierror(78, _("%s: Wrong number of output argument(s): %d to %d expected.\n"), "strtod", 1, 2);
47         return types::Function::Error;
48     }
49
50     pString = in[0]->getAs<types::String>();
51
52     pOutDouble = new types::Double(pString->getDims(), pString->getDimsArray());
53     if (_iRetCount == 2)
54     {
55         pOutString = new types::String(pString->getDims(), pString->getDimsArray());
56     }
57
58     for (int i = 0 ; i < pString->getSize() ; i++)
59     {
60         bool bStop = false;
61         wchar_t *pwstStop = NULL;
62         wchar_t* pstStr = pString->get(i);
63         int iPos = (int)wcscspn(pstStr, pwstKey);
64
65         if (iPos)
66         {
67             for (int j = 0 ; j < iPos ; j++)
68             {
69                 if (pstStr[j] != ' ')
70                 {
71                     pOutDouble->set(i, dblNan);
72                     bStop = true;
73                     pwstStop = pstStr;
74                 }
75             }
76
77             if (bStop == false)
78             {
79                 pOutDouble->set(i, wcstod(pstStr, &pwstStop));
80             }
81         }
82         else
83         {
84             pOutDouble->set(i, wcstod(pstStr, &pwstStop));
85         }
86
87         if (_iRetCount == 2)
88         {
89             if (pwstStop)
90             {
91                 pOutString->set(i, pwstStop);
92             }
93             else
94             {
95                 pOutString->set(i, L"");
96             }
97         }
98     }
99
100     out.push_back(pOutDouble);
101
102     if (_iRetCount == 2)
103     {
104         out.push_back(pOutString);
105     }
106
107     return types::Function::OK;
108 }
109