changeset 3747:50f30e40abca

[project @ 2000-12-07 05:47:06 by jwe]
author jwe
date Thu, 07 Dec 2000 05:47:07 +0000
parents c82ab37998aa
children 599fb10b454d
files src/ChangeLog src/DLD-FUNCTIONS/dassl.cc src/DLD-FUNCTIONS/fsolve.cc src/DLD-FUNCTIONS/lsode.cc src/DLD-FUNCTIONS/minmax.cc src/DLD-FUNCTIONS/quad.cc src/help.cc
diffstat 7 files changed, 299 insertions(+), 427 deletions(-) [+]
line wrap: on
line diff
--- a/src/ChangeLog	Thu Nov 30 01:11:42 2000 +0000
+++ b/src/ChangeLog	Thu Dec 07 05:47:07 2000 +0000
@@ -1,3 +1,26 @@
+2000-12-06  John W. Eaton  <jwe@bevo.che.wisc.edu>
+
+	* DLD-FUNCTIONS/minmax.cc (EMPTY_RETURN_CHECK): New macro.
+	(min, max): Use it.
+
+	* DLD-FUNCTIONS/minmax.cc (MINMAX_BODY): New macro.  If single arg
+	is empty, return empty matrix result and empty matrix for index.
+	(Fmin, Fmax): Use MINMAX_BODY, so we have consistent definition
+	for min and max functions.
+
+2000-11-30  Joerg Specht  <joerg.specht@ins.uni-stuttgart.de>
+
+	* help.cc (display_help_text): Append new line at end of doc string.
+
+2000-11-30  John W. Eaton  <jwe@bevo.che.wisc.edu>
+
+	* DLD-FUNCTIONS/lsode.cc (LSODE_ABORT1, LSODE_ABORT2): Omit `##'
+	in macro definition since they are not needed to paste strings
+	together and picky compilers choke on them.
+	* DLD-FUNCTIONS/quad.cc (QUAD_ABORT1, QUAD_ABORT2): Likewise.
+	* DLD-FUNCTIONS/fsolve.cc (FSOLVE_ABORT1, FSOLVE_ABORT2): Likewise.
+	* DLD-FUNCTIONS/dassl.cc (DASSL_ABORT1, DASSL_ABORT2): Likewise.
+
 2000-11-29  John W. Eaton  <jwe@bevo.che.wisc.edu>
 
 	* mkbuiltins (XDEFUNX_INTERNAL): New macro.
--- a/src/DLD-FUNCTIONS/dassl.cc	Thu Nov 30 01:11:42 2000 +0000
+++ b/src/DLD-FUNCTIONS/dassl.cc	Thu Dec 07 05:47:07 2000 +0000
@@ -120,7 +120,7 @@
 #define DASSL_ABORT1(msg) \
   do \
     { \
-      ::error ("dassl: " ## msg); \
+      ::error ("dassl: " msg); \
       DASSL_ABORT (); \
     } \
   while (0)
@@ -128,7 +128,7 @@
 #define DASSL_ABORT2(fmt, arg) \
   do \
     { \
-      ::error ("dassl: " ## fmt, arg); \
+      ::error ("dassl: " fmt, arg); \
       DASSL_ABORT (); \
     } \
   while (0)
--- a/src/DLD-FUNCTIONS/fsolve.cc	Thu Nov 30 01:11:42 2000 +0000
+++ b/src/DLD-FUNCTIONS/fsolve.cc	Thu Dec 07 05:47:07 2000 +0000
@@ -136,7 +136,7 @@
 #define FSOLVE_ABORT1(msg) \
   do \
     { \
-      ::error ("fsolve: " ## msg); \
+      ::error ("fsolve: " msg); \
       FSOLVE_ABORT (); \
     } \
   while (0)
@@ -144,7 +144,7 @@
 #define FSOLVE_ABORT2(fmt, arg) \
   do \
     { \
-      ::error ("fsolve: " ## fmt, arg); \
+      ::error ("fsolve: " fmt, arg); \
       FSOLVE_ABORT (); \
     } \
   while (0)
--- a/src/DLD-FUNCTIONS/lsode.cc	Thu Nov 30 01:11:42 2000 +0000
+++ b/src/DLD-FUNCTIONS/lsode.cc	Thu Dec 07 05:47:07 2000 +0000
@@ -144,7 +144,7 @@
 #define LSODE_ABORT1(msg) \
   do \
     { \
-      ::error ("lsode: " ## msg); \
+      ::error ("lsode: " msg); \
       LSODE_ABORT (); \
     } \
   while (0)
@@ -152,7 +152,7 @@
 #define LSODE_ABORT2(fmt, arg) \
   do \
     { \
-      ::error ("lsode: " ## fmt, arg); \
+      ::error ("lsode: " fmt, arg); \
       LSODE_ABORT (); \
     } \
   while (0)
--- a/src/DLD-FUNCTIONS/minmax.cc	Thu Nov 30 01:11:42 2000 +0000
+++ b/src/DLD-FUNCTIONS/minmax.cc	Thu Dec 07 05:47:07 2000 +0000
@@ -37,12 +37,18 @@
 // XXX FIXME XXX -- it would be nice to share code among the min/max
 // functions below.
 
+#define EMPTY_RETURN_CHECK(T) \
+  if (nr == 0 || nc == 0) \
+    return T (0, 0)
+
 static Matrix
 min (double d, const Matrix& m)
 {
   int nr = m.rows ();
   int nc = m.columns ();
 
+  EMPTY_RETURN_CHECK (Matrix);
+
   Matrix result (nr, nc);
 
   for (int j = 0; j < nc; j++)
@@ -58,6 +64,8 @@
   int nr = m.rows ();
   int nc = m.columns ();
 
+  EMPTY_RETURN_CHECK (Matrix);
+
   Matrix result (nr, nc);
 
   for (int j = 0; j < nc; j++)
@@ -73,6 +81,8 @@
   int nr = m.rows ();
   int nc = m.columns ();
 
+  EMPTY_RETURN_CHECK (ComplexMatrix);
+
   ComplexMatrix result (nr, nc);
 
   for (int j = 0; j < nc; j++)
@@ -88,6 +98,8 @@
   int nr = m.rows ();
   int nc = m.columns ();
 
+  EMPTY_RETURN_CHECK (ComplexMatrix);
+
   ComplexMatrix result (nr, nc);
 
   for (int j = 0; j < nc; j++)
@@ -102,12 +114,15 @@
 {
   int nr = a.rows ();
   int nc = a.columns ();
+
   if (nr != b.rows () || nc != b.columns ())
     {
       error ("two-arg min expecting args of same size");
       return Matrix ();
     }
 
+  EMPTY_RETURN_CHECK (Matrix);
+
   Matrix result (nr, nc);
 
   for (int j = 0; j < nc; j++)
@@ -122,12 +137,15 @@
 {
   int nr = a.rows ();
   int nc = a.columns ();
+
   if (nr != b.rows () || nc != b.columns ())
     {
       error ("two-arg min expecting args of same size");
       return ComplexMatrix ();
     }
 
+  EMPTY_RETURN_CHECK (ComplexMatrix);
+
   ComplexMatrix result (nr, nc);
 
   for (int j = 0; j < nc; j++)
@@ -161,6 +179,8 @@
   int nr = m.rows ();
   int nc = m.columns ();
 
+  EMPTY_RETURN_CHECK (Matrix);
+
   Matrix result (nr, nc);
 
   for (int j = 0; j < nc; j++)
@@ -176,6 +196,8 @@
   int nr = m.rows ();
   int nc = m.columns ();
 
+  EMPTY_RETURN_CHECK (Matrix);
+
   Matrix result (nr, nc);
 
   for (int j = 0; j < nc; j++)
@@ -191,6 +213,8 @@
   int nr = m.rows ();
   int nc = m.columns ();
 
+  EMPTY_RETURN_CHECK (ComplexMatrix);
+
   ComplexMatrix result (nr, nc);
 
   for (int j = 0; j < nc; j++)
@@ -206,6 +230,8 @@
   int nr = m.rows ();
   int nc = m.columns ();
 
+  EMPTY_RETURN_CHECK (ComplexMatrix);
+
   ComplexMatrix result (nr, nc);
 
   for (int j = 0; j < nc; j++)
@@ -220,12 +246,15 @@
 {
   int nr = a.rows ();
   int nc = a.columns ();
+
   if (nr != b.rows () || nc != b.columns ())
     {
       error ("two-arg max expecting args of same size");
       return Matrix ();
     }
 
+  EMPTY_RETURN_CHECK (Matrix);
+
   Matrix result (nr, nc);
 
   for (int j = 0; j < nc; j++)
@@ -240,12 +269,15 @@
 {
   int nr = a.rows ();
   int nc = a.columns ();
+
   if (nr != b.rows () || nc != b.columns ())
     {
       error ("two-arg max expecting args of same size");
       return ComplexMatrix ();
     }
 
+  EMPTY_RETURN_CHECK (ComplexMatrix);
+
   ComplexMatrix result (nr, nc);
 
   for (int j = 0; j < nc; j++)
@@ -273,6 +305,239 @@
   return result;
 }
 
+#define MINMAX_BODY(FCN) \
+ \
+  octave_value_list retval;  \
+ \
+  int nargin = args.length (); \
+ \
+  if (nargin < 1 || nargin > 2 || nargout > 2) \
+    { \
+      print_usage (#FCN); \
+      return retval; \
+    } \
+ \
+  octave_value arg1; \
+  octave_value arg2; \
+ \
+  switch (nargin) \
+    { \
+    case 2: \
+      arg2 = args(1); \
+ \
+    case 1: \
+      arg1 = args(0); \
+      break; \
+ \
+    default: \
+      panic_impossible (); \
+      break; \
+    } \
+ \
+  if (nargin == 1 && (nargout == 1 || nargout == 0)) \
+    { \
+      if (arg1.is_real_type ()) \
+	{ \
+	  Matrix m = arg1.matrix_value (); \
+ \
+	  if (! error_state) \
+	    { \
+	      if (m.rows () == 1) \
+		retval(0) = m.row_ ## FCN (); \
+	      else \
+		{ \
+		  if (m.rows () == 0 || m.columns () == 0) \
+		    retval(0) = Matrix (); \
+		  else \
+		    retval(0) = m.column_ ## FCN (); \
+		} \
+	    } \
+	} \
+      else if (arg1.is_complex_type ()) \
+	{ \
+	  ComplexMatrix m = arg1.complex_matrix_value (); \
+ \
+	  if (! error_state) \
+	    { \
+	      if (m.rows () == 1) \
+		retval(0) = m.row_ ## FCN (); \
+	      else \
+		{ \
+		  if (m.rows () == 0 || m.columns () == 0) \
+		    retval(0) = Matrix (); \
+		  else \
+		    retval(0) = m.column_ ## FCN (); \
+		} \
+	    } \
+	} \
+      else \
+	gripe_wrong_type_arg (#FCN, arg1); \
+    } \
+  else if (nargin == 1 && nargout == 2) \
+    { \
+      Array<int> index; \
+ \
+      if (arg1.is_real_type ()) \
+	{ \
+	  Matrix m = arg1.matrix_value (); \
+ \
+	  if (! error_state) \
+	    { \
+	      retval.resize (2); \
+ \
+	      if (m.rows () == 1) \
+		retval(0) = m.row_ ## FCN (index); \
+	      else \
+		{ \
+		  if (m.rows () == 0 || m.columns () == 0) \
+		    retval(0) = Matrix (); \
+		  else \
+		    retval(0) = m.column_ ## FCN (index); \
+		} \
+	    } \
+	} \
+      else if (arg1.is_complex_type ()) \
+	{ \
+	  ComplexMatrix m = arg1.complex_matrix_value (); \
+ \
+	  if (! error_state) \
+	    { \
+	      retval.resize (2); \
+ \
+	      if (m.rows () == 1) \
+		retval(0) = m.row_ ## FCN (index); \
+	      else \
+		{ \
+		  if (m.rows () == 0 || m.columns () == 0) \
+		    retval(0) = Matrix (); \
+		  else \
+		    retval(0) = m.column_ ## FCN (index); \
+		} \
+	    } \
+	} \
+      else \
+	gripe_wrong_type_arg (#FCN, arg1); \
+ \
+      int len = index.length (); \
+ \
+      if (len > 0) \
+	{ \
+	  RowVector idx (len); \
+ \
+	  for (int i = 0; i < len; i++) \
+	    { \
+	      int tmp = index.elem (i) + 1; \
+	      idx.elem (i) = (tmp <= 0) \
+		? octave_NaN : static_cast<double> (tmp); \
+	    } \
+ \
+	  retval(1) = idx; \
+	} \
+      else \
+	retval(1) = Matrix (); \
+    } \
+  else if (nargin == 2) \
+    { \
+      int arg1_is_scalar = arg1.is_scalar_type (); \
+      int arg2_is_scalar = arg2.is_scalar_type (); \
+ \
+      int arg1_is_complex = arg1.is_complex_type (); \
+      int arg2_is_complex = arg2.is_complex_type (); \
+ \
+      if (arg1_is_scalar) \
+	{ \
+	  if (arg1_is_complex || arg2_is_complex) \
+	    { \
+	      Complex c1 = arg1.complex_value (); \
+	      ComplexMatrix m2 = arg2.complex_matrix_value (); \
+	      if (! error_state) \
+		{ \
+		  ComplexMatrix result = FCN (c1, m2); \
+		  if (! error_state) \
+		    retval(0) = result; \
+		} \
+	    } \
+	  else \
+	    { \
+	      double d1 = arg1.double_value (); \
+	      Matrix m2 = arg2.matrix_value (); \
+ \
+	      if (! error_state) \
+		{ \
+		  Matrix result = FCN (d1, m2); \
+		  if (! error_state) \
+		    retval(0) = result; \
+		} \
+	    } \
+	} \
+      else if (arg2_is_scalar) \
+	{ \
+	  if (arg1_is_complex || arg2_is_complex) \
+	    { \
+	      ComplexMatrix m1 = arg1.complex_matrix_value (); \
+ \
+	      if (! error_state) \
+		{ \
+		  Complex c2 = arg2.complex_value (); \
+		  ComplexMatrix result = FCN (m1, c2); \
+		  if (! error_state) \
+		    retval(0) = result; \
+		} \
+	    } \
+	  else \
+	    { \
+	      Matrix m1 = arg1.matrix_value (); \
+ \
+	      if (! error_state) \
+		{ \
+		  double d2 = arg2.double_value (); \
+		  Matrix result = FCN (m1, d2); \
+		  if (! error_state) \
+		    retval(0) = result; \
+		} \
+	    } \
+	} \
+      else \
+	{ \
+	  if (arg1_is_complex || arg2_is_complex) \
+	    { \
+	      ComplexMatrix m1 = arg1.complex_matrix_value (); \
+ \
+	      if (! error_state) \
+		{ \
+		  ComplexMatrix m2 = arg2.complex_matrix_value (); \
+ \
+		  if (! error_state) \
+		    { \
+		      ComplexMatrix result = FCN (m1, m2); \
+		      if (! error_state) \
+			retval(0) = result; \
+		    } \
+		} \
+	    } \
+	  else \
+	    { \
+	      Matrix m1 = arg1.matrix_value (); \
+ \
+	      if (! error_state) \
+		{ \
+		  Matrix m2 = arg2.matrix_value (); \
+ \
+		  if (! error_state) \
+		    { \
+		      Matrix result = FCN (m1, m2); \
+		      if (! error_state) \
+			retval(0) = result; \
+		    } \
+		} \
+	    } \
+	} \
+    } \
+  else \
+    panic_impossible (); \
+ \
+  return retval
+
 DEFUN_DLD (min, args, nargout,
   "-*- texinfo -*-\n\
 For a vector argument, return the minimum value.  For a matrix\n\
@@ -298,215 +563,7 @@
 @noindent\n\
 returns @var{x} = 0 and @var{ix} = 3.")
 {
-  octave_value_list retval;
-
-  int nargin = args.length ();
-
-  if (nargin < 1 || nargin > 2 || nargout > 2)
-    {
-      print_usage ("min");
-      return retval;
-    }
-
-  octave_value arg1;
-  octave_value arg2;
-
-  switch (nargin)
-    {
-    case 2:
-      arg2 = args(1);
-      // Fall through...
-
-    case 1:
-      arg1 = args(0);
-      break;
-
-    default:
-      panic_impossible ();
-      break;
-    }
-
-  if (nargin == 1 && (nargout == 1 || nargout == 0))
-    {
-      if (arg1.is_real_type ())
-	{
-	  Matrix m = arg1.matrix_value ();
-
-	  if (! error_state)
-	    {
-	      if (m.rows () == 1)
-		retval(0) = m.row_min ();
-	      else
-		retval(0) = m.column_min ();
-	    }
-	}
-      else if (arg1.is_complex_type ())
-	{
-	  ComplexMatrix m = arg1.complex_matrix_value ();
-
-	  if (! error_state)
-	    {
-	      if (m.rows () == 1)
-		retval(0) = m.row_min ();
-	      else
-		retval(0) = m.column_min ();
-	    }
-	}
-      else
-	gripe_wrong_type_arg ("min", arg1);
-    }
-  else if (nargin == 1 && nargout == 2)
-    {
-      Array<int> index;
-
-      if (arg1.is_real_type ())
-	{
-	  Matrix m = arg1.matrix_value ();
-
-	  if (! error_state)
-	    {
-	      retval.resize (2);
-
-	      if (m.rows () == 1)
-		retval(0) = m.row_min (index);
-	      else
-		retval(0) = m.column_min (index);
-	    }
-	}
-      else if (arg1.is_complex_type ())
-	{
-	  ComplexMatrix m = arg1.complex_matrix_value ();
-
-	  if (! error_state)
-	    {
-	      retval.resize (2);
-
-	      if (m.rows () == 1)
-		retval(0) = m.row_min (index);
-	      else
-		retval(0) = m.column_min (index);
-	    }
-	}
-      else
-	gripe_wrong_type_arg ("min", arg1);
-
-      int len = index.length ();
-
-      if (len > 0)
-	{
-	  RowVector idx (len);
-
-	  for (int i = 0; i < len; i++)
-	    {
-	      int tmp = index.elem (i) + 1;
-	      idx.elem (i) = (tmp <= 0)
-		? octave_NaN : static_cast<double> (tmp);
-	    }
-
-	  retval(1) = idx;
-	}
-    }
-  else if (nargin == 2)
-    {
-      int arg1_is_scalar = arg1.is_scalar_type ();
-      int arg2_is_scalar = arg2.is_scalar_type ();
-
-      int arg1_is_complex = arg1.is_complex_type ();
-      int arg2_is_complex = arg2.is_complex_type ();
-
-      if (arg1_is_scalar)
-	{
-	  if (arg1_is_complex || arg2_is_complex)
-	    {
-	      Complex c1 = arg1.complex_value ();
-	      ComplexMatrix m2 = arg2.complex_matrix_value ();
-	      if (! error_state)
-		{
-		  ComplexMatrix result = min (c1, m2);
-		  if (! error_state)
-		    retval(0) = result;
-		}
-	    }
-	  else
-	    {
-	      double d1 = arg1.double_value ();
-	      Matrix m2 = arg2.matrix_value ();
-
-	      if (! error_state)
-		{
-		  Matrix result = min (d1, m2);
-		  if (! error_state)
-		    retval(0) = result;
-		}
-	    }
-	}
-      else if (arg2_is_scalar)
-	{
-	  if (arg1_is_complex || arg2_is_complex)
-	    {
-	      ComplexMatrix m1 = arg1.complex_matrix_value ();
-
-	      if (! error_state)
-		{
-		  Complex c2 = arg2.complex_value ();
-		  ComplexMatrix result = min (m1, c2);
-		  if (! error_state)
-		    retval(0) = result;
-		}
-	    }
-	  else
-	    {
-	      Matrix m1 = arg1.matrix_value ();
-
-	      if (! error_state)
-		{
-		  double d2 = arg2.double_value ();
-		  Matrix result = min (m1, d2);
-		  if (! error_state)
-		    retval(0) = result;
-		}
-	    }
-	}
-      else
-	{
-	  if (arg1_is_complex || arg2_is_complex)
-	    {
-	      ComplexMatrix m1 = arg1.complex_matrix_value ();
-
-	      if (! error_state)
-		{
-		  ComplexMatrix m2 = arg2.complex_matrix_value ();
-
-		  if (! error_state)
-		    {
-		      ComplexMatrix result = min (m1, m2);
-		      if (! error_state)
-			retval(0) = result;
-		    }
-		}
-	    }
-	  else
-	    {
-	      Matrix m1 = arg1.matrix_value ();
-
-	      if (! error_state)
-		{
-		  Matrix m2 = arg2.matrix_value ();
-
-		  if (! error_state)
-		    {
-		      Matrix result = min (m1, m2);
-		      if (! error_state)
-			retval(0) = result;
-		    }
-		}
-	    }
-	}
-    }
-  else
-    panic_impossible ();
-
-  return retval;
+  MINMAX_BODY (min);
 }
 
 DEFUN_DLD (max, args, nargout,
@@ -534,215 +591,7 @@
 @noindent\n\
 returns @var{x} = 5 and @var{ix} = 3.")
 {
-  octave_value_list retval;
-
-  int nargin = args.length ();
-
-  if (nargin < 1 || nargin > 2 || nargout > 2)
-    {
-      print_usage ("max");
-      return retval;
-    }
-
-  octave_value arg1;
-  octave_value arg2;
-
-  switch (nargin)
-    {
-    case 2:
-      arg2 = args(1);
-      // Fall through...
-
-    case 1:
-      arg1 = args(0);
-      break;
-
-    default:
-      panic_impossible ();
-      break;
-    }
-
-  if (nargin == 1 && (nargout == 1 || nargout == 0))
-    {
-      if (arg1.is_real_type ())
-	{
-	  Matrix m = arg1.matrix_value ();
-
-	  if (! error_state)
-	    {
-	      if (m.rows () == 1)
-		retval(0) = m.row_max ();
-	      else
-		retval(0) = m.column_max ();
-	    }
-	}
-      else if (arg1.is_complex_type ())
-	{
-	  ComplexMatrix m = arg1.complex_matrix_value ();
-
-	  if (! error_state)
-	    {
-	      if (m.rows () == 1)
-		retval(0) = m.row_max ();
-	      else
-		retval(0) = m.column_max ();
-	    }
-	}
-      else
-	gripe_wrong_type_arg ("max", arg1);
-    }
-  else if (nargin == 1 && nargout == 2)
-    {
-      Array<int> index;
-
-      if (arg1.is_real_type ())
-	{
-	  Matrix m = arg1.matrix_value ();
-
-	  if (! error_state)
-	    {
-	      retval.resize (2);
-
-	      if (m.rows () == 1)
-		retval(0) = m.row_max (index);
-	      else
-		retval(0) = m.column_max (index);
-	    }
-	}
-      else if (arg1.is_complex_type ())
-	{
-	  ComplexMatrix m = arg1.complex_matrix_value ();
-
-	  if (! error_state)
-	    {
-	      retval.resize (2);
-
-	      if (m.rows () == 1)
-		retval(0) = m.row_max (index);
-	      else
-		retval(0) = m.column_max (index);
-	    }
-	}
-      else
-	gripe_wrong_type_arg ("max", arg1);
-
-      int len = index.length ();
-
-      if (len > 0)
-	{
-	  RowVector idx (len);
-
-	  for (int i = 0; i < len; i++)
-	    {
-	      int tmp = index.elem (i) + 1;
-	      idx.elem (i) = (tmp <= 0)
-		? octave_NaN : static_cast<double> (tmp);
-	    }
-
-	  retval(1) = idx;
-	}
-    }
-  else if (nargin == 2)
-    {
-      int arg1_is_scalar = arg1.is_scalar_type ();
-      int arg2_is_scalar = arg2.is_scalar_type ();
-
-      int arg1_is_complex = arg1.is_complex_type ();
-      int arg2_is_complex = arg2.is_complex_type ();
-
-      if (arg1_is_scalar)
-	{
-	  if (arg1_is_complex || arg2_is_complex)
-	    {
-	      Complex c1 = arg1.complex_value ();
-	      ComplexMatrix m2 = arg2.complex_matrix_value ();
-	      if (! error_state)
-		{
-		  ComplexMatrix result = max (c1, m2);
-		  if (! error_state)
-		    retval(0) = result;
-		}
-	    }
-	  else
-	    {
-	      double d1 = arg1.double_value ();
-	      Matrix m2 = arg2.matrix_value ();
-
-	      if (! error_state)
-		{
-		  Matrix result = max (d1, m2);
-		  if (! error_state)
-		    retval(0) = result;
-		}
-	    }
-	}
-      else if (arg2_is_scalar)
-	{
-	  if (arg1_is_complex || arg2_is_complex)
-	    {
-	      ComplexMatrix m1 = arg1.complex_matrix_value ();
-
-	      if (! error_state)
-		{
-		  Complex c2 = arg2.complex_value ();
-		  ComplexMatrix result = max (m1, c2);
-		  if (! error_state)
-		    retval(0) = result;
-		}
-	    }
-	  else
-	    {
-	      Matrix m1 = arg1.matrix_value ();
-
-	      if (! error_state)
-		{
-		  double d2 = arg2.double_value ();
-		  Matrix result = max (m1, d2);
-		  if (! error_state)
-		    retval(0) = result;
-		}
-	    }
-	}
-      else
-	{
-	  if (arg1_is_complex || arg2_is_complex)
-	    {
-	      ComplexMatrix m1 = arg1.complex_matrix_value ();
-
-	      if (! error_state)
-		{
-		  ComplexMatrix m2 = arg2.complex_matrix_value ();
-
-		  if (! error_state)
-		    {
-		      ComplexMatrix result = max (m1, m2);
-		      if (! error_state)
-			retval(0) = result;
-		    }
-		}
-	    }
-	  else
-	    {
-	      Matrix m1 = arg1.matrix_value ();
-
-	      if (! error_state)
-		{
-		  Matrix m2 = arg2.matrix_value ();
-
-		  if (! error_state)
-		    {
-		      Matrix result = max (m1, m2);
-		      if (! error_state)
-			retval(0) = result;
-		    }
-		}
-	    }
-	}
-    }
-  else
-    panic_impossible ();
-
-  return retval;
+  MINMAX_BODY (max);
 }
 
 /*
--- a/src/DLD-FUNCTIONS/quad.cc	Thu Nov 30 01:11:42 2000 +0000
+++ b/src/DLD-FUNCTIONS/quad.cc	Thu Dec 07 05:47:07 2000 +0000
@@ -104,7 +104,7 @@
 #define QUAD_ABORT1(msg) \
   do \
     { \
-      ::error ("quad: " ## msg); \
+      ::error ("quad: " msg); \
       QUAD_ABORT (); \
     } \
   while (0)
@@ -112,7 +112,7 @@
 #define QUAD_ABORT2(fmt, arg) \
   do \
     { \
-      ::error ("quad: " ## fmt, arg); \
+      ::error ("quad: " fmt, arg); \
       QUAD_ABORT (); \
     } \
   while (0)
--- a/src/help.cc	Thu Nov 30 01:11:42 2000 +0000
+++ b/src/help.cc	Thu Dec 07 05:47:07 2000 +0000
@@ -639,7 +639,7 @@
 		 << "See also: \\args\\.\n"
                  << "@end macro\n";
 
-	  filter << msg.substr (pos+1);
+	  filter << msg.substr (pos+1) << endl;
 
 	  int status = filter.close ();