* Bug 15308 fixed: evstr(['1;2' '3;4']) was not accepted, unlike ['1 2';'3 4'] 98/19498/9
Samuel GOUGEON [Sat, 21 Oct 2017 22:33:18 +0000 (00:33 +0200)]
 http://bugzilla.scilab.org/15308
 http://bugzilla.scilab.org/9838 (for comments)

 NEEDED to fix http://bugzilla.scilab.org/9839 (ascii(10))

 * evstr() page basically improved
   - short description now indicates the concatenation
   - syntaxes unfolded
   - description:
      - concatenation effects now indicated
      - constrains on compatible types and sizes of results are now indicated
      - restrictions (no .., =) now indicated for subExpr as well
   - See also: sci2exp added
   - History added

Change-Id: I66efe2350d342ac37267124b41bd08be57113771

12 files changed:
scilab/CHANGES.md
scilab/modules/string/help/en_US/evstr.xml
scilab/modules/string/help/fr_FR/evstr.xml
scilab/modules/string/help/ja_JP/evstr.xml
scilab/modules/string/help/pt_BR/evstr.xml
scilab/modules/string/help/ru_RU/evstr.xml
scilab/modules/string/macros/evstr.sci
scilab/modules/string/tests/nonreg_tests/bug_15308_evstr.tst [new file with mode: 0644]
scilab/modules/string/tests/nonreg_tests/bug_9838.dia.ref [deleted file]
scilab/modules/string/tests/nonreg_tests/bug_9838.tst
scilab/modules/string/tests/unit_tests/evstr.dia.ref [deleted file]
scilab/modules/string/tests/unit_tests/evstr.tst

index 0c557cb..e32b8ab 100644 (file)
@@ -233,7 +233,7 @@ Help pages:
 
 * fixed / improved:  `members`, `part`, `ode`, `ode_optional_output`, `ode_roots`, `plot2d`, `roots`,
   `printf`, `sprintf`, `iconvert`, `stdev`, `xlabel`, `and_op`, `or_op`, `permute`, `tree2code`, `%helps`,
-  `scilab|scilex`, `flipdim`, `Matplot_properties`, `meshgrid`, `ismatrix`, `xget`, `xset`, `ieee`
+  `scilab|scilex`, `flipdim`, `Matplot_properties`, `meshgrid`, `ismatrix`, `xget`, `xset`, `ieee`, `evstr`
 * rewritten: `consolebox`, `double`, `isoview`, `pixel_drawing_mode`, `householder`, `or`, `|,||`,
 `and`, `&,&&`, `format`, `typeof`, `brackets`, `setlanguage`, `sleep`, `isinf`,
 `bitor`, `bitxor`, `bitand`, `macr2tree`, `geomean`, `clf`, `getPreferencesValue`, `gcd`, `isglobal`, `whereis`, `mode`
@@ -381,6 +381,7 @@ the [development mailing list](dev@lists.scilab.org) for a particular toolbox.
 * [#8842](http://bugzilla.scilab.org/show_bug.cgi?id=8842): Assigning the pointer of a builtin function to a new structure failed.
 * [#9297](http://bugzilla.scilab.org/show_bug.cgi?id=9297): Assigning a mlist to a structure's field failed.
 * [#9519](http://bugzilla.scilab.org/show_bug.cgi?id=9519): The console menu `File -> Open a file` opened any file in Scinotes. Binary files like .zcos blocked Scinotes.
+* [#9838](http://bugzilla.scilab.org/show_bug.cgi?id=9838): `evstr` poorly supported simple comments in input expressions.
 * [#10270](http://bugzilla.scilab.org/show_bug.cgi?id=10270): `execstr(["%val=[int16(1)";"]"])` needed entering twice <enter> to be actually performed.
 * [#11196](http://bugzilla.scilab.org/show_bug.cgi?id=11196): Some recursive extractions from a mlist failed.
 * [#11530](http://bugzilla.scilab.org/show_bug.cgi?id=11530): Raise (help, scinotes, ...) windows when iconified ( recall or startup )
@@ -469,6 +470,7 @@ the [development mailing list](dev@lists.scilab.org) for a particular toolbox.
 * [#15282](http://bugzilla.scilab.org/show_bug.cgi?id=15282): `help_from_sci` could set an xml:id starting with the forbidden `%` character.
 * [#15285](http://bugzilla.scilab.org/show_bug.cgi?id=15285): `resize_matrix` did not manage conversion into `int64` and `uint64`.
 * [#15300](http://bugzilla.scilab.org/show_bug.cgi?id=15300): Distributive assignments like `a=(1,2)` crashed Scilab.
+* [#15308](http://bugzilla.scilab.org/show_bug.cgi?id=15308): Unlike `evstr(["1 2";"3 4"])`, `evstr(["1;2" "3;4"])` was not accepted.
 
 ### Bugs fixed in 6.0.0:
 * [#592](http://bugzilla.scilab.org/show_bug.cgi?id=592): `linspace(a, b, n<=0)` returned `b` instead of `[]`
index 25565f6..4f86803 100644 (file)
@@ -1,6 +1,8 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!--
  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+ * Copyright (C) INRIA
+ * Copyright (C) 2017 - Samuel GOUGEON
  *
  * Copyright (C) 2012 - 2016 - Scilab Enterprises
  *
         xmlns:scilab="http://www.scilab.org" xml:id="evstr" xml:lang="en">
     <refnamediv>
         <refname>evstr</refname>
-        <refpurpose>evaluation of expressions</refpurpose>
+        <refpurpose>evaluates Scilab expressions and concatenates their results</refpurpose>
     </refnamediv>
     <refsynopsisdiv>
         <title>Syntax</title>
         <synopsis>
-            H = evstr(Z)
-            [H, ierr] = evstr(Z)
+            H = evstr(M)
+            H = evstr(list(M, subExpr))
+            [H, ierr] = evstr(..)
         </synopsis>
     </refsynopsisdiv>
     <refsection>
         <title>Arguments</title>
         <variablelist>
             <varlistentry>
-                <term>Z</term>
+                <term>M</term>
                 <listitem>
                     <para>
-                        a matrix of character strings <varname>M</varname> or
-                        <code>list(M,Subexp)</code>
+                        single or vector or matrix of character strings: Scilab expressions to be
+                        evaluated and results to be concatenated.
+                    </para>
+                </listitem>
+            </varlistentry>
+            <varlistentry>
+                <term>subExpr</term>
+                <listitem>
+                    <para>
+                    vector of character strings: sub-expressions to be pre-evaluated, defining
+                    quantities used in <literal>M</literal> expressions.
                     </para>
-                    <variablelist>
-                        <varlistentry>
-                            <term>M</term>
-                            <listitem>
-                                <para>a matrix of character strings.</para>
-                            </listitem>
-                        </varlistentry>
-                        <varlistentry>
-                            <term>Subexp</term>
-                            <listitem>
-                                <para>a vector of character strings.</para>
-                            </listitem>
-                        </varlistentry>
-                    </variablelist>
                 </listitem>
             </varlistentry>
             <varlistentry>
                 <term>H</term>
                 <listitem>
-                    <para>a matrix.</para>
+                    <para>
+                        single element, vector, or matrix of concatenated results.
+                    </para>
                 </listitem>
             </varlistentry>
             <varlistentry>
     <refsection>
         <title>Description</title>
         <para>
-            Returns the result of the evaluation of the matrix of character
-            strings <varname>M</varname>. Each element of the matrix must define a
-            valid Scilab expression.
+            Evaluates expressions set in <varname>M</varname>. Then, concatenates their results
+            to build <varname>H</varname>.
         </para>
         <para>
-            If the evaluation of <varname>M</varname> expression leads to an
-            error, the single return value version, <code>H = evstr(M)</code>,
-            raises the error as usual. The two return values version,
-            <code>[H,ierr] = evstr(M)</code>, on the other hand, produces no
-            error, but returns the error number in <varname>ierr</varname>.
+            All expressions are assumed to yield results of compatible types and sizes with respect
+            to their concatenation.
         </para>
         <para>
-            If <varname>Z</varname> is a list, <varname>Subexp</varname> is a
-            vector of character strings, that defines subexpressions which are
-            evaluated before evaluating <varname>M</varname>. These subexpressions
-            must be referred to as <literal>%(k)</literal> in <varname>M</varname>,
-            where <literal>k</literal> is the subexpression's index in
-            <varname>Subexp</varname>.
+            If the evaluation of <varname>M</varname> expressions or the concatenation of their
+            results leads to an error, <literal>H = evstr(M)</literal> yields the error as usual.
+            To avoid stopping to run next Scilab instructions,
+            <literal>[H, ierr] = evstr(M)</literal> can be used to catch the error.
+            <varname>H</varname> is then set to <literal>[]</literal> and <varname>ierr</varname>
+            returns <literal>999</literal> or another non-null positive code.
         </para>
         <para>
-            <code>evstr('a = 1')</code> is not valid (use <function>execstr</function>
-            instead).
-        </para>
-        <para>
-            <literal>Nan</literal>, <literal>NaN</literal> will be interpreted as <constant>%nan</constant>.
-        </para>
-        <para>
-            <literal>Inf</literal> will be interpreted as <constant>%inf</constant>.
+            If <varname>M</varname> is provided through a list, Scilab expressions set in
+            <varname>subExpr</varname> are evaluated before evaluating <varname>M</varname>.
+            The results of these subexpressions must be referred to as <literal>%(k)</literal>
+            in <varname>M</varname>, where <literal>k</literal> is the subexpression's index in
+            <varname>subExpr</varname>.
         </para>
         <warning>
-            <varname>Z</varname> should not include any continuation marks (..).
+            <itemizedlist>
+                <listitem>
+                    <para>
+                    Assignments like <literal>"a = 1"</literal> are not accepted as expressions,
+                    neither in <varname>M</varname> nor in <varname>subExpr</varname>.
+                    <function>execstr</function> must be used instead to evaluate such expressions.
+                    </para>
+                </listitem>
+                <listitem>
+                    <para>
+                    Continuation marks <literal>".."</literal> are forbidden in expressions
+                    in <varname>M</varname> as well as in <varname>subExpr</varname>.
+                    </para>
+                </listitem>
+            </itemizedlist>
         </warning>
+        <note>Special aliases:
+            <itemizedlist>
+                <listitem>
+                        <literal>"Nan"</literal> and <literal>"NaN"</literal> are parsed as
+                        <constant>%nan</constant>.
+                </listitem>
+                <listitem>
+                        <literal>"Inf"</literal> and <literal>"INF"</literal> are parsed as
+                        <constant>%inf</constant>.
+                </listitem>
+            </itemizedlist>
+        </note>
     </refsection>
     <refsection>
         <title>Examples</title>
@@ -127,6 +146,34 @@ Z = ['a', 'b', 'c'] ;// the variable c is undefined
             <member>
                 <link linkend="execstr">execstr</link>
             </member>
+            <member>
+                <link linkend="sci2exp">sci2exp</link>
+            </member>
+            <member>
+                <link linkend="strtod">strtod</link>
+            </member>
+            <member>
+                <link linkend="brackets">concatenation</link>
+            </member>
         </simplelist>
     </refsection>
+    <refsection role="history">
+        <title>History</title>
+        <revhistory>
+            <revision>
+                <revnumber>5.3.0</revnumber>
+                <revdescription>
+                <literal>"Nan"</literal> and <literal>"NaN"</literal> are now parsed as <literal>%nan</literal>.
+                <literal>"Inf"</literal> and <literal>"INF"</literal> are now parsed as <literal>%inf</literal>.
+                </revdescription>
+            </revision>
+            <revision>
+                <revnumber>6.0.1</revnumber>
+                <revdescription>
+                  Simple comments are now supported in almost all possible input expressions,
+                  whatever is the shape of <literal>M</literal>.
+                </revdescription>
+            </revision>
+        </revhistory>
+    </refsection>
 </refentry>
index 454906c..e328abb 100644 (file)
@@ -1,6 +1,8 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!--
  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+ * Copyright (C) INRIA
+ * Copyright (C) 2017 - Samuel GOUGEON
  *
  * Copyright (C) 2012 - 2016 - Scilab Enterprises
  *
         xmlns:scilab="http://www.scilab.org" xml:id="evstr" xml:lang="fr">
     <refnamediv>
         <refname>evstr</refname>
-        <refpurpose>évaluation d'une expression</refpurpose>
+        <refpurpose>évalue des expressions Scilab et concatène leurs résultats</refpurpose>
     </refnamediv>
     <refsynopsisdiv>
-        <title>Séquence d'appel</title>
-        <synopsis>H=evstr(Z)
-            [H,ierr]=evstr(Z)
+        <title>Syntaxe</title>
+        <synopsis>
+            H = evstr(M)
+            H = evstr(list(M, subExpr))
+            [H, ierr] = evstr(..)
         </synopsis>
     </refsynopsisdiv>
     <refsection>
-        <title>Paramètres</title>
+        <title>Arguments</title>
         <variablelist>
             <varlistentry>
-                <term>Z</term>
+                <term>M</term>
                 <listitem>
                     <para>
-                        matrice de chaînes de caractères <literal>M</literal> ou
-                        <literal>list(M,Subexp)</literal>
+                        élément unique ou vecteur ou matrice de textes: expressions Scilab à évaluer,
+                        dont les résultats sont ensuite concaténés.
+                    </para>
+                </listitem>
+            </varlistentry>
+            <varlistentry>
+                <term>subExpr</term>
+                <listitem>
+                    <para>
+                    vecteur de textes : expressions Scilab à évaluer avant <literal>M</literal>,
+                    et dont les résultats peuvent être utilisés dans les expressions données par
+                    <literal>M</literal>.
                     </para>
-                    <variablelist>
-                        <varlistentry>
-                            <term>M</term>
-                            <listitem>
-                                <para>matrice de chaînes de caractères</para>
-                            </listitem>
-                        </varlistentry>
-                        <varlistentry>
-                            <term>Subexp</term>
-                            <listitem>
-                                <para>vecteur de chaînes de caractères</para>
-                            </listitem>
-                        </varlistentry>
-                    </variablelist>
                 </listitem>
             </varlistentry>
             <varlistentry>
                 <term>H</term>
                 <listitem>
-                    <para>matrice</para>
+                    <para>
+                        élément simple, vecteur, ou matrice des résultats concaténés.
+                    </para>
                 </listitem>
             </varlistentry>
             <varlistentry>
                 <term>ierr</term>
                 <listitem>
-                    <para>entier, 0 ou numéro de l'erreur</para>
+                    <para>entier, non nul si une erreur s'est produite.</para>
                 </listitem>
             </varlistentry>
         </variablelist>
     </refsection>
     <refsection>
         <title>Description</title>
-        <para>Renvoie le résultat de l'évaluation de la matrice de chaînes de
-            caractères <literal>M</literal>. Chaque élément de la matrice doit être
-            une expression Scilab valide.
+        <para>
+            <literal>evstr(..)</literal> évalue les expressions données en <varname>M</varname>.
+            Les résultats de celles-ci sont ensuite concaténés (au sens ensembliste) pour construire
+            <varname>H</varname>.
         </para>
         <para>
-            Si l'évaluation d'un terme de <literal>M</literal> conduit à une
-            erreur, la syntaxe habituelle <literal>H=evstr(M)</literal>, déclenche le
-            message d'erreur. Dans la syntaxe <literal>[H,ierr]=evstr(M)</literal>
-            aucun message d'erreur n'est produit, mais le numéro de l'erreur est
-            renvoyé dans <literal>ierr</literal>.
+            Toutes les expressions sont supposées produire des résultats de types et de tailles
+            compatibles avec leur concatenation.
         </para>
         <para>
-            Si <literal>Z</literal> est une liste, <literal>Subexp</literal> est
-            un vecteur de chaînes de caractères qui définit des sous-expressions qui
-            sont évaluées avant <literal>M</literal>. Ces sous-expressions doivent
-            être référencées par l'expression <literal>%(k)</literal> dans
-            <literal>M</literal>, où <literal>k</literal> est la position de la
-            sous-expression dans la liste <literal>Subexp</literal>.
+            Si l'évaluation d'un terme de <literal>M</literal> ou la concaténation des résultats
+            conduit à une erreur, la syntaxe
+            habituelle <literal>H = evstr(M)</literal> produira effectivement l'erreur.
+            La syntaxe alternative <literal>[H, ierr] = evstr(M)</literal> permet de capturer toute
+            possible erreur, pour la gérer sans interrompre l'exécution du programme Scilab.
+            Le cas échéant, <varname>H</varname> retourne <literal>[]</literal> et <varname>ierr</varname>
+            retourne <literal>999</literal> ou un autre code entier > 0.
         </para>
-        <para>evstr('a=1') n'est pas valide (utiliser pour cela
-            <literal>execstr</literal>).
+        <para>
+            Si <varname>M</varname> est fournie en 1er élément d'une list(), les expressions Scilab
+            fournies dans <varname>subExpr</varname> sont évaluées avant d'évaluer celles de
+            <varname>M</varname>. Chaque expression de <varname>M</varname> peut faire référence
+            au résultat de <varname>subExpr(k)</varname> par <literal>"%(k)"</literal> et ainsi
+            utiliser ces résultats.
         </para>
-        <para>Nan et Nan seront interpretés comme %nan.</para>
-        <para>Inf sera interpreté comme %inf</para>
         <warning>
-            <varname>Z</varname> ne doit comporter aucunes marques de suite (..).
+            <itemizedlist>
+                <listitem>
+                    <para>
+                    aucune affectation telle que <literal>"a = 1"</literal> n'est acceptée comme
+                    expression évaluable, ni dans <varname>M</varname> ni dans <varname>subExpr</varname>.
+                    <function>execstr</function> doit être utilisée à la place pour exécuter de
+                    telles expressions.
+                    </para>
+                </listitem>
+                <listitem>
+                    <para>
+                    Aucune expression dans <varname>M</varname> et <varname>subExpr</varname> ne
+                    doit utiliser une marque <literal>".."</literal> de poursuite à la ligne.
+                    </para>
+                </listitem>
+            </itemizedlist>
         </warning>
+        <note>Alias autorisés :
+            <itemizedlist>
+                <listitem>
+                        <literal>"Nan"</literal> et <literal>"NaN"</literal> sont compris comme
+                        <constant>%nan</constant>.
+                </listitem>
+                <listitem>
+                        <literal>"Inf"</literal> et <literal>"INF"</literal> sont compris comme
+                        <constant>%inf</constant>.
+                </listitem>
+            </itemizedlist>
+        </note>
     </refsection>
     <refsection>
         <title>Exemples</title>
@@ -108,7 +138,13 @@ b = 2;
 Z = list(['%(1)','%(1)-%(2)'],['a+1','b+1']);
 evstr(Z)
 evstr('NaN'), evstr('Inf')
-        ]]></programlisting>
+
+// Capture des erreurs d'évaluation
+[H, ierr] = evstr(Z)  // pas d'erreur
+Z = ['a', 'b', 'c'] ; // la variable c n'est pas définie:
+H = evstr(Z)          // exécution avec erreur et interruption
+[H, ierr] = evstr(Z)  // exécution silencieuse
+]]></programlisting>
     </refsection>
     <refsection role="see also">
         <title>Voir aussi</title>
@@ -116,6 +152,34 @@ evstr('NaN'), evstr('Inf')
             <member>
                 <link linkend="execstr">execstr</link>
             </member>
+            <member>
+                <link linkend="sci2exp">sci2exp</link>
+            </member>
+            <member>
+                <link linkend="strtod">strtod</link>
+            </member>
+            <member>
+                <link linkend="brackets">concaténation</link>
+            </member>
         </simplelist>
     </refsection>
+    <refsection role="history">
+        <title>Historique</title>
+        <revhistory>
+            <revision>
+                <revnumber>5.3.0</revnumber>
+                <revdescription>
+                <literal>"Nan"</literal> et <literal>"NaN"</literal> sont désormais compris comme <literal>%nan</literal>.
+                <literal>"Inf"</literal> et <literal>"INF"</literal> sont désormais compris comme <literal>%inf</literal>.
+                </revdescription>
+            </revision>
+            <revision>
+                <revnumber>6.0.1</revnumber>
+                <revdescription>
+                  Les expressions d'entrée peuvent désormais inclure des commentaires simples
+                  <literal>// ..</literal>, quel que soit le format de <literal>M</literal>.
+                </revdescription>
+            </revision>
+        </revhistory>
+    </refsection>
 </refentry>
index 3e55b69..56df271 100644 (file)
@@ -13,9 +13,9 @@
  *
  -->
 <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"
-               xmlns:scilab="http://www.scilab.org" xml:id="evstr" xml:lang="ja">
+          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"
+          xmlns:scilab="http://www.scilab.org" xml:id="evstr" xml:lang="ja">
     <refnamediv>
         <refname>evstr</refname>
         <refpurpose>式を評価する</refpurpose>
@@ -130,6 +130,34 @@ Z = ['a', 'b', 'c'] ;// the variable c is undefined
             <member>
                 <link linkend="execstr">execstr</link>
             </member>
+            <member>
+                <link linkend="sci2exp">sci2exp</link>
+            </member>
+            <member>
+                <link linkend="strtod">strtod</link>
+            </member>
+            <member>
+                <link linkend="brackets">concatenation</link>
+            </member>
         </simplelist>
     </refsection>
+    <refsection role="history">
+        <title>履歴</title>
+        <revhistory>
+            <revision>
+                <revnumber>5.3.0</revnumber>
+                <revdescription>
+                <literal>"Nan"</literal> and <literal>"NaN"</literal> are now parsed as <literal>%nan</literal>.
+                <literal>"Inf"</literal> and <literal>"INF"</literal> are now parsed as <literal>%inf</literal>.
+                </revdescription>
+            </revision>
+            <revision>
+                <revnumber>6.0.1</revnumber>
+                <revdescription>
+                  Simple comments are now supported in almost all possible input expressions,
+                  whatever is the shape of <literal>M</literal>.
+                </revdescription>
+            </revision>
+        </revhistory>
+    </refsection>
 </refentry>
\ No newline at end of file
index d546331..9f07602 100644 (file)
     <refsynopsisdiv>
         <title>Seqüência de Chamamento</title>
         <synopsis>
-            H = evstr(Z)
-            [H,ierr] = evstr(Z)
+            H = evstr(M)
+            H = evstr(list(M, subExpr))
+            [H, ierr] = evstr(..)
         </synopsis>
     </refsynopsisdiv>
     <refsection>
         <title>Parâmetros</title>
         <variablelist>
-            <varlistentry>
-                <term>Z</term>
-                <listitem>
-                    <para>
-                        matriz de strings <literal>M</literal> ou
-                        <literal>list(M,Subexp)</literal>
-                    </para>
-                    <variablelist>
-                        <varlistentry>
-                            <term>M</term>
-                            <listitem>
-                                <para>matriz de strings</para>
-                            </listitem>
-                        </varlistentry>
-                        <varlistentry>
-                            <term>Subexp</term>
-                            <listitem>
-                                <para>vetor de strings</para>
-                            </listitem>
-                        </varlistentry>
-                    </variablelist>
-                </listitem>
-            </varlistentry>
-            <varlistentry>
-                <term>H</term>
-                <listitem>
-                    <para>matriz</para>
-                </listitem>
-            </varlistentry>
-            <varlistentry>
-                <term>ierr</term>
-                <listitem>
-                    <para>inteiro, indicador de erro</para>
-                </listitem>
-            </varlistentry>
+          <varlistentry>
+            <term>M</term>
+            <listitem>
+              <para>matriz de strings</para>
+            </listitem>
+          </varlistentry>
+          <varlistentry>
+            <term>subExpr</term>
+            <listitem>
+              <para>vetor de strings</para>
+            </listitem>
+          </varlistentry>
+          <varlistentry>
+            <term>H</term>
+            <listitem>
+              <para>matriz</para>
+            </listitem>
+          </varlistentry>
+          <varlistentry>
+            <term>ierr</term>
+            <listitem>
+              <para>inteiro, indicador de erro</para>
+            </listitem>
+          </varlistentry>
         </variablelist>
     </refsection>
     <refsection>
@@ -68,7 +58,7 @@
             mas retorna o número de erro em <literal>ierr</literal>.
         </para>
         <para>
-            Se <literal>Z</literal> é uma lista, <literal>Subexp </literal> é um
+            Se uma lista for fornecida, <literal>subExpr</literal> é um
             vetor de strings, que define subexpressões que são avaliadas antes da
             avaliação de <literal>M</literal>. Estas subexpressões devem ser referidas
             como <literal>%(k)</literal> em <literal>M</literal>, onde
             <literal>Subexp</literal>.
         </para>
         <warning>
-            <varname>Z</varname> should not include any continuation marks (..).
+            <itemizedlist>
+                <listitem>
+                    <para>
+                    Assignments like <literal>"a = 1"</literal> are not accepted as expressions,
+                    neither in <varname>M</varname> nor in <varname>subExpr</varname>.
+                    <function>execstr</function> must be used instead to evaluate such expressions.
+                    </para>
+                </listitem>
+                <listitem>
+                    <para>
+                    Continuation marks <literal>".."</literal> are forbidden in expressions
+                    in <varname>M</varname> as well as in <varname>subExpr</varname>.
+                    </para>
+                </listitem>
+            </itemizedlist>
         </warning>
+        <note>Special aliases:
+            <itemizedlist>
+                <listitem>
+                        <literal>"Nan"</literal> and <literal>"NaN"</literal> are parsed as
+                        <constant>%nan</constant>.
+                </listitem>
+                <listitem>
+                        <literal>"Inf"</literal> and <literal>"INF"</literal> are parsed as
+                        <constant>%inf</constant>.
+                </listitem>
+            </itemizedlist>
+        </note>
     </refsection>
     <refsection>
         <title>Exemplos</title>
@@ -89,6 +105,11 @@ a = 1; b = 2; Z = list(['%(1)','%(1)-%(2)'],['a+1','b+1']);
 evstr(Z)
 
 evstr('NaN'), evstr('Inf')
+
+//The two return values version
+[H, ierr] = evstr(Z) // no error
+Z = ['a', 'b', 'c'] ;// the variable c is undefined
+[H, ierr] = evstr(Z) // error 4: Undefined variable: c
 ]]>     </programlisting>
     </refsection>
     <refsection>
@@ -97,6 +118,34 @@ evstr('NaN'), evstr('Inf')
             <member>
                 <link linkend="execstr">execstr</link>
             </member>
+            <member>
+                <link linkend="sci2exp">sci2exp</link>
+            </member>
+            <member>
+                <link linkend="strtod">strtod</link>
+            </member>
+            <member>
+                <link linkend="brackets">concatenation</link>
+            </member>
         </simplelist>
     </refsection>
+    <refsection role="history">
+        <title>Histórico</title>
+        <revhistory>
+            <revision>
+                <revnumber>5.3.0</revnumber>
+                <revdescription>
+                <literal>"Nan"</literal> and <literal>"NaN"</literal> are now parsed as <literal>%nan</literal>.
+                <literal>"Inf"</literal> and <literal>"INF"</literal> are now parsed as <literal>%inf</literal>.
+                </revdescription>
+            </revision>
+            <revision>
+                <revnumber>6.0.1</revnumber>
+                <revdescription>
+                  Simple comments are now supported in almost all possible input expressions,
+                  whatever is the shape of <literal>M</literal>.
+                </revdescription>
+            </revision>
+        </revhistory>
+    </refsection>
 </refentry>
index ce090ed..2a280f6 100644 (file)
     <refsynopsisdiv>
         <title>Синтаксис</title>
         <synopsis>
-            H = evstr(Z)
-            [H, ierr] = evstr(Z)
+            H = evstr(M)
+            H = evstr(list(M, subExpr))
+            [H, ierr] = evstr(..)
         </synopsis>
     </refsynopsisdiv>
     <refsection>
         <title>Аргументы</title>
         <variablelist>
-            <varlistentry>
-                <term>Z</term>
-                <listitem>
-                    <para>
-                        матрица символьных строк <varname>M</varname> или
-                        <code>list(M,Subexp)</code>
-                    </para>
-                    <variablelist>
-                        <varlistentry>
-                            <term>M</term>
-                            <listitem>
-                                <para>матрица символьных строк.</para>
-                            </listitem>
-                        </varlistentry>
-                        <varlistentry>
-                            <term>Subexp</term>
-                            <listitem>
-                                <para>вектор символьных строк.</para>
-                            </listitem>
-                        </varlistentry>
-                    </variablelist>
-                </listitem>
-            </varlistentry>
-            <varlistentry>
-                <term>H</term>
-                <listitem>
-                    <para>матрица.</para>
-                </listitem>
-            </varlistentry>
-            <varlistentry>
-                <term>ierr</term>
-                <listitem>
-                    <para>целое число, указатель ошибки.</para>
-                </listitem>
-            </varlistentry>
+          <varlistentry>
+              <term>M</term>
+              <listitem>
+                <para>матрица символьных строк.</para>
+              </listitem>
+          </varlistentry>
+          <varlistentry>
+            <term>subExpr</term>
+            <listitem>
+              <para>вектор символьных строк.</para>
+            </listitem>
+          </varlistentry>
+          <varlistentry>
+            <term>H</term>
+            <listitem>
+              <para>матрица.</para>
+            </listitem>
+          </varlistentry>
+          <varlistentry>
+            <term>ierr</term>
+            <listitem>
+              <para>целое число, указатель ошибки.</para>
+            </listitem>
+          </varlistentry>
         </variablelist>
     </refsection>
     <refsection>
@@ -82,7 +72,7 @@
             но возвращается номер ошибки в <varname>ierr</varname>.
         </para>
         <para>
-            Если <varname>Z</varname> - список, то <varname>Subexp</varname> -
+            Если указан список, то <varname>subExpr</varname>
             вектор символьных строк, который определяет подвыражения, которые
             вычисляются до вычисления <varname>M</varname>. К этим
             подвыражениям следует обращаться как <literal>%(k)</literal> в
@@ -114,6 +104,7 @@ Z = list(['%(1)','%(1)-%(2)'],['a+1','b+1']);
 evstr(Z)
 
 evstr('NaN'), evstr('Inf')
+
 //Вариант с двумя возвращаемыми значениями
 [H, ierr] = evstr(Z) // ошибки нет
 Z = ['a', 'b', 'c'] ;// переменная c не определена
@@ -126,6 +117,34 @@ Z = ['a', 'b', 'c'] ;// переменная c не определена
             <member>
                 <link linkend="execstr">execstr</link>
             </member>
+            <member>
+                <link linkend="sci2exp">sci2exp</link>
+            </member>
+            <member>
+                <link linkend="strtod">strtod</link>
+            </member>
+            <member>
+                <link linkend="brackets">конкатенация</link>
+            </member>
         </simplelist>
     </refsection>
+    <refsection role="history">
+        <title>История</title>
+        <revhistory>
+            <revision>
+                <revnumber>5.3.0</revnumber>
+                <revdescription>
+                <literal>"Nan"</literal> and <literal>"NaN"</literal> are now parsed as <literal>%nan</literal>.
+                <literal>"Inf"</literal> and <literal>"INF"</literal> are now parsed as <literal>%inf</literal>.
+                </revdescription>
+            </revision>
+            <revision>
+                <revnumber>6.0.1</revnumber>
+                <revdescription>
+                  Simple comments are now supported in almost all possible input expressions,
+                  whatever is the shape of <literal>M</literal>.
+                </revdescription>
+            </revision>
+        </revhistory>
+    </refsection>
 </refentry>
index 5f801af..4f375cb 100644 (file)
@@ -1,6 +1,7 @@
 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
 // Copyright (C) INRIA
 // Copyright (C) DIGITEO - 2010 - Allan CORNET
+// Copyright (C) 2016, 2017 - Samuel GOUGEON
 //
 // Copyright (C) 2012 - 2016 - Scilab Enterprises
 //
@@ -16,32 +17,43 @@ function [%val, %ierr] = evstr(%str)
 
     [lhs, rhs] = argn(0);
     %val = [];
+    %ierr =  0;
+
     select type(%str)
 
     case 10 then
         // matrix of character strings
         if isempty(%str) then
             %val = [];
-            %ierr =  0;
             return;
         end
 
         // bug 7003
-        if ~isdef("Nan") then
-            Nan = %nan;
-        end
-        if ~isdef("NaN") then
-            NaN = %nan;
+        vars = ["Nan"  "NaN"  "Inf"  "INF"]
+        vals = ["%nan" "%nan" "%inf" "%inf"]
+        tmp = ~isdef(vars)
+        if tmp~=[]
+            execstr(vars(tmp)+"="+vals(tmp))
         end
 
-        if ~isdef("Inf") then
-            Inf = %inf;
+        // Removing comments:
+        regExp = "_(?<!\:)//[^\""\'']*$_";
+        %str = strsubst(%str, regExp , "", "r");
+        k = grep(%str, "_^[^""'']*?//.*?(\""|\'')_", "r");
+        if k~=[]
+            %str(k) = strsubst(%str(k), "_(?<!\:|"")?//.*$_" , "", "r");
         end
 
-        if ~isdef("INF") then
-            INF = %inf;
+        // Bracketing expressions: http://bugzilla.scilab.org/15308
+        comm = grep(%str, "_(^|[^:])//_", "r");
+        tmp = 1:size(%str,"*");
+        if comm~=[]
+            tmp = setdiff(tmp, comm) // indices of expressions without remaining comments
         end
-
+        if tmp~=[]
+            %str(tmp) = "[" + %str(tmp) + "]";
+        end
+        //
         %t1 = strcat(%str, ",", "c")+";"
         %t1(1) = "%val=[" + %t1(1);
         %t1($) = part(%t1($), 1:length(%t1($)) - 1)+";";
@@ -77,7 +89,6 @@ function [%val, %ierr] = evstr(%str)
     case 1 then
         // real or complex constant matrix
         %val = %str;
-        %ierr = 0;
     else
         error(msprintf(gettext("%s: Wrong type for input argument #%d: Real or Complex matrix, Matrix of character strings or list expected.\n"), "evstr", 1));
     end
diff --git a/scilab/modules/string/tests/nonreg_tests/bug_15308_evstr.tst b/scilab/modules/string/tests/nonreg_tests/bug_15308_evstr.tst
new file mode 100644 (file)
index 0000000..4f1c4d1
--- /dev/null
@@ -0,0 +1,22 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2017 - Samuel GOUGEON
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+//
+// <-- CLI SHELL MODE -->
+// <-- NO CHECK REF -->
+// <-- Non-regression test for bug 15308 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/15308
+//
+// <-- Short Description -->
+//  evstr(["1;2" "3;4"]) was refused, while evstr(["1 2" ; "3 4"]) is accepted
+
+assert_checkequal(execstr("evstr([""1;2"",""3;4""])", "errcatch"), 0);
+assert_checkequal(evstr(["1;2","3;4"]), [1 3 ; 2 4]);
+
+assert_checkequal(evstr(["1;2 // A", "3;4 // B //"]), [1 3 ; 2 4]);
+assert_checkequal(evstr(["1;2 // A", "3;4 // B //"; "5// C" "6// D"]), [1 3 ; 2 4 ; 5 6]);
diff --git a/scilab/modules/string/tests/nonreg_tests/bug_9838.dia.ref b/scilab/modules/string/tests/nonreg_tests/bug_9838.dia.ref
deleted file mode 100644 (file)
index 869b325..0000000
+++ /dev/null
@@ -1,21 +0,0 @@
-// =============================================================================
-// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
-// Copyright (C) 2011 - INRIA - Serge Steer
-//
-//  This file is distributed under the same license as the Scilab package.
-// =============================================================================
-// <-- CLI SHELL MODE -->
-//
-// <-- Non-regression test for bug 9838 -->
-//
-// <-- Bugzilla URL -->
-// http://bugzilla.scilab.org/show_bug.cgi?id=9838
-//
-// <-- Short Description -->
-// evstr freezes on some specific string
-//
-assert_checkequal(evstr('//xxx'),[]);
-t=["1";
-   "2";
-   "//xxx"];
-assert_checkequal(evstr(t),[1;2]);
index 1ad3a39..a63bbcc 100644 (file)
@@ -1,21 +1,48 @@
 // =============================================================================
 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
 // Copyright (C) 2011 - INRIA - Serge Steer
+// Copyright (C) 2017 - Samuel GOUGEON
 //
 //  This file is distributed under the same license as the Scilab package.
 // =============================================================================
 // <-- CLI SHELL MODE -->
+// <-- NO CHECK REF -->
 //
 // <-- Non-regression test for bug 9838 -->
 //
 // <-- Bugzilla URL -->
-// http://bugzilla.scilab.org/show_bug.cgi?id=9838
+// http://bugzilla.scilab.org/9838
 //
 // <-- Short Description -->
-// evstr freezes on some specific string
-//
+// evstr() poorly supported comments in expressions
+
 assert_checkequal(evstr('//xxx'),[]);
 t=["1";
    "2";
    "//xxx"];
-assert_checkequal(evstr(t),[1;2]); 
+assert_checkequal(evstr(t),[1;2]);
+
+//  Row of expressions:
+assert_checkequal(evstr(["// test", "// test line 2"]), []);
+assert_checkequal(evstr(["1 2", "// test", "3 4"]), [1 2 3 4]);
+assert_checkequal(evstr(["1 // abc", "// no result", "3 // def"]), [1 3]);
+assert_checkequal(evstr(["1 // abc", " // no result", "3 // def"]), [1 3]);
+assert_checkequal(evstr(["1 // abc", "[] // no result", "3 // def"]), [1 3]);
+
+ab = """ab""";
+ht = """http://a.b""";
+res = ["ab", "http://a.b", "ab // cd"];
+assert_checkequal(evstr([ab, ht, """ab // cd"""]), res);
+assert_checkequal(evstr([ab, ht+" // test", "''ab // cd''"]), res);
+assert_checkequal(evstr([ab, ht+"// test", """ab // cd"""]), res);
+assert_checkequal(evstr([ab, "''http://a.b'' // test", "''ab // cd''"]), res);
+assert_checkequal(evstr(["// ab", """3"" // http://a.b", """ab // cd"""]), ["3" "ab // cd"]);
+assert_checkequal(evstr(["// ab", """3"" ""//"" ""http://a.b""", """ab // cd"""]), ..
+  ["3" "//" "http://a.b" "ab // cd"]);
+assert_checkequal(evstr([ab, ht, """ab // cd"""]), res);
+
+//  Matrix of expressions:
+assert_checkequal(evstr(["1;2 // A", "3;4 // B //"]), [1 3 ; 2 4]);
+assert_checkequal(evstr(["1 2 // A"; "3 4 // B //"]), [1 2 ; 3 4]);
+assert_checkequal(evstr(["1;2 // A", "3;4 // B //"; "5// C" "6// D"]), [1 3 ; 2 4 ; 5 6]);
+assert_checkequal(evstr(["1 // un", "2 // deux"; "3 // trois", "4 // quatre"]), [1 2 ; 3 4]);
diff --git a/scilab/modules/string/tests/unit_tests/evstr.dia.ref b/scilab/modules/string/tests/unit_tests/evstr.dia.ref
deleted file mode 100644 (file)
index f78dece..0000000
+++ /dev/null
@@ -1,51 +0,0 @@
-// =============================================================================
-// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
-// Copyright (C) 2010 - DIGITEO - Allan CORNET
-//
-//  This file is distributed under the same license as the Scilab package.
-// =============================================================================
-//
-// <-- CLI SHELL MODE -->
-//
-// =============================================================================
-// unit tests evstr
-// =============================================================================
-a = 1;
-b = 2;
-Z = ["a","b"];
-res = evstr(Z);
-assert_checkequal(res(1), a);
-assert_checkequal(res(2), b);
-// =============================================================================
-a = 1;
-b = 2;
-Z = list(["%(1)","%(1)-%(2)"], ["a+1","b+1"]);
-res = evstr(Z);
-assert_checkequal(res, [2 -1]);
-// =============================================================================
-assert_checktrue(isnan(evstr(%nan)));
-assert_checktrue(isinf(evstr(%inf)));
-assert_checktrue(isnan(evstr("%nan")));
-assert_checktrue(isinf(evstr("%inf")));
-assert_checktrue(isnan(evstr("Nan")));
-assert_checktrue(isinf(evstr("Inf")));
-assert_checktrue(isnan(evstr("NaN")));
-assert_checktrue(isinf(evstr(-%inf)));
-assert_checktrue(isinf(evstr("-%inf")));
-assert_checktrue(isinf(evstr("-Inf")));
-// =============================================================================
-Scilab_value = 3;
-assert_checkequal(Scilab_value, evstr("Scilab_value"));
-// =============================================================================
-clear toto;
-assert_checkfalse(execstr("evstr(''toto'')", "errcatch") == 0);
-assert_checkfalse(execstr("evstr(toto)", "errcatch") == 0);
-// =============================================================================
-s = rand(3,3,3);
-assert_checkequal(execstr("evstr(s)", "errcatch"), 0);
-// =============================================================================
-function foo(), endfunction
-assert_checkequal(execstr("evstr(''foo'')", "errcatch"), 0);
-// =============================================================================
-assert_checkequal(evstr(""), []);
-// =============================================================================
index f78dece..e360049 100644 (file)
@@ -1,11 +1,13 @@
 // =============================================================================
 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
 // Copyright (C) 2010 - DIGITEO - Allan CORNET
+// Copyright (C) 2017 - Samuel GOUGEON
 //
 //  This file is distributed under the same license as the Scilab package.
 // =============================================================================
 //
 // <-- CLI SHELL MODE -->
+// <-- NO CHECK REF -->
 //
 // =============================================================================
 // unit tests evstr
@@ -49,3 +51,72 @@ assert_checkequal(execstr("evstr(''foo'')", "errcatch"), 0);
 // =============================================================================
 assert_checkequal(evstr(""), []);
 // =============================================================================
+// With some concatenations:
+assert_checkequal(evstr("1 2 3"), 1:3);
+assert_checkequal(evstr(["1 2" "3" "4 5"]), 1:5);
+assert_checkequal(evstr("1 ; 2 ; 3"), [1;2;3]);
+assert_checkequal(evstr(["1;2" ; "3" ; "4;5"]), (1:5)');
+
+assert_checkequal(evstr(["1 2" ; "3 4"]), [1 2 ; 3 4]);
+assert_checkequal(evstr(["1;2" "3;4"]), [1 3 ; 2 4]);
+
+// =============================================================================
+// With some comments or "//" substrings
+//  Scalar expression
+assert_checkequal(evstr("// test"), []);
+assert_checkequal(evstr("1 // test"), 1);
+assert_checkequal(evstr("1 2 // test"), [1 2]);
+assert_checkequal(evstr("[1 2] // test"), [1 2]);
+assert_checkequal(evstr("1 ; 2 // test"), [1 ; 2]);
+assert_checkequal(evstr("[1;2] // test"), [1 ; 2]);
+assert_checkequal(evstr("""//"" // A''b"), "//");
+assert_checkequal(evstr(" ""//"" // A''b"), "//");
+assert_checkequal(evstr(" "" //"" // A''b // c""d "), " //");
+
+//  Column of expressions:
+assert_checkequal(evstr(["// test" ; "// test line 2"]), []);
+assert_checkequal(evstr(["1 2"; "// test" ; "3 4"]), [1 2; 3 4]);
+assert_checkequal(evstr(["1 // abc"; "// no result" ; "3 // def"]), [1 ; 3]);
+assert_checkequal(evstr(["1 // abc"; " // no result" ; "3 // def"]), [1 ; 3]);
+assert_checkequal(evstr(["1 // abc"; "[] // no result" ; "3 // def"]), [1 ; 3]);
+res = ["abc"; "http://a.b" ; "def"];
+assert_checkequal(evstr(["""abc"""; """http://a.b""" ; """def"""]), res);
+assert_checkequal(evstr(["""abc"""; """http://a.b"" // test" ; """def"""]), res);
+assert_checkequal(evstr(["""abc"""; """http://a.b""// test" ; """def"""]), res);
+assert_checkequal(evstr(["""abc"""; "''http://a.b'' // test" ; """def"""]), res);
+
+res = ["abc"; "//a.b" ; "def"];
+assert_checkequal(evstr(["""abc"""; """//a.b""" ; """def"""]), res);
+assert_checkequal(evstr(["""abc"" // test"; """//a.b""" ; """def"""]), res);
+assert_checkequal(evstr(["""abc // test"""]), "abc // test");
+assert_checkequal(evstr(["""abc // test"" // comment"]), "abc // test");
+
+//  Row of expressions:
+assert_checkequal(evstr(["// test", "// test line 2"]), []);
+assert_checkequal(evstr(["1 2", "// test", "3 4"]), [1 2 3 4]);
+assert_checkequal(evstr(["1 // abc", "// no result", "3 // def"]), [1 3]);
+assert_checkequal(evstr(["1 // abc", " // no result", "3 // def"]), [1 3]);
+assert_checkequal(evstr(["1 // abc", "[] // no result", "3 // def"]), [1 3]);
+
+ab = """ab""";
+ht = """http://a.b""";
+res = ["ab", "http://a.b", "ab // cd"];
+assert_checkequal(evstr([ab, ht, """ab // cd"""]), res);
+assert_checkequal(evstr([ab, ht+" // test", "''ab // cd''"]), res);
+assert_checkequal(evstr([ab, ht+"// test", """ab // cd"""]), res);
+assert_checkequal(evstr([ab, "''http://a.b'' // test", "''ab // cd''"]), res);
+assert_checkequal(evstr(["// ab", """3"" // http://a.b", """ab // cd"""]), ["3" "ab // cd"]);
+assert_checkequal(evstr(["// ab", """3"" ""//"" ""http://a.b""", """ab // cd"""]), ..
+  ["3" "//" "http://a.b" "ab // cd"]);
+assert_checkequal(evstr([ab, ht, """ab // cd"""]), res);
+
+//  Matrix of expressions:
+assert_checkequal(evstr(["1;2 // A", "3;4 // B //"]), [1 3 ; 2 4]);
+assert_checkequal(evstr(["1 2 // A"; "3 4 // B //"]), [1 2 ; 3 4]);
+assert_checkequal(evstr(["1;2 // A", "3;4 // B //"; "5// C" "6// D"]), [1 3 ; 2 4 ; 5 6]);
+assert_checkequal(evstr(["1 // un", "2 // deux"; "3 // trois", "4 // quatre"]), [1 2 ; 3 4]);
+
+// Can't be easily fixed (but very permissive):
+in = [" ""a""; ""b"" // A''b", " ""c""; ""d"" // E''F"];
+assert_checkfalse(evstr(in)==["a" "c";"b" "d"]);
+assert_checkequal(evstr(in), ["a" ; "b"]);