Bug #10379 fixed - lines did not manage a 1x2 vector [nc, nl] as input argument. 78/5878/2
Allan CORNET [Wed, 11 Jan 2012 13:36:00 +0000 (14:36 +0100)]
Change-Id: I5b81d4c0e1fe90858f0a584cc41132ff72c7cdd7

scilab/CHANGES_5.4.X
scilab/modules/console/help/en_US/lines.xml
scilab/modules/console/sci_gateway/c/sci_lines.c
scilab/modules/console/tests/nonreg_tests/bug_10379.dia.ref [new file with mode: 0644]
scilab/modules/console/tests/nonreg_tests/bug_10379.tst [new file with mode: 0644]

index 894e32a..417108b 100644 (file)
@@ -124,6 +124,8 @@ Bug fixes
 
 * Bug #10267 fixed - The help browser did not use the default language on restoration.
 
+* Bug #10379 fixed - lines did not manage a 1x2 vector [nc, nl] as input argument.
+
 * Bug #10384 fixed - On exit, "Close Console" was proposed rather than "Close
                      Scilab".
 
index 15d772c..b116ca4 100644 (file)
@@ -2,49 +2,58 @@
 <!--
     * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
     * Copyright (C) 2002 - INRIA
-    * 
+    * Copyright (C) 2012 - DIGITEO - Allan CORNET
+    *
     * This file must be used under the terms of the CeCILL.
     * This source file is licensed as described in the file COPYING, which
     * you should have received as part of this distribution.  The terms
-    * are also available at    
+    * are also available at
     * http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
     *
     -->
-<refentry xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:svg="http://www.w3.org/2000/svg" xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:db="http://docbook.org/ns/docbook" version="5.0-subset Scilab" xml:lang="en" xml:id="lines">
+<refentry xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:svg="http://www.w3.org/2000/svg" xmlns:ns5="http://www.w3.org/1999/xhtml" xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:db="http://docbook.org/ns/docbook" version="5.0-subset Scilab" xml:id="lines" xml:lang="en">
   <info>
     <pubdate>$LastChangedDate$</pubdate>
   </info>
   <refnamediv>
     <refname>lines</refname>
-    <refpurpose> rows and columns used for display</refpurpose>
+    <refpurpose>rows and columns used for display</refpurpose>
   </refnamediv>
   <refsynopsisdiv>
     <title>Calling Sequence</title>
-    <synopsis>lines([nl [,nc]])
-ncl=lines()</synopsis>
+    <synopsis>lines(nl)
+lines(nl, nc)
+lines(ncl)
+ncl = lines()</synopsis>
   </refsynopsisdiv>
   <refsection>
     <title>Arguments</title>
     <variablelist>
       <varlistentry>
-        <term>nl : an integer, the number of lines for vertical paging control.</term>
-        <listitem>
-          <para> If 0 : no vertical paging control is done.</para>
-        </listitem>
+        <term>nl</term>
         <listitem>
-          <para> If -1 : reset vertical paging control to current size of the window.</para>
+          <para>An integer, the number of lines for vertical paging control.</para>
+          <itemizedlist>
+            <listitem>
+              <para>If 0: no vertical paging control is done.</para>
+            </listitem>
+            <listitem>
+              <para>If -1: reset vertical paging control to current size of the window.</para>
+            </listitem>
+          </itemizedlist>
         </listitem>
       </varlistentry>
       <varlistentry>
         <term>nc</term>
         <listitem>
-          <para>an integer, the number of column of output. Used for formatting output</para>
+          <para>An integer, the number of column of output. Used for
+          formatting output</para>
         </listitem>
       </varlistentry>
       <varlistentry>
         <term>ncl</term>
         <listitem>
-          <para>a 1x2 vector [nc,nl]</para>
+          <para>A 1x2 vector [nc, nl]</para>
         </listitem>
       </varlistentry>
     </variablelist>
@@ -52,17 +61,18 @@ ncl=lines()</synopsis>
   <refsection>
     <title>Description</title>
     <para><literal>lines</literal> handles Scilab display paging.</para>
-    <para><literal>lines()</literal> returns the vector <literal>[# columns, # rows]</literal> currently
-    used by Scilab for displaying the results.</para>
-    <para><literal>lines(nl)</literal> sets the number of displayed lines (before user is asked
-    for more) to <literal>nl</literal>.</para>
+    <para><literal>lines()</literal> returns the vector <literal>[# columns, #
+    rows]</literal> currently used by Scilab for displaying the
+    results.</para>
+    <para><literal>lines(nl)</literal> sets the number of displayed lines
+    (before user is asked for more) to <literal>nl</literal>.</para>
     <para><literal>lines(0)</literal> disables vertical paging</para>
-    <para><literal>lines(nl,nc)</literal> changes also the size of the output to <literal>nc</literal>
-    columns.</para>
-    <para>
-    When Scilab is launched without -nw option, the <literal>lines</literal> parameters
-    are automatically set according to the output window size, these
-    parameters are also automatically modified when the window is resized.</para>
+    <para><literal>lines(nl,nc)</literal> and <literal>lines([nc,nl])</literal> changes also the size of the output
+    to <literal>nc</literal> columns.</para>
+    <para>When Scilab is launched without -nw option, the
+    <literal>lines</literal> parameters are automatically set according to the
+    output window size, these parameters are also automatically modified when
+    the window is resized.</para>
   </refsection>
   <refsection role="see also">
     <title>See Also</title>
@@ -80,7 +90,13 @@ ncl=lines()</synopsis>
     <revhistory>
       <revision>
         <revnumber>5.4.0</revnumber>
-        <revremark>lines is set by default to 0. Argument -1 added. See SEP 67 for more information.</revremark>
+        <revdescription>
+          <itemizedlist>
+            <listitem>lines is set by default to 0. Argument -1 added. See SEP #67 for more information.</listitem>
+            <listitem>lines manages a 1x2 vector [nc, nl] as input
+            argument</listitem>
+          </itemizedlist>
+        </revdescription>
       </revision>
     </revhistory>
   </refsection>
index 2fab57c..2b6174a 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
  * Copyright (C) 2007 - INRIA - Allan CORNET 
- * Copyright (C) 2011 - DIGITEO - Allan CORNET 
+ * Copyright (C) 2011-2012 - DIGITEO - Allan CORNET 
  * 
  * This file must be used under the terms of the CeCILL.
  * This source file is licensed as described in the file COPYING, which
@@ -82,7 +82,8 @@ static int sci_lines_one_rhs(char *fname)
     /* nb_lines > 0 set value */
     SciErr sciErr;
     int *piAddressVarOne = NULL;
-    int iParam1 = 0;
+
+    int isScalarInput = 0;
 
     sciErr = getVarAddressFromPosition(pvApiCtx, 1, &piAddressVarOne);
     if(sciErr.iErr)
@@ -99,48 +100,114 @@ static int sci_lines_one_rhs(char *fname)
         return 0;
     }
 
-    if (!isScalar(pvApiCtx, piAddressVarOne))
+    isScalarInput = isScalar(pvApiCtx, piAddressVarOne);
+
+    if (!isScalarInput && !checkVarDimension(pvApiCtx, piAddressVarOne, 1, 2))
     {
         Scierror(999,_("%s: Wrong size for input argument #%d: A scalar expected.\n"),fname, 1);
         return 0;
     }
 
-    if (isIntegerType(pvApiCtx, piAddressVarOne))
+    if (isScalarInput)
     {
-        if (getScalarInteger32(pvApiCtx, piAddressVarOne, &iParam1) != 0)
+        int iParam1 = 0;
+        if (isIntegerType(pvApiCtx, piAddressVarOne))
         {
-            Scierror(999,_("%s: Wrong type for input argument #%d: A scalar expected.\n"),fname, 1);
-            return 0;
+            if (getScalarInteger32(pvApiCtx, piAddressVarOne, &iParam1) != 0)
+            {
+                Scierror(999, _("%s: Can not read input argument #%d.\n"), fname, 1);
+                return 0;
+            }
         }
-    }
-    else // double
-    {
-        double dParam1 = 0.;
-        if (getScalarDouble(pvApiCtx,piAddressVarOne, &dParam1) == 0)
+        else // double
         {
-            iParam1 = (int)dParam1;
+            double dParam1 = 0.;
+            if (getScalarDouble(pvApiCtx,piAddressVarOne, &dParam1) == 0)
+            {
+                iParam1 = (int)dParam1;
+                if (dParam1 != (double)iParam1)
+                {
+                    Scierror(999, _("%s: Wrong value for input argument #%d: An integer value expected.\n"), fname, 1);
+                    return 0;
+                }
+            }
+            else
+            {
+                Scierror(999, _("%s: Can not read input argument #%d.\n"), fname, 1);
+                return 0;
+            }
         }
-    }
 
-    if (iParam1 == -1)
-    {
-        scilinesdefault();
-        if (getScilabMode() == SCILAB_STD)
+        if (iParam1 == -1)
         {
-            ScilabLinesUpdate();
+            scilinesdefault();
+            if (getScilabMode() == SCILAB_STD)
+            {
+                ScilabLinesUpdate();
+            }
+        }
+        else
+        {
+            if (iParam1 < 0)
+            {
+                Scierror(999,_("%s: Wrong value for input argument #%d: A scalar (>= 0) expected.\n"),fname, 1);
+                return 0;
+            }
+            else
+            {
+                setLinesSize(iParam1);
+            }
         }
     }
     else
     {
-        if (iParam1 < 0)
+        int iLinesValues[2];
+
+        if (isIntegerType(pvApiCtx, piAddressVarOne))
         {
-            Scierror(999,_("%s: Wrong value for input argument #%d: A scalar (>= 0) expected.\n"),fname, 1);
-            return 0;
+            int *iParams1 = NULL;
+            int m = 0, n = 0;
+            sciErr = getMatrixOfInteger32(pvApiCtx,piAddressVarOne, &m, &n, &iParams1);
+            if(sciErr.iErr)
+            {
+                printError(&sciErr, 0);
+                Scierror(999, _("%s: Can not read input argument #%d.\n"), fname, 1);
+                return 0;
+            }
+            iLinesValues[0] = iParams1[0];
+            iLinesValues[1] = iParams1[1];
         }
-        else
+        else // double
         {
-            setLinesSize(iParam1);
+            double *dParams1 = NULL;
+            int m = 0, n = 0;
+
+            sciErr = getMatrixOfDouble(pvApiCtx, piAddressVarOne, &m, &n, &dParams1);
+            if(sciErr.iErr)
+            {
+                printError(&sciErr, 0);
+                Scierror(999, _("%s: Can not read input argument #%d.\n"), fname, 1);
+                return 0;
+            }
+
+            iLinesValues[0] = (int)dParams1[0];
+            iLinesValues[1] = (int)dParams1[1];
+
+            if ((dParams1[0] != (double)iLinesValues[0]) ||
+                (dParams1[1] != (double)iLinesValues[1]))
+            {
+                Scierror(999, _("%s: Wrong value for input argument #%d: An integer value expected.\n"), fname, 1);
+                return 0;
+            }
         }
+
+        if ((iLinesValues[0] < 0) || (iLinesValues[1] < 0))
+        {
+            Scierror(999,_("%s: Wrong value for input argument #%d.\n"), fname, 1);
+            return 0;
+        }
+
+        scilines(iLinesValues[1], iLinesValues[0]);
     }
 
     LhsVar(1) = 0;
diff --git a/scilab/modules/console/tests/nonreg_tests/bug_10379.dia.ref b/scilab/modules/console/tests/nonreg_tests/bug_10379.dia.ref
new file mode 100644 (file)
index 0000000..5939035
--- /dev/null
@@ -0,0 +1,26 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2012 - DIGITEO - Allan CORNET
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+//
+// <-- TEST WITH CONSOLE -->
+//
+// <-- Non-regression test for bug 10379 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/10379
+//
+// <-- Short Description -->
+// lines did not manage a 1x2 vector [nc, nl] as input argument
+old_lines_value = lines();
+assert_checkequal(old_lines_value(2), 0);
+new_lines_value = [70 30];
+lines(new_lines_value);
+modified_lines_value = lines();
+assert_checkequal(modified_lines_value, new_lines_value);
+// we restore default values
+lines(old_lines_value);
+modified_lines_value = lines();
+assert_checkequal(modified_lines_value, old_lines_value);
diff --git a/scilab/modules/console/tests/nonreg_tests/bug_10379.tst b/scilab/modules/console/tests/nonreg_tests/bug_10379.tst
new file mode 100644 (file)
index 0000000..6063351
--- /dev/null
@@ -0,0 +1,30 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2012 - DIGITEO - Allan CORNET
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+//
+// <-- TEST WITH CONSOLE -->
+//
+// <-- Non-regression test for bug 10379 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/10379
+//
+// <-- Short Description -->
+// lines did not manage a 1x2 vector [nc, nl] as input argument
+
+old_lines_value = lines();
+assert_checkequal(old_lines_value(2), 0);
+
+new_lines_value = [70 30];
+lines(new_lines_value);
+
+modified_lines_value = lines();
+assert_checkequal(modified_lines_value, new_lines_value);
+
+// we restore default values
+lines(old_lines_value);
+modified_lines_value = lines();
+assert_checkequal(modified_lines_value, old_lines_value);