wcstod no more convert d and D characters
[scilab.git] / scilab / modules / string / src / c / os_wcstod.c
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) Scilab Enterprises - 2017 - Cedric Delamarre
4  *
5  * Copyright (C) 2012 - 2017 - Scilab Enterprises
6  *
7  * This file is hereby licensed under the terms of the GNU GPL v2.0,
8  * pursuant to article 5.3.4 of the CeCILL v.2.1.
9  * This file was originally licensed under the terms of the CeCILL v2.1,
10  * and continues to be available under such terms.
11  * For more information, see the COPYING file which you should have received
12  * along with this program.
13  *
14  */
15 #include <stddef.h>
16 #include "os_string.h"
17 #include "os_wcstod.h"
18 #include "stdio.h"
19
20 double os_wcstod(wchar_t *_pwstData, wchar_t** _pwstState)
21 {
22     double val = wcstod(_pwstData, _pwstState);
23     wchar_t* pwstStop = *_pwstState;
24     if (*pwstStop == L'd' || *pwstStop == L'D')
25     {
26         wchar_t pwstKey[] = L"1234567890";
27         wchar_t pwstSymbol[] = L"-+";
28         int iSign = (int)wcscspn(pwstStop, pwstSymbol);
29         int iKey = (int)wcscspn(pwstStop, pwstKey);
30
31         if ((iSign == 1 || pwstStop[iSign] == L'\0') && // d-12 or d12
32                 (iKey  == 1 || iKey == iSign + 1)) // d12 or d+12
33         {
34             ptrdiff_t iPos = pwstStop - _pwstData;
35             wchar_t* pwstData = os_wcsdup(_pwstData);
36             pwstData[iPos] = L'e';
37             val = wcstod(pwstData, &pwstStop);
38             *_pwstState = _pwstData + (pwstStop - pwstData);
39         }
40     }
41
42     return val;
43 }