changeset 3165:e4bbfc196e53

[project @ 1998-04-16 03:01:47 by jwe]
author jwe
date Thu, 16 Apr 1998 03:05:03 +0000
parents 45490c020e47
children c3409a0cafa8
files src/ChangeLog src/input.cc src/input.h src/lex.h src/lex.l src/ov-usr-fcn.cc src/ov-usr-fcn.h src/parse.y src/pt-plot.cc src/pt-plot.h src/pt-pr-code.cc src/pt-pr-code.h src/pt-walk.h src/variables.cc
diffstat 14 files changed, 323 insertions(+), 58 deletions(-) [+]
line wrap: on
line diff
--- a/src/ChangeLog	Tue Apr 14 20:56:53 1998 +0000
+++ b/src/ChangeLog	Thu Apr 16 03:05:03 1998 +0000
@@ -1,3 +1,30 @@
+Wed Apr 15 01:03:05 1998  John W. Eaton  <jwe@bevo.che.wisc.edu>
+
+	* input.cc (Vlast_prompt_time): New global variable.
+	(octave_gets): Set it.
+	* ov-usr-fcn.h (octave_user_function::time_checked): New function.
+	(octave_user_function::mark_fcn_file_up_to_date): Ditto.
+	(octave_user_function::t_checked): New data member.
+	* variables.cc (symbol_out_of_date): Only check file time stamp if
+	a prompt has been printed since the last time check.
+
+	* pt-plot.h, pt-plot.cc (subplot_axes): New class.
+	(subplot): Handle axes.
+	(Vgnuplot_command_axes): New static variable.
+	(gnuplot_command_axes): New function.
+	(symbols_of_pt_plot): DEFVAR gnuplot_command_axes.
+	* pt-walk.h (tree_walker::visit_subplot_axes): New virtual function.
+	* parse.y (plot_options): Handle axes.
+	* lex.l (plot_axes_token): New function.
+	(is_keyword): Use it.
+	(is_plot_keyword): Recognize "axes" and "axis".
+	* lex.h (class lexical_feedback): New field, in_plot_axes.
+	(lexical_feedback::init): Reset it.
+
+Tue Apr 14 23:32:27 1998  John W. Eaton  <jwe@bevo.che.wisc.edu>
+
+	* parse.y (parse_fcn_file): New arg, force_script.  Change callers.
+
 Fri Apr 10 11:01:27 1998  John W. Eaton  <jwe@bevo.che.wisc.edu>
 
 	* help.cc (type): Also print values of variables.
--- a/src/input.cc	Tue Apr 14 20:56:53 1998 +0000
+++ b/src/input.cc	Thu Apr 16 03:05:03 1998 +0000
@@ -86,6 +86,9 @@
 // more than one state can be active at once.
 int Vecho_executing_commands;
 
+// The time we last printed a prompt.
+time_t Vlast_prompt_time;
+
 // Character to append after successful command-line completion attempts.
 static char Vcompletion_append_char;
 
@@ -192,6 +195,8 @@
 {
   string retval;
 
+  Vlast_prompt_time = time (0);
+
   if ((interactive || forced_interactive)
       && (! (reading_fcn_file || reading_script_file)))
     {
--- a/src/input.h	Tue Apr 14 20:56:53 1998 +0000
+++ b/src/input.h	Thu Apr 16 03:05:03 1998 +0000
@@ -26,6 +26,7 @@
 #define octave_input_h 1
 
 #include <cstdio>
+#include <ctime>
 
 #include <string>
 
@@ -85,6 +86,8 @@
 
 extern int Vecho_executing_commands;
 
+extern time_t Vlast_prompt_time;
+
 #endif
 
 /*
--- a/src/lex.h	Tue Apr 14 20:56:53 1998 +0000
+++ b/src/lex.h	Thu Apr 16 03:05:03 1998 +0000
@@ -161,6 +161,9 @@
   // TRUE means we're looking at the style part of a plot command.
   bool in_plot_style;
 
+  // TRUE means we're looking at the axes part of a plot command.
+  bool in_plot_axes;
+
   // TRUE means we're looking at an indirect reference to a
   // structure element.
   bool looking_at_indirect_ref;
--- a/src/lex.l	Tue Apr 14 20:56:53 1998 +0000
+++ b/src/lex.l	Thu Apr 16 03:05:03 1998 +0000
@@ -835,6 +835,38 @@
   return retval;
 }
 
+// Check to see if a character string matches any of the possible axes
+// tags for plots.
+
+static string
+plot_axes_token (const string& s)
+{
+  string retval;
+
+  static char *plot_axes[] = 
+    {
+      "x1y1",
+      "x1y2",
+      "x2y1",
+      "x2y2",
+      0,
+    };
+
+  char **tmp = plot_axes;
+  while (*tmp)
+    {
+      if (almost_match (*tmp, s.c_str ()))
+	{
+	  retval = *tmp;
+	  break;
+	}
+
+      tmp++;
+    }
+
+  return retval;
+}
+
 // Check to see if a character string matches any one of the plot
 // option keywords.  Don't match abbreviations for clear, since that's
 // not a gnuplot keyword (users will probably only expect to be able
@@ -858,6 +890,11 @@
       lexer_flags.in_plot_style = true;
       return WITH;
     }
+  else if (almost_match ("axes", t) || almost_match ("axis", t))
+    {
+      lexer_flags.in_plot_axes = true;
+      return AXES;
+    }
   else if (strcmp ("clear", t) == 0)
     {
       return CLEAR;
@@ -873,17 +910,32 @@
 static int
 is_keyword (const string& s)
 {
-  if (lexer_flags.plotting && lexer_flags.in_plot_style)
+  if (lexer_flags.plotting)
     {
-      string sty = plot_style_token (s);
-
-      if (! sty.empty ())
+      if (lexer_flags.in_plot_style)
 	{
-	  lexer_flags.in_plot_style = false;
-	  yylval.tok_val = new token (sty);
-	  token_stack.push (yylval.tok_val);
-	  return STYLE;
+	  string sty = plot_style_token (s);
+
+	  if (! sty.empty ())
+	    {
+	      lexer_flags.in_plot_style = false;
+	      yylval.tok_val = new token (sty);
+	      token_stack.push (yylval.tok_val);
+	      return STYLE;
+	    }
 	}
+      else if (lexer_flags.in_plot_axes)
+	{
+	  string axes = plot_axes_token (s);
+
+	  if (! axes.empty ())
+	    {
+	      lexer_flags.in_plot_axes = false;
+	      yylval.tok_val = new token (axes);
+	      token_stack.push (yylval.tok_val);
+	      return AXES_TAG;
+	    }
+	}	
     }
 
   int l = input_line_number;
@@ -1860,6 +1912,7 @@
   doing_set = false;
   in_plot_range = false;
   in_plot_style = false;
+  in_plot_axes = false;
   in_plot_using = false;
   past_plot_range = false;
   plotting = false;
--- a/src/ov-usr-fcn.cc	Tue Apr 14 20:56:53 1998 +0000
+++ b/src/ov-usr-fcn.cc	Thu Apr 16 03:05:03 1998 +0000
@@ -80,10 +80,10 @@
   : octave_function (string (), string ()),
     param_list (pl), ret_list (rl), cmd_list (cl),
     sym_tab (st), file_name (), fcn_name (), t_parsed (0),
-    system_fcn_file (false), call_depth (0), num_named_args (0),
-    args_passed (), num_args_passed (0), curr_va_arg_number (0),
-    vr_list (0), symtab_entry (0), argn_sr (0), nargin_sr (0),
-    nargout_sr (0)
+    t_checked (0), system_fcn_file (false), call_depth (0),
+    num_named_args (0), args_passed (), num_args_passed (0),
+    curr_va_arg_number (0), vr_list (0), symtab_entry (0),
+    argn_sr (0), nargin_sr (0), nargout_sr (0)
 {
   install_automatic_vars ();
 
--- a/src/ov-usr-fcn.h	Tue Apr 14 20:56:53 1998 +0000
+++ b/src/ov-usr-fcn.h	Thu Apr 16 03:05:03 1998 +0000
@@ -73,8 +73,14 @@
 
   void stash_fcn_file_name (void);
 
+  void mark_fcn_file_up_to_date (time_t t)
+    { t_checked = t; }
+
   void stash_fcn_file_time (time_t t)
-    { t_parsed = t; }
+    {
+      t_parsed = t;
+      mark_fcn_file_up_to_date (t);
+    }
 
   void stash_symtab_ptr (symbol_record *sr)
     { symtab_entry = sr; }
@@ -85,6 +91,9 @@
   time_t time_parsed (void) const
     { return t_parsed; }
 
+  time_t time_checked (void) const
+    { return t_checked; }
+
   void mark_as_system_fcn_file (void);
 
   bool is_system_fcn_file (void) const
@@ -157,6 +166,10 @@
   // The time the file was parsed.
   time_t t_parsed;
 
+  // The time the file was last checked to see if it needs to be
+  // parsed again.
+  time_t t_checked;
+
   // True if this function came from a file that is considered to be a
   // system function.  This affects whether we check the time stamp
   // on the file to see if it has changed.
--- a/src/parse.y	Tue Apr 14 20:56:53 1998 +0000
+++ b/src/parse.y	Thu Apr 16 03:05:03 1998 +0000
@@ -324,6 +324,7 @@
   plot_range *plot_range_type;
   subplot_using *subplot_using_type;
   subplot_style *subplot_style_type;
+  subplot_axes *subplot_axes_type;
   octave_user_function *octave_user_function_type;
 }
 
@@ -342,7 +343,7 @@
 %token <tok_val> NAME
 %token <tok_val> END
 %token <tok_val> PLOT
-%token <tok_val> TEXT STYLE
+%token <tok_val> TEXT STYLE AXES_TAG
 %token <tok_val> FOR WHILE
 %token <tok_val> IF ELSEIF ELSE
 %token <tok_val> SWITCH CASE OTHERWISE
@@ -354,7 +355,7 @@
 // Other tokens.
 %token END_OF_INPUT LEXICAL_ERROR
 %token FCN ELLIPSIS ALL_VA_ARGS
-%token USING TITLE WITH COLON OPEN_BRACE CLOSE_BRACE CLEAR
+%token USING TITLE WITH AXES COLON OPEN_BRACE CLOSE_BRACE CLEAR
 
 // Nonterminals we construct.
 %type <sep_type> sep_no_nl opt_sep_no_nl sep opt_sep
@@ -392,6 +393,7 @@
 %type <plot_range_type> ranges1 
 %type <subplot_using_type> using using1 
 %type <subplot_style_type> style
+%type <subplot_axes_type> axes
 
 // Precedence and associativity.
 %left ';' ',' '\n'
@@ -1177,39 +1179,68 @@
 plot_command2	: expression
 		  { $$ = new subplot ($1); }
 		| expression plot_options
-		  { $$ = $2->set_data ($1); }
+		  { $$ = $2->add_data ($1); }
 		;
 
 plot_options	: using
-		  { $$ = new subplot ($1, 0, 0); }
+		  {
+		    subplot *tmp = new subplot ();
+		    $$ = tmp->add_clause ($1);
+		  }
 		| title
-		  { $$ = new subplot (0, $1, 0); }
+		  {
+		    subplot *tmp = new subplot ();
+		    $$ = tmp->add_clause ($1);
+		  }
 		| style
-		  { $$ = new subplot (0, 0, $1); }
-		| using title
-		  { $$ = new subplot ($1, $2, 0); }
-		| title using		 
-		  { $$ = new subplot ($2, $1, 0); }
-		| using style		 
-		  { $$ = new subplot ($1, 0, $2); }
-		| style using		 
-		  { $$ = new subplot ($2, 0, $1); }
-		| title style		 
-		  { $$ = new subplot (0, $1, $2); }
-		| style title		 
-		  { $$ = new subplot (0, $2, $1); }
-		| using title style	 
-		  { $$ = new subplot ($1, $2, $3); }
-		| using style title	 
-		  { $$ = new subplot ($1, $3, $2); }
-		| title using style	 
-		  { $$ = new subplot ($2, $1, $3); }
-		| title style using	 
-		  { $$ = new subplot ($3, $1, $2); }
-		| style using title	 
-		  { $$ = new subplot ($2, $3, $1); }
-		| style title using	 
-		  { $$ = new subplot ($3, $2, $1); }
+		  {
+		    subplot *tmp = new subplot ();
+		    $$ = tmp->add_clause ($1);
+		  }
+		| axes
+		  {
+		    subplot *tmp = new subplot ();
+		    $$ = tmp->add_clause ($1);
+		  }
+		| plot_options using
+		  {
+		    if (! ($$ = $1->add_clause ($2)))
+		      {
+			yyerror ("only one using option may be specified");
+			ABORT_PARSE;
+		      }
+		  }
+		| plot_options title
+		  {
+		    if (! ($$ = $1->add_clause ($2)))
+		      {
+			yyerror ("only one title option my be specified");
+			ABORT_PARSE;
+		      }
+		  }
+		| plot_options style
+		  {
+		    if (! ($$ = $1->add_clause ($2)))
+		      {
+			yyerror ("only one style option my be specified");
+			ABORT_PARSE;
+		      }
+		  }
+		| plot_options axes
+		  {
+		    if (! ($$ = $1->add_clause ($2)))
+		      {
+			yyerror ("only one axes option may be specified");
+			ABORT_PARSE;
+		      }
+		  }
+		;
+
+axes		: AXES AXES_TAG
+		  {
+		    lexer_flags.in_plot_axes = false;
+		    $$ = new subplot_axes ($2->text ());
+		  }
 		;
 
 using		: using1
@@ -2750,7 +2781,7 @@
 }
 
 static bool
-parse_fcn_file (bool exec_script, const string& ff)
+parse_fcn_file (const string& ff, bool exec_script, bool force_script = false)
 {
   unwind_protect::begin_frame ("parse_fcn_file");
 
@@ -2785,7 +2816,7 @@
       // Check to see if this file defines a function or is just a
       // list of commands.
 
-      if (is_function_file (ffile))
+      if (! force_script && is_function_file (ffile))
 	{
 	  // XXX FIXME XXX -- we shouldn't need both the
 	  // command_history object and the
@@ -2886,7 +2917,7 @@
       curr_fcn_file_full_name = ff;
 
       if (ff.length () > 0)
-	script_file_executed = parse_fcn_file (exec_script, ff);
+	script_file_executed = parse_fcn_file (ff, exec_script);
 
       if (! (error_state || script_file_executed))
 	force_link_to_function (nm);
@@ -2915,7 +2946,7 @@
 	{
 	  file = file_ops::tilde_expand (file);
 
-	  parse_fcn_file (true, file);
+	  parse_fcn_file (file, true, true);
 
 	  if (error_state)
 	    error ("source: error sourcing file `%s'", file.c_str ());
--- a/src/pt-plot.cc	Tue Apr 14 20:56:53 1998 +0000
+++ b/src/pt-plot.cc	Thu Apr 16 03:05:03 1998 +0000
@@ -107,6 +107,7 @@
 static string Vgnuplot_command_splot;
 static string Vgnuplot_command_using;
 static string Vgnuplot_command_with;
+static string Vgnuplot_command_axes;
 static string Vgnuplot_command_title;
 static string Vgnuplot_command_end;
 
@@ -625,12 +626,28 @@
   tw.visit_subplot_style (*this);
 }
 
+int
+subplot_axes::print (ostrstream& plot_buf)
+{
+  if (! sp_axes.empty ())
+    plot_buf << " " << Vgnuplot_command_axes << " " << sp_axes;
+
+  return 0;
+}
+
+void
+subplot_axes::accept (tree_walker& tw)
+{
+  tw.visit_subplot_axes (*this);
+}
+
 subplot::~subplot (void)
 {
   delete sp_plot_data;
   delete sp_using_clause;
   delete sp_title_clause;
   delete sp_style_clause;
+  delete sp_axes_clause;
 }
 
 octave_value
@@ -760,6 +777,13 @@
   if (status < 0)
     return -1;
 
+  if (sp_axes_clause)
+    {
+      int status = sp_axes_clause->print (plot_buf);
+      if (status < 0)
+	return -1;
+    }
+
   if (sp_title_clause)
     {
       octave_value tmp = sp_title_clause->rvalue ();
@@ -1151,6 +1175,12 @@
 }
 
 static int
+gnuplot_command_axes (void)
+{
+  return set_string_var (Vgnuplot_command_axes, "gnuplot_command_axes");
+}
+
+static int
 gnuplot_command_title (void)
 {
   return set_string_var (Vgnuplot_command_title, "gnuplot_command_title");
@@ -1202,6 +1232,9 @@
   DEFVAR (gnuplot_command_with, "w", 0, gnuplot_command_with,
     "");
 
+  DEFVAR (gnuplot_command_axes, "ax", 0, gnuplot_command_axes,
+    "");
+
   DEFVAR (gnuplot_command_title, "t", 0, gnuplot_command_title,
     "");
 
--- a/src/pt-plot.h	Tue Apr 14 20:56:53 1998 +0000
+++ b/src/pt-plot.h	Thu Apr 16 03:05:03 1998 +0000
@@ -36,6 +36,7 @@
 class plot_range;
 class subplot_using;
 class subplot_style;
+class subplot_axes;
 class subplot;
 class subplot_list;
 
@@ -265,26 +266,94 @@
 };
 
 class
+subplot_axes
+{
+public:
+
+  subplot_axes (const string& s = string ())
+    : sp_axes (s) { }
+
+  ~subplot_axes (void) { }
+
+  int print (ostrstream& plot_buf);
+
+  string axes (void) { return sp_axes; }
+
+  void accept (tree_walker& tw);
+
+private:
+
+  // The axes we are using: `x1y1', `x1y2', etc.
+  string sp_axes;
+
+  // No copying!
+
+  subplot_axes (const subplot_axes&);
+
+  subplot_axes& operator = (const subplot_axes&);
+};
+
+class
 subplot
 {
 public:
 
   subplot (tree_expression *data = 0)
     : sp_plot_data (data), sp_using_clause (0), sp_title_clause (0),
-      sp_style_clause (0) { }
-
-  subplot (subplot_using *u, tree_expression *t, subplot_style *s)
-    : sp_plot_data (0), sp_using_clause (u), sp_title_clause (t),
-      sp_style_clause (s) { }
+      sp_style_clause (0), sp_axes_clause (0) { }
 
   ~subplot (void);
 
-  subplot *set_data (tree_expression *data)
+  subplot *add_data (tree_expression *data)
     {
       sp_plot_data = data;
       return this;
     }
 
+  subplot *add_clause (subplot_using *u)
+    {
+      if (! sp_using_clause)
+	{
+	  sp_using_clause = u;
+	  return this;
+	}
+      else
+	return 0;
+    }
+
+  subplot *add_clause (tree_expression *t)
+    {
+      if (! sp_title_clause)
+	{
+	  sp_title_clause = t;
+	  return this;
+	}
+      else
+	return 0;
+    }
+
+  subplot *add_clause (subplot_style *s)
+    {
+      if (! sp_style_clause)
+	{
+	  sp_style_clause = s;
+	  return this;
+	}
+      else
+	return 0;
+    }
+
+  subplot *add_clause (subplot_axes *a)
+    {
+      if (! sp_axes_clause)
+	{
+	  sp_axes_clause = a;
+	  return this;
+	}
+      else
+	return 0;
+    }
+
   octave_value extract_plot_data (int ndim, octave_value& data);
 
   int handle_plot_data (int ndim, ostrstream& plot_buf);
@@ -299,6 +368,8 @@
 
   subplot_style *style_clause (void) { return sp_style_clause; }
 
+  subplot_axes *axes_clause (void) { return sp_axes_clause; }
+
   void accept (tree_walker& tw);
 
 private:
@@ -315,6 +386,9 @@
   // The `style' option
   subplot_style *sp_style_clause;
 
+  // The `axes' option
+  subplot_axes *sp_axes_clause;
+
   // No copying!
 
   subplot (const subplot&);
--- a/src/pt-pr-code.cc	Tue Apr 14 20:56:53 1998 +0000
+++ b/src/pt-pr-code.cc	Thu Apr 16 03:05:03 1998 +0000
@@ -793,6 +793,11 @@
       sp_plot_data->accept (*this);
     }
 
+  subplot_axes *sp_axes_clause = cmd.axes_clause ();
+
+  if (sp_axes_clause)
+    sp_axes_clause->accept (*this);
+
   subplot_using *sp_using_clause = cmd.using_clause ();
 
   if (sp_using_clause)
@@ -810,6 +815,12 @@
 }
 
 void
+tree_print_code::visit_subplot_axes (subplot_axes& cmd)
+{
+  os << " axes " << cmd.axes ();
+}
+
+void
 tree_print_code::visit_subplot_list (subplot_list& lst)
 {
   Pix p = lst.first ();
--- a/src/pt-pr-code.h	Tue Apr 14 20:56:53 1998 +0000
+++ b/src/pt-pr-code.h	Thu Apr 16 03:05:03 1998 +0000
@@ -116,6 +116,8 @@
 
   void visit_subplot (subplot&);
 
+  void visit_subplot_axes (subplot_axes&);
+
   void visit_subplot_list (subplot_list&);
 
   void visit_subplot_style (subplot_style&);
--- a/src/pt-walk.h	Tue Apr 14 20:56:53 1998 +0000
+++ b/src/pt-walk.h	Thu Apr 16 03:05:03 1998 +0000
@@ -59,6 +59,7 @@
 class tree_statement;
 class tree_statement_list;
 class subplot;
+class subplot_axes;
 class subplot_list;
 class subplot_style;
 class subplot_using;
@@ -180,6 +181,9 @@
   visit_subplot (subplot&) = 0;
 
   virtual void
+  visit_subplot_axes (subplot_axes&) = 0;
+
+  virtual void
   visit_subplot_list (subplot_list&) = 0;
 
   virtual void
--- a/src/variables.cc	Tue Apr 14 20:56:53 1998 +0000
+++ b/src/variables.cc	Thu Apr 16 03:05:03 1998 +0000
@@ -41,6 +41,7 @@
 #include "error.h"
 #include "gripes.h"
 #include "help.h"
+#include "input.h"
 #include "lex.h"
 #include "oct-map.h"
 #include "oct-obj.h"
@@ -510,14 +511,19 @@
 		 || (Vignore_function_time_stamp
 		     && tmp->is_system_fcn_file ())))
 	    {
-	      time_t tp = tmp->time_parsed ();
+	      if (tmp->time_checked () < Vlast_prompt_time)
+		{
+		  time_t tp = tmp->time_parsed ();
 
-	      string fname = fcn_file_in_path (ff);
+		  string fname = fcn_file_in_path (ff);
 
-	      file_stat fs (fname);
+		  tmp->mark_fcn_file_up_to_date (time (0));
+
+		  file_stat fs (fname);
 
-	      if (fs && fs.is_newer (tp))
-		retval = true;
+		  if (fs && fs.is_newer (tp))
+		    retval = true;
+		}
 	    }
 	}
     }