wcstod no more convert d and D characters 54/18954/2
Cedric Delamarre [Wed, 25 Jan 2017 11:26:23 +0000 (12:26 +0100)]
  test_run atoms bug_13108
  test_run ast bug_14303
  test_run("string", ["strtod", "bug_12335", "bug_14568", "bug_13524", "bug_14568_test", "bug_5073", "bug_5291", "bug_8234"])

Change-Id: Ia3edc93aa3f16282d21d8fe8ebdd602fa69aad87

scilab/modules/string/Makefile.am
scilab/modules/string/Makefile.in
scilab/modules/string/includes/os_wcstod.h [new file with mode: 0644]
scilab/modules/string/sci_gateway/cpp/sci_strtod.cpp
scilab/modules/string/src/c/os_wcstod.c [new file with mode: 0644]
scilab/modules/string/src/c/string.vcxproj
scilab/modules/string/src/c/string.vcxproj.filters

index 180f6cd..206db89 100644 (file)
@@ -28,6 +28,7 @@ STRING_C_SOURCES = \
     src/c/StringConvert.c \
     src/c/os_wcsdup.c \
     src/c/os_wcstok.c \
+    src/c/os_wcstod.c \
     src/c/scistrtostr.c \
     src/c/stringToDouble.c \
     src/c/stringToComplex.c \
@@ -158,6 +159,7 @@ includes/getfastcode.h \
 includes/men_Sutils.h \
 includes/os_string.h \
 includes/os_wcstok.h \
+includes/os_wcstod.h \
 includes/pcre_private.h \
 includes/scistrtostr.h \
 includes/StringConvert.h \
index 95e4207..239a516 100644 (file)
@@ -189,6 +189,7 @@ am__objects_1 = src/c/libscistring_algo_la-convstr.lo \
        src/c/libscistring_algo_la-StringConvert.lo \
        src/c/libscistring_algo_la-os_wcsdup.lo \
        src/c/libscistring_algo_la-os_wcstok.lo \
+       src/c/libscistring_algo_la-os_wcstod.lo \
        src/c/libscistring_algo_la-scistrtostr.lo \
        src/c/libscistring_algo_la-stringToDouble.lo \
        src/c/libscistring_algo_la-stringToComplex.lo \
@@ -645,6 +646,7 @@ STRING_C_SOURCES = \
     src/c/StringConvert.c \
     src/c/os_wcsdup.c \
     src/c/os_wcstok.c \
+    src/c/os_wcstod.c \
     src/c/scistrtostr.c \
     src/c/stringToDouble.c \
     src/c/stringToComplex.c \
@@ -768,6 +770,7 @@ includes/getfastcode.h \
 includes/men_Sutils.h \
 includes/os_string.h \
 includes/os_wcstok.h \
+includes/os_wcstod.h \
 includes/pcre_private.h \
 includes/scistrtostr.h \
 includes/StringConvert.h \
@@ -975,6 +978,8 @@ src/c/libscistring_algo_la-os_wcsdup.lo: src/c/$(am__dirstamp) \
        src/c/$(DEPDIR)/$(am__dirstamp)
 src/c/libscistring_algo_la-os_wcstok.lo: src/c/$(am__dirstamp) \
        src/c/$(DEPDIR)/$(am__dirstamp)
+src/c/libscistring_algo_la-os_wcstod.lo: src/c/$(am__dirstamp) \
+       src/c/$(DEPDIR)/$(am__dirstamp)
 src/c/libscistring_algo_la-scistrtostr.lo: src/c/$(am__dirstamp) \
        src/c/$(DEPDIR)/$(am__dirstamp)
 src/c/libscistring_algo_la-stringToDouble.lo: src/c/$(am__dirstamp) \
@@ -1152,6 +1157,7 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote@src/c/$(DEPDIR)/libscistring_algo_la-isnum.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@src/c/$(DEPDIR)/libscistring_algo_la-men_Sutils.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@src/c/$(DEPDIR)/libscistring_algo_la-os_wcsdup.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/c/$(DEPDIR)/libscistring_algo_la-os_wcstod.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@src/c/$(DEPDIR)/libscistring_algo_la-os_wcstok.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@src/c/$(DEPDIR)/libscistring_algo_la-partfunction.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@src/c/$(DEPDIR)/libscistring_algo_la-pcre_error.Plo@am__quote@
@@ -1326,6 +1332,13 @@ src/c/libscistring_algo_la-os_wcstok.lo: src/c/os_wcstok.c
 @AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libscistring_algo_la_CPPFLAGS) $(CPPFLAGS) $(libscistring_algo_la_CFLAGS) $(CFLAGS) -c -o src/c/libscistring_algo_la-os_wcstok.lo `test -f 'src/c/os_wcstok.c' || echo '$(srcdir)/'`src/c/os_wcstok.c
 
+src/c/libscistring_algo_la-os_wcstod.lo: src/c/os_wcstod.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libscistring_algo_la_CPPFLAGS) $(CPPFLAGS) $(libscistring_algo_la_CFLAGS) $(CFLAGS) -MT src/c/libscistring_algo_la-os_wcstod.lo -MD -MP -MF src/c/$(DEPDIR)/libscistring_algo_la-os_wcstod.Tpo -c -o src/c/libscistring_algo_la-os_wcstod.lo `test -f 'src/c/os_wcstod.c' || echo '$(srcdir)/'`src/c/os_wcstod.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) src/c/$(DEPDIR)/libscistring_algo_la-os_wcstod.Tpo src/c/$(DEPDIR)/libscistring_algo_la-os_wcstod.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='src/c/os_wcstod.c' object='src/c/libscistring_algo_la-os_wcstod.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libscistring_algo_la_CPPFLAGS) $(CPPFLAGS) $(libscistring_algo_la_CFLAGS) $(CFLAGS) -c -o src/c/libscistring_algo_la-os_wcstod.lo `test -f 'src/c/os_wcstod.c' || echo '$(srcdir)/'`src/c/os_wcstod.c
+
 src/c/libscistring_algo_la-scistrtostr.lo: src/c/scistrtostr.c
 @am__fastdepCC_TRUE@   $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libscistring_algo_la_CPPFLAGS) $(CPPFLAGS) $(libscistring_algo_la_CFLAGS) $(CFLAGS) -MT src/c/libscistring_algo_la-scistrtostr.lo -MD -MP -MF src/c/$(DEPDIR)/libscistring_algo_la-scistrtostr.Tpo -c -o src/c/libscistring_algo_la-scistrtostr.lo `test -f 'src/c/scistrtostr.c' || echo '$(srcdir)/'`src/c/scistrtostr.c
 @am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) src/c/$(DEPDIR)/libscistring_algo_la-scistrtostr.Tpo src/c/$(DEPDIR)/libscistring_algo_la-scistrtostr.Plo
diff --git a/scilab/modules/string/includes/os_wcstod.h b/scilab/modules/string/includes/os_wcstod.h
new file mode 100644 (file)
index 0000000..2f1ef7a
--- /dev/null
@@ -0,0 +1,27 @@
+/*
+ *  Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+ *  Copyright (C) 2011 - Scilab Enterprises - Cedric Delamarre
+ *
+ * Copyright (C) 2012 - 2017 - Scilab Enterprises
+ *
+ * This file is hereby licensed under the terms of the GNU GPL v2.0,
+ * pursuant to article 5.3.4 of the CeCILL v.2.1.
+ * This file was originally licensed under the terms of the CeCILL v2.1,
+ * and continues to be available under such terms.
+ * For more information, see the COPYING file which you should have received
+ * along with this program.
+ *
+ */
+
+#ifndef __OS_WCSTOD_H__
+#define __OS_WCSTOD_H__
+
+#include <wchar.h>
+#include "dynlib_string.h"
+
+// because of string 'd' and 'D' have been removed from the convertion of wcstod,
+// this function will allow the convertion of strings which use theses characteres
+// to keep compatibility
+STRING_IMPEXP double os_wcstod(wchar_t *_pwstData, wchar_t** _pswtState);
+
+#endif /* !__OS_WCSTOD_H__ */
index d0b4109..b812b84 100644 (file)
@@ -27,6 +27,7 @@ extern "C"
 #include "localization.h"
 #include "Scierror.h"
 #include "os_string.h"
+#include "os_wcstod.h"
 #include "locale.h"
 }
 
@@ -159,7 +160,7 @@ types::Function::ReturnValue sci_strtod(types::typed_list &in, int _iRetCount, t
                 }
                 else // strtod("  000xxx")
                 {
-                    pOutDouble->set(i, wcstod(pstStr + iKey, &pwstStop));
+                    pOutDouble->set(i, os_wcstod(pstStr + iKey, &pwstStop));
                 }
             }
         }
@@ -169,7 +170,7 @@ types::Function::ReturnValue sci_strtod(types::typed_list &in, int _iRetCount, t
         }
         else //all characters are digits
         {
-            pOutDouble->set(i, wcstod(pstStr, &pwstStop));
+            pOutDouble->set(i, os_wcstod(pstStr, &pwstStop));
         }
 
         if (_iRetCount == 2)
diff --git a/scilab/modules/string/src/c/os_wcstod.c b/scilab/modules/string/src/c/os_wcstod.c
new file mode 100644 (file)
index 0000000..7830635
--- /dev/null
@@ -0,0 +1,43 @@
+/*
+ * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+ * Copyright (C) Scilab Enterprises - 2017 - Cedric Delamarre
+ *
+ * Copyright (C) 2012 - 2017 - Scilab Enterprises
+ *
+ * This file is hereby licensed under the terms of the GNU GPL v2.0,
+ * pursuant to article 5.3.4 of the CeCILL v.2.1.
+ * This file was originally licensed under the terms of the CeCILL v2.1,
+ * and continues to be available under such terms.
+ * For more information, see the COPYING file which you should have received
+ * along with this program.
+ *
+ */
+#include <stddef.h>
+#include "os_string.h"
+#include "os_wcstod.h"
+#include "stdio.h"
+
+double os_wcstod(wchar_t *_pwstData, wchar_t** _pwstState)
+{
+    double val = wcstod(_pwstData, _pwstState);
+    wchar_t* pwstStop = *_pwstState;
+    if (*pwstStop == L'd' || *pwstStop == L'D')
+    {
+        wchar_t pwstKey[] = L"1234567890";
+        wchar_t pwstSymbol[] = L"-+";
+        int iSign = (int)wcscspn(pwstStop, pwstSymbol);
+        int iKey = (int)wcscspn(pwstStop, pwstKey);
+
+        if ((iSign == 1 || pwstStop[iSign] == L'\0') && // d-12 or d12
+                (iKey  == 1 || iKey == iSign + 1)) // d12 or d+12
+        {
+            ptrdiff_t iPos = pwstStop - _pwstData;
+            wchar_t* pwstData = os_wcsdup(_pwstData);
+            pwstData[iPos] = L'e';
+            val = wcstod(pwstData, &pwstStop);
+            *_pwstState = _pwstData + (pwstStop - pwstData);
+        }
+    }
+
+    return val;
+}
index 7b2e30e..1f0df42 100644 (file)
     <ClCompile Include="isdigit.c" />
     <ClCompile Include="isletter.c" />
     <ClCompile Include="men_Sutils.c" />
+    <ClCompile Include="os_wcstod.c" />
     <ClCompile Include="os_wcstok.c" />
     <ClCompile Include="partfunction.c" />
     <ClCompile Include="pcre_error.c" />
     <ClInclude Include="..\..\includes\getfastcode.h" />
     <ClInclude Include="..\..\includes\men_Sutils.h" />
     <ClInclude Include="..\..\includes\os_string.h" />
+    <ClInclude Include="..\..\includes\os_wcstod.h" />
     <ClInclude Include="..\..\includes\os_wcstok.h" />
     <ClInclude Include="..\..\includes\os_wtoi.h" />
     <ClInclude Include="..\..\includes\pcre_private.h" />
index 7974e8b..50797cb 100644 (file)
     <ClCompile Include="..\cpp\os_wtoi.cpp">
       <Filter>Source Files</Filter>
     </ClCompile>
+    <ClCompile Include="os_wcstod.c">
+      <Filter>Source Files</Filter>
+    </ClCompile>
   </ItemGroup>
   <ItemGroup>
     <None Include="core_import.def">
     <ClInclude Include="..\..\includes\os_wtoi.h">
       <Filter>Header Files</Filter>
     </ClInclude>
+    <ClInclude Include="..\..\includes\os_wcstod.h">
+      <Filter>Header Files</Filter>
+    </ClInclude>
   </ItemGroup>
   <ItemGroup>
     <Library Include="..\..\..\..\bin\blasplus.lib" />