changeset 672:066e1551639c

[project @ 1994-09-07 21:10:32 by jwe]
author jwe
date Wed, 07 Sep 1994 21:11:36 +0000
parents e9adf666b647
children 8af8709c349e
files src/error.cc src/error.h src/octave.cc src/pt-misc.cc src/pt-misc.h
diffstat 5 files changed, 118 insertions(+), 12 deletions(-) [+]
line wrap: on
line diff
--- a/src/error.cc
+++ b/src/error.cc
@@ -36,7 +36,10 @@
 #include "defun.h"
 
 // Current error state.
-int error_state;
+int error_state = 0;
+
+// XXX FIXME XXX
+int suppress_octave_error_messages = 0;
 
 static void
 verror (const char *name, const char *fmt, va_list args)
@@ -96,6 +99,9 @@
   if (! error_state)
     error_state = 1;
 
+  if (suppress_octave_error_messages)
+    return;
+
   flush_output_to_pager ();
 
   va_list args;
--- a/src/error.h
+++ b/src/error.h
@@ -44,6 +44,9 @@
 // Current error state.
 extern int error_state;
 
+// XXX FIXME XXX
+extern int suppress_octave_error_messages;
+
 #endif
 
 /*
--- a/src/octave.cc
+++ b/src/octave.cc
@@ -726,9 +726,9 @@
   return retval;
 }
 
-tree_constant
+static Octave_object
 eval_string (const char *string, int print, int ans_assign,
-	     int& parse_status)
+	     int& parse_status, int nargout)
 {
   begin_unwind_frame ("eval_string");
 
@@ -761,11 +761,11 @@
 
   run_unwind_frame ("eval_string");
 
-  tree_constant retval;
+  Octave_object retval;
 
   if (parse_status == 0 && command)
     {
-      retval = command->eval (print);
+      retval = command->eval (print, nargout);
       delete command;
     }
 
@@ -773,32 +773,67 @@
 }
 
 tree_constant
-eval_string (const tree_constant& arg, int& parse_status)
+eval_string (const char *string, int print, int ans_assign,
+	     int& parse_status)
+{
+  tree_constant retval;
+
+  Octave_object tmp = eval_string (string, print, ans_assign,
+				   parse_status, 1);
+
+  retval = tmp(0);
+
+  return retval;
+}
+
+static Octave_object
+eval_string (const tree_constant& arg, int& parse_status, int nargout)
 {
   char *string = arg.string_value ();
 
   if (error_state)
     {
       error ("eval: expecting string argument");
-      return -1;
+      return -1.0;
     }
 
 // Yes Virginia, we always print here...
 
-  return eval_string (string, 1, 1, parse_status);
+  return eval_string (string, 1, 1, parse_status, nargout);
 }
 
-DEFUN ("eval", Feval, Seval, 2, 1,
-  "eval (STRING): evaluate STRING as octave code")
+DEFUN ("eval", Feval, Seval, 3, 1,
+  "eval (TRY, CATCH)\n\
+\n\
+Evaluate the string TRY as octave code.  If that fails, evaluate the\n\
+string CATCH.")
 {
   Octave_object retval;
 
   int nargin = args.length ();
 
-  if (nargin == 2)
+  if (nargin > 1)
     {
+      begin_unwind_frame ("Feval");
+
+      if (nargin > 2)
+	{
+	  unwind_protect_int (suppress_octave_error_messages);
+	  suppress_octave_error_messages = 1;
+	}
+
       int parse_status = 0;
-      retval = eval_string (args(1), parse_status);
+
+      retval = eval_string (args(1), parse_status, nargout);
+
+      if (nargin > 2 && (parse_status != 0 || error_state))
+	{
+	  error_state = 0;
+	  eval_string (args(2), parse_status, nargout);
+	  retval = Octave_object ();
+	}
+
+      run_unwind_frame ("Feval");
     }
   else
     print_usage ("eval");
--- a/src/pt-misc.cc
+++ b/src/pt-misc.cc
@@ -130,6 +130,66 @@
   return retval;
 }
 
+Octave_object
+tree_statement_list::eval (int print, int nargout)
+{
+  Octave_object retval;
+
+  if (nargout > 1)
+    {
+      int pf;
+
+      if (error_state)
+	return retval;
+
+      for (Pix p = first (); p != 0; next (p))
+	{
+	  tree_statement *elt = this->operator () (p);
+
+	  if (print == 0)
+	    pf = 0;
+	  else
+	    pf = elt->print_flag;
+
+	  tree_command *cmd = elt->command;
+	  tree_expression *expr = elt->expression;
+
+	  if (cmd || expr)
+	    {
+	      if (cmd)
+		cmd->eval ();
+	      else
+		{
+		  if (expr->is_multi_val_ret_expression ())
+		    {
+		      Octave_object args;
+		      tree_multi_val_ret *t = (tree_multi_val_ret *) expr;
+		      retval = t->eval (pf, nargout, args);
+		    }
+		  else
+		    retval = expr->eval (pf);
+		}
+
+	      if (error_state)
+		return tree_constant ();
+
+	      if (breaking || continuing)
+		break;
+
+	      if (returning)
+		break;
+	    }
+	  else
+	    retval = Octave_object ();
+	}
+      return retval;
+    }
+  else
+    retval = eval (print);
+
+  return retval;
+}
+
 void
 tree_statement_list::print_code (ostream& os)
 {
--- a/src/pt-misc.h
+++ b/src/pt-misc.h
@@ -113,6 +113,8 @@
 
   tree_constant eval (int print);
 
+  Octave_object eval (int print, int nargout);
+
   void print_code (ostream& os);
 };