add scope/current option in who function 23/19523/3
Antoine ELIAS [Sun, 3 Dec 2017 16:41:26 +0000 (17:41 +0100)]
Change-Id: Icce0e6420ea81bede2a7d411ee77bbefc05c7065

scilab/modules/core/help/en_US/variables/who.xml
scilab/modules/core/help/fr_FR/variables/who.xml
scilab/modules/core/sci_gateway/cpp/sci_who.cpp
scilab/modules/core/tests/unit_tests/who.dia.ref [deleted file]
scilab/modules/core/tests/unit_tests/who.tst

index cafaa9c..02b8889 100644 (file)
@@ -8,33 +8,47 @@
         <title>Syntax</title>
         <synopsis>who
             who()
-            names = who('local')
-            [names, mem] = who('local')
-            names = who('global')
-            [names, mem] = who('global')
-            who('sorted')
-            names = who('local','sorted')
-            [names, mem] = who('local','sorted')
-            names = who('global','sorted')
-            [names, mem] = who('global','sorted')
+            [names, mem] = who([mode], [sorted])
         </synopsis>
     </refsynopsisdiv>
     <refsection>
-        <title>Description</title>
-        <para>
-            <code>who()</code> displays current variable names.
-        </para>
-        <para>
-            <code>who('local')</code> or <code>who('get')</code> returns current
-            variable names and memory used in double precision words.
-        </para>
-        <para>
-            <code>who('global')</code> returns global variable names and memory
-            used in double precision words.
-        </para>
-        <para>
-            <code>who('sorted')</code> displays in alphabetical order all variables.
-        </para>
+        <title>Arguments</title>
+        <variablelist>
+            <varlistentry>
+                <term>mode</term>
+                <listitem>
+                    <para>
+                        <literal>local</literal>/<literal>get</literal>: list visible variables (not only in current function).
+                    </para>
+                    <para>
+                        <literal>scope</literal>/<literal>current</literal>: list variables in the current scope/function.
+                    </para>
+                    <para>
+                        <literal>global</literal>: list global variables.
+                    </para>
+                </listitem>
+            </varlistentry>
+            <varlistentry>
+                <term>sorted</term>
+                <listitem>
+                    <para>
+                        Boolean value to specify if output must be sort in alphabetical order.
+                    </para>
+                </listitem>
+            </varlistentry>
+            <varlistentry>
+                <term>names</term>
+                <listitem>
+                    <para>String matrix with variable names.</para>
+                </listitem>
+            </varlistentry>
+            <varlistentry>
+                <term>mem</term>
+                <listitem>
+                    <para>Double matrix with variable sizes in doubles.</para>
+                </listitem>
+            </varlistentry>
+        </variablelist>
     </refsection>
     <refsection>
         <title>Examples</title>
@@ -45,6 +59,13 @@ b=2;
 position=find(name=="a")
 mem(position) // Size used by a
 position=find(name=="d") // []
+
+function foo(a,b)
+    disp(who("scope", "sorted"))
+endfunction
+
+foo(1,2);
+
  ]]></programlisting>
     </refsection>
     <refsection role="see also">
@@ -58,4 +79,15 @@ position=find(name=="d") // []
             </member>
         </simplelist>
     </refsection>
+    <refsection role="history">
+        <title>History</title>
+        <revhistory>
+            <revision>
+                <revnumber>6.0.1</revnumber>
+                <revdescription>
+                    Ajout de l'option scope/current.
+                </revdescription>
+            </revision>
+        </revhistory>
+    </refsection>
 </refentry>
index ca9263f..098cdf8 100644 (file)
@@ -8,38 +8,68 @@
         <title>Séquence d'appel</title>
         <synopsis>who
             who()
-            names=who('local')
-            [names,mem]=who('local')
-            names=who('global')
-            [names,mem]=who('global')
-            who('sorted')
-            names=who('local','sorted')
-            [names,mem]=who('local','sorted')
-            names=who('global','sorted')
-            [names,mem]=who('global','sorted')
+            [names, mem] = who([mode], [sorted])
         </synopsis>
     </refsynopsisdiv>
     <refsection>
-        <title>Description</title>
-        <para>
-            <literal>who</literal> affiche les noms des variables courantes.
-        </para>
-        <para>
-            <literal>who('local')</literal> ou <literal>who('get')</literal>
-            renvoie les noms des variables courantes et l'occupation mémoire en
-            nombre de flottants double précision.
-        </para>
-        <para>
-            <literal>who('global')</literal> renvoie les noms des variables
-            <literal>globales</literal> courantes et l'occupation mémoire en nombre
-            de flottants double précision.
-        </para>
-        <para>
-            <literal>who('sorted')</literal> affiche les noms des variables courantes triees par ordre alphabetique.
-        </para>
+        <title>Arguments</title>
+        <variablelist>
+            <varlistentry>
+                <term>mode</term>
+                <listitem>
+                    <para>
+                        <literal>local</literal>/<literal>get</literal>: liste les variables visibles (pas seulement dans la fonction courrante).
+                    </para>
+                    <para>
+                        <literal>scope</literal>/<literal>current</literal>: liste les variables dans la fonction courrante.
+                    </para>
+                    <para>
+                        <literal>global</literal>: liste les variables globales.
+                    </para>
+                </listitem>
+            </varlistentry>
+            <varlistentry>
+                <term>sorted</term>
+                <listitem>
+                    <para>
+                        Valeur booléenne pour spécifier si la sortie doit être triée par ordre alphabétique.
+                    </para>
+                </listitem>
+            </varlistentry>
+            <varlistentry>
+                <term>names</term>
+                <listitem>
+                    <para>Matrices de chaînes de caractères avec le noms de variables.</para>
+                </listitem>
+            </varlistentry>
+            <varlistentry>
+                <term>mem</term>
+                <listitem>
+                    <para>Matrice réelle avec l'occupation mémoire des variables en nombre de doubles.</para>
+                </listitem>
+            </varlistentry>
+        </variablelist>
+    </refsection>
+    <refsection>
+        <title>Examples</title>
+        <programlisting role="example"><![CDATA[
+a=1;
+b=2;
+[name, mem]=who("local");
+position=find(name=="a")
+mem(position) // Size used by a
+position=find(name=="d") // []
+
+function foo(a,b)
+    disp(who("scope", "sorted"))
+endfunction
+
+foo(1,2);
+
+ ]]></programlisting>
     </refsection>
     <refsection role="see also">
-        <title>Voir aussi</title>
+        <title>See also</title>
         <simplelist type="inline">
             <member>
                 <link linkend="whos">whos</link>
             </member>
         </simplelist>
     </refsection>
+    <refsection role="history">
+        <title>History</title>
+        <revhistory>
+            <revision>
+                <revnumber>6.0.1</revnumber>
+                <revdescription>
+                    Add scope/current option.
+                </revdescription>
+            </revision>
+        </revhistory>
+    </refsection>
 </refentry>
index c6a8d34..13412fd 100644 (file)
@@ -108,6 +108,10 @@ types::Function::ReturnValue sci_who(types::typed_list& in, int _iRetCount, type
     {
         size = symbol::Context::getInstance()->getVarsNameForWho(lstVar, bSorted);
     }
+    else if (wcsWhat == L"scope" || wcsWhat == L"current")
+    {
+        size = symbol::Context::getInstance()->getCurrentScope(lstVar, bSorted);
+    }
     else if (wcsWhat == L"global")
     {
         size = symbol::Context::getInstance()->getGlobalNameForWho(lstVar, bSorted);
diff --git a/scilab/modules/core/tests/unit_tests/who.dia.ref b/scilab/modules/core/tests/unit_tests/who.dia.ref
deleted file mode 100644 (file)
index 79b62de..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-// =============================================================================
-// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
-// Copyright (C) 2008 - INRIA
-//
-//  This file is distributed under the same license as the Scilab package.
-// =============================================================================
-// <-- CLI SHELL MODE -->
-//who
-a    = 33;
-bbb  = -1;
-vars = who("get");
-assert_checktrue(find(vars == "bbb") <> []);
-assert_checktrue(find(vars == "a") <> []);
index 1aab99a..f426118 100644 (file)
@@ -6,6 +6,7 @@
 // =============================================================================
 
 // <-- CLI SHELL MODE -->
+// <-- NO CHECK REF -->
 
 //who
 
@@ -14,3 +15,37 @@ bbb  = -1;
 vars = who("get");
 assert_checktrue(find(vars == "bbb") <> []);
 assert_checktrue(find(vars == "a") <> []);
+
+function foo(a, b, c)
+    lst = who("scope");
+    //remove nargin/nargout
+    lst(find(lst == "nargin")) = [];
+    lst(find(lst == "nargout")) = [];
+
+    //check args against who
+    assert_checkequal(setdiff(lst, a), []);
+endfunction
+
+//normal argument passing
+foo(["a"]);
+foo(["a";"b"], 1);
+foo(["a";"b";"c"], 1, 2);
+
+//named existing arguments
+foo(a = ["a"]);
+foo(a = ["a";"b"], b = 1);
+foo(b = 1, a = ["a";"b"]);
+foo(a = ["a";"c"], c = 2);
+foo(c = 2, a = ["a";"c"], c = 1);
+foo(a = ["a";"b";"c"], b = 1, c = 2);
+foo(a = ["a";"b";"c"], c = 2, b = 1);
+foo(b = 1, a = ["a";"b";"c"], c = 2);
+foo(b = 1, c = 2, a = ["a";"b";"c"]);
+foo(c = 2, a = ["a";"b";"c"], b = 1);
+foo(c = 2, b = 1, a = ["a";"b";"c"]);
+
+//named non existing arguments
+foo(a = ["a";"g"], g = 1);
+foo(b = 1, a = ["a";"b"]);
+foo(a = ["a";"h"], h = 1);
+foo(h = 1, a = ["a";"h"]);