diff src/octave.cc @ 672:066e1551639c

[project @ 1994-09-07 21:10:32 by jwe]
author jwe
date Wed, 07 Sep 1994 21:11:36 +0000
parents fb4f6556b443
children 0faebdd7df57
line wrap: on
line diff
--- a/src/octave.cc	Wed Sep 07 19:32:26 1994 +0000
+++ b/src/octave.cc	Wed Sep 07 21:11:36 1994 +0000
@@ -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");