Added a optional mode for matfile2sci to append or write on the output file. Better... 83/14083/8
Pierre-Aime Agnel [Thu, 20 Mar 2014 13:21:41 +0000 (14:21 +0100)]
Change-Id: Ib785d08157125a0b61e362494d3684579d52f0f4

SEP/INDEX
SEP/SEP_131_matfile2sci.odt [new file with mode: 0644]
scilab/CHANGES_5.5.X
scilab/modules/m2sci/help/en_US/matfile2sci.xml
scilab/modules/m2sci/macros/matfile2sci.sci
scilab/modules/m2sci/tests/unit_tests/m2sci_c_empty.mat [new file with mode: 0644]
scilab/modules/m2sci/tests/unit_tests/m2sci_empty.mat [new file with mode: 0644]
scilab/modules/m2sci/tests/unit_tests/m2sci_n_empty1.mat [new file with mode: 0644]
scilab/modules/m2sci/tests/unit_tests/m2sci_n_empty2.mat [new file with mode: 0644]
scilab/modules/m2sci/tests/unit_tests/matfile2sci.dia.ref [new file with mode: 0644]
scilab/modules/m2sci/tests/unit_tests/matfile2sci.tst [new file with mode: 0644]

index c9b928c..f0512d7 100644 (file)
--- a/SEP/INDEX
+++ b/SEP/INDEX
@@ -126,3 +126,4 @@ SEP #127: jmat tagged as obsolete. New input argument to flipdim to replace jmat
 SEP #128: nanreglin.
 SEP #129: HTLM parsing functions.
 SEP #130: Replace obsolete numdiff and derivative with new function numderivative.
+SEP #131: Modified matfile2sci to have an new input argument overwrite to overwrite the output file
diff --git a/SEP/SEP_131_matfile2sci.odt b/SEP/SEP_131_matfile2sci.odt
new file mode 100644 (file)
index 0000000..75a1cab
Binary files /dev/null and b/SEP/SEP_131_matfile2sci.odt differ
index 9873d6d..a4510f5 100644 (file)
@@ -156,6 +156,8 @@ Scilab
 
 * nanreglin(): reglin() with arguments containing NaNs (See bug #13208).
 
+* New optional input argument added to matfile2sci (append or write the output file).
+
 
 Xcos
 ====
index d7d057e..a5d2546 100644 (file)
@@ -19,7 +19,7 @@
     </refnamediv>
     <refsynopsisdiv>
         <title>Calling Sequence</title>
-        <synopsis>matfile2sci(mat_file_path,sci_file_path)</synopsis>
+        <synopsis>matfile2sci(mat_file_path,sci_file_path[, overwrite])</synopsis>
     </refsynopsisdiv>
     <refsection>
         <title>Arguments</title>
                     <para>character string containing the path of the Scilab output file</para>
                 </listitem>
             </varlistentry>
+            <varlistentry>
+                <term>overwrite</term>
+                <listitem>
+                    <para>
+                        a boolean: wipes the <literal>sci_file_path</literal> file if set to true. False by default.
+                    </para>
+                </listitem>
+            </varlistentry>
         </variablelist>
     </refsection>
     <refsection>
@@ -45,6 +53,9 @@
             with the function <literal>load</literal> (See <link linkend="save">save</link> for more information). The Matlab data types are
             converted into the Scilab equivalents.
         </para>
+        <para>
+            The function exits without creating an output file if no variable was found in the input file.
+        </para>
     </refsection>
     <refsection role="see also">
         <title>See Also</title>
                 <revnumber>5.4.0</revnumber>
                 <revremark>Scilab output file in a SOD (Scilab Open Data) file.</revremark>
             </revision>
+            <revision>
+                <revnumber>5.5.0</revnumber>
+                <revremark>Output file can be overwritten or appended.</revremark>
+            </revision>
         </revhistory>
     </refsection>
 </refentry>
index a63699b..fb98302 100644 (file)
@@ -8,7 +8,7 @@
 // are also available at
 // http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.txt
 
-function matfile2sci(mat_file_path,result_file_path)
+function matfile2sci(mat_file_path, result_file_path, overwrite)
     // Translate a Matlab MAT file into a Scilab file
     //
     // mat_file_path : path of the Matlab MAT file
@@ -22,28 +22,59 @@ function matfile2sci(mat_file_path,result_file_path)
     end
 
     [lhs,rhs]=argn(0)
-    if rhs<>2 then
-        error(msprintf(gettext("%s: Wrong number of input arguments: %d expected.\n"),"matfile2sci",2)),
+    if rhs<2 | rhs>3 then
+        error(msprintf(gettext("%s: Wrong number of input arguments: %d to %d expected.\n"), "matfile2sci", 2, 3));
+    end
+
+    //overwrite is false by default
+    if rhs==2
+        overwrite = %F;
+    end
+
+    //overwrite must be a boolean
+    if type(overwrite)<>4 
+        error(msprintf(_("%s: Wrong type for argument %d: Boolean matrix expected.\n"), "matfile2sci", 3));
+    end
+
+    if size(overwrite, '*')<>1 
+        error(msprintf(_("%s: Wrong size for input argument #%d: %d-by-%d matrix expected.\n"), "matfile2sci", 3, 1, 1));
     end
 
     //--file opening
-    fdi=matfile_open(pathconvert(mat_file_path, %F, %T), "r");
-    fdo=pathconvert(result_file_path, %F, %T);
+    input_file_path = pathconvert(mat_file_path, %F, %T)
+    fdi=matfile_open(input_file_path, "r");
+    fdo_path=pathconvert(result_file_path, %F, %T);
+
+    //Wipe file if overwrite is true and the output file previously existed
+    if isfile(fdo_path) & overwrite
+        fdo = mopen(fdo_path, "wb");
+    end
 
     //-- Read first variable
     ierr = execstr("[Name, Matrix, Class] = matfile_varreadnext(fdi);", "errcatch");
     ierrsave = 0;
 
+    if (ierr~=0) | ~exists("Name")
+        error(msprintf(_("%s: Could not read variables in %s"), "matfile2sci", input_file_path))
+    end
+
+    if Name==""
+        error(msprintf(_("%s: Could not read variables in %s"), "matfile2sci", input_file_path))
+    end
+
     //--loop on the stored variables
     while Name<>"" & ierr==0 & ierrsave==0
-        ierrsave = execstr(Name + " = Matrix; save(fdo, ""-append"", """+Name+""")", "errcatch")
+        ierrsave = execstr(Name + " = Matrix; save(fdo_path, ""-append"", """+Name+""")", "errcatch")
         if ierrsave==0 then
             //-- Read next variable
             ierr = execstr("[Name, Matrix, Class] = matfile_varreadnext(fdi);", "errcatch");
         end
     end
 
+    if exists("fdo")==1
+        mclose(fdo);
+    end
+
     //--file closing
     matfile_close(fdi);
 endfunction
-
diff --git a/scilab/modules/m2sci/tests/unit_tests/m2sci_c_empty.mat b/scilab/modules/m2sci/tests/unit_tests/m2sci_c_empty.mat
new file mode 100644 (file)
index 0000000..059a7c3
Binary files /dev/null and b/scilab/modules/m2sci/tests/unit_tests/m2sci_c_empty.mat differ
diff --git a/scilab/modules/m2sci/tests/unit_tests/m2sci_empty.mat b/scilab/modules/m2sci/tests/unit_tests/m2sci_empty.mat
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/scilab/modules/m2sci/tests/unit_tests/m2sci_n_empty1.mat b/scilab/modules/m2sci/tests/unit_tests/m2sci_n_empty1.mat
new file mode 100644 (file)
index 0000000..7d8b0f5
Binary files /dev/null and b/scilab/modules/m2sci/tests/unit_tests/m2sci_n_empty1.mat differ
diff --git a/scilab/modules/m2sci/tests/unit_tests/m2sci_n_empty2.mat b/scilab/modules/m2sci/tests/unit_tests/m2sci_n_empty2.mat
new file mode 100644 (file)
index 0000000..b00920f
Binary files /dev/null and b/scilab/modules/m2sci/tests/unit_tests/m2sci_n_empty2.mat differ
diff --git a/scilab/modules/m2sci/tests/unit_tests/matfile2sci.dia.ref b/scilab/modules/m2sci/tests/unit_tests/matfile2sci.dia.ref
new file mode 100644 (file)
index 0000000..c5eca5d
--- /dev/null
@@ -0,0 +1,120 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2014      - Scilab-Enterprises - Pierre-Aime Agnel <pierre-aime.agnel@scilab-enterprises.com>
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+// <-- CLI SHELL MODE -->
+// <-- Unit test for macro matfile2sci -->
+//==============================================================================
+//Testing the error messagge on an non empty file with empty content
+matfile_content_empty = pathconvert("SCI/modules/m2sci/tests/unit_tests/m2sci_c_empty.mat",%F,%T);
+w_file_content_empty  = pathconvert("TMPDIR/w_content_empty.sod",%F,%T);
+a_file_content_empty  = pathconvert("TMPDIR/a_content_empty.sod",%F,%T);
+errmsg_c_empty = msprintf(_("%s: Could not read variables in %s"), "matfile2sci", matfile_content_empty);
+//m2sci_c_empty.mat is not a completely blank file but has no variables
+assert_checkerror('matfile2sci(matfile_content_empty, w_file_content_empty, %t)', errmsg_c_empty); 
+assert_checkerror('matfile2sci(matfile_content_empty, a_file_content_empty, %f)', errmsg_c_empty); 
+//Check files were not created
+assert_checkfalse(isfile(w_file_content_empty));
+assert_checkfalse(isfile(a_file_content_empty));
+//==============================================================================
+//Testing the error message on an empty file
+matfile_empty         = pathconvert("SCI/modules/m2sci/tests/unit_tests/m2sci_empty.mat",%F,%T);
+w_file_empty          = pathconvert("TMPDIR/w_empty.sod",%F,%T);
+a_file_empty          = pathconvert("TMPDIR/a_empty.sod",%F,%T);
+errmsg_empty = msprintf(_("%s: Could not read variables in %s"), "matfile2sci", matfile_empty);
+assert_checkerror('matfile2sci(matfile_empty, w_file_empty, %t)', errmsg_empty); 
+assert_checkerror('matfile2sci(matfile_empty, a_file_empty, %f)', errmsg_empty); 
+//Check files were not created
+assert_checkfalse(isfile(w_file_empty));
+assert_checkfalse(isfile(a_file_empty));
+//==============================================================================
+//Testing the error message on a call with third argument different than %t or %f
+matfile_notow         = pathconvert("SCI/modules/m2sci/tests/unit_tests/m2sci_empty.mat",%F,%T);
+w_file_notow          = pathconvert("TMPDIR/w_empty.sod",%F,%T);
+errmsg_notow = msprintf(_("%s: Wrong type for argument %d: Boolean matrix expected.\n"), "matfile2sci", 3);
+errmsg_notow2 = msprintf(_("%s: Wrong size for input argument #%d: %d-by-%d matrix expected.\n"), "matfile2sci", 3, 1, 1);
+assert_checkerror('matfile2sci(matfile_empty, w_file_empty, ""a wrong value"")', errmsg_notow); 
+assert_checkerror('matfile2sci(matfile_empty, w_file_empty, [%t, %f, %t])', errmsg_notow2); 
+//==============================================================================
+//Testing non empty files
+matfile_not_empty1    = pathconvert("SCI/modules/m2sci/tests/unit_tests/m2sci_n_empty1.mat",%F,%T);
+matfile_not_empty2    = pathconvert("SCI/modules/m2sci/tests/unit_tests/m2sci_n_empty2.mat",%F,%T);
+w_file_not_empty      = pathconvert("TMPDIR/w_not_empty.sod",%F,%T);
+def_file_not_empty    = pathconvert("TMPDIR/def_not_empty.sod",%F,%T);
+a_file_not_empty      = pathconvert("TMPDIR/a_not_empty.sod",%F,%T);
+//Matfile m2sci_n_empty1.mat contains:
+// tst_append_double1  = 1;
+// tst_append_mdouble1 = [0,1.1,2,3.3];
+// tst_append_str1     = "a tested string";
+//Matfile m2sci_n_empty2.mat contains:
+// tst_append_double2  = 2;
+// tst_append_mdouble2 = [11,12.1,12,13.3];
+// tst_append_str2     = "a tested string2";
+var_ne1 = ["tst_append_double1","tst_append_mdouble1","tst_append_str1"]; 
+var_ne2 = ["tst_append_double2","tst_append_mdouble2","tst_append_str2"]; 
+//==============================================================================
+//Testing append Default behaviour
+//def_file_not_empty : appended values of matfile_not_empty1 and 2
+matfile2sci(matfile_not_empty1, def_file_not_empty);
+matfile2sci(matfile_not_empty2, def_file_not_empty);
+//File must be written
+assert_checktrue(isfile(def_file_not_empty));
+load(def_file_not_empty);
+//if not overwritten all values from both files should exist
+for v = var_ne1 
+    assert_checktrue(exists(v)==1);
+end
+for v = var_ne2 
+    assert_checktrue(exists(v)==1);
+end
+//clearing variables for future tests
+for v = [var_ne1, var_ne2]
+    clear(v);
+end
+//==============================================================================
+//File not empty with append flag = default behaviour
+matfile2sci(matfile_not_empty1, a_file_not_empty, %f);
+matfile2sci(matfile_not_empty2, a_file_not_empty, %f);
+//File must be written
+assert_checktrue(isfile(a_file_not_empty));
+load(a_file_not_empty);
+//if not overwritten all values from both files should exist
+for v = var_ne1 
+    assert_checktrue(exists(v)==1);
+end
+for v = var_ne2 
+    assert_checktrue(exists(v)==1);
+end
+//clearing variables for future tests
+for v = [var_ne1, var_ne2]
+    clear(v);
+end
+//==============================================================================
+//Testing the writing flag
+matfile2sci(matfile_not_empty1, w_file_not_empty, %t);
+//File must be written
+assert_checktrue(isfile(w_file_not_empty));
+//Checks variables in the file written
+load(w_file_not_empty);
+for v = var_ne1 
+    assert_checktrue(exists(v)==1);
+    clear(v) //clearing to have an empty variable for next test
+end
+matfile2sci(matfile_not_empty2, w_file_not_empty, %t);
+//File must be written
+assert_checktrue(isfile(w_file_not_empty));
+//File w_file_not_empty must be overwritten
+load(w_file_not_empty);
+for v = var_ne1 
+    assert_checkfalse(exists(v)==1); //variables in matfile_not_empty1 must not be in the file overwritten
+end
+for v = var_ne2 
+    assert_checktrue(exists(v)==1);
+end
+//clearing variables for future tests
+for v = [var_ne1, var_ne2]
+    clear(v); // clear is silent on unexisting variables
+end
+//==============================================================================
diff --git a/scilab/modules/m2sci/tests/unit_tests/matfile2sci.tst b/scilab/modules/m2sci/tests/unit_tests/matfile2sci.tst
new file mode 100644 (file)
index 0000000..4a16f3a
--- /dev/null
@@ -0,0 +1,155 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2014      - Scilab-Enterprises - Pierre-Aime Agnel <pierre-aime.agnel@scilab-enterprises.com>
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+
+// <-- CLI SHELL MODE -->
+
+// <-- Unit test for macro matfile2sci -->
+
+//==============================================================================
+//Testing the error messagge on an non empty file with empty content
+matfile_content_empty = pathconvert("SCI/modules/m2sci/tests/unit_tests/m2sci_c_empty.mat",%F,%T);
+w_file_content_empty  = pathconvert("TMPDIR/w_content_empty.sod",%F,%T);
+a_file_content_empty  = pathconvert("TMPDIR/a_content_empty.sod",%F,%T);
+errmsg_c_empty = msprintf(_("%s: Could not read variables in %s"), "matfile2sci", matfile_content_empty);
+
+//m2sci_c_empty.mat is not a completely blank file but has no variables
+assert_checkerror('matfile2sci(matfile_content_empty, w_file_content_empty, %t)', errmsg_c_empty); 
+assert_checkerror('matfile2sci(matfile_content_empty, a_file_content_empty, %f)', errmsg_c_empty); 
+
+//Check files were not created
+assert_checkfalse(isfile(w_file_content_empty));
+assert_checkfalse(isfile(a_file_content_empty));
+
+//==============================================================================
+//Testing the error message on an empty file
+matfile_empty         = pathconvert("SCI/modules/m2sci/tests/unit_tests/m2sci_empty.mat",%F,%T);
+w_file_empty          = pathconvert("TMPDIR/w_empty.sod",%F,%T);
+a_file_empty          = pathconvert("TMPDIR/a_empty.sod",%F,%T);
+
+errmsg_empty = msprintf(_("%s: Could not read variables in %s"), "matfile2sci", matfile_empty);
+
+assert_checkerror('matfile2sci(matfile_empty, w_file_empty, %t)', errmsg_empty); 
+assert_checkerror('matfile2sci(matfile_empty, a_file_empty, %f)', errmsg_empty); 
+
+//Check files were not created
+assert_checkfalse(isfile(w_file_empty));
+assert_checkfalse(isfile(a_file_empty));
+
+//==============================================================================
+//Testing the error message on a call with third argument different than %t or %f
+matfile_notow         = pathconvert("SCI/modules/m2sci/tests/unit_tests/m2sci_empty.mat",%F,%T);
+w_file_notow          = pathconvert("TMPDIR/w_empty.sod",%F,%T);
+
+errmsg_notow = msprintf(_("%s: Wrong type for argument %d: Boolean matrix expected.\n"), "matfile2sci", 3);
+errmsg_notow2 = msprintf(_("%s: Wrong size for input argument #%d: %d-by-%d matrix expected.\n"), "matfile2sci", 3, 1, 1);
+
+assert_checkerror('matfile2sci(matfile_empty, w_file_empty, ""a wrong value"")', errmsg_notow); 
+assert_checkerror('matfile2sci(matfile_empty, w_file_empty, [%t, %f, %t])', errmsg_notow2); 
+
+//==============================================================================
+//Testing non empty files
+matfile_not_empty1    = pathconvert("SCI/modules/m2sci/tests/unit_tests/m2sci_n_empty1.mat",%F,%T);
+matfile_not_empty2    = pathconvert("SCI/modules/m2sci/tests/unit_tests/m2sci_n_empty2.mat",%F,%T);
+w_file_not_empty      = pathconvert("TMPDIR/w_not_empty.sod",%F,%T);
+def_file_not_empty    = pathconvert("TMPDIR/def_not_empty.sod",%F,%T);
+a_file_not_empty      = pathconvert("TMPDIR/a_not_empty.sod",%F,%T);
+
+//Matfile m2sci_n_empty1.mat contains:
+// tst_append_double1  = 1;
+// tst_append_mdouble1 = [0,1.1,2,3.3];
+// tst_append_str1     = "a tested string";
+
+//Matfile m2sci_n_empty2.mat contains:
+// tst_append_double2  = 2;
+// tst_append_mdouble2 = [11,12.1,12,13.3];
+// tst_append_str2     = "a tested string2";
+
+var_ne1 = ["tst_append_double1","tst_append_mdouble1","tst_append_str1"]; 
+var_ne2 = ["tst_append_double2","tst_append_mdouble2","tst_append_str2"]; 
+
+
+//==============================================================================
+//Testing append Default behaviour
+//def_file_not_empty : appended values of matfile_not_empty1 and 2
+matfile2sci(matfile_not_empty1, def_file_not_empty);
+matfile2sci(matfile_not_empty2, def_file_not_empty);
+
+//File must be written
+assert_checktrue(isfile(def_file_not_empty));
+
+load(def_file_not_empty);
+//if not overwritten all values from both files should exist
+for v = var_ne1 
+    assert_checktrue(exists(v)==1);
+end
+
+for v = var_ne2 
+    assert_checktrue(exists(v)==1);
+end
+
+//clearing variables for future tests
+for v = [var_ne1, var_ne2]
+    clear(v);
+end
+
+//==============================================================================
+//File not empty with append flag = default behaviour
+matfile2sci(matfile_not_empty1, a_file_not_empty, %f);
+matfile2sci(matfile_not_empty2, a_file_not_empty, %f);
+
+//File must be written
+assert_checktrue(isfile(a_file_not_empty));
+
+load(a_file_not_empty);
+//if not overwritten all values from both files should exist
+for v = var_ne1 
+    assert_checktrue(exists(v)==1);
+end
+
+for v = var_ne2 
+    assert_checktrue(exists(v)==1);
+end
+
+//clearing variables for future tests
+for v = [var_ne1, var_ne2]
+    clear(v);
+end
+
+//==============================================================================
+//Testing the writing flag
+matfile2sci(matfile_not_empty1, w_file_not_empty, %t);
+
+//File must be written
+assert_checktrue(isfile(w_file_not_empty));
+
+//Checks variables in the file written
+load(w_file_not_empty);
+for v = var_ne1 
+    assert_checktrue(exists(v)==1);
+    clear(v) //clearing to have an empty variable for next test
+end
+
+matfile2sci(matfile_not_empty2, w_file_not_empty, %t);
+
+//File must be written
+assert_checktrue(isfile(w_file_not_empty));
+
+//File w_file_not_empty must be overwritten
+load(w_file_not_empty);
+for v = var_ne1 
+    assert_checkfalse(exists(v)==1); //variables in matfile_not_empty1 must not be in the file overwritten
+end
+
+for v = var_ne2 
+    assert_checktrue(exists(v)==1);
+end
+
+//clearing variables for future tests
+for v = [var_ne1, var_ne2]
+    clear(v); // clear is silent on unexisting variables
+end
+//==============================================================================