* Bug #12335 fixed - strtod didn't work with negative numbers. 96/10696/7
Charlotte HECQUET [Tue, 5 Mar 2013 13:54:25 +0000 (14:54 +0100)]
+ manage sign '+' and '-' and form with '.' without zero like .3 or -.5 ( compatible with strtod C function )

Change-Id: I50993dd8363759a77e18eb2f8d196a1f4a3bfdf4

scilab/CHANGES_5.4.X
scilab/modules/string/help/en_US/strtod.xml
scilab/modules/string/sci_gateway/c/sci_strtod.c
scilab/modules/string/tests/nonreg_tests/bug_12335.dia.ref [new file with mode: 0644]
scilab/modules/string/tests/nonreg_tests/bug_12335.tst [new file with mode: 0644]
scilab/modules/string/tests/unit_tests/strtod.dia.ref
scilab/modules/string/tests/unit_tests/strtod.tst

index 595aa03..60c7505 100644 (file)
@@ -472,6 +472,8 @@ Bug fixes
 
 * Bug #12333 fixed - Cleaned command history is restored after reopening Scilab.
 
+* Bug #12335 fixed - strtod didn't work with negative numbers.
+
 * Bug #12346 fixed - lsslist() help pages were mislocated. Moved now to CACSD.
 
 * Bug #12348 fixed - surf() disable lines(n) if there is no input variable.
index d55a4bb..7bdeaf4 100644 (file)
         </para>
     </refsection>
     <refsection>
+        <title>Remark</title>
+        <para>
+            This function is based on the strtod C function which causes different behaviors on Windows and Linux. In fact, on Windows, it is possible to use
+            d or D for exponents, but it is not possible to use hexadecimal numbers.
+        </para>
+    </refsection> 
+    <refsection>
         <title>Examples</title>
         <programlisting role="example"><![CDATA[ 
 strtod('123.556This is a sample real')
index 86c94c7..45bcd1f 100644 (file)
@@ -28,6 +28,7 @@ int sci_strtod(char *fname, unsigned long fname_len)
     int first_nb = 0;
     int x, y; //loop indexes
     char keys[] = "1234567890";
+    char symbol[] = "-+.";
     unsigned long long raw = 0x7ff8000000000000;
     double not_a_number = *( double* )&raw;
     int iRhs = nbInputArgument(pvApiCtx);
@@ -39,7 +40,6 @@ int sci_strtod(char *fname, unsigned long fname_len)
     double *OutputDoubles = NULL;
     char **OutputStrings = NULL;
 
-
     CheckInputArgument(pvApiCtx, 1, 1);
     CheckOutputArgument(pvApiCtx, 1, 2);
 
@@ -113,8 +113,25 @@ int sci_strtod(char *fname, unsigned long fname_len)
     {
         //Double part
         char *stopstring = NULL;
+        int iLen = (int)strlen(Input_StringMatrix_1[x]);
+        int iSign = (int)strcspn(Input_StringMatrix_1[x], symbol);
         first_nb = (int)strcspn(Input_StringMatrix_1[x], keys);
 
+        //symbol can be use only if it is before key
+        if (iSign == first_nb - 1)
+        {
+            //let strtod do with symbol
+            first_nb -= 1;
+        }
+
+        //special case for "-.3"
+        if (iSign == first_nb - 2 && Input_StringMatrix_1[x][iSign + 1] == '.')
+        {
+
+            //let strtod do with symbol
+            first_nb -= 2;
+        }
+
         //Check if there is a number in the string
         if (first_nb != 0)
         {
diff --git a/scilab/modules/string/tests/nonreg_tests/bug_12335.dia.ref b/scilab/modules/string/tests/nonreg_tests/bug_12335.dia.ref
new file mode 100644 (file)
index 0000000..f799460
--- /dev/null
@@ -0,0 +1,20 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2013 - Scilab Enterprises - Charlotte HECQUET
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+//
+// <-- CLI SHELL MODE -->
+//
+// <-- Non-regression test for bug 12335 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/show_bug.cgi?id=12335
+//
+// <-- Short Description -->
+// Wrong error message returned by length when called without input argument.
+//
+[d,s] = strtod("-3 sdf");
+assert_checkequal(s, " sdf");
+assert_checkequal(d, -3);
diff --git a/scilab/modules/string/tests/nonreg_tests/bug_12335.tst b/scilab/modules/string/tests/nonreg_tests/bug_12335.tst
new file mode 100644 (file)
index 0000000..128cb68
--- /dev/null
@@ -0,0 +1,21 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2013 - Scilab Enterprises - Charlotte HECQUET
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+//
+// <-- CLI SHELL MODE -->
+//
+// <-- Non-regression test for bug 12335 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/show_bug.cgi?id=12335
+//
+// <-- Short Description -->
+// Wrong error message returned by length when called without input argument.
+//
+
+[d,s] = strtod("-3 sdf");
+assert_checkequal(s, " sdf");
+assert_checkequal(d, -3);
index c18c89e..08a5a68 100644 (file)
@@ -60,3 +60,26 @@ assert_checkequal(d, %nan);
 assert_checkequal(s, "");
 assert_checkequal(d, %nan);
 //===============================
+[d,s] = strtod("-3 sdf");
+assert_checkequal(s, " sdf");
+assert_checkequal(d, -3);
+//===============================
+[d,s] = strtod("abc -3 sdf");
+assert_checkequal(s, "abc -3 sdf");
+assert_checkequal(d, %nan);
+//===============================
+[d,s] = strtod("- 3 sdf");
+assert_checkequal(s, "- 3 sdf");
+assert_checkequal(d, %nan);
+//===============================
+[d,s] = strtod("  -.3 sdf");
+assert_checkequal(s, " sdf");
+assert_checkequal(d, -0.3);
+//===============================
+[d,s] = strtod("abs .01sdf");
+assert_checkequal(s, "abs .01sdf");
+assert_checkequal(d, %nan);
+//===============================
+[d,s] = strtod("-.4e-3 sdf");
+assert_checkequal(s, " sdf");
+assert_checkequal(d, -.4e-3);
index 8b9d55c..0a9cd11 100644 (file)
@@ -62,3 +62,27 @@ assert_checkequal(d, %nan);
 assert_checkequal(s, "");
 assert_checkequal(d, %nan);
 //===============================
+[d,s] = strtod("-3 sdf");
+assert_checkequal(s, " sdf");
+assert_checkequal(d, -3);
+//===============================
+[d,s] = strtod("abc -3 sdf");
+assert_checkequal(s, "abc -3 sdf");
+assert_checkequal(d, %nan);
+//===============================
+[d,s] = strtod("- 3 sdf");
+assert_checkequal(s, "- 3 sdf");
+assert_checkequal(d, %nan);
+//===============================
+[d,s] = strtod("  -.3 sdf");
+assert_checkequal(s, " sdf");
+assert_checkequal(d, -0.3);
+//===============================
+[d,s] = strtod("abs .01sdf");
+assert_checkequal(s, "abs .01sdf");
+assert_checkequal(d, %nan);
+//===============================
+[d,s] = strtod("-.4e-3 sdf");
+assert_checkequal(s, " sdf");
+assert_checkequal(d, -.4e-3);
+