* Bug 15095: mfile2sci() translatepaths() failed with non-ASCII paths 25/20525/3
Samuel GOUGEON [Sat, 29 Sep 2018 23:37:01 +0000 (01:37 +0200)]
  http://bugzilla.scilab.org/15095

  mfile2sci(): named parameters were not allowed
  translatepath():
    - path management improved, using dedicated functions
    - building the builder and loader was bugged:
      unix_g("pwd") does not work on Windows

Change-Id: I021d635ecdb052fcdb80adf1c5e7040c96a2d186

scilab/CHANGES.md
scilab/modules/m2sci/help/en_US/mfile2sci.xml
scilab/modules/m2sci/help/fr_FR/mfile2sci.xml
scilab/modules/m2sci/macros/mfile2sci.sci
scilab/modules/m2sci/macros/translatepaths.sci
scilab/modules/m2sci/tests/nonreg_tests/bug_15095.tst [new file with mode: 0644]

index ae5d5fe..ca4922a 100644 (file)
@@ -502,6 +502,7 @@ Known issues
 * [#15033](http://bugzilla.scilab.org/show_bug.cgi?id=15033): `fileinfo` gave negative size if filesize bigger than 2^31
 * [#15091](http://bugzilla.scilab.org/show_bug.cgi?id=15091): `translatepaths()` was KO.
 * [#15092](http://bugzilla.scilab.org/show_bug.cgi?id=15092): Scalar variable was resized as a column vector instead of row.
+* [#15095](http://bugzilla.scilab.org/show_bug.cgi?id=15095): The Matlab=>Scilab translator failed when working with non-ASCII paths.
 * [#15017](http://bugzilla.scilab.org/show_bug.cgi?id=15017): `lcm` did not support int64 and uint64 input integers. Input integers had to be in a row instead of any matrix. For input decimal integers, results were int32 encoded.
 * [#15115](http://bugzilla.scilab.org/show_bug.cgi?id=15115): Tabs order in SciNotes was incorrect when opening file and restoring session.
 * [#15157](http://bugzilla.scilab.org/show_bug.cgi?id=15157): min/max on tlist or mlist did not call good overload.
index 3c98920..8b9753b 100644 (file)
@@ -1,24 +1,23 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!--
- * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
- * Copyright (C) ???? - INRIA - Serge STEER
- * Copyright (C) 2002-2004 - INRIA - Vincent COUVERT
- * Copyright (C) 2018 - Samuel GOUGEON
- *
- * Copyright (C) 2012 - 2016 - 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.
-    *
-    -->
+* Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+* Copyright (C) ???? - INRIA - Serge STEER
+* Copyright (C) 2002-2004 - INRIA - Vincent COUVERT
+*
+* Copyright (C) 2012 - 2016 - 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.
+*
+-->
 <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" xmlns:scilab="http://www.scilab.org"
-        xml:lang="en" xml:id="mfile2sci">
+          xmlns:svg="http://www.w3.org/2000/svg" xmlns:mml="http://www.w3.org/1998/Math/MathML"
+          xmlns:db="http://docbook.org/ns/docbook" xmlns:scilab="http://www.scilab.org"
+          xml:lang="en" xml:id="mfile2sci">
     <refnamediv>
         <refname>mfile2sci</refname>
         <refpurpose>Matlab M-file to Scilab conversion function</refpurpose>
     <refsynopsisdiv>
         <title>Syntax</title>
         <synopsis>
-            mfile2sci()  // interactive GUI
-            mfile2sci(M_file_path)
-            mfile2sci(M_file_path, result_path )
-            mfile2sci(M_file_path, result_path, Recmode)
-            mfile2sci(M_file_path, result_path, Recmode, only_double)
-            mfile2sci(M_file_path, result_path, Recmode, only_double, verbose_mode)
-            mfile2sci(M_file_path, result_path, Recmode, only_double, verbose_mode, prettyprintoutput)
+          mfile2sci()
+          mfile2sci(M-file-path)
+          mfile2sci(M-file-path, results_path)
+          mfile2sci(M-file-path, results_path, Recmode)
+          mfile2sci(M-file-path, results_path, Recmode, only_double)
+          mfile2sci(M-file-path, results_path, Recmode, only_double, verbose_mode)
+          mfile2sci(M-file-path, results_path, Recmode, only_double, verbose_mode, prettyprintoutput)
+          mfile2sci(M-file-path, verbose_mode=.., ..)
         </synopsis>
     </refsynopsisdiv>
     <refsection>
                 </listitem>
             </varlistentry>
             <varlistentry>
-                <term>result_path</term>
+                <term>results_path</term>
                 <listitem>
                     <para>
-                        a character string which gives the directory where the result has to be
-                        written. Default value is current directory.
+                      a character string which gives the directory where the result has to be written.
+                      Default value is current directory.
                     </para>
                 </listitem>
             </varlistentry>
@@ -57,8 +57,8 @@
                 <term>Recmode</term>
                 <listitem>
                     <para>
-                        Boolean flag, used by <literal>translatepaths()</literal> function for
-                        recursive conversion. Must be %F to convert a single mfile. Default value: %F
+                      Boolean flag, used by translatepaths function for recursive conversion.
+                      Must be %F to convert a single mfile. Default value : %f
                     </para>
                 </listitem>
             </varlistentry>
                 <term>only_double</term>
                 <listitem>
                     <para>
-                        Boolean: If %T, mfile2sci() considers that numerical functions and operators
-                        (like "+") are used only with numerical data. This excludes for instance
-                        instructions like <literal>"ab" + "cd"</literal> (that then will be
-                        kept as is instead of being converted into
-                        <literal>asciimat("ab") + asciimat("cd")</literal>).
-                    </para>
-                    <para>
-                        Default value: %F: All possible conversions are done.
+                       Boolean flag, if %T mfile2sci considers that numerical function have been
+                       used only with numerical data (no Scilab overloading function is needed).
+                       Default value: %T
                     </para>
                 </listitem>
             </varlistentry>
                 <term>verbose_mode</term>
                 <listitem>
                     <para> display information mode</para>
-                    <table border="0">
-                        <tr valign="top">
-                            <th>0 : </th>
-                            <td>no information displayed</td>
-                        </tr>
-                        <tr valign="top">
-                            <th>1 : </th>
-                            <td>
-                                information is written as comments in resulting SCI-file.
-                            </td>
-                        </tr>
-                        <tr valign="top">
-                            <th>2 : </th>
-                            <td>
-                                information is written as comments in resulting SCI-file
-                                and in logfile.
-                            </td>
-                        </tr>
-                        <tr valign="top">
-                            <th>[3] : </th>
-                            <td>
-                                information is written as comments in resulting SCI-file,
-                                in logfile and displayed in Scilab window. (Default value)
-                            </td>
-                        </tr>
-                    </table>
+                    <variablelist>
+                        <varlistentry>
+                            <term>0</term>
+                            <listitem>
+                                <para>no information displayed</para>
+                            </listitem>
+                        </varlistentry>
+                        <varlistentry>
+                            <term>1</term>
+                            <listitem>
+                                <para>information written as comment is resulting SCI-file</para>
+                            </listitem>
+                        </varlistentry>
+                        <varlistentry>
+                            <term>2</term>
+                            <listitem>
+                                <para>
+                                  information written as comment is resulting SCI-file and in logfile
+                                </para>
+                            </listitem>
+                        </varlistentry>
+                        <varlistentry>
+                            <term>3</term>
+                            <listitem>
+                                <para>
+                                  information written as comment is resulting SCI-file,
+                                  in logfile and displayed in Scilab window
+                                </para>
+                            </listitem>
+                        </varlistentry>
+                    </variablelist>
                 </listitem>
             </varlistentry>
             <varlistentry>
         <title>Description</title>
         <para>
             M2SCI (and particularly mfile2sci) is Matlab M-file to Scilab function conversion tools.
-            It tries whenever possible to replace call to Matlab functions by the equivalent
-            Scilab primitives and functions.
+            It tries whenever possible to replace call to Matlab functions by the
+            equivalent Scilab primitives and functions.
         </para>
         <para>
             To convert a Matlab M-file just enter the Scilab instruction:
         <para>
             where file is a character string giving the path name of the M-file.
         </para>
+        <variablelist>
+            <varlistentry>
+                <term>&lt;function-name&gt;.sci</term>
+                <listitem>
+                    <para>the Scilab equivalent of the M-file</para>
+                </listitem>
+            </varlistentry>
+            <varlistentry>
+                <term>&lt;function-name&gt;.cat</term>
+                <listitem>
+                    <para>the Scilab help file associated to the function</para>
+                </listitem>
+            </varlistentry>
+            <varlistentry>
+                <term>sci_&lt;function-name&gt;.sci</term>
+                <listitem>
+                    <para>
+                      the Scilab function required to convert the calls to this Matlab M-file
+                      in other Matlab M-files. This function may be improved "by hand".
+                      This function is only useful for conversion not for use of translated functions.
+                    </para>
+                </listitem>
+            </varlistentry>
+        </variablelist>
         <para>
             <literal>mfile2sci(..)</literal> will then generate three files in the same directory:
         </para>
             </table>
         </para>
         <para>
-            Some functions like eye, ones, size, sum,... behave differently according to the
-            dimension of their arguments. When mfile2sci cannot infer dimensions it replaces
-            these function call by a call to an emulation function named mtlb_&lt;function_name>.
-            For efficiency, these functions may be replaced by the proper scilab equivalent
-            instructions.
-            To get information about replacement, enter:
-            <literal>help mtlb_&lt;function_name></literal> in Scilab command window
+            When translation may be incorrect or may be improved mfile2sci adds a
+            comment which begins by "//!" (according to verbose_mode)
         </para>
         <para>
-            Some other functions like plot, has no straightforward equivalent in scilab.
-            They are also replaced by an emulation function named
-            <literal>mtlb_&lt;function_name></literal>.
+            When called without rhs, <literal>mfile2sci()</literal> launches a GUI to help
+            to select a file/directory and options.
         </para>
         <para>
             When translation may be incorrect or may be improved mfile2sci adds a
index 3539d91..a7fff00 100644 (file)
@@ -1,24 +1,23 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!--
- * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
- * Copyright (C) 2002-2004 - INRIA - Vincent COUVERT
- * Copyright (C) ???? - INRIA - Serge STEER
- * Copyright (C) 2018 - Samuel GOUGEON
- *
- * Copyright (C) 2012 - 2016 - 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.
- *
+* Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+* Copyright (C) ???? - INRIA - Serge STEER
+* Copyright (C) 2002-2004 - INRIA - Vincent COUVERT
+*
+* Copyright (C) 2012 - 2016 - 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.
+*
 -->
 <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" xmlns:scilab="http://www.scilab.org"
-        xml:lang="fr" xml:id="mfile2sci">
+          xmlns:svg="http://www.w3.org/2000/svg" xmlns:mml="http://www.w3.org/1998/Math/MathML"
+          xmlns:db="http://docbook.org/ns/docbook" xmlns:scilab="http://www.scilab.org"
+          xml:lang="fr" xml:id="mfile2sci">
     <refnamediv>
         <refname>mfile2sci</refname>
         <refpurpose>Fonction de conversion de fichiers.m Matlab en langage Scilab</refpurpose>
     <refsynopsisdiv>
         <title>Séquence d'appel</title>
         <synopsis>
-            mfile2sci()     // interface interactive
-            mfile2sci(M_file_path)
-            mfile2sci(M_file_path, result_path)
-            mfile2sci(M_file_path, result_path, Recmode)
-            mfile2sci(M_file_path, result_path, Recmode, only_double)
-            mfile2sci(M_file_path, result_path, Recmode, only_double, verbose_mode)
-            mfile2sci(M_file_path, result_path, Recmode, only_double, verbose_mode, prettyprintoutput)
+          mfile2sci()
+          mfile2sci(M-file-path)
+          mfile2sci(M-file-path, results_path)
+          mfile2sci(M-file-path, results_path, Recmode)
+          mfile2sci(M-file-path, results_path, Recmode, only_double)
+          mfile2sci(M-file-path, results_path, Recmode, only_double, verbose_mode)
+          mfile2sci(M-file-path, results_path, Recmode, only_double, verbose_mode, prettyprintoutput)
+          mfile2sci(M-file-path, verbose_mode=.., ..)
         </synopsis>
     </refsynopsisdiv>
     <refsection>
                 </listitem>
             </varlistentry>
             <varlistentry>
-                <term>result_path</term>
+                <term>results_path</term>
                 <listitem>
                     <para>
-                        une chaîne de caractères qui donne le répertoire où le résultat sera écrit.
-                        La valeur par défault est le répertoire courant.
+                      une chaîne de caractères qui donne le répertoire où le résultat sera écrit.
+                      La valeur par défault est le répertoire courant.
                     </para>
                 </listitem>
             </varlistentry>
@@ -57,9 +57,8 @@
                 <term>Recmode</term>
                 <listitem>
                     <para>
-                        Flag booléen, utilisé par <literal>translatepaths()</literal> pour une
-                        conversion récursive.
-                        Doit être %F pour convertir un seul M-file. Valeur par défaut : %F
+                      Flag booléen, utilisé par translatepaths pour une conversion récursive.
+                      Doit être %F pour convertir un seul M-file. Valeur par défaut : %F
                     </para>
                 </listitem>
             </varlistentry>
                 <term>only_double</term>
                 <listitem>
                     <para>
-                        Booléen : S'il vaut %T, mfile2sci() considère que les fonctions et les
-                        opérateurs usuellement numériques sont utilisées uniquement avec des
-                        données numériques.
-                        Cela exclut par exemple les instructions telles que
-                        <literal>"ab" + "cd"</literal> (qui sera alors conservée en l'état, au lieu
-                        d'être traduite en <literal>asciimat("ab") + asciimat("cd")</literal>).
-                    </para>
-                    <para>
-                        Valeur par défaut = %F : toutes les conversions possibles sont réalisées.
+                      Flag booléen, si il vaut %T mfile2sci considère que les fonctions de calcul
+                      numérique ont été utilisées uniquement avec des données numériques (aucune
+                      fonction de surcharge Scilab n'est requise). Valeur par défaut : %T
                     </para>
                 </listitem>
             </varlistentry>
             <varlistentry>
                 <term>verbose_mode</term>
                 <listitem>
-                    <para>règle mode d'affichage des informations de conversion :</para>
-                    <table border="0">
-                        <tr valign="top">
-                            <th>0 : </th>
-                            <td>aucune information affichée</td>
-                        </tr>
-                        <tr valign="top">
-                            <th>1 : </th>
-                            <td>
-                                les informations sont écrites comme commentaires du fichier Scilab.
-                            </td>
-                        </tr>
-                        <tr valign="top">
-                            <th>2 : </th>
-                            <td>
-                                les informations sont écrites comme commentaires du fichier Scilab
-                                et dans le fichier log.
-                            </td>
-                        </tr>
-                        <tr valign="top">
-                            <th>[3] : </th>
-                            <td>
-                                Les informations sont écrites comme commentaires du fichier Scilab,
-                                dans le fichier log et affichées dans la fenêtre Scilab.
-                                (Valeur par défaut).
-                            </td>
-                        </tr>
-                    </table>
+                    <para>mode d'affichage des information de conversion</para>
+                    <variablelist>
+                        <varlistentry>
+                            <term>0</term>
+                            <listitem>
+                                <para>aucune information donnée</para>
+                            </listitem>
+                        </varlistentry>
+                        <varlistentry>
+                            <term>1</term>
+                            <listitem>
+                                <para>
+                                  les ionformations sont écrites comme commentaires du fichier Scilab
+                                </para>
+                            </listitem>
+                        </varlistentry>
+                        <varlistentry>
+                            <term>2</term>
+                            <listitem>
+                                <para>
+                                  les ionformations sont écrites comme commentaires du fichier
+                                  Scilab et dans le fichier log.
+                                </para>
+                            </listitem>
+                        </varlistentry>
+                        <varlistentry>
+                            <term>3</term>
+                            <listitem>
+                                <para>
+                                  les ionformations sont écrites comme commentaires du fichier Scilab,
+                                  dans le fichier log et affichées dans la fenêtre Scilab
+                                  (Valeur par défaut).
+                                </para>
+                            </listitem>
+                        </varlistentry>
+                    </variablelist>
                 </listitem>
             </varlistentry>
             <varlistentry>
                 <term>prettyprintoutput</term>
                 <listitem>
                     <para>
-                        Flag booléen, si il vaut %T le code généré est réarrangé.
-                        Valeur par défaut : %F
+                      Flag booléen, si il vaut %T le code généré est réarrangé. Valeur par défaut : %F
                     </para>
                 </listitem>
             </varlistentry>
     <refsection>
         <title>Description</title>
         <para>
-            Le module M2SCI -- et en particulier mfile2sci() -- est un ensemble d'outils de
-            conversion de fichiers.m écrits en Matlab, vers Scilab.
-            Il essaie à chaque fois que c'est possible de remplacer l'appel à une
+            M2SCI (et en particulier mfile2sci) est un ensemble d'outils de conversion de M-file
+            vers Scilab. Il essaie à chaque fois que c'est possible de remplacer l'appel à une
             fonction Matlab par la primitive ou la fonction Scilab équivalente.
         </para>
         <para>
                 </tr>
             </table>
         </para>
+        <variablelist>
+            <varlistentry>
+                <term>&lt;function-name&gt;.sci</term>
+                <listitem>
+                    <para>l'équivalent Scilab pour le M-file</para>
+                </listitem>
+            </varlistentry>
+            <varlistentry>
+                <term>&lt;function-name&gt;.cat</term>
+                <listitem>
+                    <para>le fichier d'aide Scilab associé à la fonction</para>
+                </listitem>
+            </varlistentry>
+            <varlistentry>
+                <term>sci_&lt;function-name&gt;.sci</term>
+                <listitem>
+                    <para>
+                      la fonction Scilab requise pour convertir les appels à ce M-file dans d'autres
+                      M-files. Cette fonction peut être améliorée "à la main". Cette fonction est
+                      utile uniquement pour la conversion, pas pour utiliser la fonction convertie.
+                    </para>
+                </listitem>
+            </varlistentry>
+        </variablelist>
         <para>
             Des fonctions comme eye, ones, size, sum,... se comportent différemment
             selon la dimension de leurs arguments. Quand mfile2sci ne peut pas
             <literal>mtlb_&lt;function_name></literal>.
         </para>
         <para>
-            Quand la conversion peut être incorrecte ou améliorée, <literal>mfile2sci()</literal>
-            ajoute des commentaires qui commencent par "//!" (suivant verbose_mode).
+            Quand la conversion peut être incorrecte ou améliorée, mfile2sci ajoute
+            des commentaires qui commencent par "//!" (suivant verbose_mode).
+        </para>
+        <para>
+            Un appel à <literal>mfile2sci()</literal> sans rhs lance une interface graphique pour
+            aider à la sélection d'un fichier/répertoire et des options.
         </para>
         <note>
             <literal>mfile2sci()</literal> appelée sans argument d'entrée ouvre une interface
index b3bfa03..caee785 100644 (file)
@@ -1,9 +1,8 @@
 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
 // Copyright (C) 2002-2004 - INRIA - Vincent COUVERT
 // Copyright (C) ???? - INRIA - Serge STEER
-// Copyright (C) 2018 - Samuel GOUGEON
-//
 // Copyright (C) 2012 - 2016 - Scilab Enterprises
+// Copyright (C) 2018 - Samuel GOUGEON
 //
 // 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.
 // For more information, see the COPYING file which you should have received
 // along with this program.
 
-function res=mfile2sci(fil,res_path,Recmode,only_double,verbose_mode,prettyprintoutput)
+function res = mfile2sci(fil, results_path, Recmode, only_double, verbose_mode, prettyprintoutput)
     // This function performs translation of a single M-file
     // - fil: file name
-    // - res_path: path to write translated file in (default value is fil path)
+    // - results_path: path to write translated file in (default value is fil path)
     // - Recmode: recursive mode (default value is false)
 
     // Get default arguments
     [lhs,rhs]=argn(0)
-    if rhs<6 then prettyprintoutput=%F,end
-    if rhs<5 then verbose_mode=3,end
-    if rhs<4 then only_double = %F,end
-    if rhs<3 then Recmode=%F,end
-    if rhs<2 then res_path="./",end
-    if rhs<1 then m2sci_gui();res=[];return;end
-    if getos() == "Windows" then
-        fil=strsubst(fil,filesep(),"/")
-        res_path=strsubst(res_path,"\","/")
-    end
-    if part(res_path,length(res_path))<>"/" then
-        res_path=res_path+"/"
+    if ~isdef("prettyprintoutput","l"), prettyprintoutput = %F, end
+    if ~isdef("verbose_mode","l"),      verbose_mode = 3,       end
+    if ~isdef("only_double","l"),       only_double = %T,       end
+    if ~isdef("Recmode","l"),           Recmode = %F,           end
+    if ~isdef("results_path","l"),      results_path = ".",     end
+    if rhs<1 then
+        m2sci_gui();
+        res = [];
+        return
     end
+    fil = strsubst(fil,filesep(),"/")
+    results_path = getshortpathname(pathconvert(results_path));
+    results_path = strsubst(results_path,"\","/")
+
     // Loads libraries related to m2sci
     if exists("m2scikernellib")==0 then load("SCI/modules/m2sci/macros/kernel/lib"),end
     if exists("m2scipercentlib")==0 then load("SCI/modules/m2sci/macros/percent/lib"),end
     if exists("m2scisci_fileslib")==0 then load("SCI/modules/m2sci/macros/sci_files/lib"),end
 
-    if multi_fun_file(fil,res_path,Recmode,only_double,verbose_mode,prettyprintoutput) then
+    if multi_fun_file(fil,results_path,Recmode,only_double,verbose_mode,prettyprintoutput) then
         res=1
         return
     end
@@ -116,21 +116,22 @@ function res=mfile2sci(fil,res_path,Recmode,only_double,verbose_mode,prettyprint
 
     // logfile initialisation
     if exists("logfile")==0 then
-        [tempfd1,ierr1]=file("open",pathconvert(TMPDIR)+"logfile.dat","old")
+        File = getshortpathname(pathconvert(TMPDIR))+"logfile.dat"
+        [tempfd1,ierr1] = file("open",File,"old")
         if ierr1==0 then
-            load(pathconvert(TMPDIR)+"logfile.dat")
+            load(File)
             file("close",tempfd1)
             file("close",logfile)
-            mdelete(pathconvert(TMPDIR)+"logfile.dat")
+            mdelete(File)
         end
-        logfile=file("open",res_path+"m2sci_"+fnam+".log","unknown")
-        save(pathconvert(TMPDIR)+"logfile.dat", "logfile")
+        logfile = file("open",results_path+"m2sci_"+fnam+".log","unknown")
+        save(File, "logfile")
     end
 
     // Output beginning message
     mss=[gettext("****** Beginning of mfile2sci() session ******");
     gettext("File to convert:")+" "+fil;
-    gettext("Result file path:")+" "+res_path;
+    gettext("Result file path:")+" "+results_path;
     gettext("Recursive mode:")+" "+rec;
     gettext("Only double values used in M-file:")+" "+dble;
     gettext("Verbose mode:")+" "+string(verbose_mode);
@@ -154,7 +155,8 @@ function res=mfile2sci(fil,res_path,Recmode,only_double,verbose_mode,prettyprint
     // Make minor changes on syntax
     m2sci_info(gettext("Syntax modification..."),-1);
     ierr=execstr("load(''"+pathconvert(TMPDIR)+fnam+ ".tree'',''txt'',''helppart'',''batch'')","errcatch","n")
-    if ierr<>0 | exists("txt")==0 | exists("batch")==0 & strindex(res_path,TMPDIR)==[] then
+    if ierr<>0 | exists("txt")==0 | exists("batch")==0 & ..
+                 strindex(results_path,getshortpathname(TMPDIR))==[] then
         [helppart,txt,batch]=m2sci_syntax(txt)
     elseif ierr==0 & newest(fil,pathconvert(TMPDIR)+fnam+ ".tree")==1 then
         [helppart,txt,batch]=m2sci_syntax(tmptxt)
@@ -164,8 +166,8 @@ function res=mfile2sci(fil,res_path,Recmode,only_double,verbose_mode,prettyprint
 
     // Write .cat file and update whatis
     if helppart<>[] then
-        catfil=res_path+fnam+".cat"
-        whsfil=res_path+"whatis"
+        catfil = results_path + fnam+".cat"
+        whsfil = results_path + "whatis"
         mputl(helppart,catfil);
         if exists("whsfil_unit")==1 then
             write(whsfil_unit,stripblanks(helppart(1))+" |"+fnam,"(a)")
@@ -265,14 +267,16 @@ function res=mfile2sci(fil,res_path,Recmode,only_double,verbose_mode,prettyprint
         // if mtlbref_fun<>[]|not_mtlb_fun<>[]|mtlbtool_fun<>[] then
         //resume_logfile initialisation
         if exists("resume_logfile")==0 then
-            [tempfd2,ierr2]=file("open",pathconvert(TMPDIR)+gettext("resumelogfile.dat"),"old")
+            File = getshortpathname(pathconvert(TMPDIR))+gettext("resumelogfile.dat")
+            [tempfd2,ierr2] = file("open",File,"old")
             if ierr2==0 then
                 load(pathconvert(TMPDIR)+gettext("resumelogfile.dat"))
-                file("close",tempfd2)
-                file("close",resume_logfile)
+                file("close", tempfd2)
+                file("close", resume_logfile)
                 mdelete(pathconvert(TMPDIR)+gettext("resumelogfile.dat"))
             end
-            resume_logfile=file("open",res_path+gettext("resume")+"_m2sci_"+fnam+".log","unknown")
+            resume_logfile = results_path+gettext("resume")+"_m2sci_"+fnam+".log"
+            resume_logfile = file("open", resume_logfile, "unknown")
             save(pathconvert(TMPDIR)+gettext("resumelogfile.dat"), "resume_logfile")
         end
 
@@ -336,13 +340,13 @@ function res=mfile2sci(fil,res_path,Recmode,only_double,verbose_mode,prettyprint
         res=res(1:n)
 
         // Write sci-file
-        ext=".sci"
-        scifil=res_path+fnam+ext
-        mputl(res,scifil);
+        ext = ".sci"
+        scifil = results_path + fnam + ext
+        mputl(res, scifil);
 
         // Write sci_<mname>.sci translation file
         if trad<>[] then
-            sci_fil=res_path+"sci_"+mname+".sci"
+            sci_fil = results_path + "sci_" + mname + ".sci"
             mputl(trad,sci_fil);
             res=1
         else
@@ -350,12 +354,12 @@ function res=mfile2sci(fil,res_path,Recmode,only_double,verbose_mode,prettyprint
         end
 
         // Output summary information
-        infos=[]
+        infos = []
         if m2sci_infos(1) then
-            infos=gettext("Translation may be improved: see the //! comments and for all mtlb_<funname> function call\n  Type help mtlb_<funname> in Scilab command window to get information about improvements.");
+            infos = gettext("Translation may be improved: see the //! comments and for all mtlb_<funname> function call\n  Type help mtlb_<funname> in Scilab command window to get information about improvements.");
         end
         if m2sci_infos(2) then
-            infos=[infos;gettext("Translation may be wrong (see the //!! comments).")]
+            infos = [infos ; gettext("Translation may be wrong (see the //!! comments).")]
         end
 
         nametbl($)=[]
@@ -370,10 +374,10 @@ function res=mfile2sci(fil,res_path,Recmode,only_double,verbose_mode,prettyprint
     m2sci_info([infos;mss],-1);
 
     if Reclevel>1 then
-        m2sci_infos=m2sci_infos_save
+        m2sci_infos = m2sci_infos_save
     end
 
-    file("close",logfile)
+    file("close", logfile)
     clearglobal m2sci_infos
     clearglobal mtlbref_fun
     clearglobal mtlbtool_fun
index b65986d..dc6d3f3 100644 (file)
@@ -1,8 +1,8 @@
 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
 // Copyright (C) 2002-2004 - INRIA - Vincent COUVERT
 // Copyright (C) ???? - INRIA - Serge STEER
-//
 // Copyright (C) 2012 - 2016 - Scilab Enterprises
+// Copyright (C) 2018 - Samuel GOUGEON
 //
 // 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.
 // For more information, see the COPYING file which you should have received
 // along with this program.
 
-function   transorder=translatepaths(Paths,res_path)
+function transorder = translatepaths(Paths, res_path)
     // Perform translation of Matlab M-files to Scilab for all M-files found in Paths
 
     // Output :
     //  -transorder : a vector which contains the files names with a determinated order
     // Input :
     //  -Paths : a vector of strings (paths of Matlab M-files to translate)
-    //  -res_paths : a string (resolution path of translated files)
+    //  -res_paths : a string (results path of translated files)
 
     // M2SCI kernel functions called:
     //  -lst_funcall
@@ -27,9 +27,15 @@ function   transorder=translatepaths(Paths,res_path)
 
     // Get default arguments
 
-    [lhs,rhs]=argn(0)
-    if rhs<2 then res_path="./",end
-    if rhs<1 then m2sci_gui();transorder=[];return;end
+    [lhs,rhs] = argn(0)
+    if rhs<2 then
+        res_path = "."
+    end
+    if rhs<1 then
+        m2sci_gui()
+        transorder = []
+        return
+    end
 
     // Loads libraries related to m2sci
     if exists("m2skernellib")==0 then load("SCI/modules/m2sci/macros/kernel/lib"),end
@@ -37,25 +43,14 @@ function   transorder=translatepaths(Paths,res_path)
     if exists("m2ssci_fileslib")==0 then load("SCI/modules/m2sci/macros/sci_files/lib"),end
 
     // Convert paths so that they can be used according to the platform
-
+    shortTMPDIR = getshortpathname(pathconvert(TMPDIR));
     sep = filesep();
-    if getos() == "Windows" then
-        Paths=strsubst(Paths,"/",sep)
-        res_path=strsubst(res_path,"/",sep)
-    else
-        Paths=strsubst(Paths,"\",sep)
-        res_path=strsubst(res_path,"\",sep)
-    end
-
-    // Close resolution path with a / or a \
-    res_path=stripblanks(res_path)
-    if part(res_path,length(res_path))<>sep then
-        res_path=res_path+sep
-    end
+    Paths = getshortpathname(pathconvert(stripblanks(Paths)));
+    res_path = getshortpathname(pathconvert(stripblanks(res_path)));
 
     // Create a logfile and a whatis file
-    Paths=stripblanks(Paths)
-    [tempfd,ierr]=file("open",pathconvert(TMPDIR)+gettext("unitfile.dat"),"old");
+    File = shortTMPDIR + gettext("unitfile.dat")
+    [tempfd,ierr] = file("open", File, "old");
 
     if ierr==0 then
         load(pathconvert(TMPDIR)+gettext("unitfile.dat"))
@@ -63,21 +58,13 @@ function   transorder=translatepaths(Paths,res_path)
         file("close",tempfd);
         mdelete(pathconvert(TMPDIR)+gettext("unitfile.dat"))
     end
-
-    whsfil_unit=file("open",res_path+"whatis","unknown")
+    whsfil_unit = file("open",res_path+"whatis","unknown")
     save(pathconvert(TMPDIR)+gettext("unitfile.dat"),"whsfil_unit")
-    // Close paths with a / or a \
-    for k=1:size(Paths,"*")
-        if part(Paths(k),length(Paths(k)))<>sep then
-            Paths(k)=Paths(k)+sep,
-        end
-    end
 
     // Find names of files to translate
     // mfiles is a vector which contains the names (and the paths) of files to translate
     mfiles=[]
-    for k=1:size(Paths,"*")
-        path = Paths(k);
+    for path = Paths(:)'
         mfiles = [mfiles; ls(path+"*.m")];
     end
 
@@ -130,7 +117,7 @@ function   transorder=translatepaths(Paths,res_path)
         scepath=res_path+fnam+".sce"
 
         if newest(mpath,scipath,scepath)==1 then
-            [fd,ierr]=file("open",pathconvert(TMPDIR)+fnam+".m","old");
+            [fd,ierr] = file("open", shortTMPDIR + fnam+".m", "old");
             if ierr==0 & strindex(mpath,TMPDIR)==[] then
                 mfile2sci(pathconvert(TMPDIR)+fnam+".m",res_path, %t, %t)
                 file("close",fd)
@@ -140,7 +127,7 @@ function   transorder=translatepaths(Paths,res_path)
                 mfile2sci(funpath(i),res_path, %t, %t)
             end
 
-            tmp_sci_file=pathconvert(TMPDIR)+"tmp_"+fnam+".sci"
+            tmp_sci_file = shortTMPDIR + "tmp_" + fnam + ".sci"
             ierr=execstr("exec(tmp_sci_file)","errcatch");errclear();
             if ierr==0 & strindex(mpath,TMPDIR)==[] then
                 txt=[]
@@ -151,12 +138,12 @@ function   transorder=translatepaths(Paths,res_path)
             end
 
             // LOG
-            tmp_m2sci_file=pathconvert(TMPDIR)+"tmp_m2sci_"+fnam+".log"
-            m2scipath=res_path+"m2sci_"+fnam+".log"
-            logtxt=[logtxt;" ";" ";mgetl(m2scipath)]
+            tmp_m2sci_file = shortTMPDIR + "tmp_m2sci_" + fnam + ".log"
+            m2scipath = res_path + "m2sci_" + fnam + ".log"
+            logtxt = [logtxt ; " " ; " " ; mgetl(m2scipath)]
             mdelete(m2scipath)
 
-            [fd,ierr]=file("open",tmp_m2sci_file,"old");
+            [fd,ierr] = file("open",tmp_m2sci_file, "old");
             if ierr==0 & strindex(mpath,TMPDIR)==[] then
                 logtxt=[logtxt;" ";mgetl(tmp_m2sci_file)]
                 file("close",fd)
@@ -164,7 +151,7 @@ function   transorder=translatepaths(Paths,res_path)
             end
 
             // RESUMELOG
-            tmp_resume_m2sci_file=pathconvert(TMPDIR)+"tmp_resume_m2sci_"+fnam+".log"
+            tmp_resume_m2sci_file = shortTMPDIR + "tmp_resume_m2sci_"+fnam+".log"
             resumem2scipath=res_path+"resume_m2sci_"+fnam+".log"
             if fileinfo(resumem2scipath)<>[] then
                 resumelogtxt=[resumelogtxt;" ";" ";mgetl(resumem2scipath)]
@@ -194,28 +181,22 @@ function   transorder=translatepaths(Paths,res_path)
 
     // create builder.sce and loader.sce files
     // get the directory name where the Scilab functions are written
-    if res_path=="./" then
-        current_path=pathconvert(unix_g("pwd"))
-        index_slash=strindex(current_path,"/")
-        if size(index_slash,"*")==1 then index_slash=[0 index_slash],end
-        namelib=part(current_path,index_slash($-1)+1:index_slash($)-1)
-    else
-        index_slash=strindex(res_path,"/")
-        if size(index_slash,"*")==1 then index_slash=[0 index_slash],end
-        namelib=part(res_path,index_slash($-1)+1:index_slash($)-1)
+    if or(res_path==["./" ".\"]) then
+        res_path = pathconvert(pwd());
     end
+    namelib = basename(pathconvert(res_path, %f)) + "lib"
 
     //builder.sce
     buildertxt=[]
     buildertxt($+1)="path=get_absolute_file_path(""builder.sce"")"
-    buildertxt($+1)="genlib("""+namelib+"lib"",path)"
-    builderfile=res_path+"builder.sce"
+    buildertxt($+1)="genlib("""+namelib+""",path)"
+    builderfile = res_path+"builder.sce"
     mputl(buildertxt,builderfile);
     //loader.sce
     loadertxt=[]
     loadertxt($+1)="path=get_absolute_file_path(""loader.sce"")"
     loadertxt($+1)="load(path+"+"""lib"")"
-    loaderfile=res_path+"loader.sce"
+    loaderfile = res_path+"loader.sce"
     mputl(loadertxt,loaderfile);
 
 endfunction
diff --git a/scilab/modules/m2sci/tests/nonreg_tests/bug_15095.tst b/scilab/modules/m2sci/tests/nonreg_tests/bug_15095.tst
new file mode 100644 (file)
index 0000000..402da3f
--- /dev/null
@@ -0,0 +1,30 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2018 - Samuel GOUGEON
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+//
+// <-- CLI SHELL MODE -->
+// <-- NO CHECK REF -->
+// <-- WINDOWS ONLY -->
+//    Extension to Linux and MacOS to come later
+// <-- Non-regression test for bug 15095 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/15095
+//
+// <-- Short Description -->
+// mfile2sci() and translatepaths() failed when working with non-ASCII paths
+
+cd(TMPDIR);
+Dir = TMPDIR + filesep() + "bug_15095 àé" + filesep();
+File = Dir + "ìô.m";
+mkdir(Dir);
+mputl("a = rand(2,3);", File);
+assert_checkequal(execstr("mfile2sci(File, verbose_mode=0)", "errcatch"), 0);
+assert_checkequal(execstr("mfile2sci(File, Dir, verbose_mode=0)", "errcatch"), 0);
+assert_checkequal(execstr("translatepaths(Dir)", "errcatch"), 0);
+assert_checkequal(execstr("translatepaths(Dir, Dir)", "errcatch"), 0);
+
+rmdir(Dir, "s")