Add cases after commit https://codereview.scilab.org/#/c/10467 (Fixes bug #5291) 84/10584/3
Charlotte HECQUET [Mon, 25 Feb 2013 09:18:30 +0000 (10:18 +0100)]
Change-Id: I93fee0516f41062ffad7aaf80d8928d86995c9c7

scilab/modules/string/sci_gateway/c/sci_strtod.c
scilab/modules/string/tests/unit_tests/strtod.dia.ref
scilab/modules/string/tests/unit_tests/strtod.tst

index a03bffa..86c94c7 100644 (file)
@@ -30,8 +30,16 @@ int sci_strtod(char *fname, unsigned long fname_len)
     char keys[] = "1234567890";
     unsigned long long raw = 0x7ff8000000000000;
     double not_a_number = *( double* )&raw;
+    int iRhs = nbInputArgument(pvApiCtx);
+    int iLhs = nbOutputArgument(pvApiCtx);
     int flag = 0;
 
+
+    //output values
+    double *OutputDoubles = NULL;
+    char **OutputStrings = NULL;
+
+
     CheckInputArgument(pvApiCtx, 1, 1);
     CheckOutputArgument(pvApiCtx, 1, 2);
 
@@ -44,6 +52,28 @@ int sci_strtod(char *fname, unsigned long fname_len)
         return 0;
     }
 
+    if (isEmptyMatrix(pvApiCtx, piAddr))
+    {
+        if (createScalarDouble(pvApiCtx, iRhs + 1, not_a_number) != 0)
+        {
+            return 0;
+        }
+
+        AssignOutputVariable(pvApiCtx, 1) = iRhs + 1;
+
+        if (iLhs == 2)
+        {
+            if (createSingleString(pvApiCtx, iRhs + 2, ""))
+            {
+                return 0;
+            }
+            AssignOutputVariable(pvApiCtx, 2) = iRhs + 2;
+        }
+
+        ReturnArguments(pvApiCtx);
+        return 0;
+    }
+
     if (isStringType(pvApiCtx, piAddr) == 0) //Check type
     {
         Scierror(999, _("%s: Wrong type for input argument #%d: Matrix of strings or empty matrix expected.\n"), fname, 1);
@@ -52,16 +82,14 @@ int sci_strtod(char *fname, unsigned long fname_len)
 
     if (getAllocatedMatrixOfString(pvApiCtx, piAddr, &iRows, &iCols, &Input_StringMatrix_1))
     {
+        Scierror(999, _("%s: Wrong type for input argument #%d: Matrix of strings or empty matrix expected.\n"), fname, 1);
         return 0;
     }
 
     iRowsiCols = iRows * iCols;
 
-    if (nbOutputArgument(pvApiCtx) == 2)
+    if (iLhs == 2)
     {
-        double *OutputDoubles = NULL;
-        char **OutputStrings = NULL;
-
         OutputStrings = (char **)MALLOC(sizeof(char*)*iRowsiCols);
         if (OutputStrings == NULL)
         {
@@ -69,47 +97,66 @@ int sci_strtod(char *fname, unsigned long fname_len)
             Scierror(999, _("%s: No more memory.\n"), fname);
             return 0;
         }
+    }
 
-        OutputDoubles = (double*)MALLOC(sizeof(double) * iRowsiCols);
-        if (OutputDoubles == NULL)
-        {
-            FREE(OutputStrings);
-            OutputStrings = NULL;
-            freeAllocatedMatrixOfString(iRows, iCols, Input_StringMatrix_1);
-            Scierror(999, _("%s: No more memory.\n"), fname);
-            return 0;
-        }
+    OutputDoubles = (double*)MALLOC(sizeof(double) * iRowsiCols);
+    if (OutputDoubles == NULL)
+    {
+        FREE(OutputStrings);
+        OutputStrings = NULL;
+        freeAllocatedMatrixOfString(iRows, iCols, Input_StringMatrix_1);
+        Scierror(999, _("%s: No more memory.\n"), fname);
+        return 0;
+    }
+
+    for (x = 0 ; x < iRowsiCols ; x++)
+    {
+        //Double part
+        char *stopstring = NULL;
+        first_nb = (int)strcspn(Input_StringMatrix_1[x], keys);
 
-        for ( x = 0 ; x < iRowsiCols ; x++ )
+        //Check if there is a number in the string
+        if (first_nb != 0)
         {
-            //Double part
-            char *stopstring = NULL;
-            first_nb = (int)strcspn(Input_StringMatrix_1[x], keys);
+            flag = 0;
 
-            //Check if there is a number in the string
-            if (first_nb != 0)
+            for (y = 0 ; y < first_nb ; y++)
             {
-                flag = 0;
-                for ( y = 0; y < first_nb; y++)
+                if (Input_StringMatrix_1[x][y] != ' ') // spaces are accepted
                 {
-                    if (Input_StringMatrix_1[x][y] != ' ')
-                    {
-                        OutputDoubles[x] = not_a_number;
-                        flag = 1;
-                        stopstring = Input_StringMatrix_1[x];
-                    }
+                    OutputDoubles[x] = not_a_number;
+                    flag = 1;
+                    stopstring = Input_StringMatrix_1[x];
+                    break;
                 }
+            }
 
-                if (flag == 0)
+            //it is still a number
+            if (flag == 0)
+            {
+                //only spaces ?
+                if (strlen(Input_StringMatrix_1[x]) == first_nb) // strtod("  ")
                 {
-                    OutputDoubles[x] = (double)strtod(Input_StringMatrix_1[x], &stopstring);
+                    OutputDoubles[x] = not_a_number;
+                    stopstring = Input_StringMatrix_1[x];
+                }
+                else // strtod("  000xxx")
+                {
+                    OutputDoubles[x] = (double)strtod(Input_StringMatrix_1[x] + first_nb, &stopstring);
                 }
             }
-            else
-            {
-                OutputDoubles[x] = (double)strtod(Input_StringMatrix_1[x], &stopstring);
-            }
+        }
+        else if (strlen(Input_StringMatrix_1[x]) == 0) //case strtod("")
+        {
+            OutputDoubles[x] = not_a_number;
+        }
+        else //all characters are digits
+        {
+            OutputDoubles[x] = (double)strtod(Input_StringMatrix_1[x], &stopstring);
+        }
 
+        if (iLhs == 2)
+        {
             //String part
             if (stopstring)
             {
@@ -139,34 +186,21 @@ int sci_strtod(char *fname, unsigned long fname_len)
                 strcpy(OutputStrings[x], "");
             }
         }
+    }
 
-        sciErr = createMatrixOfDouble(pvApiCtx, nbInputArgument(pvApiCtx) + 1, iRows, iCols, OutputDoubles);
-        if (sciErr.iErr)
-        {
-            printError(&sciErr, 0);
-            Scierror(999, _("%s: Memory allocation error.\n"), fname);
-            return 0;
-        }
-
-        sciErr = createMatrixOfString(pvApiCtx, nbInputArgument(pvApiCtx) + 2, iRows, iCols, (char**)OutputStrings);
-        if (sciErr.iErr)
-        {
-            printError(&sciErr, 0);
-            Scierror(999, _("%s: Memory allocation error.\n"), fname);
-            return 0;
-        }
+    sciErr = createMatrixOfDouble(pvApiCtx, iRhs + 1, iRows, iCols, OutputDoubles);
+    if (sciErr.iErr)
+    {
+        printError(&sciErr, 0);
+        Scierror(999, _("%s: Memory allocation error.\n"), fname);
+        return 0;
+    }
 
-        AssignOutputVariable(pvApiCtx, 1) = nbInputArgument(pvApiCtx) + 1;
-        AssignOutputVariable(pvApiCtx, 2) = nbInputArgument(pvApiCtx) + 2;
+    AssignOutputVariable(pvApiCtx, 1) = iRhs + 1;
 
-        freeAllocatedMatrixOfString(iRows, iCols, OutputStrings);
-        FREE(OutputDoubles);
-    }
-    else /* nbOutputArgument(pvApiCtx) == 1 */
+    if (iLhs == 2)
     {
-        double* pdblOutIndex = NULL;
-
-        sciErr = allocMatrixOfDouble(pvApiCtx, nbInputArgument(pvApiCtx) + 1, iRows, iCols, &pdblOutIndex);
+        sciErr = createMatrixOfString(pvApiCtx, iRhs + 2, iRows, iCols, (char**)OutputStrings);
         if (sciErr.iErr)
         {
             printError(&sciErr, 0);
@@ -174,39 +208,11 @@ int sci_strtod(char *fname, unsigned long fname_len)
             return 0;
         }
 
-        for ( x = 0 ; x < iRowsiCols ; x++ )
-        {
-            char  *stopstring = NULL;
-            first_nb = (int)strcspn(Input_StringMatrix_1[x], keys);
-
-            //Check if there is a number in the string
-            if (first_nb != 0)
-            {
-                flag = 0;
-                for ( y = 0 ; y < first_nb ; y++)
-                {
-                    if (Input_StringMatrix_1[x][y] != ' ')
-                    {
-                        pdblOutIndex[x] = not_a_number;
-                        flag = 1;
-                    }
-                }
-
-                if (flag == 0)
-                {
-                    pdblOutIndex[x] = (double)strtod( Input_StringMatrix_1[x], &stopstring);
-                }
-            }
-            else
-            {
-                pdblOutIndex[x] = (double)strtod( Input_StringMatrix_1[x], &stopstring);
-            }
-
-        }
-
-        AssignOutputVariable(pvApiCtx, 1) = nbInputArgument(pvApiCtx) + 1 ;
+        AssignOutputVariable(pvApiCtx, 2) = iRhs + 2;
+        freeAllocatedMatrixOfString(iRows, iCols, OutputStrings);
     }
 
+    FREE(OutputDoubles);
     freeAllocatedMatrixOfString(iRows, iCols, Input_StringMatrix_1);
     ReturnArguments(pvApiCtx);
     return 0;
index 1d6aa49..c18c89e 100644 (file)
@@ -38,5 +38,25 @@ assert_checkequal(d, [1,2;3,4]);
 //===============================
 [d,s] = strtod("");
 assert_checkequal(s, "");
-assert_checkequal(d, 0);
+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);
 //===============================
index 787d18d..8b9d55c 100644 (file)
@@ -40,5 +40,25 @@ assert_checkequal(d, [1,2;3,4]);
 //===============================
 [d,s] = strtod("");
 assert_checkequal(s, "");
-assert_checkequal(d, 0);
-//===============================
\ No newline at end of file
+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);
+//===============================