* Bug #13102 fixed - matio: 7.3 support 23/13423/7
Paul Bignier [Thu, 9 Jan 2014 18:31:16 +0000 (19:31 +0100)]
savematfile did not support "-v7.3" option.

Fixing this introduces a new input argument to matfile_open,
to create Matlab 7.3 files.

Change-Id: I1ef59ea03a0f4b7d8c2bb804a462b73b814121c2

SEP/INDEX
SEP/SEP_125_matfile_open_73.odt [new file with mode: 0644]
scilab/CHANGES_5.5.X
scilab/modules/matio/help/en_US/matfile_open.xml
scilab/modules/matio/help/en_US/savematfile.xml
scilab/modules/matio/macros/savematfile.sci
scilab/modules/matio/sci_gateway/c/sci_matfile_open.c
scilab/modules/matio/tests/nonreg_tests/bug_13102.dia.ref [new file with mode: 0644]
scilab/modules/matio/tests/nonreg_tests/bug_13102.tst [new file with mode: 0644]

index 0765191..5ccb3de 100644 (file)
--- a/SEP/INDEX
+++ b/SEP/INDEX
@@ -120,4 +120,4 @@ SEP #121: New rect property for matplot handle
 SEP #122: Customized mark draw
 SEP #123: Grid improvements
 SEP #124: New input argument for csvRead(), to ignore header comments.
-
+SEP #125: New input argument to matfile_open to open Matlab 7.3 files.
diff --git a/SEP/SEP_125_matfile_open_73.odt b/SEP/SEP_125_matfile_open_73.odt
new file mode 100644 (file)
index 0000000..d227d51
Binary files /dev/null and b/SEP/SEP_125_matfile_open_73.odt differ
index 182e642..6fbd4c9 100644 (file)
@@ -379,6 +379,8 @@ Scilab Bug Fixes
 
 * Bug #13101 fixed - When x-axis was in reverse position x_location='origin' failed.
 
+* Bug #13102 fixed - savematfile did not support "-v7.3" option.
+
 * Bug #13108 fixed - Time between ATOMS database updates is now a month (was a day) and is configurable.
 
 * Bug #13109 fixed - pll2str now supports polynomials with complex coefficients and hypermatrices.
index e144b83..ef1208f 100644 (file)
@@ -1,12 +1,12 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!--
     * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
-    * Copyright (C) 2008 - INRIA - Vincent COUVERT 
-    * 
+    * Copyright (C) 2008 - INRIA - Vincent COUVERT
+    *
     * 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.1-en.txt
     *
     -->
@@ -17,7 +17,7 @@
     </refnamediv>
     <refsynopsisdiv>
         <title>Calling Sequence</title>
-        <synopsis>fd = matfile_open(filename[, mode])</synopsis>
+        <synopsis>fd = matfile_open(filename[, mode[, version]])</synopsis>
     </refsynopsisdiv>
     <refsection>
         <title>Arguments</title>
                 </listitem>
             </varlistentry>
             <varlistentry>
+                <term>version</term>
+                <listitem>
+                    <para>
+                        Scalar string: file version format (<literal>"5"</literal> by default).
+                    </para>
+                    <itemizedlist>
+                        <listitem>
+                            <para>
+                                <emphasis>"5"</emphasis>: Matlab 5 file.
+                            </para>
+                        </listitem>
+                        <listitem>
+                            <para>
+                                <emphasis>"7.3"</emphasis>: Matlab 7.3 file.
+                            </para>
+                        </listitem>
+                    </itemizedlist>
+                </listitem>
+            </varlistentry>
+            <varlistentry>
                 <term>fd</term>
                 <listitem>
                     <para>Real: file descriptor (-1 if opening failed).</para>
     <refsection>
         <title>Examples</title>
         <programlisting role="example"><![CDATA[
-A = rand(10,10);
-B = sprand(100,100,0.1);
-savematfile('test_matfile.mat','A','B','-v6');
+A = rand(10, 10);
+B = sprand(100, 100, 0.1);
+savematfile("test_matfile.mat", "A", "B", "-v6");
 clear();
 fd = matfile_open("test_matfile.mat");
 matfile_listvar(fd)
 matfile_close(fd);
 
-//fd = matfile_open("test_matfile.mat","w"); // Empty test_matfile.mat
+//fd = matfile_open("test_matfile.mat", "w"); // Empty test_matfile.mat
+
+//fd = matfile_open("test_matfile.mat", "w", "7.3"); // Empty test_matfile.mat as a Matlab 7.3 file
  ]]></programlisting>
     </refsection>
     <refsection role="see also">
@@ -108,4 +130,13 @@ matfile_close(fd);
             ).
         </para>
     </refsection>
+    <refsection>
+        <title>History</title>
+        <revhistory>
+            <revision>
+                <revnumber>5.5.0</revnumber>
+                <revremark>Support for Matlab 7.3 files.</revremark>
+            </revision>
+        </revhistory>
+    </refsection>
 </refentry>
index 70e19e3..62832b9 100644 (file)
@@ -1,13 +1,13 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!--
     * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
-    * Copyright (C) 2004-2007 - INRIA - Serge STEER 
-    * Copyright (C) 2004-2007 - INRIA - Vincent COUVERT 
-    * 
+    * Copyright (C) 2004-2007 - INRIA - Serge STEER
+    * Copyright (C) 2004-2007 - INRIA - Vincent COUVERT
+    *
     * 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.1-en.txt
     *
     -->
     </refsection>
     <refsection>
         <title>Examples</title>
-        <programlisting role="example"><![CDATA[ 
-A = rand(10,10);
-B = sprand(100,100,0.1);
-savematfile('test_matfile.mat','A','B','-v6');
+        <programlisting role="example"><![CDATA[
+A = rand(10, 10);
+B = sprand(100, 100, 0.1);
+savematfile("test_matfile.mat", "A", "B", "-v6");
+clear;
+loadmatfile("test_matfile.mat");
+disp(A)
+disp(B)
+
+// As a Matlab 7.3 file
+A = rand(10, 10);
+B = sprand(100, 100, 0.1);
+savematfile("test_matfile.mat", "A", "B", "-v7.3");
 clear;
-loadmatfile('test_matfile.mat');
+loadmatfile("test_matfile.mat");
 disp(A)
 disp(B)
  ]]></programlisting>
@@ -163,7 +172,7 @@ disp(B)
     <refsection>
         <title>Bibliography</title>
         <para>This function has been developed following the "MAT-File Format"
-            description: 
+            description:
             <literal>
                 <ulink url="http://www.mathworks.com/access/helpdesk/help/pdf_doc/matlab/matfile_format.pdf">Mat-File Format</ulink>
             </literal>
index b1b0118..a50b45b 100644 (file)
@@ -1,4 +1,5 @@
 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2014 - Scilab Enterprises - Paul Bignier: bug #13102 fixed
 // Copyright (C) 2002-2004 - INRIA - Vincent COUVERT
 // Copyright (C) ???? - INRIA - Serge STEER
 //
@@ -316,8 +317,35 @@ function savematfile(varargin)
             end
 
             matfile_close(mtlb_fd);
-        else // Version 7.3 ???
-            error(msprintf(gettext("Version %d MAT-file not implemented."),version));
+        else // Version 7.3
+            // Open file for writing
+            mtlb_fd=matfile_open(mtlb_thefile, "w", "7.3"); // "7.3" specifies a Matlab 7.3 file
+            if mtlb_fd == -1 then
+                error(msprintf(gettext("%s: Could not open file ''%s''.\n"),"savematfile",mtlb_thefile))
+            end
+            // Clear variable wich are no more used to avoid name conflicts
+            for k=["varargin","mtlb_names","mtlb_fmt","mtlb_fd"]
+                if or(mtlb_names==k) then
+                    error(msprintf(gettext("Name conflict: it is not possible to save variable with name %s."),k))
+                end
+            end
+            clear("x","k","rhs","lhs","kk","err","sep","bin","version","mtlb_thefile","mtlb_opts");
+
+            // Write variables as miCOMPRESSED data type
+            for k=1:size(mtlb_names,"*")
+                %var=evstr(mtlb_names(k));
+                // We transpose the sparse matrix so as to ease the conversion to the matlab sparse format
+                if type(%var)==5 then %var = %var'; end
+                if and(type(%var)<>[9 11 13]) then
+                    if ~matfile_varwrite(mtlb_fd, mtlb_names(k), %var, %T) then
+                        error(msprintf(gettext("savematfile: could not save variable named %s.\n"), mtlb_names(k)));
+                    end
+                else
+                    error(msprintf(gettext("savematfile: could not save variable named %s.\n"), mtlb_names(k)));
+                end
+            end
+
+            matfile_close(mtlb_fd);
         end
 
         // ASCII save
index f57d90e..b753dbc 100644 (file)
@@ -1,5 +1,6 @@
 /*
  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+ * Copyright (C) 2014 - Scilab Enterprises - Paul Bignier: bug #13102 fixed
  * Copyright (C) 2008 - INRIA - Vincent COUVERT
  * Copyright (C) 2010 - DIGITEO - Yann COLLETTE
  *
@@ -30,10 +31,12 @@ int sci_matfile_open(char *fname, unsigned long fname_len)
     char * filename  = NULL;
     char * optionStr = NULL;
     int option = 0, var_type;
-    int * filename_addr = NULL, * option_addr = NULL;
+    int * filename_addr = NULL, * option_addr = NULL, * version_addr = NULL;
+    char * versionStr = NULL;
+    int version = MAT_FT_MAT5; // By default, use MAtlab 5 files
     SciErr sciErr;
 
-    CheckRhs(1, 2);
+    CheckRhs(1, 3);
     CheckLhs(1, 1);
 
     sciErr = getVarAddressFromPosition(pvApiCtx, 1, &filename_addr);
@@ -73,7 +76,7 @@ int sci_matfile_open(char *fname, unsigned long fname_len)
         return FALSE;
     }
 
-    if (Rhs == 2)
+    if (Rhs >= 2)
     {
         sciErr = getVarAddressFromPosition(pvApiCtx, 2, &option_addr);
         if (sciErr.iErr)
@@ -140,12 +143,63 @@ int sci_matfile_open(char *fname, unsigned long fname_len)
         option = MAT_ACC_RDONLY;
     }
 
-    if (option == MAT_ACC_RDWR)
+    if (Rhs >= 3)
     {
-        /* create a Matlab 5 file */
-        matfile = Mat_CreateVer(filename, NULL, 0);
+        sciErr = getVarAddressFromPosition(pvApiCtx, 3, &version_addr);
+        if (sciErr.iErr)
+        {
+            printError(&sciErr, 0);
+            return 0;
+        }
+
+        sciErr = getVarType(pvApiCtx, version_addr, &var_type);
+        if (sciErr.iErr)
+        {
+            printError(&sciErr, 0);
+            return 0;
+        }
+        printf("sci_strings %d %d\n", var_type, sci_strings);
+        if (var_type == sci_strings)
+        {
+            getAllocatedSingleString(pvApiCtx, version_addr, &versionStr);
+            sciErr = getVarDimension(pvApiCtx, version_addr, &nbRow, &nbCol);
+            if (sciErr.iErr)
+            {
+                printError(&sciErr, 0);
+                return 0;
+            }
+            if (nbCol != 1)
+            {
+                Scierror(999, _("%s: Wrong size for input argument #%d: Single string expected.\n"), fname, 3);
+                freeAllocatedSingleString(filename);
+                freeAllocatedSingleString(optionStr);
+                freeAllocatedSingleString(versionStr);
+
+                return FALSE;
+            }
+
+            if (strcmp(versionStr, "7.3") == 0)
+            {
+                version = MAT_FT_MAT73; // Matlab 7.3 file
+            }
+            else
+            {
+                version = MAT_FT_MAT5; // Default, Matlab 5 file
+            }
+        }
+        else
+        {
+            Scierror(999, _("%s: Wrong type for input argument #%d: A string expected.\n"), fname, 3);
+            return 0;
+        }
     }
-    else
+
+    if (option == MAT_ACC_RDWR) // Write, option = "w"
+    {
+        /* create a Matlab 5 or 7.3 file */
+        matfile = Mat_CreateVer(filename, NULL, version);
+    }
+    else // Read, option = "r"
     {
         /* Try to open the file (as a Matlab 5 file) */
         matfile = Mat_Open(filename, option);
@@ -168,6 +222,7 @@ int sci_matfile_open(char *fname, unsigned long fname_len)
 
     freeAllocatedSingleString(filename);
     freeAllocatedSingleString(optionStr);
+    freeAllocatedSingleString(versionStr);
 
     LhsVar(1) = Rhs + 1;
     PutLhsVar();
diff --git a/scilab/modules/matio/tests/nonreg_tests/bug_13102.dia.ref b/scilab/modules/matio/tests/nonreg_tests/bug_13102.dia.ref
new file mode 100644 (file)
index 0000000..c1c43b1
--- /dev/null
@@ -0,0 +1,30 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2014 - Scilab Enterprises - Paul Bignier
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+//
+// <-- CLI SHELL MODE -->
+//
+// <-- Non-regression test for bug 13102 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/show_bug.cgi?id=13102
+//
+// <-- Short Description -->
+// savematfile did not support "-v7.3" option.
+A = rand(10,10);
+testfile = fullfile(TMPDIR, "bug_13102.mat");
+savematfile(testfile, "A", "-v7.3");
+refA = A;
+clear A;
+loadmatfile(testfile);
+assert_checkequal(refA, A);
+deletefile(testfile);
+// Create an empty Matlab 7.3 file ready for writing
+fd = matfile_open(testfile, "w", "7.3");
+assert_checkequal(fd, 0);
+matfile_close(fd);
+assert_checktrue(isfile(testfile));
+deletefile(testfile);
diff --git a/scilab/modules/matio/tests/nonreg_tests/bug_13102.tst b/scilab/modules/matio/tests/nonreg_tests/bug_13102.tst
new file mode 100644 (file)
index 0000000..1260cfa
--- /dev/null
@@ -0,0 +1,37 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2014 - Scilab Enterprises - Paul Bignier
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+//
+// <-- CLI SHELL MODE -->
+//
+// <-- Non-regression test for bug 13102 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/show_bug.cgi?id=13102
+//
+// <-- Short Description -->
+// savematfile did not support "-v7.3" option.
+
+A = rand(10,10);
+
+testfile = fullfile(TMPDIR, "bug_13102.mat");
+savematfile(testfile, "A", "-v7.3");
+
+refA = A;
+clear A;
+
+loadmatfile(testfile);
+assert_checkequal(refA, A);
+deletefile(testfile);
+
+
+// Create an empty Matlab 7.3 file ready for writing
+fd = matfile_open(testfile, "w", "7.3");
+assert_checkequal(fd, 0);
+
+matfile_close(fd);
+assert_checktrue(isfile(testfile));
+deletefile(testfile);