changeset 3162:7c96e85c76db

[project @ 1998-04-08 18:19:35 by jwe]
author jwe
date Wed, 08 Apr 1998 18:21:04 +0000
parents 2837d1701fd9
children 7f7228c0e658
files ChangeLog PROJECTS aclocal.m4 configure.in doc/interpreter/basics.texi doc/interpreter/expr.texi doc/interpreter/var.texi examples/oregonator.cc examples/oregonator.m install-octave.in libcruft/ChangeLog libcruft/slatec-fn/xdgami.f liboctave/ChangeLog liboctave/lo-specfun.cc readline/ChangeLog readline/parens.c scripts/ChangeLog scripts/plot/__plt2mm__.m scripts/plot/__plt2mv__.m scripts/plot/__plt2ss__.m scripts/plot/__plt2vm__.m scripts/plot/__plt2vv__.m scripts/plot/__pltopt1__.m scripts/plot/__pltopt__.m scripts/plot/mplot.m scripts/plot/multiplot.m scripts/plot/oneplot.m scripts/plot/subplot.m src/ChangeLog src/error.cc src/file-io.cc src/parse.h src/parse.y src/pt-arg-list.cc src/pt-except.cc src/pt-plot.cc src/sighandlers.cc src/toplev.cc src/toplev.h src/variables.cc src/xpow.cc test/ChangeLog test/octave.test/io/binary-io-1.m test/octave.test/system/gmtime-1.m test/octave.test/system/localtime-1.m
diffstat 45 files changed, 654 insertions(+), 311 deletions(-) [+]
line wrap: on
line diff
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,16 @@
+Fri Mar 27 02:54:59 1998  John W. Eaton  <jwe@bevo.che.wisc.edu>
+
+	* aclocal.m4 (OCTAVE_F2C_F77_COMPAT): Use a Fortran subroutine
+	instead of a function.
+
+Tue Mar 10 17:28:20 1998  John W. Eaton  <jwe@bevo.che.wisc.edu>
+
+	* configure.in (RLD_FLAG): Use $(octlibdir), not $(libdir).
+
 Mon Mar  2 00:02:26 1998  John W. Eaton  <jwe@bevo.che.wisc.edu>
 
+	* install-octave.in: Explicitly set permissions on ls-R files.
+
 	* configure.in: Don't disable GNU Info on cygwin32 systems.
 
 	* install-octave.in: New file.
--- a/PROJECTS
+++ b/PROJECTS
@@ -1,3 +1,5 @@
+<html>
+<pre>
 Octave PROJECTS                                          -*- text -*-
 ===============
 
@@ -249,6 +251,17 @@
 Interpreter:
 -----------
 
+  * Allow customization of the debug prompt.
+
+  * For the keyboard function, parse return (or quit) more
+    intelligently so that something like
+
+      debug> x = 1; return
+
+    will work as expected.
+
+  * Warn about M-files with timestamps in the future.
+
   * Fix the parser so that
 
       function foo ()
@@ -356,6 +369,9 @@
   * Input stream class for parser files -- must manage buffers for
     flex and context for global variable settings.
 
+  * make parser do more semantic checking, continue after errors when
+    compiling functions, etc.
+
   * Make LEXICAL_ERROR have a value that is the error message for
     parse_error() to print?
 
@@ -752,3 +768,5 @@
   * Squash bugs.
 
 				--30--
+</pre>
+</html>
--- a/aclocal.m4
+++ b/aclocal.m4
@@ -360,13 +360,13 @@
   [trap 'rm -f ftest* ctest* core; exit 1' 1 3 15
   octave_cv_f2c_f77_compat=no
   cat > ftest.f <<EOF
-      INTEGER FUNCTION FORSUB (C, D)
+      SUBROUTINE FORSUB (C, I, D)
       CHARACTER *(*) C
-      INTEGER L
+      INTEGER L, I
       DOUBLE PRECISION D
       L = LEN (C)
       WRITE (*, '(A,1X,I2)') C(1:L), INT (D)
-      FORSUB = 1
+      I = 0
       RETURN
       END
 EOF
@@ -374,18 +374,24 @@
   changequote(, )
   cat > ctest.c <<EOF
 #include "confdefs.h"
+#ifdef F77_APPEND_UNDERSCORE
+extern int forsub_ (const char*, int*, double*, long int);
+#else
+extern int forsub (const char*, int*, double*, long int);
+#endif
 static char s[14];
 int main ()
 {
   double d = 10.0;
-  int len;
+  int len, i = 1;
   strcpy (s, "FOO-I-HITHERE");
   len = strlen (s);
 #ifdef F77_APPEND_UNDERSCORE
-  return (! forsub_ (s, &d, len));
+  forsub_ (s, &i, &d, len);
 #else
-  return (! forsub (s, &d, len));
+  forsub (s, &i, &d, len);
 #endif
+  return i;
 }
 #if defined (sun)
 int MAIN_ () { return 0; }
--- a/configure.in
+++ b/configure.in
@@ -21,7 +21,7 @@
 ### Software Foundation, 59 Temple Place - Suite 330, Boston, MA
 ### 02111-1307, USA. 
 
-AC_REVISION($Revision: 1.301 $)
+AC_REVISION($Revision: 1.302 $)
 AC_PREREQ(2.9)
 AC_INIT(src/octave.cc)
 AC_CONFIG_HEADER(config.h)
@@ -550,13 +550,13 @@
     FPICFLAG=
     SH_LDFLAGS="-shared -Xlinker -expect_unresolved -Xlinker '*'"
     SONAME_FLAGS='-Xlinker -soname -Xlinker $@'
-    RLD_FLAG='-Xlinker -rpath -Xlinker $(libdir)'
+    RLD_FLAG='-Xlinker -rpath -Xlinker $(octlibdir)'
   ;;
 changequote(,)dnl
   i[3456789]86-*-linux*)
 changequote([,])dnl
     SONAME_FLAGS='-Xlinker -soname -Xlinker $@'
-    RLD_FLAG='-Xlinker -rpath -Xlinker $(libdir)'
+    RLD_FLAG='-Xlinker -rpath -Xlinker $(octlibdir)'
   ;;
 changequote(,)dnl
   i[3456]86-*-sco3.2v5*)
@@ -577,13 +577,13 @@
     fi
     SHLEXT=sl
     SH_LDFLAGS="-shared -fPIC"
-    RLD_FLAG='-Xlinker +b -Xlinker $(libdir)'
+    RLD_FLAG='-Xlinker +b -Xlinker $(octlibdir)'
   ;;
   *-sgi-*)
     CPICFLAG=
     CXXPICFLAG=
     FPICFLAG=
-    RLD_FLAG='-L$(libdir)'
+    RLD_FLAG='-L$(octlibdir)'
   ;;
   sparc-sun-sunos4*)
     if test "$octave_cv_f77_is_g77" = yes; then
@@ -593,7 +593,7 @@
     fi
     SH_LD=ld
     SH_LDFLAGS="-assert nodefinitions"
-    RLD_FLAG='-L$(libdir)'
+    RLD_FLAG='-L$(octlibdir)'
   ;;
   sparc-sun-solaris2*)
     if test "$octave_cv_f77_is_g77" = yes; then
@@ -601,7 +601,7 @@
     else
       FPICFLAG=-PIC
     fi
-    RLD_FLAG='-Xlinker -R -Xlinker $(libdir)'
+    RLD_FLAG='-Xlinker -R -Xlinker $(octlibdir)'
   ;;
 esac
 
--- a/doc/interpreter/basics.texi
+++ b/doc/interpreter/basics.texi
@@ -112,7 +112,7 @@
 
 @item --no-line-editing
 @cindex @code{--no-line-editing}
-Disable command-line editing and history.
+Disable command-line editing.
 
 @item --no-site-file
 @cindex @code{--no-site-file}
@@ -942,7 +942,7 @@
 context.  It marked the error at the @code{y} because the first name by
 itself was accepted as valid input.
 
-Another class of error message occurs occurs at evaluation time.  These
+Another class of error message occurs at evaluation time.  These
 errors are called @dfn{run-time errors}, or sometimes
 @dfn{evaluation errors} because they occur when your program is being
 @dfn{run}, or @dfn{evaluated}.  For example, if after correcting the
--- a/doc/interpreter/expr.texi
+++ b/doc/interpreter/expr.texi
@@ -181,7 +181,7 @@
 
 @noindent
 (for @code{a} previously  undefined) produce column vectors.  Otherwise, row
-vectors are preferred.  The default value is 0.
+vectors are preferred.  The default value is 1.
 
 If a variable is already defined to be a vector (a matrix with a single
 row or column), the original orientation is respected, regardless of the
--- a/doc/interpreter/var.texi
+++ b/doc/interpreter/var.texi
@@ -469,7 +469,7 @@
 @item prefer_column_vectors
 @xref{Index Expressions}.
 
-Default value: 0.
+Default value: 1.
 
 @item print_answer_id_name
 @xref{Terminal Output}.
--- a/examples/oregonator.cc
+++ b/examples/oregonator.cc
@@ -1,9 +1,14 @@
 #include <octave/oct.h>
 
-#include <iostream.h>
-
 DEFUN_DLD (oregonator, args, ,
-  "The `oregonator'.")
+  "The `oregonator'.\n\
+\n\
+Reference:\n\
+\n\
+  Oscillations in chemical systems.  IV.  Limit cycle behavior in a\n\
+  model of a real chemical reaction. Richard J. Field and Richard\n\
+  M. Noyes, The Journal of Chemical Physics, Volume 60 Number 5,\n\
+  March 1974.")
 {
   ColumnVector dx (3);
 
--- a/examples/oregonator.m
+++ b/examples/oregonator.m
@@ -1,4 +1,11 @@
 ## The `oregonator'.
+##
+## Reference:
+##
+##   Oscillations in chemical systems.  IV.  Limit cycle behavior in a
+##   model of a real chemical reaction. Richard J. Field and Richard
+##   M. Noyes, The Journal of Chemical Physics, Volume 60 Number 5,
+##   March 1974.
 
 function dx = oregonator (x, t)
 
--- a/install-octave.in
+++ b/install-octave.in
@@ -279,9 +279,11 @@
 
 echo "creating ls-R file in $datadir/octave"
 ls -LR $datadir/octave > $datadir/octave/ls-R
+chmod 644 $datadir/octave/ls-R
 
 echo "creating ls-R file in $libexecdir/octave"
 ls -LR $libexecdir/octave > $libexecdir/octave/ls-R
+chmod 644 $libexecdir/octave/ls-R
 
 echo "installing info files in $infodir"
 for f in doc/interpreter/octave.info*
--- a/libcruft/ChangeLog
+++ b/libcruft/ChangeLog
@@ -1,3 +1,7 @@
+Mon Apr  6 00:26:35 1998  John W. Eaton  <jwe@bevo.che.wisc.edu>
+
+	* slatec-fn/xdgami.f (xdgami): Reorder args to match dgami.
+
 Thu Feb 19 21:00:00 1998  John W. Eaton  <jwe@bevo.che.wisc.edu>
 
 	* specfun/ribesl.f, specfun/rjbesl.f: Compute NSIG correctly.
--- a/libcruft/slatec-fn/xdgami.f
+++ b/libcruft/slatec-fn/xdgami.f
@@ -1,5 +1,5 @@
-      subroutine xdgami (x, a, result)
-      double precision x, a, result, dgami
-      result = dgami (x, a)
+      subroutine xdgami (a, x, result)
+      double precision a, x, result, dgami
+      result = dgami (a, x)
       return
       end
--- a/liboctave/ChangeLog
+++ b/liboctave/ChangeLog
@@ -1,3 +1,7 @@
+Mon Apr  6 00:27:06 1998  John W. Eaton  <jwe@bevo.che.wisc.edu>
+
+	* lo-specfun.cc (gammainc): Reorder args in call to xdgami.
+
 Thu Feb 19 01:16:38 1998  John W. Eaton  <jwe@bevo.che.wisc.edu>
 
 	* lo-specfun.cc (xgamma, xlgamma): Define here.
--- a/liboctave/lo-specfun.cc
+++ b/liboctave/lo-specfun.cc
@@ -476,7 +476,7 @@
 gammainc (double x, double a)
 {
   double retval;
-  F77_XFCN (xdgami, XDGAMI, (x, a, retval));
+  F77_XFCN (xdgami, XDGAMI, (a, x, retval));
   return retval;
 }
 
--- a/readline/ChangeLog
+++ b/readline/ChangeLog
@@ -1,3 +1,8 @@
+Wed Mar  4 14:59:11 1998  John W. Eaton  <jwe@bevo.che.wisc.edu>
+
+	* parens.c (rl_insert_close): Make time delay for showing matching
+	parentheses 0.5 seconds.
+
 Sun Jan 25 02:19:15 1998  John W. Eaton  <jwe@bevo.che.wisc.edu>
 
 	* aclocal.m4 (BASH_REINSTALL_SIGHANDLERS, BASH_FUNC_STRCOLL):
--- a/readline/parens.c
+++ b/readline/parens.c
@@ -101,8 +101,8 @@
 
       FD_ZERO (&readfds);
       FD_SET (fileno (rl_instream), &readfds);
-      timer.tv_sec = 1;
-      timer.tv_usec = 500;
+      timer.tv_sec = 0;
+      timer.tv_usec = 500000;
 
       orig_point = rl_point;
       rl_point = match_point;
--- a/scripts/ChangeLog
+++ b/scripts/ChangeLog
@@ -1,3 +1,25 @@
+Wed Apr  8 13:17:58 1998  John W. Eaton  <jwe@bevo.che.wisc.edu>
+
+	* plot/__pltopt1.m__: New file.
+	* plot/__pltopt.m__: Handle opt as a string array by calling
+	__pltopt1__ multiple times and returning a string array with rows
+	corresponding to the rows of opt.
+	* plot/__plt2ss__.m, plot/__plt2vv__.m, plot/__plt2vm__.m,
+	plot/__plt2mv__.m, plot/__plt2mm__.m: Handle fmt as a string
+	array.
+
+Fri Mar 27 03:00:40 1998  John W. Eaton  <jwe@bevo.che.wisc.edu>
+
+	* plot/mplot.m: Fix misspellings of global variables.
+	Don't call clearplot.
+
+Tue Mar 17 17:45:25 1998  John W. Eaton  <jwe@bevo.che.wisc.edu>
+
+	* plot/subplot.m, plot/multiplot.m: Set gnuplot_command_replot to
+	"cle;rep" when going in ot multiplot mode.
+	* plot/oneplot.m: Reset gnuplot_command_replot to "rep" when
+	switching out of multiplot mode.
+
 Fri Feb 20 01:31:32 1998  John W. Eaton  <jwe@bevo.che.wisc.edu>
 
 	* plot/mplot.m, plot/subplot.m, plot/oneplot.m, plot/multiplot.m,
--- a/scripts/plot/__plt2mm__.m
+++ b/scripts/plot/__plt2mm__.m
@@ -25,19 +25,29 @@
     msg = sprintf ("__plt2mm__ (x, y)\n");
     msg = sprintf ("%s              __plt2mm__ (x, y, fmt)", msg);
     usage (msg);
-  elseif (nargin == 2)
-    fmt = "";
+  elseif (nargin == 2 || fmt == "")
+    fmt = " ";  ## Yes, this is intentionally not an empty string!
   endif
 
   [x_nr, x_nc] = size (x);
   [y_nr, y_nc] = size (y);
 
+  k = 1;
+  fmt_nr = rows (fmt);
   if (x_nr == y_nr && x_nc == y_nc)
     if (x_nc > 0)
       tmp = [x, y];
-      cmd = sprintf ("gplot tmp(:,%d:%d:%d) %s", 1, x_nc, x_nc+1, fmt);
+      cmd = sprintf ("gplot tmp(:,%d:%d:%d) %s", 1, x_nc, x_nc+1,
+		     deblank (fmt (k, :)));
+      if (k < fmt_nr)
+      	k++;
+      endif
       for i = 2:x_nc
-        cmd = sprintf ("%s, tmp(:,%d:%d:%d) %s", cmd, i, x_nc, x_nc+i, fmt);
+        cmd = sprintf ("%s, tmp(:,%d:%d:%d) %s", cmd, i, x_nc, x_nc+i,
+		       deblank (fmt (k, :)));
+	if (k < fmt_nr)
+	  k++;
+	endif
       endfor
       eval (cmd);
     else
--- a/scripts/plot/__plt2mv__.m
+++ b/scripts/plot/__plt2mv__.m
@@ -21,12 +21,13 @@
 
 function __plt2mv__ (x, y, fmt)
 
+  keyboard
   if (nargin < 2 || nargin > 3)
     msg = sprintf ("__plt2mv__ (x, y)\n");
     msg = sprintf ("%s              __plt2mv__ (x, y, fmt)", msg);
     usage (msg);
-  elseif (nargin == 2)
-    fmt = "";
+  elseif (nargin == 2 || fmt == "")
+    fmt = " ";  ## Yes, this is intentionally not an empty string!
   endif
 
   [x_nr, x_nc] = size (x);
@@ -50,11 +51,22 @@
     error ("__plt2mv__: matrix dimensions must match");
   endif
 
+  k = 1;
+  fmt_nr = rows (fmt);
   if (x_nc > 0)
     tmp = [x, y];
-    cmd = sprintf ("gplot tmp(:,%d:%d:%d) %s", 1, x_nc, x_nc+1, fmt);
+    keyboard
+    cmd = sprintf ("gplot tmp(:,%d:%d:%d) %s", 1, x_nc, x_nc+1,
+		   deblank (fmt (k, :)));
+    if (k < fmt_nr)
+      k++;
+    endif
     for i = 2:x_nc
-      cmd = sprintf ("%s, tmp(:,%d:%d:%d) %s", cmd, i, x_nc-i+1, x_nc+1, fmt);
+      cmd = sprintf ("%s, tmp(:,%d:%d:%d) %s", cmd, i, x_nc-i+1, x_nc+1,
+		     deblank (fmt (k, :)));
+      if (k < fmt_nr)
+      	k++;
+      endif
     endfor
     eval (cmd);
   else
--- a/scripts/plot/__plt2ss__.m
+++ b/scripts/plot/__plt2ss__.m
@@ -27,6 +27,8 @@
     usage (msg);
   elseif (nargin == 2)
     fmt = "";
+  elseif (rows (fmt) > 1)
+    fmt = fmt (1, :);
   endif
 
   [x_nr, x_nc] = size (x);
--- a/scripts/plot/__plt2vm__.m
+++ b/scripts/plot/__plt2vm__.m
@@ -25,8 +25,8 @@
     msg = sprintf ("__plt2vm__ (x, y)\n");
     msg = sprintf ("%s              __plt2vm__ (x, y, fmt)", msg);
     usage (msg);
-  elseif (nargin == 2)
-    fmt = "";
+  elseif (nargin == 2 || fmt == "")
+    fmt = " ";  ## Yes, this is intentionally not an empty string!
   endif
 
   [x_nr, x_nc] = size (x);
@@ -50,11 +50,21 @@
     error ("__plt2vm__: matrix dimensions must match");
   endif
 
+  k = 1;
+  fmt_nr = rows (fmt);
   if (y_nc > 0)
     tmp = [x, y];
-    cmd = sprintf ("gplot tmp(:,%d:%d:%d) %s", 1, x_nc, x_nc+1, fmt);
+    cmd = sprintf ("gplot tmp(:,%d:%d:%d) %s", 1, x_nc, x_nc+1,
+		   deblank (fmt (k, :)));
+    if (k < fmt_nr)
+      k++;
+    endif
     for i = 2:y_nc
-      cmd = sprintf ("%s, tmp(:,%d:%d:%d) %s", cmd, 1, i, i+1, fmt);
+      cmd = sprintf ("%s, tmp(:,%d:%d:%d) %s", cmd, 1, i, i+1,
+		     deblank (fmt (k, :)));
+      if (k < fmt_nr)
+      	k++;
+      endif
     endfor
     eval (cmd);
   else
--- a/scripts/plot/__plt2vv__.m
+++ b/scripts/plot/__plt2vv__.m
@@ -27,6 +27,8 @@
     usage (msg);
   elseif (nargin == 2)
     fmt = "";
+  elseif (rows (fmt) > 1)
+    fmt = fmt (1, :);
   endif
 
   [x_nr, x_nc] = size (x);
new file mode 100644
--- /dev/null
+++ b/scripts/plot/__pltopt1__.m
@@ -0,0 +1,217 @@
+## 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.
+
+## usage: fmt = __pltopt1__ (caller, opt)
+##
+## Really decode plot option strings.
+##
+## See also: __pltopt__
+
+## Author: Rick Niles <niles@axp745.gsfc.nasa.gov>
+## Adapted-By: jwe
+## Maintainer: jwe
+
+function fmt = __pltopt1__ (caller, opt)
+
+  set_color = 0;
+  set_symbol = 0;
+  set_lines = 0;
+  set_dots = 0;
+  set_points = 0;
+  set_impulses = 0;
+  set_steps = 0;
+  set_boxes = 0;
+  set_errbars = 0;
+  set_key = 0;
+  more_opts = 1;
+
+  WITH = "w";
+  LINES = "l";
+  LINESPOINTS = "linesp";
+  BOXERRORBARS = "boxer";
+  BOXES = "boxes";
+  POINTS = "p";
+  DOTS = "d";
+  IMPULSES = "i";
+  STEPS = "s";
+  ERRORBARS = "e";
+  TITLE = "title";
+
+  if (nargin != 2)
+    usage ("__pltopt1__ (opt)");
+  endif
+
+  if (! isstr (opt))
+    error ("__pltopt1__: argument must be a string");
+  endif
+
+  while (more_opts)
+
+    ## First get next char.
+
+    if (max (size (opt)) > 1)
+#      [char, opt] = sscanf (opt, "%c %s", "C");
+       char = opt(1);
+       opt = opt(2:length(opt));
+    else
+      char = opt;
+      more_opts = 0;
+    endif
+
+    ## Now set flags based on char.
+
+    if (strcmp (char, "-"))
+      set_lines = 1;
+    elseif (strcmp (char, "."))
+      set_dots  = 1;
+    elseif (strcmp (char, "@"))
+      set_points = 1;
+    elseif (strcmp (char, "^"))
+      set_impulses = 1;
+    elseif (strcmp (char, "L"))
+      set_steps = 1;
+    elseif (strcmp (char, "~"))
+      set_errbars = 1;
+    elseif (strcmp (char, "#"))
+      set_boxes = 1;
+    elseif (strcmp (char, "0") || strcmp (char, "1") ...
+            || strcmp (char, "2") || strcmp (char, "3") ...
+            || strcmp (char, "4") || strcmp (char, "5") ...
+            || strcmp (char, "6") || strcmp (char, "7") ...
+            || strcmp (char, "8") || strcmp (char, "9"))
+      if (set_color)
+	set_points = 1;
+	symbol = char;
+	set_symbol = 1;
+      else
+	color = char;
+	set_color = 1;
+      endif
+    elseif (strcmp (char, "r"))
+      set_color = 1;
+      color = "1";
+    elseif (strcmp (char, "g"))
+      set_color = 1;
+      color = "2";
+    elseif (strcmp (char, "b"))
+      set_color = 1;
+      color = "3";
+    elseif (strcmp (char, "m"))
+      set_color = 1;
+      color = "4";
+    elseif (strcmp (char, "c"))
+      set_color = 1;
+      color = "5";
+    elseif (strcmp (char, "w"))
+      set_color = 1;
+      color = "6";
+    elseif (strcmp (char, "*"))
+      set_points = 1;
+      set_symbol = 1;
+      symbol = "6";
+    elseif (strcmp (char, "+"))
+      set_points = 1;
+      set_symbol = 1;
+      symbol = "2";
+    elseif (strcmp (char, "o"))
+      set_points = 1;
+      set_symbol = 1;
+      symbol = "1";
+    elseif (strcmp (char, "x"))
+      set_points = 1;
+      set_symbol = 1;
+      symbol = "4";
+    elseif (strcmp (char, ";"))  # title mode.
+      set_key = 1;
+      working = 1;
+      key_title = ""; 
+      while (working)
+        if (max (size (opt)) > 1)
+	  char = opt(1);
+	  opt = opt(2:length(opt));
+        else
+	  char = opt;
+	  if (! strcmp (char, ";"))
+            error ("%s: unfinished key label", caller);
+          end
+          more_opts = 0;
+          working = 0;
+        endif
+        if strcmp (char, ";")
+          working = 0;
+        else
+	  if (isempty (key_title))  # needs this to avoid empty matrix warning.
+            key_title = char;
+	  else
+            key_title = strcat (key_title, char);
+	  endif
+        endif
+      endwhile
+    elseif (strcmp (char, " ")) 
+      ## whitespace -- do nothing.
+    else
+      error ("%s: unrecognized format character: '%s'", caller, char);
+    endif
+  endwhile
+
+  ## Now create format string.
+
+  fmt = WITH;
+
+  if (set_lines)
+    if (set_points)
+      fmt = strcat (fmt, " ", LINESPOINTS);
+    else
+      fmt = strcat (fmt, " ", LINES);
+    endif
+  elseif (set_boxes)
+    if (set_errbars)
+      fmt = strcat (fmt, " ", BOXERRORBARS);
+    else
+      fmt = strcat (fmt, " ", BOXES);
+    endif
+  elseif (set_points)
+    fmt = strcat (fmt, " ", POINTS);
+  elseif (set_dots)
+    fmt = strcat (fmt, " ", DOTS);
+  elseif (set_impulses)
+    fmt = strcat (fmt, " ", IMPULSES);
+  elseif (set_steps)
+    fmt = strcat (fmt, " ", STEPS);
+  elseif (set_errbars)
+    fmt = strcat (fmt, " ", ERRORBARS);
+  endif
+
+  if (strcmp (fmt, WITH))
+    fmt = strcat (fmt, " ", LINES);
+  endif
+
+  if (set_color)
+    fmt = strcat (fmt, " ", color);
+    if (set_symbol)
+      fmt = strcat (fmt, " ", symbol);
+    endif
+  elseif (set_symbol)
+    fmt = strcat (fmt, " 1 ", symbol);
+  endif
+
+  if (set_key)
+    fmt = sprintf ("%s %s \"%s\" ", fmt, TITLE, key_title);
+  endif
+endfunction
--- a/scripts/plot/__pltopt__.m
+++ b/scripts/plot/__pltopt__.m
@@ -60,196 +60,24 @@
 ##     4    magenta   magenta     dotted          "x"        open square  
 ##     5    cyan      cyan        dot long dash  triangle    filled square
 ##     6    brown     yellow      dot short dash  "*"         "o"         
+##
+## See also: __pltopt1__
 
-## Author: Rick Niles <niles@axp745.gsfc.nasa.gov>
+## Author: jwe
 ## Adapted-By: jwe
 ## Maintainer: jwe
 
 function fmt = __pltopt__ (caller, opt)
 
-  set_color = 0;
-  set_symbol = 0;
-  set_lines = 0;
-  set_dots = 0;
-  set_points = 0;
-  set_impulses = 0;
-  set_steps = 0;
-  set_boxes = 0;
-  set_errbars = 0;
-  set_key = 0;
-  more_opts = 1;
-
-  WITH = "w";
-  LINES = "l";
-  LINESPOINTS = "linesp";
-  BOXERRORBARS = "boxer";
-  BOXES = "boxes";
-  POINTS = "p";
-  DOTS = "d";
-  IMPULSES = "i";
-  STEPS = "s";
-  ERRORBARS = "e";
-  TITLE = "title";
-
-  if (nargin != 2)
-    usage ("__pltopt__ (opt)");
-  endif
-
   if (! isstr (opt))
-    error ("__pltopt__: argument must be a string");
+    usage ("__pltopt__ (caller, opt)");
   endif
 
-  while (more_opts)
-
-    ## First get next char.
-
-    if (max (size (opt)) > 1)
-#      [char, opt] = sscanf (opt, "%c %s", "C");
-       char = opt(1);
-       opt = opt(2:length(opt));
-    else
-      char = opt;
-      more_opts = 0;
-    endif
-
-    ## Now set flags based on char.
+  nr = rows (opt);
+  fmt = "";
+  for i = 1:nr
+    t = __pltopt1__ (caller, deblank (opt(i,:)));
+    fmt(i,1:length(t)) = t;
+  endfor
 
-    if (strcmp (char, "-"))
-      set_lines = 1;
-    elseif (strcmp (char, "."))
-      set_dots  = 1;
-    elseif (strcmp (char, "@"))
-      set_points = 1;
-    elseif (strcmp (char, "^"))
-      set_impulses = 1;
-    elseif (strcmp (char, "L"))
-      set_steps = 1;
-    elseif (strcmp (char, "~"))
-      set_errbars = 1;
-    elseif (strcmp (char, "#"))
-      set_boxes = 1;
-    elseif (strcmp (char, "0") || strcmp (char, "1") ...
-            || strcmp (char, "2") || strcmp (char, "3") ...
-            || strcmp (char, "4") || strcmp (char, "5") ...
-            || strcmp (char, "6") || strcmp (char, "7") ...
-            || strcmp (char, "8") || strcmp (char, "9"))
-      if (set_color)
-	set_points = 1;
-	symbol = char;
-	set_symbol = 1;
-      else
-	color = char;
-	set_color = 1;
-      endif
-    elseif (strcmp (char, "r"))
-      set_color = 1;
-      color = "1";
-    elseif (strcmp (char, "g"))
-      set_color = 1;
-      color = "2";
-    elseif (strcmp (char, "b"))
-      set_color = 1;
-      color = "3";
-    elseif (strcmp (char, "m"))
-      set_color = 1;
-      color = "4";
-    elseif (strcmp (char, "c"))
-      set_color = 1;
-      color = "5";
-    elseif (strcmp (char, "w"))
-      set_color = 1;
-      color = "6";
-    elseif (strcmp (char, "*"))
-      set_points = 1;
-      set_symbol = 1;
-      symbol = "6";
-    elseif (strcmp (char, "+"))
-      set_points = 1;
-      set_symbol = 1;
-      symbol = "2";
-    elseif (strcmp (char, "o"))
-      set_points = 1;
-      set_symbol = 1;
-      symbol = "1";
-    elseif (strcmp (char, "x"))
-      set_points = 1;
-      set_symbol = 1;
-      symbol = "4";
-    elseif (strcmp (char, ";"))  # title mode.
-      set_key = 1;
-      working = 1;
-      key_title = ""; 
-      while (working)
-        if (max (size (opt)) > 1)
-	  char = opt(1);
-	  opt = opt(2:length(opt));
-        else
-	  char = opt;
-	  if (! strcmp (char, ";"))
-            error ("%s: unfinished key label", caller);
-          end
-          more_opts = 0;
-          working = 0;
-        endif
-        if strcmp (char, ";")
-          working = 0;
-        else
-	  if (isempty (key_title))  # needs this to avoid empty matrix warning.
-            key_title = char;
-	  else
-            key_title = strcat (key_title, char);
-	  endif
-        endif
-      endwhile
-    elseif (strcmp (char, " ")) 
-      ## whitespace -- do nothing.
-    else
-      error ("%s: unrecognized format character: '%s'", caller, char);
-    endif
-  endwhile
-
-  ## Now create format string.
-
-  fmt = WITH;
-
-  if (set_lines)
-    if (set_points)
-      fmt = strcat (fmt, " ", LINESPOINTS);
-    else
-      fmt = strcat (fmt, " ", LINES);
-    endif
-  elseif (set_boxes)
-    if (set_errbars)
-      fmt = strcat (fmt, " ", BOXERRORBARS);
-    else
-      fmt = strcat (fmt, " ", BOXES);
-    endif
-  elseif (set_points)
-    fmt = strcat (fmt, " ", POINTS);
-  elseif (set_dots)
-    fmt = strcat (fmt, " ", DOTS);
-  elseif (set_impulses)
-    fmt = strcat (fmt, " ", IMPULSES);
-  elseif (set_steps)
-    fmt = strcat (fmt, " ", STEPS);
-  elseif (set_errbars)
-    fmt = strcat (fmt, " ", ERRORBARS);
-  endif
-
-  if (strcmp (fmt, WITH))
-    fmt = strcat (fmt, " ", LINES);
-  endif
-
-  if (set_color)
-    fmt = strcat (fmt, " ", color);
-    if (set_symbol)
-      fmt = strcat (fmt, " ", symbol);
-    endif
-  elseif (set_symbol)
-    fmt = strcat (fmt, " 1 ", symbol);
-  endif
-
-  if (set_key)
-    fmt = sprintf ("%s %s \"%s\" ", fmt, TITLE, key_title);
-  endif
 endfunction
--- a/scripts/plot/mplot.m
+++ b/scripts/plot/mplot.m
@@ -62,7 +62,7 @@
       __multiplot_xi__++;
     else
       __multiplot_xi__ = 1;
-      if (__multiplot_yi__ < multiplot_xn__)
+      if (__multiplot_yi__ < __multiplot_yn__)
 	__multiplot_yi__++;
       else
 	__multiplot_yi__ = 1;
@@ -70,12 +70,10 @@
     endif
 
     xo = (__multiplot_xi__ - 1.0) * __multiplot_xsize__;
-    yo = (__multiplot_yn__ - __multiplot_yi) * __multiplot_ysize__;
+    yo = (__multiplot_yn__ - __multiplot_yi__) * __multiplot_ysize__;
 
     eval (sprintf ("gset origin %g, %g", xo, yo));
 
-    clearplot;
-
   endif
 
 endfunction
--- a/scripts/plot/multiplot.m
+++ b/scripts/plot/multiplot.m
@@ -98,6 +98,8 @@
     __multiplot_xi__ = 1;
     __multiplot_yi__ = 1;
 
+    gnuplot_command_replot = "cle;rep";
+
     clearplot;
 
   endif
--- a/scripts/plot/oneplot.m
+++ b/scripts/plot/oneplot.m
@@ -40,6 +40,7 @@
       gset size 1, 1;
       gset origin 0, 0;
       __multiplot_mode__ = 0;
+      gnuplot_command_replot "rep";
       clearplot;
     endif
 
--- a/scripts/plot/subplot.m
+++ b/scripts/plot/subplot.m
@@ -130,6 +130,8 @@
       __multiplot_xsize__ = 1.0 ./ columns;
       __multiplot_ysize__ = 1.0 ./ rows;
 
+      gnuplot_command_replot = "cle;rep";
+
       gset multiplot;
 
       eval (sprintf ("gset size %g, %g", __multiplot_xsize__,
--- a/src/ChangeLog
+++ b/src/ChangeLog
@@ -1,3 +1,54 @@
+Wed Apr  8 01:00:58 1998  John W. Eaton  <jwe@bevo.che.wisc.edu>
+
+	* parse.y (Vwarn_future_time_stamp): New variable.
+	(symbols_of_parse): Add DEFVAR for it.
+	(warn_future_time_stamp): New function.
+	(frob_function_def): Maybe warn about files with future time stamps.
+
+Thu Apr  2 20:43:45 1998  John W. Eaton  <jwe@bevo.che.wisc.edu>
+
+	* pt-arg-list.cc (tree_argument_list::convert_to_const_vector): In
+	error messages, print element numbers starting with 1, not 0.
+
+Sat Mar 28 15:25:44 1998  John W. Eaton  <jwe@bevo.che.wisc.edu>
+
+	* toplev.cc (clean_up_for_exit): New function.
+	(clean_up_and_exit): Use it.
+	* sighandlers.cc (my_friendly_exit): Call it instead of
+	clean_up_and_exit, then do default action for signal.
+
+	* sighandlers.cc (octave_new_handler): Call my_friendly_exit with
+	signal set to SIGABRT if it is defined, or -1 otherwise.
+
+	* error.cc (verror): Fix thinko in attempt to skip `error: ' tag
+	when buffering error messages.
+	* pt-except.cc (tree_try_catch::eval): Reset buffer_error_messages
+	here if	just discarding unwind_protect frame.
+
+Wed Mar 18 12:35:18 1998  John W. Eaton  <jwe@bevo.che.wisc.edu>
+
+	* xpow.cc (elem_xpow): For real-scalar .^ matrix case, result is
+	complex only if real-scalar is negative and matrix has some
+	non-integer values.
+
+Tue Mar 17 17:47:50 1998  John W. Eaton  <jwe@bevo.che.wisc.edu>
+
+	* pt-plot.cc (Vgnuplot_command_plot, Vgnuplot_command_replot,
+	Vgnuplot_command_splot, Vgnuplot_command_using,
+	Vgnuplot_command_with, Vgnuplot_command_title,
+	Vgnuplot_command_end): New static variables.
+	(symbols_of_pt_plot): DEFVAR them.
+	(gnuplot_command_plot, gnuplot_command_replot,
+	gnuplot_command_splot, gnuplot_command_using,
+	gnuplot_command_with, gnuplot_command_title,
+	gnuplot_command_end): New functions.
+	(open_plot_stream, send_to_plot_stream, tree_plot_command::eval,
+	subplot_using::print, subplot_style::print, subplot::print, 
+	do_external_plotter_cd, Fgset, Fgshow): Use them instead of the
+	GPLOT_CMD_PLOT, GPLOT_CMD_REPLOT, GPLOT_CMD_SPLOT,
+	GPLOT_CMD_USING, GPLOT_CMD_WITH, GPLOT_CMD_TITLE, and
+	GPLOT_CMD_END macros.
+
 Fri Feb 27 12:25:27 1998  John W. Eaton  <jwe@bevo.che.wisc.edu>
 
 	* help.cc (additional_help_message): Fix www address.
--- a/src/error.cc
+++ b/src/error.cc
@@ -87,8 +87,15 @@
 	  // from printing `error: ' twice.  Assumes that the NAME we
 	  // have been given doesn't contain `:'.
 
-	  ptr = strchr (msg, ':') + 2;
-	  ptr = ptr ? ptr : msg;	  
+	  ptr = strchr (msg, ':');
+
+	  if (ptr)
+	    {
+	      if (*++ptr != '\0')
+		++ptr;
+	    }
+	  else
+	    ptr = msg;
 	}
 
       *error_message_buffer << ptr;
--- a/src/file-io.cc
+++ b/src/file-io.cc
@@ -413,8 +413,9 @@
 	    }
 	  else
 	    {
-	      int errno = 0;
-	      retval(1) = os->error (false, errno);
+	      int error_number = 0;
+
+	      retval(1) = os->error (false, error_number);
 	      retval(0) = -1.0;
 	    }
 	}
--- a/src/parse.h
+++ b/src/parse.h
@@ -69,6 +69,9 @@
 // the command line.
 extern bool input_from_command_line_file;
 
+// TRUE means warn about function files that have time stamps in the future.
+extern bool Vwarn_future_time_stamp;
+
 extern void
 parse_and_execute (FILE *f);
 
--- a/src/parse.y
+++ b/src/parse.y
@@ -82,6 +82,9 @@
 // the name of the file in which it is defined.
 static bool Vwarn_function_name_clash;
 
+// TRUE means warn about function files that have time stamps in the future.
+bool Vwarn_future_time_stamp;
+
 // If TRUE, generate warning if a statement in a function is not
 // terminated with a semicolon.  Useful for checking functions that
 // should only produce output using explicit printing statements.
@@ -2201,10 +2204,22 @@
 	  id_name = id->name ();
 	}
 
+      time_t now = time (0);
+
       fcn->stash_function_name (id_name);
       fcn->stash_fcn_file_name ();
-      fcn->stash_fcn_file_time (time (0));
+      fcn->stash_fcn_file_time (now);
       fcn->mark_as_system_fcn_file ();
+
+      if (Vwarn_future_time_stamp)
+	{
+	  string nm = fcn->fcn_file_name ();
+
+	  file_stat fs (nm);
+
+	  if (fs && fs.is_newer (now))
+	    warning ("time stamp for `%s' is in the future", nm.c_str ());
+	}
     }
   else if (! (input_from_tmp_history_file || input_from_startup_file)
 	   && reading_script_file
@@ -3128,6 +3143,14 @@
 }
 
 static int
+warn_future_time_stamp (void)
+{
+  Vwarn_future_time_stamp = check_preference ("warn_future_time_stamp");
+
+  return 0;
+}
+
+static int
 warn_missing_semicolon (void)
 {
   Vwarn_missing_semicolon = check_preference ("warn_missing_semicolon");
@@ -3157,6 +3180,9 @@
   DEFVAR (warn_function_name_clash, 1.0, 0, warn_function_name_clash,
     "produce warning if function name conflicts with file name");
 
+  DEFVAR (warn_future_time_stamp, 1.0, 0, warn_future_time_stamp,
+    "warn if a function file has a time stamp that is in the future");
+
   DEFVAR (warn_missing_semicolon, 0.0, 0, warn_missing_semicolon,
     "produce a warning if a statement in a function file is not\n\
 terminated with a semicolon");
--- a/src/pt-arg-list.cc
+++ b/src/pt-arg-list.cc
@@ -94,7 +94,7 @@
 
 	  if (error_state)
 	    {
-	      ::error ("evaluating argument list element number %d", k);
+	      ::error ("evaluating argument list element number %d", k+1);
 	      args = octave_value_list ();
 	      break;
 	    }
--- a/src/pt-except.cc
+++ b/src/pt-except.cc
@@ -102,6 +102,8 @@
 
   unwind_protect::add (do_catch_code, catch_code);
 
+  bool old_buffer_error_messages = buffer_error_messages;
+
   if (catch_code)
     {
       unwind_protect_bool (buffer_error_messages);
@@ -119,6 +121,7 @@
   else
     {
       error_state = 0;
+      buffer_error_messages = old_buffer_error_messages;
       unwind_protect::discard_frame ("tree_try_catch::eval");
     }
 }
--- a/src/pt-plot.cc
+++ b/src/pt-plot.cc
@@ -101,36 +101,14 @@
 // ID of the plotter process.
 static pid_t plot_stream_pid = 0;
 
-// Use shortest possible abbreviations to minimize trouble caused by
-// gnuplot's fixed-length command line buffer.
-
-#ifndef GPLOT_CMD_PLOT  
-#define GPLOT_CMD_PLOT   "pl"
-#endif
-
-#ifndef GPLOT_CMD_REPLOT 
-#define GPLOT_CMD_REPLOT "cle;rep"
-#endif
-
-#ifndef GPLOT_CMD_SPLOT 
-#define GPLOT_CMD_SPLOT  "sp"
-#endif
-
-#ifndef GPLOT_CMD_USING
-#define GPLOT_CMD_USING  "u"
-#endif
-
-#ifndef GPLOT_CMD_WITH 
-#define GPLOT_CMD_WITH   "w"
-#endif
-
-#ifndef GPLOT_CMD_TITLE
-#define GPLOT_CMD_TITLE  "t"
-#endif
-
-#ifndef GPLOT_CMD_END
-#define GPLOT_CMD_END "\n"
-#endif
+// Gnuplot command strings that we use.
+static string Vgnuplot_command_plot;
+static string Vgnuplot_command_replot;
+static string Vgnuplot_command_splot;
+static string Vgnuplot_command_using;
+static string Vgnuplot_command_with;
+static string Vgnuplot_command_title;
+static string Vgnuplot_command_end;
 
 static void
 plot_stream_death_handler (pid_t pid, int)
@@ -210,7 +188,8 @@
       *plot_stream << "set data style lines\n";
 
       if (gnuplot_terminal_type)
-	*plot_stream << "set term " << gnuplot_terminal_type << GPLOT_CMD_END;
+	*plot_stream << "set term " << gnuplot_terminal_type
+		     << Vgnuplot_command_end; 
     }
 }
 
@@ -225,13 +204,13 @@
 	return -1;
     }
 
-  int replot_len = strlen (GPLOT_CMD_REPLOT);
-  int splot_len = strlen (GPLOT_CMD_SPLOT);
-  int plot_len = strlen (GPLOT_CMD_PLOT);
+  int replot_len = Vgnuplot_command_replot.length ();
+  int splot_len = Vgnuplot_command_splot.length ();
+  int plot_len = Vgnuplot_command_plot.length ();
 
-  bool is_replot = (strncmp (cmd, GPLOT_CMD_REPLOT, replot_len) == 0);
-  bool is_splot = (strncmp (cmd, GPLOT_CMD_SPLOT, splot_len) == 0);
-  bool is_plot = (strncmp (cmd, GPLOT_CMD_PLOT, plot_len) == 0);
+  bool is_replot = (Vgnuplot_command_replot.compare (cmd, 0, replot_len) == 0);
+  bool is_splot = (Vgnuplot_command_splot.compare (cmd, 0, splot_len) == 0);
+  bool is_plot = (Vgnuplot_command_plot.compare (cmd, 0, plot_len) == 0);
 
   if (plot_line_count == 0 && is_replot)
     error ("replot: no previous plot");
@@ -242,7 +221,7 @@
       if (! (is_replot || is_splot || is_plot)
 	  && plot_line_count > 0
 	  && Vautomatic_replot)
-	*plot_stream << GPLOT_CMD_REPLOT << GPLOT_CMD_END;
+	*plot_stream << Vgnuplot_command_replot << Vgnuplot_command_end;
 
       plot_stream->flush ();
     }
@@ -274,7 +253,7 @@
       if (plot_line_count == 0)
 	{
 	  if (plot_list)
-	    plot_buf << GPLOT_CMD_PLOT;
+	    plot_buf << Vgnuplot_command_plot;
 	  else
 	    {
 	      ::error ("replot: must have something to plot");
@@ -282,27 +261,27 @@
 	    }
 	}
       else
-	plot_buf << GPLOT_CMD_REPLOT;
+	plot_buf << Vgnuplot_command_replot;
       break;
 
     case 2:
       if (clear_before_plotting || plot_line_count == 0)
 	{
 	  plot_line_count = 0;
-	  plot_buf << GPLOT_CMD_PLOT;
+	  plot_buf << Vgnuplot_command_plot;
 	}
       else
-	plot_buf << GPLOT_CMD_REPLOT;
+	plot_buf << Vgnuplot_command_replot;
       break;
 
     case 3:
       if (clear_before_plotting || plot_line_count == 0)
 	{
 	  plot_line_count = 0;
-	  plot_buf << GPLOT_CMD_SPLOT;
+	  plot_buf << Vgnuplot_command_splot;
 	}
       else
-	plot_buf << GPLOT_CMD_REPLOT;
+	plot_buf << Vgnuplot_command_replot;
       break;
 
     default:
@@ -330,7 +309,7 @@
 	return;
     }
 
-  plot_buf << GPLOT_CMD_END << ends;
+  plot_buf << Vgnuplot_command_end << ends;
 
   // Just testing...
   //  char *message = plot_buf.str ();
@@ -532,7 +511,7 @@
   for (int i = 0; i < qual_count; i++)
     {
       if (i == 0)
-	plot_buf << " " << GPLOT_CMD_USING << " ";
+	plot_buf << " " << Vgnuplot_command_using << " ";
       else
 	plot_buf << ":";
 
@@ -559,7 +538,7 @@
 {
   if (! sp_style.empty ())
     {
-      plot_buf << " " << GPLOT_CMD_WITH << " " << sp_style;
+      plot_buf << " " << Vgnuplot_command_with << " " << sp_style;
 
       if (sp_linetype)
 	{
@@ -786,17 +765,17 @@
       octave_value tmp = sp_title_clause->rvalue ();
 
       if (! error_state && tmp.is_string ())
-	plot_buf << " " << GPLOT_CMD_TITLE << " "
+	plot_buf << " " << Vgnuplot_command_title << " "
 	  << '"' << tmp.string_value () << '"';
       else
 	{
 	  warning ("line title must be a string");
-	  plot_buf << " " << GPLOT_CMD_TITLE << " "
+	  plot_buf << " " << Vgnuplot_command_title << " "
 	    << '"' << "line " << plot_line_count << '"';
 	}
     }
   else
-    plot_buf << " " << GPLOT_CMD_TITLE << " "
+    plot_buf << " " << Vgnuplot_command_title << " "
       << '"' << "line " << plot_line_count << '"';
 
   if (sp_style_clause)
@@ -925,7 +904,7 @@
   if (plot_stream && *plot_stream)
     {
       ostrstream plot_buf;
-      plot_buf << "cd \"" << newdir << "\"" GPLOT_CMD_END << ends;
+      plot_buf << "cd \"" << newdir << "\"" << Vgnuplot_command_end << ends;
       char *message = plot_buf.str ();
       send_to_plot_stream (message);
       delete [] message;
@@ -1048,7 +1027,7 @@
 	  ostrstream buf;
 	  for (int i = 2; i < argc; i++)
 	    buf << argv[i] << " ";
-	  buf << GPLOT_CMD_END << ends;
+	  buf << Vgnuplot_command_end << ends;
 	  gnuplot_terminal_type = buf.str ();
 	}
     }
@@ -1056,7 +1035,7 @@
   for (int i = 0; i < argc; i++)
     plot_buf << argv[i] << " ";
 
-  plot_buf << GPLOT_CMD_END << ends;
+  plot_buf << Vgnuplot_command_end << ends;
 
   char *plot_command = plot_buf.str ();
   send_to_plot_stream (plot_command);
@@ -1092,7 +1071,7 @@
   for (int i = 0; i < argc; i++)
     plot_buf << argv[i] << " ";
 
-  plot_buf << GPLOT_CMD_END << ends;
+  plot_buf << Vgnuplot_command_end << ends;
 
   char *plot_command = plot_buf.str ();
   send_to_plot_stream (plot_command);
@@ -1117,22 +1096,70 @@
   return 0;
 }
 
-int
-gnuplot_binary (void)
+static int
+set_string_var (string& var, const char *nm)
 {
-  int status = 0;
+  int retval = 0;
 
-  string s = builtin_string_variable ("gnuplot_binary");
+  string s = builtin_string_variable (nm);
 
   if (s.empty ())
     {
-      gripe_invalid_value_specified ("gnuplot_binary");
-      status = -1;
+      gripe_invalid_value_specified (nm);
+      retval = -1;
     }
   else
-    Vgnuplot_binary = s;
+    var = s;
+
+  return retval;
+}
+
+static int
+gnuplot_binary (void)
+{
+  return set_string_var (Vgnuplot_binary, "gnuplot_binary");
+}
+
+static int
+gnuplot_command_plot (void)
+{
+  return set_string_var (Vgnuplot_command_plot, "gnuplot_command_plot");
+}
+
+static int
+gnuplot_command_replot (void)
+{
+  return set_string_var (Vgnuplot_command_replot, "gnuplot_command_replot");
+}
 
-  return status;
+static int
+gnuplot_command_splot (void)
+{
+  return set_string_var (Vgnuplot_command_splot, "gnuplot_command_splot");
+}
+
+static int
+gnuplot_command_using (void)
+{
+  return set_string_var (Vgnuplot_command_using, "gnuplot_command_using");
+}
+
+static int
+gnuplot_command_with (void)
+{
+  return set_string_var (Vgnuplot_command_with, "gnuplot_command_with");
+}
+
+static int
+gnuplot_command_title (void)
+{
+  return set_string_var (Vgnuplot_command_title, "gnuplot_command_title");
+}
+
+static int
+gnuplot_command_end (void)
+{
+  return set_string_var (Vgnuplot_command_end, "gnuplot_command_end");
 }
 
 static int
@@ -1160,6 +1187,27 @@
   DEFVAR (gnuplot_binary, "gnuplot", 0, gnuplot_binary,
     "path to gnuplot binary");
 
+  DEFVAR (gnuplot_command_plot, "pl", 0, gnuplot_command_plot,
+    "");
+
+  DEFVAR (gnuplot_command_replot, "rep", 0, gnuplot_command_replot,
+    "");
+
+  DEFVAR (gnuplot_command_splot, "sp", 0, gnuplot_command_splot,
+    "");
+
+  DEFVAR (gnuplot_command_using, "u", 0, gnuplot_command_using,
+    "");
+
+  DEFVAR (gnuplot_command_with, "w", 0, gnuplot_command_with,
+    "");
+
+  DEFVAR (gnuplot_command_title, "t", 0, gnuplot_command_title,
+    "");
+
+  DEFVAR (gnuplot_command_end, "\n", 0, gnuplot_command_end,
+    "");
+
 #ifdef GNUPLOT_HAS_FRAMES
   double with_frames = 1.0;
 #else
--- a/src/sighandlers.cc
+++ b/src/sighandlers.cc
@@ -89,6 +89,12 @@
   do { } while (0)
 #endif
 
+#if defined (SIGABRT)
+#define OCTAVE_MEMORY_EXHAUSTED_ERROR SIGABRT
+#else
+#define OCTAVE_MEMORY_EXHAUSTED_ERROR (-1)
+#endif
+
 void
 octave_save_signal_mask (void)
 {
@@ -128,7 +134,14 @@
 
       save_user_variables ();
 
-      clean_up_and_exit (sig_number);
+      if (sig_number < 0)
+	exit (1);
+      else
+	{
+	  octave_set_signal_handler (sig_number, SIG_DFL);
+
+	  kill (getpid (), sig_number);
+	}
     }
 }
 
@@ -145,7 +158,7 @@
       panic_impossible ();
     }
   else
-    my_friendly_exit ("operator new", 1);
+    my_friendly_exit ("operator new", OCTAVE_MEMORY_EXHAUSTED_ERROR);
 }
 
 sig_handler *
--- a/src/toplev.cc
+++ b/src/toplev.cc
@@ -167,7 +167,7 @@
 // Fix up things before exiting.
 
 void
-clean_up_and_exit (int retval)
+clean_up_for_exit (void)
 {
   command_editor::restore_terminal_state ();
 
@@ -184,16 +184,14 @@
 
   if (!quitting_gracefully && (interactive || forced_interactive))
     cout << "\n";
-
-  if (retval == EOF)
-    retval = 0;
+}
 
-  exit (retval);
+void
+clean_up_and_exit (int retval)
+{
+  clean_up_for_exit ();
 
-  // This is bogus but should prevent g++ from giving a warning saying
-  // that this volatile function does return.
-
-  panic_impossible ();
+  exit (retval == EOF ? 0 : retval);
 }
 
 DEFUN_TEXT (casesen, args, ,
--- a/src/toplev.h
+++ b/src/toplev.h
@@ -34,6 +34,9 @@
 #include <string>
 
 extern void
+clean_up_and_exit (void);
+
+extern void
 clean_up_and_exit (int) GCC_ATTR_NORETURN;
 
 extern int
--- a/src/variables.cc
+++ b/src/variables.cc
@@ -26,6 +26,7 @@
 
 #include <cstdio>
 #include <cstring>
+#include <ctime>
 
 #include <string>
 
@@ -513,9 +514,9 @@
 
 	      string fname = fcn_file_in_path (ff);
 
-	      int status = file_stat::is_newer (fname, tp);
+	      file_stat fs (fname);
 
-	      if (status > 0)
+	      if (fs && fs.is_newer (tp))
 		retval = true;
 	    }
 	}
--- a/src/xpow.cc
+++ b/src/xpow.cc
@@ -446,6 +446,20 @@
 //
 //   * -> not needed.
 
+// XXX FIXME XXX -- these functions need to be fixed so that things
+// like
+//
+//   a = -1; b = [ 0, 0.5, 1 ]; r = a .^ b
+//
+// and
+//
+//   a = -1; b = [ 0, 0.5, 1 ]; for i = 1:3, r(i) = a .^ b(i), end
+//
+// produce identical results.  Also, it would be nice if -1^0.5
+// produced a pure imaginary result instead of a complex number with a
+// small real part.  But perhaps that's really a problem with the math
+// library...
+
 // -*- 1 -*-
 octave_value
 elem_xpow (double a, const Matrix& b)
@@ -455,9 +469,9 @@
   int nr = b.rows ();
   int nc = b.cols ();
 
-  // For now, assume the worst.
+  double d1, d2;
 
-  if (a < 0.0)
+  if (a < 0.0 && ! b.all_integers (d1, d2))
     {
       Complex atmp (a);
       ComplexMatrix result (nr, nc);
--- a/test/ChangeLog
+++ b/test/ChangeLog
@@ -1,3 +1,12 @@
+Thu Mar  5 20:35:26 1998  John W. Eaton  <jwe@bevo.che.wisc.edu>
+
+	* octave.test/system/gmtime-1.m, octave.test/system/localtime-1.m:
+	Not all systems have time zone info in the struct.
+
+Mon Mar  2 14:36:50 1998  John W. Eaton  <jwe@bevo.che.wisc.edu>
+
+	* octave.test/io/binary-io-1.m (id): Use binary flag in fopen call.
+
 Wed Apr  2 21:59:15 1997  John W. Eaton  <jwe@bevo.che.wisc.edu>
 
 	* octave.test/prefer/prefer.exp: Delete prefer-36 and prefer-37.
--- a/test/octave.test/io/binary-io-1.m
+++ b/test/octave.test/io/binary-io-1.m
@@ -9,7 +9,7 @@
 
 nm = tmpnam ();
 
-id = fopen (nm, "w");
+id = fopen (nm, "wb");
 
 if (id > 0)
 
@@ -19,7 +19,7 @@
 
   fclose (id);
 
-  id = fopen (nm, "r");
+  id = fopen (nm, "rb");
 
   if (id > 0)
 
--- a/test/octave.test/system/gmtime-1.m
+++ b/test/octave.test/system/gmtime-1.m
@@ -5,7 +5,6 @@
  && struct_contains (ts, "mon")
  && struct_contains (ts, "mday")
  && struct_contains (ts, "sec")
- && struct_contains (ts, "zone")
  && struct_contains (ts, "min")
  && struct_contains (ts, "wday")
  && struct_contains (ts, "hour")
--- a/test/octave.test/system/localtime-1.m
+++ b/test/octave.test/system/localtime-1.m
@@ -5,7 +5,6 @@
  && struct_contains (ts, "mon")
  && struct_contains (ts, "mday")
  && struct_contains (ts, "sec")
- && struct_contains (ts, "zone")
  && struct_contains (ts, "min")
  && struct_contains (ts, "wday")
  && struct_contains (ts, "hour")