diff src/pt-select.cc @ 2982:20f5cec4f11c

[project @ 1997-05-16 03:29:26 by jwe]
author jwe
date Fri, 16 May 1997 03:30:14 +0000
parents
children 6cfa474c5b99
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pt-select.cc	Fri May 16 03:30:14 1997 +0000
@@ -0,0 +1,249 @@
+/*
+
+Copyright (C) 1996, 1997 John W. Eaton
+
+This file is part of Octave.
+
+Octave is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2, or (at your option) any
+later version.
+
+Octave is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with Octave; see the file COPYING.  If not, write to the Free
+Software Foundation, 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+
+*/
+
+#if defined (__GNUG__)
+#pragma implementation
+#endif
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "error.h"
+#include "oct-obj.h"
+#include "ov.h"
+#include "pt-cmd.h"
+#include "pt-exp.h"
+#include "pt-select.h"
+#include "pt-stmt.h"
+#include "pt-walk.h"
+
+// If clauses.
+
+tree_if_clause::~tree_if_clause (void)
+{
+  delete expr;
+  delete list;
+}
+
+int
+tree_if_clause::eval (void)
+{
+  if (is_else_clause () || expr->is_logically_true ("if"))
+    {
+      if (list)
+	list->eval ();
+
+      return 1;
+    }
+
+  return 0;
+}
+
+void
+tree_if_clause::accept (tree_walker& tw)
+{
+  tw.visit_if_clause (*this);
+}
+
+// List of if commands.
+
+void
+tree_if_command_list::eval (void)
+{
+  for (Pix p = first (); p != 0; next (p))
+    {
+      tree_if_clause *t = this->operator () (p);
+
+      if (t->eval () || error_state)
+	break;
+    }
+}
+
+void
+tree_if_command_list::accept (tree_walker& tw)
+{
+  tw.visit_if_command_list (*this);
+}
+
+// If.
+
+tree_if_command::~tree_if_command (void)
+{
+  delete list;
+}
+
+void
+tree_if_command::eval (void)
+{
+  if (list)
+    list->eval ();
+
+  if (error_state > 0)
+    ::error ("evaluating if command near line %d, column %d",
+	     line (), column ());
+}
+
+void
+tree_if_command::accept (tree_walker& tw)
+{
+  tw.visit_if_command (*this);
+}
+
+// Switch cases.
+
+tree_switch_case::~tree_switch_case (void)
+{
+  delete label;
+  delete list;
+}
+
+bool
+tree_switch_case::label_matches (const octave_value& val)
+{
+  bool retval = false;
+
+  octave_value label_value = label->rvalue ();
+
+  if (! error_state)
+    {
+      if (label_value.is_defined ())
+	{
+	  octave_value tmp = do_binary_op (octave_value::eq,
+					   val, label_value);
+
+	  if (! error_state)
+	    {
+	      if (tmp.is_defined ())
+		retval = tmp.is_true ();
+	      else
+		eval_error ();
+	    }
+	  else
+	    eval_error ();
+	}
+      else
+	eval_error ();
+    }
+  else
+    eval_error ();
+
+  return retval;
+}
+
+int
+tree_switch_case::eval (const octave_value& val)
+{
+  int retval = 0;
+
+  if (is_default_case () || label_matches (val))
+    {
+      if (list)
+	list->eval ();
+
+      retval = 1;
+    }
+
+  return retval;
+}
+
+void
+tree_switch_case::eval_error (void)
+{
+  ::error ("evaluating switch case label");
+}
+
+void
+tree_switch_case::accept (tree_walker& tw)
+{
+  tw.visit_switch_case (*this);
+}
+
+// List of switch cases.
+
+void
+tree_switch_case_list::eval (const octave_value& val)
+{
+  for (Pix p = first (); p != 0; next (p))
+    {
+      tree_switch_case *t = this->operator () (p);
+
+      if (t->eval (val) || error_state)
+	break;
+    }
+}
+
+void
+tree_switch_case_list::accept (tree_walker& tw)
+{
+  tw.visit_switch_case_list (*this);
+}
+
+// Switch.
+
+tree_switch_command::~tree_switch_command (void)
+{
+  delete expr;
+  delete list;
+}
+
+void
+tree_switch_command::eval (void)
+{
+  if (expr)
+    {
+      octave_value val = expr->rvalue ();
+
+      if (! error_state)
+	{
+	  if (list)
+	    list->eval (val);
+
+	  if (error_state)
+	    eval_error ();
+	}
+      else
+	eval_error ();
+    }
+  else
+    ::error ("missing value in switch command near line %d, column %d",
+	     line (), column ());
+}
+
+void
+tree_switch_command::eval_error (void)
+{
+  ::error ("evaluating switch command near line %d, column %d",
+	   line (), column ());
+}
+
+void
+tree_switch_command::accept (tree_walker& tw)
+{
+  tw.visit_switch_command (*this);
+}
+
+/*
+;;; Local Variables: ***
+;;; mode: C++ ***
+;;; End: ***
+*/