* Bug #5073 fixed - New parameter added at strtod function (decimal separator). 49/11249/3
Charlotte HECQUET [Tue, 9 Apr 2013 14:32:43 +0000 (16:32 +0200)]
Change-Id: I10c5c3e4d7c00d62a4971753229a2816b81c231c

SEP/INDEX
SEP/SEP_097_strtod.odt [new file with mode: 0644]
scilab/CHANGES_5.5.X
scilab/modules/string/sci_gateway/c/sci_strtod.c
scilab/modules/string/tests/nonreg_tests/bug_5073.dia.ref [new file with mode: 0644]
scilab/modules/string/tests/nonreg_tests/bug_5073.tst [new file with mode: 0644]
scilab/modules/string/tests/unit_tests/strtod.dia.ref
scilab/modules/string/tests/unit_tests/strtod.tst

index 3dc8851..d2b48a8 100644 (file)
--- a/SEP/INDEX
+++ b/SEP/INDEX
@@ -85,4 +85,9 @@ SEP #085: cond improvements
 SEP #086: Improvement of the regexp function
 SEP #087: New binaries: xcos scinotes
 SEP #088: Remote file access functions
-SEP #089: New parameter added at routh_t function (normalized).
+SEP #089: New parameter added at routh_t function (normalized)
+SEP #090: New function to access to numerical data in HDF5 files
+SEP #091: New function daskr
+SEP #092: 
+SEP #093: New function cov
+SEP #097: New parameter added at strtod function (decimalseparator)
diff --git a/SEP/SEP_097_strtod.odt b/SEP/SEP_097_strtod.odt
new file mode 100644 (file)
index 0000000..21e683a
Binary files /dev/null and b/SEP/SEP_097_strtod.odt differ
index 63880da..165462b 100644 (file)
@@ -85,6 +85,8 @@ Bug fixes
 
 * Bug #4731 fixed - lqr() failed when time domain of input was a number.
 
+* Bug #5073 fixed - New parameter added at strtod function (decimal separator).
+
 * Bug #5207 fixed - grand() can now return a hypermatrix.
 
 * Bug #5365 fixed - makecell help page was in the "compatibility functions" directory
index 45bcd1f..5534d91 100644 (file)
 #include "Scierror.h"
 #include "localization.h"
 #include "api_scilab.h"
+#include "locale.h"
+#ifdef _MSC_VER
+#include "strdup_windows.h"
+#endif
 /*----------------------------------------------------------------------------*/
 int sci_strtod(char *fname, unsigned long fname_len)
 {
     SciErr sciErr;
     int* piAddr = NULL;
+    int* piAddr2 = NULL;
     int iRows = 0, iCols = 0;
     int iRowsiCols = 0;
     char **Input_StringMatrix_1 = NULL;
+    char *Input_SingleString_1 = NULL;
     int first_nb = 0;
     int x, y; //loop indexes
     char keys[] = "1234567890";
-    char symbol[] = "-+.";
+    char symbol1[] = "-+.";
+    char symbol2[] = "-+,";
     unsigned long long raw = 0x7ff8000000000000;
     double not_a_number = *( double* )&raw;
     int iRhs = nbInputArgument(pvApiCtx);
     int iLhs = nbOutputArgument(pvApiCtx);
     int flag = 0;
-
+    int nopt = 1; //Number of optional arguments
 
     //output values
     double *OutputDoubles = NULL;
     char **OutputStrings = NULL;
 
-    CheckInputArgument(pvApiCtx, 1, 1);
+    CheckInputArgument(pvApiCtx, 1, 1 + nopt);
     CheckOutputArgument(pvApiCtx, 1, 2);
 
+    if (iRhs == 2)
+    {
+        //get variable address
+        sciErr = getVarAddressFromPosition(pvApiCtx, 2, &piAddr2);
+        if (sciErr.iErr)
+        {
+            printError(&sciErr, 0);
+            Scierror(999, _("%s: Can not read input argument #%d.\n"), fname, 2);
+            return 0;
+        }
+        if (isStringType(pvApiCtx, piAddr2) == 0)
+        {
+            Scierror(999, _("%s: Wrong type for input argument #%d: Single string expected.\n"), fname, 2);
+            return 0;
+        }
+        if (getAllocatedSingleString(pvApiCtx, piAddr2, &Input_SingleString_1))
+        {
+            Scierror(999, _("%s: Wrong type for input argument #%d: Single string expected.\n"), fname, 2);
+            return 0;
+        }
+        //Test on optional argument value
+        if (Input_SingleString_1[0] != '.' && Input_SingleString_1[0] != ',')
+        {
+            Scierror(999, _("%s: Wrong value for input argument #%d: '.' or ',' expected.\n"), fname, 2);
+        }
+    }
+    else
+    {
+        Input_SingleString_1 = strdup(".");
+    }
+
     //get variable address
     sciErr = getVarAddressFromPosition(pvApiCtx, 1, &piAddr);
     if (sciErr.iErr)
     {
         printError(&sciErr, 0);
-        Scierror(999, _("%s: Can not read input argument #%d.\n"), fname, 3);
+        Scierror(999, _("%s: Can not read input argument #%d.\n"), fname, 1);
         return 0;
     }
 
@@ -94,6 +132,7 @@ int sci_strtod(char *fname, unsigned long fname_len)
         if (OutputStrings == NULL)
         {
             freeAllocatedMatrixOfString(iRows, iCols, Input_StringMatrix_1);
+            freeAllocatedSingleString(Input_SingleString_1);
             Scierror(999, _("%s: No more memory.\n"), fname);
             return 0;
         }
@@ -105,16 +144,25 @@ int sci_strtod(char *fname, unsigned long fname_len)
         FREE(OutputStrings);
         OutputStrings = NULL;
         freeAllocatedMatrixOfString(iRows, iCols, Input_StringMatrix_1);
+        freeAllocatedSingleString(Input_SingleString_1);
         Scierror(999, _("%s: No more memory.\n"), fname);
         return 0;
     }
-
     for (x = 0 ; x < iRowsiCols ; x++)
     {
         //Double part
         char *stopstring = NULL;
         int iLen = (int)strlen(Input_StringMatrix_1[x]);
-        int iSign = (int)strcspn(Input_StringMatrix_1[x], symbol);
+        int iSign = 0;
+
+        if (Input_SingleString_1[0] == ',')
+        {
+            iSign = (int)strcspn(Input_StringMatrix_1[x], symbol2);
+        }
+        else if (Input_SingleString_1[0] == '.')
+        {
+            iSign = (int)strcspn(Input_StringMatrix_1[x], symbol1);
+        }
         first_nb = (int)strcspn(Input_StringMatrix_1[x], keys);
 
         //symbol can be use only if it is before key
@@ -125,7 +173,7 @@ int sci_strtod(char *fname, unsigned long fname_len)
         }
 
         //special case for "-.3"
-        if (iSign == first_nb - 2 && Input_StringMatrix_1[x][iSign + 1] == '.')
+        if (iSign == first_nb - 2 && (Input_StringMatrix_1[x][iSign + 1] == '.' || Input_StringMatrix_1[x][iSign + 1] == ','))
         {
 
             //let strtod do with symbol
@@ -159,7 +207,20 @@ int sci_strtod(char *fname, unsigned long fname_len)
                 }
                 else // strtod("  000xxx")
                 {
-                    OutputDoubles[x] = (double)strtod(Input_StringMatrix_1[x] + first_nb, &stopstring);
+                    if (Input_SingleString_1[0] == ',')
+                    {
+#ifdef _MSC_VER
+                        setlocale(LC_NUMERIC, "French_France.1252");
+#else
+                        setlocale(LC_NUMERIC, "fr_FR.UTF-8");
+#endif
+                        OutputDoubles[x] = (double)strtod(Input_StringMatrix_1[x] + first_nb, &stopstring);
+                        setlocale(LC_NUMERIC, "C");
+                    }
+                    else
+                    {
+                        OutputDoubles[x] = (double)strtod(Input_StringMatrix_1[x] + first_nb, &stopstring);
+                    }
                 }
             }
         }
@@ -169,7 +230,20 @@ int sci_strtod(char *fname, unsigned long fname_len)
         }
         else //all characters are digits
         {
-            OutputDoubles[x] = (double)strtod(Input_StringMatrix_1[x], &stopstring);
+            if (Input_SingleString_1[0] == ',')
+            {
+#ifdef _MSC_VER
+                setlocale(LC_NUMERIC, "French_France.1252");
+#else
+                setlocale(LC_NUMERIC, "fr_FR.UTF-8");
+#endif
+                OutputDoubles[x] = (double)strtod(Input_StringMatrix_1[x], &stopstring);
+                setlocale(LC_NUMERIC, "C");
+            }
+            else
+            {
+                OutputDoubles[x] = (double)strtod(Input_StringMatrix_1[x], &stopstring);
+            }
         }
 
         if (iLhs == 2)
@@ -187,6 +261,7 @@ int sci_strtod(char *fname, unsigned long fname_len)
             if (OutputStrings[x] == NULL)
             {
                 freeAllocatedMatrixOfString(iRows, iCols, Input_StringMatrix_1);
+                freeAllocatedSingleString(Input_SingleString_1);
                 freeAllocatedMatrixOfString(iRows, iCols, OutputStrings);
                 FREE(OutputDoubles);
                 OutputDoubles = NULL;
@@ -196,7 +271,14 @@ int sci_strtod(char *fname, unsigned long fname_len)
 
             if (stopstring)
             {
-                strcpy(OutputStrings[x], stopstring);
+                if (Input_SingleString_1[0] == ',')
+                {
+                    strcpy(OutputStrings[x], stopstring);
+                }
+                else
+                {
+                    strcpy(OutputStrings[x], stopstring);
+                }
             }
             else
             {
@@ -231,6 +313,7 @@ int sci_strtod(char *fname, unsigned long fname_len)
 
     FREE(OutputDoubles);
     freeAllocatedMatrixOfString(iRows, iCols, Input_StringMatrix_1);
+    freeAllocatedSingleString(Input_SingleString_1);
     ReturnArguments(pvApiCtx);
     return 0;
 }
diff --git a/scilab/modules/string/tests/nonreg_tests/bug_5073.dia.ref b/scilab/modules/string/tests/nonreg_tests/bug_5073.dia.ref
new file mode 100644 (file)
index 0000000..abb4348
--- /dev/null
@@ -0,0 +1,22 @@
+// =============================================================================
+// 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.
+// =============================================================================
+//
+// <-- TEST WITH GRAPHIC --> 
+//
+// <-- Non-regression test for bug 5073 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/show_bug.cgi?id=5073
+//
+// <-- Short Description -->
+// Optional argument added for decimal separator
+assert_checkequal(strtod("1,3",","),1.3);
+str_ref=",3";
+d_ref=1;
+[d, str]=strtod("1,3",".");
+assert_checkequal(d, 1);
+assert_checkequal(str, ",3");
diff --git a/scilab/modules/string/tests/nonreg_tests/bug_5073.tst b/scilab/modules/string/tests/nonreg_tests/bug_5073.tst
new file mode 100644 (file)
index 0000000..a2c33b4
--- /dev/null
@@ -0,0 +1,23 @@
+// =============================================================================
+// 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.
+// =============================================================================
+//
+// <-- TEST WITH GRAPHIC --> 
+//
+// <-- Non-regression test for bug 5073 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/show_bug.cgi?id=5073
+//
+// <-- Short Description -->
+// Optional argument added for decimal separator
+
+assert_checkequal(strtod("1,3",","),1.3);
+str_ref=",3";
+d_ref=1;
+[d, str]=strtod("1,3",".");
+assert_checkequal(d, 1);
+assert_checkequal(str, ",3");
index 08a5a68..89db7ae 100644 (file)
@@ -8,6 +8,7 @@
 //===============================
 // strtod
 //===============================
+// Without optional argument
 N = 666.666;
 STREND = " is a double";
 STR = string(N)+STREND;
@@ -83,3 +84,169 @@ assert_checkequal(d, %nan);
 [d,s] = strtod("-.4e-3 sdf");
 assert_checkequal(s, " sdf");
 assert_checkequal(d, -.4e-3);
+//===============================
+[d,s] = strtod(["2,1","2.1"]);
+assert_checkequal(s, [",1" ""]);
+assert_checkequal(d, [2 2.1]);
+//===============================
+// With point as optional argument
+N = 666.666;
+STREND = " is a double";
+STR = string(N)+STREND;
+d = strtod(STR,".");
+assert_checkequal(d, N);
+[d,s] = strtod(STR,".");
+assert_checkequal(d, N);
+assert_checkequal(s, STREND);
+//===============================
+STR = "1";
+[d,s] = strtod(STR,".");
+assert_checkequal(s, "");
+assert_checkequal(d, 1);
+//===============================
+STR = "string";
+[d,s] = strtod(STR,".");
+assert_checkequal(s, STR);
+assert_checkequal(d, %nan);
+//===============================
+STR1 = "1A";
+STR2 = "2B";
+STR3 = "3C";
+STR4 = "4d";
+STR = [STR1,STR2;STR3,STR4];
+[d,s] = strtod(STR,".");
+assert_checkequal(s, ["A","B";"C","d"]);
+assert_checkequal(d, [1,2;3,4]);
+//===============================
+[d,s] = strtod("",".");
+assert_checkequal(s, "");
+assert_checkequal(d, %nan);
+//===============================
+[d,s] = strtod("  ",".");
+assert_checkequal(s, "  ");
+assert_checkequal(d, %nan);
+//===============================
+[d,s] = strtod("  123",".");
+assert_checkequal(s, "");
+assert_checkequal(d, 123);
+//===============================
+[d,s] = strtod("  123  ",".");
+assert_checkequal(s, "  ");
+assert_checkequal(d, 123);
+//===============================
+[d,s] = strtod("  sdf  ",".");
+assert_checkequal(s, "  sdf  ");
+assert_checkequal(d, %nan);
+//===============================
+[d,s] = strtod([],".");
+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);
+//===============================
+[d,s] = strtod(["2,1","2.1"],".");
+assert_checkequal(s, [",1" ""]);
+assert_checkequal(d, [2 2.1]);
+//===============================
+// With comma as optional argument
+STREND = " is a double";
+STR = "666,666"+STREND;
+d = strtod(STR,",");
+assert_checkequal(d, N);
+[d,s] = strtod(STR,",");
+assert_checkequal(d, N);
+assert_checkequal(s, STREND);
+//===============================
+STR = "1";
+[d,s] = strtod(STR,",");
+assert_checkequal(s, "");
+assert_checkequal(d, 1);
+//===============================
+STR = "string";
+[d,s] = strtod(STR,",");
+assert_checkequal(s, STR);
+assert_checkequal(d, %nan);
+//===============================
+STR1 = "1A";
+STR2 = "2B";
+STR3 = "3C";
+STR4 = "4d";
+STR = [STR1,STR2;STR3,STR4];
+[d,s] = strtod(STR,",");
+assert_checkequal(s, ["A","B";"C","d"]);
+assert_checkequal(d, [1,2;3,4]);
+//===============================
+[d,s] = strtod("",",");
+assert_checkequal(s, "");
+assert_checkequal(d, %nan);
+//===============================
+[d,s] = strtod("  ",",");
+assert_checkequal(s, "  ");
+assert_checkequal(d, %nan);
+//===============================
+[d,s] = strtod("  123",",");
+assert_checkequal(s, "");
+assert_checkequal(d, 123);
+//===============================
+[d,s] = strtod("  123  ",",");
+assert_checkequal(s, "  ");
+assert_checkequal(d, 123);
+//===============================
+[d,s] = strtod("  sdf  ",",");
+assert_checkequal(s, "  sdf  ");
+assert_checkequal(d, %nan);
+//===============================
+[d,s] = strtod([],",");
+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);
+//===============================
+[d,s] = strtod(["2,1","2.1"],",");
+assert_checkequal(s, ["" ".1"]);
+assert_checkequal(d, [2.1 2]);
+//===============================
index 0a9cd11..ba3be18 100644 (file)
@@ -10,6 +10,7 @@
 //===============================
 // strtod
 //===============================
+// Without optional argument
 N = 666.666;
 STREND = " is a double";
 STR = string(N)+STREND;
@@ -85,4 +86,173 @@ assert_checkequal(d, %nan);
 [d,s] = strtod("-.4e-3 sdf");
 assert_checkequal(s, " sdf");
 assert_checkequal(d, -.4e-3);
+//===============================
+[d,s] = strtod(["2,1","2.1"]);
+assert_checkequal(s, [",1" ""]);
+assert_checkequal(d, [2 2.1]);
+//===============================
+
+
+// With point as optional argument
+N = 666.666;
+STREND = " is a double";
+STR = string(N)+STREND;
+d = strtod(STR,".");
+assert_checkequal(d, N);
+[d,s] = strtod(STR,".");
+assert_checkequal(d, N);
+assert_checkequal(s, STREND);
+//===============================
+STR = "1";
+[d,s] = strtod(STR,".");
+assert_checkequal(s, "");
+assert_checkequal(d, 1);
+//===============================
+STR = "string";
+[d,s] = strtod(STR,".");
+assert_checkequal(s, STR);
+assert_checkequal(d, %nan);
+//===============================
+STR1 = "1A";
+STR2 = "2B";
+STR3 = "3C";
+STR4 = "4d";
+STR = [STR1,STR2;STR3,STR4];
+[d,s] = strtod(STR,".");
+assert_checkequal(s, ["A","B";"C","d"]);
+assert_checkequal(d, [1,2;3,4]);
+//===============================
+[d,s] = strtod("",".");
+assert_checkequal(s, "");
+assert_checkequal(d, %nan);
+//===============================
+[d,s] = strtod("  ",".");
+assert_checkequal(s, "  ");
+assert_checkequal(d, %nan);
+//===============================
+[d,s] = strtod("  123",".");
+assert_checkequal(s, "");
+assert_checkequal(d, 123);
+//===============================
+[d,s] = strtod("  123  ",".");
+assert_checkequal(s, "  ");
+assert_checkequal(d, 123);
+//===============================
+[d,s] = strtod("  sdf  ",".");
+assert_checkequal(s, "  sdf  ");
+assert_checkequal(d, %nan);
+//===============================
+[d,s] = strtod([],".");
+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);
+//===============================
+[d,s] = strtod(["2,1","2.1"],".");
+assert_checkequal(s, [",1" ""]);
+assert_checkequal(d, [2 2.1]);
+//===============================
+
 
+// With comma as optional argument
+STREND = " is a double";
+STR = "666,666"+STREND;
+d = strtod(STR,",");
+assert_checkequal(d, N);
+[d,s] = strtod(STR,",");
+assert_checkequal(d, N);
+assert_checkequal(s, STREND);
+//===============================
+STR = "1";
+[d,s] = strtod(STR,",");
+assert_checkequal(s, "");
+assert_checkequal(d, 1);
+//===============================
+STR = "string";
+[d,s] = strtod(STR,",");
+assert_checkequal(s, STR);
+assert_checkequal(d, %nan);
+//===============================
+STR1 = "1A";
+STR2 = "2B";
+STR3 = "3C";
+STR4 = "4d";
+STR = [STR1,STR2;STR3,STR4];
+[d,s] = strtod(STR,",");
+assert_checkequal(s, ["A","B";"C","d"]);
+assert_checkequal(d, [1,2;3,4]);
+//===============================
+[d,s] = strtod("",",");
+assert_checkequal(s, "");
+assert_checkequal(d, %nan);
+//===============================
+[d,s] = strtod("  ",",");
+assert_checkequal(s, "  ");
+assert_checkequal(d, %nan);
+//===============================
+[d,s] = strtod("  123",",");
+assert_checkequal(s, "");
+assert_checkequal(d, 123);
+//===============================
+[d,s] = strtod("  123  ",",");
+assert_checkequal(s, "  ");
+assert_checkequal(d, 123);
+//===============================
+[d,s] = strtod("  sdf  ",",");
+assert_checkequal(s, "  sdf  ");
+assert_checkequal(d, %nan);
+//===============================
+[d,s] = strtod([],",");
+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);
+//===============================
+[d,s] = strtod(["2,1","2.1"],",");
+assert_checkequal(s, ["" ".1"]);
+assert_checkequal(d, [2.1 2]);
+//===============================