* Bug #15121 fixed: getOptionals() fails to recognize some options. 48/19248/4
Simon Marchetto [Fri, 7 Apr 2017 16:00:54 +0000 (18:00 +0200)]
Change-Id: Ic9e3e48ff8c419620d96ac9fa0d69853e0f2078a
Signed-off-by: Simon Marchetto <simon.marchetto@scilab-enterprises.com>

scilab/CHANGES.md
scilab/modules/api_scilab/src/cpp/api_stack_optional.cpp
scilab/modules/api_scilab/tests/nonreg_tests/bug_15121.c [new file with mode: 0644]
scilab/modules/api_scilab/tests/nonreg_tests/bug_15121.tst [new file with mode: 0644]
scilab/modules/api_scilab/tests/unit_tests/api_c/optional.c [new file with mode: 0644]
scilab/modules/api_scilab/tests/unit_tests/api_c/optional.tst [new file with mode: 0644]

index 7e6f16c..fd4d491 100644 (file)
@@ -371,10 +371,10 @@ the [development mailing list](dev@lists.scilab.org) for a particular toolbox.
 * [#15072](http://bugzilla.scilab.org/show_bug.cgi?id=15072): The context was stored as a root diagram attribute instead of being stored on each Superblock layer.
 * [#15079](http://bugzilla.scilab.org/show_bug.cgi?id=15079): When all children of a graphic handle have not the same number of sub-children, any vectorized extraction or insertion in subchildren failed.
 * [#15117](http://bugzilla.scilab.org/show_bug.cgi?id=15117): Imbricated optim/leastsq/lsqrsolve/fsolve calls either crashed or returned errors
+* [#15121](http://bugzilla.scilab.org/show_bug.cgi?id=15121): getOptionals() fails to recognize some options.
 * [#15137](http://bugzilla.scilab.org/show_bug.cgi?id=15137): ilib_build cannot build a library with more than 999 function entries in Scilab 6
 * [#15138](http://bugzilla.scilab.org/show_bug.cgi?id=15138): Scilab crashes at start on Windows
 
-
 ### Bugs fixed in 6.0.0:
 * [#592](http://bugzilla.scilab.org/show_bug.cgi?id=592): `linspace(a, b, n<=0)` returned `b` instead of `[]`
 * [#2835](http://bugzilla.scilab.org/show_bug.cgi?id=2835): On negative "initial event", EVTDLY_c took no notice of the input.
index 0f38f80..e7e4d6f 100644 (file)
@@ -136,17 +136,12 @@ static int findOptional(void* _pvCtx, char *pstProperty, rhs_opts opts[])
     while (opts[i].pstName != NULL)
     {
         int cmp;
-
         /* name is terminated by white space and we want to ignore them */
         if ((cmp = strcmp(pstProperty, opts[i].pstName)) == 0)
         {
             rep = i;
             break;
         }
-        else if (cmp < 0)
-        {
-            break;
-        }
         else
         {
             i++;
diff --git a/scilab/modules/api_scilab/tests/nonreg_tests/bug_15121.c b/scilab/modules/api_scilab/tests/nonreg_tests/bug_15121.c
new file mode 100644 (file)
index 0000000..c39bf6d
--- /dev/null
@@ -0,0 +1,34 @@
+/*
+* Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+*
+ * 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 "api_scilab.h"
+#include "Scierror.h"
+
+int sci_bug_15121(char* fname, void *pvApiCtx)
+{
+    static rhs_opts opts[] =
+    {
+        { -1, "B", -1, 0, 0, NULL},
+        { -1, "A", -1, 0, 0, NULL},
+        { -1, NULL, -1, 0, 0, NULL}
+    };
+
+    if (getOptionals(pvApiCtx, fname, opts) == 0)
+    {
+        Scierror(999, "foo: error occured in getOptionals().");
+        return 1;
+    }
+
+    return 0;
+}
\ No newline at end of file
diff --git a/scilab/modules/api_scilab/tests/nonreg_tests/bug_15121.tst b/scilab/modules/api_scilab/tests/nonreg_tests/bug_15121.tst
new file mode 100644 (file)
index 0000000..f009d11
--- /dev/null
@@ -0,0 +1,23 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2017 - Scilab Enterprises
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+
+// <-- NO CHECK REF -->
+// <-- CLI SHELL MODE -->
+
+ilib_verbose(0);
+
+copyfile(fullfile(SCI, "modules/api_scilab/tests/nonreg_tests/bug_15121.c"), ..
+    fullfile(TMPDIR, "bug_15121.c"));
+
+cd(TMPDIR);
+ilib_build("libbug_15121", ["bug_15121", "sci_bug_15121"], "bug_15121.c", ..
+    [], "", "", "");
+exec("loader.sce");
+
+bug_15121(A=2);
+
+ulink(0);
\ No newline at end of file
diff --git a/scilab/modules/api_scilab/tests/unit_tests/api_c/optional.c b/scilab/modules/api_scilab/tests/unit_tests/api_c/optional.c
new file mode 100644 (file)
index 0000000..901d8fd
--- /dev/null
@@ -0,0 +1,84 @@
+/*
+* Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+*
+ * 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 "api_scilab.h"
+#include "Scierror.h"
+
+#include <stdio.h>
+
+int sci_optional_args(char* fname, void *pvApiCtx)
+{
+    char* pstName = NULL;
+    int iAge = 0;
+    int iDrivingLicense = 0;
+    char stOutput[100];
+
+    static rhs_opts opts[] =
+    {
+        { -1, "name", -1, 0, 0, NULL},
+        { -1, "age", -1, 0, 0, NULL},
+        { -1, "driving_license", -1, 0, 0, NULL},
+        { -1, NULL, -1, 0, 0, NULL}
+    };
+
+    CheckInputArgument(pvApiCtx, 0, 3);
+    CheckOutputArgument(pvApiCtx, 0, 1);
+
+    if (getOptionals(pvApiCtx, fname, opts) == 0)
+    {
+        Scierror(999, "foo: error occured in getOptionals().");
+        return 1;
+    }
+
+    // name
+    if (opts[0].iPos != -1)
+    {
+        getAllocatedSingleString(pvApiCtx, opts[0].piAddr, &pstName);
+    }
+    else
+    {
+        pstName = strdup("John Doe");
+    }
+
+    // age
+    if (opts[1].iPos != -1)
+    {
+        double dblAge = 0;
+        getScalarDouble(pvApiCtx, opts[1].piAddr, &dblAge);
+        iAge = (int)dblAge;
+    }
+    else
+    {
+        iAge = 77;
+    }
+
+    // driving license
+    if (opts[2].iPos != -1)
+    {
+        getScalarBoolean(pvApiCtx, opts[2].piAddr, &iDrivingLicense);
+    }
+    else
+    {
+        iDrivingLicense = 0;
+    }
+
+    sprintf(stOutput, "%s, %d years old, %s a driving license.", pstName, iAge, iDrivingLicense ? "has" : "does not have");
+    if (createSingleString(pvApiCtx, nbInputArgument(pvApiCtx) + 1, stOutput))
+    {
+        return 1;
+    }
+    AssignOutputVariable(pvApiCtx, 1) = nbInputArgument(pvApiCtx) + 1;
+
+    return 0;
+}
diff --git a/scilab/modules/api_scilab/tests/unit_tests/api_c/optional.tst b/scilab/modules/api_scilab/tests/unit_tests/api_c/optional.tst
new file mode 100644 (file)
index 0000000..f648e1a
--- /dev/null
@@ -0,0 +1,36 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2017 - Scilab Enterprises
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+
+// <-- NO CHECK REF -->
+// <-- CLI SHELL MODE -->
+
+ilib_verbose(0);
+
+tmpDir = fullfile(TMPDIR, "api_c");
+mkdir(tmpDir);
+cd(tmpDir);
+copyfile(fullfile(SCI, "modules/api_scilab/tests/unit_tests/api_c/optional.c"), ..
+    fullfile(tmpDir, "optional.c"));
+
+ilib_build("liboptional", ["optional_args", "sci_optional_args"], "optional.c", ..
+    [], "", "", "");
+exec("loader.sce");
+
+ret = optional_args();
+assert_checkequal(ret, "John Doe, 77 years old, does not have a driving license.");
+ret = optional_args(name="Bill");
+assert_checkequal(ret, "Bill, 77 years old, does not have a driving license.");
+ret = optional_args(name="Bill", age=22);
+assert_checkequal(ret, "Bill, 22 years old, does not have a driving license.");
+ret = optional_args(age=22, name="Bill");
+assert_checkequal(ret, "Bill, 22 years old, does not have a driving license.");
+ret = optional_args(name="Bill", age=22, driving_license=%t);
+assert_checkequal(ret, "Bill, 22 years old, has a driving license.");
+ret = optional_args(name="Walter", driving_license=%t);
+assert_checkequal(ret, "Walter, 77 years old, has a driving license.");
+
+ulink(0);
\ No newline at end of file