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++ ***