# HG changeset patch # User jwe # Date 778972296 0 # Node ID 066e1551639c3c247f878501fb60894dc55300a1 # Parent e9adf666b647ad93af9edce06946ecbc2f5d5cf3 [project @ 1994-09-07 21:10:32 by jwe] diff --git a/src/error.cc b/src/error.cc --- 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; diff --git a/src/error.h b/src/error.h --- 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 /* diff --git a/src/octave.cc b/src/octave.cc --- 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"); diff --git a/src/pt-misc.cc b/src/pt-misc.cc --- 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) { diff --git a/src/pt-misc.h b/src/pt-misc.h --- 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); };