bug 12170: matfile_listvar now returns an empty matrix if called on a mat file withou... 12/14012/3
Pierre-Aime Agnel [Thu, 13 Mar 2014 15:33:42 +0000 (16:33 +0100)]
Change-Id: I3f18fea302764f8689e75fb958b670b12275425f

scilab/CHANGES_5.5.X
scilab/modules/matio/help/en_US/matfile_listvar.xml
scilab/modules/matio/help/en_US/matfile_open.xml
scilab/modules/matio/sci_gateway/c/sci_matfile_listvar.c
scilab/modules/matio/tests/nonreg_tests/bug_12170.dia.ref [new file with mode: 0644]
scilab/modules/matio/tests/nonreg_tests/bug_12170.tst [new file with mode: 0644]

index b5c4949..fea6a6a 100644 (file)
@@ -510,6 +510,8 @@ Scilab Bug Fixes
 
 * Bug #12156 fixed - Closing a Scilab session in Javasci could led to a HDF5 error message.
 
+* Bug #12170 fixed - Calling matfile_listvar on an empty file returned an error.
+
 * Bug #12306 fixed - Invalid memory free on completion in NWNI mode fixed.
 
 * Bug #12308 fixed - create_palette help page removed (function removed).
index e6572cf..73809e9 100644 (file)
@@ -55,6 +55,9 @@
         <para>
             Lists variables of a Matlab binary MAT-file opened by <link linkend="matfile_open">matfile_open</link>.
         </para>
+        <para>
+            Returns empty matrices if the file contains no variables.
+        </para>
     </refsection>
     <refsection>
         <title>Examples</title>
index ef1208f..48b7018 100644 (file)
@@ -42,7 +42,7 @@
                         </listitem>
                         <listitem>
                             <para>
-                                <emphasis>"w"</emphasis>: opens the file for writing.
+                                <emphasis>"w"</emphasis>: creates an empty file or opens it for writing.
                             </para>
                         </listitem>
                     </itemizedlist>
index 2d63ce9..242d220 100644 (file)
@@ -35,6 +35,7 @@ int sci_matfile_listvar(char *fname, unsigned long fname_len)
     int * fd_addr = NULL;
     double tmp_dbl;
     SciErr sciErr;
+    int iErr = 0;
 
     CheckRhs(1, 1);
     CheckLhs(1, 3);
@@ -119,50 +120,78 @@ int sci_matfile_listvar(char *fname, unsigned long fname_len)
     Mat_VarFree(matvar);
 
     /* Return the variable names list */
-    nbRow = nbvar;
-    nbCol = 1;
-    sciErr = createMatrixOfString(pvApiCtx, Rhs + 1, nbRow, nbCol, varnames);
-    if (sciErr.iErr)
+    if (nbvar == 0)
     {
-        printError(&sciErr, 0);
-        return 0;
-    }
-    LhsVar(1) = Rhs + 1;
+        /* No variables found in MatFile */
 
-    /* Return the variable classes */
-    if (Lhs >= 2)
-    {
-        sciErr = createMatrixOfDouble(pvApiCtx, Rhs + 2, nbRow, nbCol, varclasses);
-        if (sciErr.iErr)
+        /* Return the empty names */
+        iErr = createEmptyMatrix(pvApiCtx, Rhs + 1);
+        if (iErr)
         {
-            printError(&sciErr, 0);
+            Scierror(999, _("%s: Memory allocation error.\n"), fname);
             return 0;
         }
-        LhsVar(2) = Rhs + 2;
-    }
+        LhsVar(1) = Rhs + 1;
 
-    /* Return the variable types */
-    if (Lhs >= 3)
-    {
-        sciErr = createMatrixOfDouble(pvApiCtx, Rhs + 3, nbRow, nbCol, vartypes);
-        if (sciErr.iErr)
+        /* Return the empty classes if asked */
+        if (Lhs >= 2)
         {
-            printError(&sciErr, 0);
-            return 0;
+            iErr = createEmptyMatrix(pvApiCtx, Rhs + 2);
+            if (iErr)
+            {
+                Scierror(999, _("%s: Memory allocation error.\n"), fname);
+                return 0;
+            }
+            LhsVar(2) = Rhs + 2;
         }
-        LhsVar(2) = Rhs + 2;
-    }
 
-    /* Return the variable types */
-    if (Lhs >= 3)
+        /* Return the empty types if asked */
+        if (Lhs >= 3)
+        {
+            iErr = createEmptyMatrix(pvApiCtx, Rhs + 3);
+            if (iErr)
+            {
+                Scierror(999, _("%s: Memory allocation error.\n"), fname);
+                return 0;
+            }
+            LhsVar(3) = Rhs + 3;
+        }
+    }
+    else
     {
-        sciErr = createMatrixOfDouble(pvApiCtx, Rhs + 3, nbRow, nbCol, vartypes);
+        nbRow = nbvar;
+        nbCol = 1;
+        sciErr = createMatrixOfString(pvApiCtx, Rhs + 1, nbRow, nbCol, varnames);
         if (sciErr.iErr)
         {
             printError(&sciErr, 0);
             return 0;
         }
-        LhsVar(3) = Rhs + 3;
+        LhsVar(1) = Rhs + 1;
+
+        /* Return the variable classes */
+        if (Lhs >= 2)
+        {
+            sciErr = createMatrixOfDouble(pvApiCtx, Rhs + 2, nbRow, nbCol, varclasses);
+            if (sciErr.iErr)
+            {
+                printError(&sciErr, 0);
+                return 0;
+            }
+            LhsVar(2) = Rhs + 2;
+        }
+
+        /* Return the variable types */
+        if (Lhs >= 3)
+        {
+            sciErr = createMatrixOfDouble(pvApiCtx, Rhs + 3, nbRow, nbCol, vartypes);
+            if (sciErr.iErr)
+            {
+                printError(&sciErr, 0);
+                return 0;
+            }
+            LhsVar(3) = Rhs + 3;
+        }
     }
 
     freeArrayOfString(varnames, nbvar);
diff --git a/scilab/modules/matio/tests/nonreg_tests/bug_12170.dia.ref b/scilab/modules/matio/tests/nonreg_tests/bug_12170.dia.ref
new file mode 100644 (file)
index 0000000..ffe7aa7
--- /dev/null
@@ -0,0 +1,41 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2014 - Scilab Enterprises - Pierre-Aime Agnel
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+//
+// <-- CLI SHELL MODE -->
+//
+// <-- Non-regression test for bug 12170 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/show_bug.cgi?id=12170
+//
+// <-- Short Description -->
+// matfile_open with option "w" causes matfile_listvar error
+A = rand(10,10);
+B = sprand(100,100,0.1);
+C = "foo";
+D = "bar";
+filename=TMPDIR+"/test_matfile.mat";
+savematfile(filename,'A','B','C','D','-v6');
+clear();
+filename=TMPDIR+"/test_matfile.mat";
+//Open files in different modes
+fd = matfile_open(filename, "w");
+//Checking if matfile_listvar generates an error on a "w" opened file
+if execstr('[name, classes, types]=matfile_listvar(fd)','errcatch','n')<>0
+   genErr = %t //matfile_listvar generated an error 
+else
+   genErr = %f //matfile_listvar did not generate an error
+ genErr  =
+  F  
+end
+assert_checkfalse(genErr);
+assert_checkequal(matfile_close(fd), %t);
+//Listvar on an empty file should not give error but empty matrices
+assert_checktrue(isempty(name));
+assert_checktrue(isempty(classes));
+assert_checktrue(isempty(types));
diff --git a/scilab/modules/matio/tests/nonreg_tests/bug_12170.tst b/scilab/modules/matio/tests/nonreg_tests/bug_12170.tst
new file mode 100644 (file)
index 0000000..9bb7345
--- /dev/null
@@ -0,0 +1,46 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2014 - Scilab Enterprises - Pierre-Aime Agnel
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+//
+// <-- CLI SHELL MODE -->
+//
+// <-- Non-regression test for bug 12170 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/show_bug.cgi?id=12170
+//
+// <-- Short Description -->
+// matfile_open with option "w" causes matfile_listvar error
+
+
+A = rand(10,10);
+B = sprand(100,100,0.1);
+C = "foo";
+D = "bar";
+
+filename=TMPDIR+"/test_matfile.mat";
+savematfile(filename,'A','B','C','D','-v6');
+
+clear();
+
+filename=TMPDIR+"/test_matfile.mat";
+//Open files in different modes
+fd = matfile_open(filename, "w");
+
+//Checking if matfile_listvar generates an error on a "w" opened file
+if execstr('[name, classes, types]=matfile_listvar(fd)','errcatch','n')<>0
+   genErr = %t //matfile_listvar generated an error 
+else
+   genErr = %f //matfile_listvar did not generate an error
+end
+
+assert_checkfalse(genErr);
+assert_checkequal(matfile_close(fd), %t);
+
+//Listvar on an empty file should not give error but empty matrices
+assert_checktrue(isempty(name));
+assert_checktrue(isempty(classes));
+assert_checktrue(isempty(types));