changeset 4435:dd7af4fa1942

[project @ 2003-06-23 17:52:36 by jwe]
author jwe
date Mon, 23 Jun 2003 17:52:36 +0000
parents d28fa596b886
children 689f730954b3
files src/ChangeLog src/oct-map.h src/variables.cc
diffstat 3 files changed, 147 insertions(+), 62 deletions(-) [+]
line wrap: on
line diff
--- a/src/ChangeLog	Mon Jun 23 16:36:20 2003 +0000
+++ b/src/ChangeLog	Mon Jun 23 17:52:36 2003 +0000
@@ -1,3 +1,11 @@
+2003-06-23  John W. Eaton  <jwe@bevo.che.wisc.edu>
+
+	* variables.cc (do_who): New arg, return_list.  If return_list is
+	true, return values in cell or struct arrays instead of printing.
+	(Fwho, Fwhos): If nargout is 1, ask do_who to return lists of values.
+	* oct-map.h (Octave_map (const std::string&, const octave_value_list&):
+	New constructor.
+
 2003-06-19  John W. Eaton  <jwe@bevo.che.wisc.edu>
 
 	* pt-idx.cc (tree_index_expression::rvalue):
--- a/src/oct-map.h	Mon Jun 23 16:36:20 2003 +0000
+++ b/src/oct-map.h	Mon Jun 23 17:52:36 2003 +0000
@@ -49,6 +49,12 @@
 	map[key] = octave_value_list (value);
       }
 
+  Octave_map (const std::string& key, const octave_value_list& val_list)
+    : map (), array_len (val_list.length ())
+      {
+	map[key] = val_list;
+      }
+
   Octave_map (const Octave_map& m)
     : map (m.map), array_len (m.array_len) { }
 
--- a/src/variables.cc	Mon Jun 23 16:36:20 2003 +0000
+++ b/src/variables.cc	Mon Jun 23 17:52:36 2003 +0000
@@ -36,6 +36,7 @@
 #include "str-vec.h"
 
 #include <defaults.h>
+#include "Cell.h"
 #include "defun.h"
 #include "dirfns.h"
 #include "error.h"
@@ -1059,10 +1060,10 @@
   return retval;
 }
 
-static octave_value_list
-do_who (int argc, const string_vector& argv)
+static octave_value
+do_who (int argc, const string_vector& argv, int return_list)
 {
-  octave_value_list retval;
+  octave_value retval;
 
   bool show_builtins = false;
   bool show_functions = false;
@@ -1118,55 +1119,113 @@
       show_variables = 1;
     }
 
-  int pad_after = 0;
-
-  if (show_builtins)
-    {
-      pad_after += fbi_sym_tab->maybe_list
-	("*** built-in constants:", pats, octave_stdout,
-	 show_verbose, symbol_record::BUILTIN_CONSTANT, SYMTAB_ALL_SCOPES);
-
-      pad_after += fbi_sym_tab->maybe_list
-	("*** built-in variables:", pats, octave_stdout,
-	 show_verbose, symbol_record::BUILTIN_VARIABLE, SYMTAB_ALL_SCOPES);
-
-      pad_after += fbi_sym_tab->maybe_list
-	("*** built-in functions:", pats, octave_stdout,
-	 show_verbose, symbol_record::BUILTIN_FUNCTION, SYMTAB_ALL_SCOPES);
-    }
-
-  if (show_functions)
+  if (return_list)
     {
-      pad_after += fbi_sym_tab->maybe_list
-	("*** dynamically linked functions:", pats,
-	 octave_stdout, show_verbose, symbol_record::DLD_FUNCTION,
-	 SYMTAB_ALL_SCOPES);
+      string_vector names;
+
+      if (show_builtins)
+	{
+	  names.append (fbi_sym_tab->name_list
+			(pats, true, symbol_record::BUILTIN_CONSTANT,
+			 SYMTAB_ALL_SCOPES));
+
+	  names.append (fbi_sym_tab->name_list
+			(pats, true, symbol_record::BUILTIN_VARIABLE,
+			 SYMTAB_ALL_SCOPES));
+
+	  names.append (fbi_sym_tab->name_list
+			(pats, true, symbol_record::BUILTIN_FUNCTION,
+			 SYMTAB_ALL_SCOPES));
+	}
+
+      if (show_functions)
+	{
+	  names.append (fbi_sym_tab->name_list
+			(pats, true, symbol_record::DLD_FUNCTION,
+			 SYMTAB_ALL_SCOPES));
 
-      pad_after += fbi_sym_tab->maybe_list
-	("*** currently compiled functions:", pats,
-	 octave_stdout, show_verbose, symbol_record::USER_FUNCTION,
-	 SYMTAB_ALL_SCOPES);
+	  names.append (fbi_sym_tab->name_list
+			(pats, true, symbol_record::USER_FUNCTION,
+			 SYMTAB_ALL_SCOPES));
+	}
+
+      if (show_variables)
+	{
+	  names.append (curr_sym_tab->name_list
+			(pats, true, symbol_record::USER_VARIABLE,
+			 SYMTAB_LOCAL_SCOPE));
+
+	  names.append (curr_sym_tab->name_list
+			(pats, true, symbol_record::USER_VARIABLE,
+			 SYMTAB_GLOBAL_SCOPE));
+	}
+
+      if (show_verbose)
+	{
+	  int len = names.length ();
+
+	  octave_value_list ovl (len, octave_value ());
+
+	  for (int i = 0; i < len; i++)
+	    ovl(i) = names(i);
+
+	  retval = Octave_map ("name", ovl);
+	}
+      else
+	retval = Cell (names);
     }
-
-  if (show_variables)
+  else
     {
-      pad_after += curr_sym_tab->maybe_list
-	("*** local user variables:", pats, octave_stdout,
-	 show_verbose, symbol_record::USER_VARIABLE, SYMTAB_LOCAL_SCOPE);
+      int pad_after = 0;
+
+      if (show_builtins)
+	{
+	  pad_after += fbi_sym_tab->maybe_list
+	    ("*** built-in constants:", pats, octave_stdout,
+	     show_verbose, symbol_record::BUILTIN_CONSTANT, SYMTAB_ALL_SCOPES);
+
+	  pad_after += fbi_sym_tab->maybe_list
+	    ("*** built-in variables:", pats, octave_stdout,
+	     show_verbose, symbol_record::BUILTIN_VARIABLE, SYMTAB_ALL_SCOPES);
+
+	  pad_after += fbi_sym_tab->maybe_list
+	    ("*** built-in functions:", pats, octave_stdout,
+	     show_verbose, symbol_record::BUILTIN_FUNCTION, SYMTAB_ALL_SCOPES);
+	}
 
-      pad_after += curr_sym_tab->maybe_list
-	("*** globally visible user variables:", pats,
-	 octave_stdout, show_verbose, symbol_record::USER_VARIABLE,
-	 SYMTAB_GLOBAL_SCOPE);
+      if (show_functions)
+	{
+	  pad_after += fbi_sym_tab->maybe_list
+	    ("*** dynamically linked functions:", pats,
+	     octave_stdout, show_verbose, symbol_record::DLD_FUNCTION,
+	     SYMTAB_ALL_SCOPES);
+
+	  pad_after += fbi_sym_tab->maybe_list
+	    ("*** currently compiled functions:", pats,
+	     octave_stdout, show_verbose, symbol_record::USER_FUNCTION,
+	     SYMTAB_ALL_SCOPES);
+	}
+
+      if (show_variables)
+	{
+	  pad_after += curr_sym_tab->maybe_list
+	    ("*** local user variables:", pats, octave_stdout,
+	     show_verbose, symbol_record::USER_VARIABLE, SYMTAB_LOCAL_SCOPE);
+
+	  pad_after += curr_sym_tab->maybe_list
+	    ("*** globally visible user variables:", pats,
+	     octave_stdout, show_verbose, symbol_record::USER_VARIABLE,
+	     SYMTAB_GLOBAL_SCOPE);
+	}
+
+      if (pad_after)
+	octave_stdout << "\n";
     }
 
-  if (pad_after)
-    octave_stdout << "\n";
-
   return retval;
 }
 
-DEFCMD (who, args, ,
+DEFCMD (who, args, nargout,
   "-*- texinfo -*-\n\
 @deffn {Command} who options pattern @dots{}\n\
 @deffnx {Command} whos options pattern @dots{}\n\
@@ -1204,43 +1263,55 @@
 The command @kbd{whos} is equivalent to @kbd{who -long}.\n\
 @end deffn")
 {
-  octave_value_list retval;
+  octave_value retval;
 
-  int argc = args.length () + 1;
+  if (nargout < 2)
+    {
+      int argc = args.length () + 1;
+
+      string_vector argv = args.make_argv ("who");
 
-  string_vector argv = args.make_argv ("who");
+      if (error_state)
+	return retval;
 
-  if (error_state)
-    return retval;
-
-  retval = do_who (argc, argv);
+      retval = do_who (argc, argv, nargout == 1);
+    }
+  else
+    print_usage ("who");
 
   return retval;
 }
 
-DEFCMD (whos, args, ,
+DEFCMD (whos, args, nargout,
   "-*- texinfo -*-\n\
 @deffn {Command} whos options pattern @dots{}\n\
 See who.\n\
 @end deffn")
 {
-  octave_value_list retval;
-
-  int nargin = args.length ();
+  octave_value retval;
 
-  octave_value_list tmp_args;
-  for (int i = nargin; i > 0; i--)
-    tmp_args(i) = args(i-1);
-  tmp_args(0) = "-long";
+  if (nargout < 2)
+    {
+      int nargin = args.length ();
+
+      octave_value_list tmp_args;
+
+      for (int i = nargin; i > 0; i--)
+	tmp_args(i) = args(i-1);
 
-  int argc = tmp_args.length () + 1;
+      tmp_args(0) = "-long";
 
-  string_vector argv = tmp_args.make_argv ("whos");
+      int argc = tmp_args.length () + 1;
+
+      string_vector argv = tmp_args.make_argv ("whos");
 
-  if (error_state)
-    return retval;
+      if (error_state)
+	return retval;
 
-  retval = do_who (argc, argv);
+      retval = do_who (argc, argv, nargout == 1);
+    }
+  else
+    print_usage ("whos");
 
   return retval;
 }