Mercurial > hg > octave-lyh
diff src/pt-exp.cc @ 2958:da62d3b91fa3
[project @ 1997-05-09 18:51:56 by jwe]
author | jwe |
---|---|
date | Fri, 09 May 1997 18:52:05 +0000 |
parents | dfffbf305468 |
children | 194b50e4725b |
line wrap: on
line diff
--- a/src/pt-exp.cc +++ b/src/pt-exp.cc @@ -56,6 +56,10 @@ // Nonzero means we're breaking out of a loop or function body. extern int breaking; +// TRUE means print the right hand side of an assignment instead of +// the left. +static bool Vprint_rhs_assign_val; + // Prefix expressions. tree_prefix_expression::~tree_prefix_expression (void) @@ -520,85 +524,105 @@ octave_value tree_simple_assignment_expression::eval (bool print) { - octave_value retval; - - octave_value lhs_val; + octave_value rhs_val; if (error_state) - return retval; + return rhs_val; if (rhs) { - octave_value rhs_val = rhs->eval (); + octave_value lhs_val; - if (error_state) - { - eval_error (); - } - else if (rhs_val.is_undefined ()) + rhs_val = rhs->eval (); + + if (! error_state) { - error ("value on right hand side of assignment is undefined"); - eval_error (); - } - else - { - octave_variable_reference ult = lhs->reference (); - - if (error_state) - eval_error (); + if (rhs_val.is_undefined ()) + { + error ("value on right hand side of assignment is undefined"); + eval_error (); + } else { - if (index) + octave_variable_reference ult = lhs->reference (); + + if (error_state) + eval_error (); + else { - // Extract the arguments into a simple vector. + if (index) + { + // Extract the arguments into a simple vector. + + octave_value_list args + = index->convert_to_const_vector (); + + if (! error_state) + { + int nargin = args.length (); - octave_value_list args = index->convert_to_const_vector (); + if (nargin > 0) + { + ult.index (args); + + ult.assign (etype, rhs_val); - if (error_state) - eval_error (); + if (error_state) + eval_error (); + else if (! Vprint_rhs_assign_val) + lhs_val = ult.value (); + } + else + error ("??? invalid index list ???"); + } + else + eval_error (); + } else { - int nargin = args.length (); - - if (nargin > 0) - { - ult.index (args); - - ult.assign (etype, rhs_val); - - if (error_state) - eval_error (); - else - { - lhs_val = ult.value (); + ult.assign (etype, rhs_val); - retval = rhs_val; - } - } - else - error ("??? invalid index list ???"); + if (error_state) + eval_error (); + else if (! Vprint_rhs_assign_val) + lhs_val = ult.value (); } } - else - { - ult.assign (etype, rhs_val); - - lhs_val = ult.value (); - - retval = rhs_val; - } } } + else + eval_error (); + + if (! error_state && print) + { + if (Vprint_rhs_assign_val) + { + ostrstream buf; + + buf << lhs->name (); + + if (index) + { + buf << " ("; + tree_print_code tpc (buf); + index->accept (tpc); + buf << ")"; + } + + buf << ends; + + const char *tag = buf.str (); + + rhs_val.print_with_name (octave_stdout, tag); + + delete [] tag; + } + else + lhs_val.print_with_name (octave_stdout, lhs->name ()); + } } - // Return value is RHS value, but the value we print is the complete - // LHS value so that expressions like x(2) = 2 (for x previously - // undefined) print b = [ 0; 2 ], which is more Matlab-like. - - if (! error_state && print && lhs_val.is_defined ()) - lhs_val.print_with_name (octave_stdout, lhs->name ()); - - return retval; + return rhs_val; } void @@ -739,6 +763,21 @@ tw.visit_colon_expression (*this); } +static int +print_rhs_assign_val (void) +{ + Vprint_rhs_assign_val = check_preference ("print_rhs_assign_val"); + + return 0; +} + +void +symbols_of_pt_exp (void) +{ + DEFVAR (print_rhs_assign_val, 0.0, 0, print_rhs_assign_val, + "if TRUE, print the right hand side of assignments instead of the left"); +} + /* ;;; Local Variables: *** ;;; mode: C++ ***