* Bug 4401 fixed - String: fix for isnum 38/13038/1
Paul BIGNIER [Wed, 30 Oct 2013 11:52:15 +0000 (12:52 +0100)]
isnum now accepts more constants, more complex forms,
but still does not handle "operations",
the only accepted "operations" are the "+" and "-" to separate real and imaginary parts,
but for example isnum("1+2") is not true.

Change-Id: I2375fdba1e8b1cad3dd64b05f3109d027e751044

scilab/CHANGES_5.5.X
scilab/modules/string/includes/stringToDouble.h
scilab/modules/string/src/c/stringToComplex.c
scilab/modules/string/src/c/stringToDouble.c
scilab/modules/string/tests/nonreg_tests/bug_4401.dia.ref
scilab/modules/string/tests/nonreg_tests/bug_4401.tst

index 355fd2d..2628fda 100644 (file)
@@ -4,6 +4,8 @@
 Scilab Bug Fixes
 ================
 
+* Bug #4401 fixed - isnum did not recognize all constants or some complex numbers.
+
 * Bug #5016 fixed - condestsp could return different results when repeated calls were performed.
 
 * Bug #6689 & #6690 fixed - grand now works with complexes, polynomials, booleans, integers, sparses and strings,
index f635752..704c5e7 100644 (file)
 #define ScilabPiString "%pi"
 #define ScilabNegPiString "-%pi"
 #define ScilabPosPiString "+%pi"
+#define ScilabEString "%e"
+#define ScilabPosEString "+%e"
+#define ScilabNegEString "-%e"
+#define ScilabEpsString "%eps"
+#define ScilabPosEpsString "+%eps"
+#define ScilabNegEpsString "-%eps"
 
 #ifdef __cplusplus
 extern "C" {
index bc9ed20..ebb1803 100644 (file)
@@ -179,6 +179,28 @@ static int ParseNumber(const char* tx)
         return lookahead;
     }
 
+    // Special cases: constants
+    if (strlen(tx) >= 5 && strncmp(tx, "+%eps", 5) == 0 || strncmp(tx, "-%eps", 5) == 0 || strncmp(tx, "+%nan", 5) == 0 ||
+            strncmp(tx, "-%nan", 5) == 0 || strncmp(tx, "+%inf", 5) == 0 || strncmp(tx, "-%inf", 5) == 0)
+    {
+        return 5;
+    }
+    else if (strlen(tx) >= 4 && strncmp(tx, "%eps", 4) == 0 || strncmp(tx, "+%pi", 4) == 0 || strncmp(tx, "-%pi", 4) == 0 ||
+             strncmp(tx, "+Inf", 4) == 0 || strncmp(tx, "-Inf", 4) == 0 || strncmp(tx, "+Nan", 4) == 0 ||
+             strncmp(tx, "-Nan", 4) == 0 || strncmp(tx, "%nan", 4) == 0 || strncmp(tx, "%inf", 4) == 0 )
+    {
+        return 4;
+    }
+    else if (strlen(tx) >= 3 && strncmp(tx, "+%e", 3) == 0 || strncmp(tx, "-%e", 3) == 0 || strncmp(tx, "%pi", 3) == 0 ||
+             strncmp(tx, "Nan", 3) == 0 || strncmp(tx, "Inf", 3) == 0 || strncmp(tx, "%pi", 3) == 0)
+    {
+        return 3;
+    }
+    else if (strlen(tx) >= 2 && strncmp(tx, "%e", 2) == 0)
+    {
+        return 2;
+    }
+
     if ((tx[len] == '+') || (tx[len] == '-'))
     {
         len++;
@@ -231,6 +253,7 @@ static stringToComplexError ParseComplexValue(const char *tx, BOOL bConvertByNAN
     size_t lnum = 0;
     BOOL haveImagI = FALSE;
     char *modifiedTxt = NULL;
+    int i = 0;
 
     *real = stringToDouble(tx, FALSE, &ierrDouble);
     *imag = 0;
@@ -293,7 +316,7 @@ static stringToComplexError ParseComplexValue(const char *tx, BOOL bConvertByNAN
         inum_string = midstring(modifiedTxt, lnum, -1);
 
         if ((inum_string[strlen(inum_string) - 1] == 'i') ||
-                (inum_string[strlen(inum_string) - 1] == 'j'))
+                (inum_string[strlen(inum_string) - 1] == 'j')) // The imaginary part looks like "a*%i"
         {
             inum_string[strlen(inum_string) - 1] = 0;
             if (inum_string[strlen(inum_string) - 1] == '*')
@@ -314,6 +337,33 @@ static stringToComplexError ParseComplexValue(const char *tx, BOOL bConvertByNAN
             }
             haveImagI = TRUE;
         }
+        else if (inum_string[1] == 'i' || inum_string[1] == 'j') // The imaginary part looks like "%i*a". For instance if string() has been used
+        {
+            for (i = 1; i < strlen(inum_string); ++i)
+            {
+                inum_string[i] = inum_string[i + 1];    // Removing the "i"
+            }
+            if (inum_string[1] == '*')
+            {
+                for (i = 1; i < strlen(inum_string); ++i)
+                {
+                    inum_string[i] = inum_string[i + 1];    // Removing the "*"
+                }
+            }
+
+            if (strcmp(inum_string, "+") == 0)
+            {
+                FREE(inum_string);
+                inum_string = strdup("+1");
+            }
+
+            if (strcmp(inum_string, "-") == 0)
+            {
+                FREE(inum_string);
+                inum_string = strdup("-1");
+            }
+            haveImagI = TRUE;
+        }
         else
         {
             haveImagI = FALSE;
index f289588..368132c 100644 (file)
@@ -96,6 +96,22 @@ double stringToDouble(const char *pSTR, BOOL bConvertByNAN, stringToDoubleError
         {
             dValue = -M_PI;
         }
+        else if ((stricmp(pSTR, ScilabEString) == 0) || (stricmp(pSTR, ScilabPosEString) == 0))
+        {
+            dValue = exp(1);
+        }
+        else if (stricmp(pSTR, ScilabNegEString) == 0)
+        {
+            dValue = -exp(1);
+        }
+        else if ((stricmp(pSTR, ScilabEpsString) == 0) || (stricmp(pSTR, ScilabPosEpsString) == 0))
+        {
+            dValue = EPSILON;
+        }
+        else if (stricmp(pSTR, ScilabNegEpsString) == 0)
+        {
+            dValue = -EPSILON;
+        }
         else
         {
             char* pstReplaced = replace_D_By_E(pSTR);
index 64b9ee2..5a26918 100644 (file)
@@ -1,5 +1,8 @@
 // =============================================================================
 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2013 - Scilab Enterprises - Paul Bignier: removed the instructions that
+//                                                         involved real operations, such as %pi+1,
+//                                                         because they are not handled by isnum anymore
 // Copyright (C) 2009 - DIGITEO - Allan CORNET
 //
 //  This file is distributed under the same license as the Scilab package.
 //
 // <-- Short Description -->
 // isnum returns wrong values
-//======================================================================================== 
-r = isnum("%pi");
-if r <> %t then bugmes();quit;end
-r = isnum("bla_bla");
-if r <> %f then bugmes();quit;end
-r = isnum("pi+1");
-if r <> %f then bugmes();quit;end
-r = isnum("%pi+1");
-if r <> %t then bugmes();quit;end
-r = isnum("%nan");
-if r <> %t then bugmes();quit;end
-r = isnum("%inf");
-if r <> %t then bugmes();quit;end
-r = isnum("%e");
-if r <> %t then bugmes();quit;end
-r = isnum("%e+1");
-if r <> %t then bugmes();quit;end
-r = isnum("%e+%pi");
-if r <> %t then bugmes();quit;end
-r = isnum("%t");
-if r <> %f then bugmes();quit;end
-r = isnum("%i");
-if r <> %t then bugmes();quit;end
-r = isnum("1+%i");
-if r <> %t then bugmes();quit;end
-r = isnum("1+%2i");
-if r <> %f then bugmes();quit;end
-r = isnum("1+%2*i");
-if r <> %f then bugmes();quit;end
-r = isnum("1+%i*2");
-if r <> %t then bugmes();quit;end
-r = isnum("1+2*%i");
-if r <> %t then bugmes();quit;end
-//======================================================================================== 
+//========================================================================================
+assert_checktrue(  isnum("%pi")          );
+assert_checkfalse( isnum("bla_bla")      );
+assert_checktrue(  isnum("%nan")         );
+assert_checktrue(  isnum("%inf")         );
+assert_checktrue(  isnum("%e")            );
+assert_checktrue(  isnum("%eps")          );
+assert_checktrue(  isnum("+%eps")         );
+assert_checktrue(  isnum("-%eps")         );
+assert_checktrue(  isnum("Nan")           );
+assert_checktrue(  isnum("Inf")           );
+assert_checktrue(  isnum("Nan-%i*Nan")   );
+assert_checktrue(  isnum("-Inf+Inf*%i")  );
+assert_checktrue(  isnum("1-%i*%nan")  );
+assert_checktrue(  isnum("-%eps+%e*%i")  );
+assert_checkfalse( isnum("%t")            );
+assert_checktrue(  isnum("%i")            );
+assert_checktrue(  isnum("1+%i")          );
+assert_checkfalse( isnum("1+%2i")         );
+assert_checkfalse( isnum("1+%2*i")        );
+assert_checktrue(  isnum("1+%i*2")        );
+assert_checktrue(  isnum("1+2*%i")        );
+//========================================================================================
index 7469a5f..fab8114 100644 (file)
@@ -1,5 +1,8 @@
 // =============================================================================
 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2013 - Scilab Enterprises - Paul Bignier: removed the instructions that
+//                                                         involved real operations, such as %pi+1,
+//                                                         because they are not handled by isnum anymore
 // Copyright (C) 2009 - DIGITEO - Allan CORNET
 //
 //  This file is distributed under the same license as the Scilab package.
 // <-- Short Description -->
 // isnum returns wrong values
 
-//======================================================================================== 
-r = isnum("%pi");
-if r <> %t then pause,end
-r = isnum("bla_bla");
-if r <> %f then pause,end
-r = isnum("pi+1");
-if r <> %f then pause,end
-r = isnum("%pi+1");
-if r <> %t then pause,end
-r = isnum("%nan");
-if r <> %t then pause,end
-r = isnum("%inf");
-if r <> %t then pause,end
-r = isnum("%e");
-if r <> %t then pause,end
-r = isnum("%e+1");
-if r <> %t then pause,end
-r = isnum("%e+%pi");
-if r <> %t then pause,end
-r = isnum("%t");
-if r <> %f then pause,end
-r = isnum("%i");
-if r <> %t then pause,end
-r = isnum("1+%i");
-if r <> %t then pause,end
-r = isnum("1+%2i");
-if r <> %f then pause,end
-r = isnum("1+%2*i");
-if r <> %f then pause,end
-r = isnum("1+%i*2");
-if r <> %t then pause,end
-r = isnum("1+2*%i");
-if r <> %t then pause,end
-//======================================================================================== 
-
-
+//========================================================================================
+assert_checktrue(  isnum("%pi")          );
+assert_checkfalse( isnum("bla_bla")      );
+assert_checktrue(  isnum("%nan")         );
+assert_checktrue(  isnum("%inf")         );
+assert_checktrue(  isnum("%e")            );
+assert_checktrue(  isnum("%eps")          );
+assert_checktrue(  isnum("+%eps")         );
+assert_checktrue(  isnum("-%eps")         );
+assert_checktrue(  isnum("Nan")           );
+assert_checktrue(  isnum("Inf")           );
+assert_checktrue(  isnum("Nan-%i*Nan")   );
+assert_checktrue(  isnum("-Inf+Inf*%i")  );
+assert_checktrue(  isnum("1-%i*%nan")  );
+assert_checktrue(  isnum("-%eps+%e*%i")  );
+assert_checkfalse( isnum("%t")            );
+assert_checktrue(  isnum("%i")            );
+assert_checktrue(  isnum("1+%i")          );
+assert_checkfalse( isnum("1+%2i")         );
+assert_checkfalse( isnum("1+%2*i")        );
+assert_checktrue(  isnum("1+%i*2")        );
+assert_checktrue(  isnum("1+2*%i")        );
+//========================================================================================