# HG changeset patch
# User John Donoghue
# Date 1525463967 14400
#      Fri May 04 15:59:27 2018 -0400
# Node ID 2e695fa8408942fd0be206b4cf4a939f08b7313d
# Parent  e126cad113f059dfcda9d29fbbb490905dfc39fa
update to allow compile on octave 4.2 (Bug #46521)

* src/base-lu.cc, src/base-lu.h: new files (removed from octave)

* src/configure.ac: dont include octave/config.h, check for removed
  or new octave headers

* src/galois-ops.h: check for define CAST_BINOP_ARGS

* src/galois.cc: include octave/base-lu or base-lu,
  dont include octave/config.h

* src/galois.h: include octave/base-lu or base-lu,
  dont include octave/config.h

* src/gf.cc, src/op-gm-gm.cc, src/op-gm-m.cc, src/op-gm-s.cc,
  src/op-m-gm.cc, src/op-s-gm.cc
  : dont include octave/config.h

* src/ov-galois.cc: dont include octave/config.h or octave/oct-hdf5.h,
  include ls-oct-ascii.h or ls-oct-text.h, check for hdf5 type

* src/ov-galois.h: define OC_REP_TYPE if not defined

diff -r e126cad113f0 -r 2e695fa84089 src/base-lu.cc
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/base-lu.cc	Fri May 04 15:59:27 2018 -0400
@@ -0,0 +1,191 @@
+/*
+
+Copyright (C) 1996-2015 John W. Eaton
+Copyright (C) 2009 VZLU Prague
+
+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 3 of the License, 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, see
+<http://www.gnu.org/licenses/>.
+
+*/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "base-lu.h"
+
+template <class lu_type>
+base_lu<lu_type>::base_lu (const lu_type& l, const lu_type& u,
+                           const PermMatrix& p)
+  : a_fact (u), l_fact (l), ipvt (p.transpose ().col_perm_vec ())
+{
+  if (l.columns () != u.rows ())
+    (*current_liboctave_error_handler) ("lu: dimension mismatch");
+}
+
+template <class lu_type>
+bool
+base_lu <lu_type> :: packed (void) const
+{
+  return l_fact.dims () == dim_vector ();
+}
+
+template <class lu_type>
+void
+base_lu <lu_type> :: unpack (void)
+{
+  if (packed ())
+    {
+      l_fact = L ();
+      a_fact = U (); // FIXME: sub-optimal
+      ipvt = getp ();
+    }
+}
+
+template <class lu_type>
+lu_type
+base_lu <lu_type> :: L (void) const
+{
+  if (packed ())
+    {
+      octave_idx_type a_nr = a_fact.rows ();
+      octave_idx_type a_nc = a_fact.cols ();
+      octave_idx_type mn = (a_nr < a_nc ? a_nr : a_nc);
+
+      lu_type l (a_nr, mn, lu_elt_type (0.0));
+
+      for (octave_idx_type i = 0; i < a_nr; i++)
+        {
+          if (i < a_nc)
+            l.xelem (i, i) = 1.0;
+
+          for (octave_idx_type j = 0; j < (i < a_nc ? i : a_nc); j++)
+            l.xelem (i, j) = a_fact.xelem (i, j);
+        }
+
+      return l;
+    }
+  else
+    return l_fact;
+}
+
+template <class lu_type>
+lu_type
+base_lu <lu_type> :: U (void) const
+{
+  if (packed ())
+    {
+      octave_idx_type a_nr = a_fact.rows ();
+      octave_idx_type a_nc = a_fact.cols ();
+      octave_idx_type mn = (a_nr < a_nc ? a_nr : a_nc);
+
+      lu_type u (mn, a_nc, lu_elt_type (0.0));
+
+      for (octave_idx_type i = 0; i < mn; i++)
+        {
+          for (octave_idx_type j = i; j < a_nc; j++)
+            u.xelem (i, j) = a_fact.xelem (i, j);
+        }
+
+      return u;
+    }
+  else
+    return a_fact;
+}
+
+template <class lu_type>
+lu_type
+base_lu <lu_type> :: Y (void) const
+{
+  if (! packed ())
+    (*current_liboctave_error_handler)
+      ("lu: Y () not implemented for unpacked form");
+  return a_fact;
+}
+
+template <class lu_type>
+Array<octave_idx_type>
+base_lu <lu_type> :: getp (void) const
+{
+  if (packed ())
+    {
+      octave_idx_type a_nr = a_fact.rows ();
+
+      Array<octave_idx_type> pvt (dim_vector (a_nr, 1));
+
+      for (octave_idx_type i = 0; i < a_nr; i++)
+        pvt.xelem (i) = i;
+
+      for (octave_idx_type i = 0; i < ipvt.length (); i++)
+        {
+          octave_idx_type k = ipvt.xelem (i);
+
+          if (k != i)
+            {
+              octave_idx_type tmp = pvt.xelem (k);
+              pvt.xelem (k) = pvt.xelem (i);
+              pvt.xelem (i) = tmp;
+            }
+        }
+
+      return pvt;
+    }
+  else
+    return ipvt;
+}
+
+template <class lu_type>
+PermMatrix
+base_lu <lu_type> :: P (void) const
+{
+  return PermMatrix (getp (), false);
+}
+
+template <class lu_type>
+ColumnVector
+base_lu <lu_type> :: P_vec (void) const
+{
+  octave_idx_type a_nr = a_fact.rows ();
+
+  ColumnVector p (a_nr);
+
+  Array<octave_idx_type> pvt = getp ();
+
+  for (octave_idx_type i = 0; i < a_nr; i++)
+    p.xelem (i) = static_cast<double> (pvt.xelem (i) + 1);
+
+  return p;
+}
+
+template <class lu_type>
+bool
+base_lu<lu_type>::regular (void) const
+{
+  bool retval = true;
+
+  octave_idx_type k = std::min (a_fact.rows (), a_fact.columns ());
+
+  for (octave_idx_type i = 0; i < k; i++)
+    {
+      if (a_fact(i, i) == lu_elt_type ())
+        {
+          retval = false;
+          break;
+        }
+    }
+
+  return retval;
+}
diff -r e126cad113f0 -r 2e695fa84089 src/base-lu.h
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/base-lu.h	Fri May 04 15:59:27 2018 -0400
@@ -0,0 +1,87 @@
+/*
+
+Copyright (C) 1996-2015 John W. Eaton
+Copyright (C) 2009 VZLU Prague
+
+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 3 of the License, 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, see
+<http://www.gnu.org/licenses/>.
+
+*/
+
+#if !defined (octave_base_lu_h)
+#define octave_base_lu_h 1
+
+#include "MArray.h"
+#include "dColVector.h"
+#include "PermMatrix.h"
+
+template <class lu_type>
+class
+base_lu
+{
+public:
+
+  typedef typename lu_type::element_type lu_elt_type;
+
+  base_lu (void)
+    : a_fact (), l_fact (), ipvt () { }
+
+  base_lu (const base_lu& a)
+    : a_fact (a.a_fact), l_fact (a.l_fact), ipvt (a.ipvt) { }
+
+  base_lu (const lu_type& l, const lu_type& u,
+           const PermMatrix& p);
+
+  base_lu& operator = (const base_lu& a)
+  {
+    if (this != &a)
+      {
+        a_fact = a.a_fact;
+        l_fact = a.l_fact;
+        ipvt = a.ipvt;
+      }
+    return *this;
+  }
+
+  virtual ~base_lu (void) { }
+
+  bool packed (void) const;
+
+  void unpack (void);
+
+  lu_type L (void) const;
+
+  lu_type U (void) const;
+
+  lu_type Y (void) const;
+
+  PermMatrix P (void) const;
+
+  ColumnVector P_vec (void) const;
+
+  bool regular (void) const;
+
+protected:
+
+  Array<octave_idx_type> getp (void) const;
+
+  lu_type a_fact;
+  lu_type l_fact;
+
+  Array<octave_idx_type> ipvt;
+};
+
+#endif
diff -r e126cad113f0 -r 2e695fa84089 src/configure.ac
--- a/src/configure.ac	Thu Apr 14 01:07:22 2016 +0100
+++ b/src/configure.ac	Fri May 04 15:59:27 2018 -0400
@@ -34,7 +34,7 @@
    CXXFLAGS="$CXXFLAGS $comm_CXXFLAGS"
    AC_LANG_PUSH(C++)
    AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
-       #include <octave/config.h>
+       #include <octave/oct.h>
        #include <octave/ov-base.h>
        ]], [[
        octave_hdf5_id x;
@@ -56,7 +56,7 @@
    CXXFLAGS="$CXXFLAGS $comm_CXXFLAGS"
    AC_LANG_PUSH(C++)
    AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
-       #include <octave/config.h>
+       #include <octave/oct.h>
        #include <octave/ov-base.h>
        class foo : public octave_base_value
        {
@@ -85,7 +85,7 @@
    AC_LANG_PUSH(C++)
    AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
        #include <iostream>
-       #include <octave/config.h>
+       #include <octave/oct.h>
        #include <octave/ov-base.h>
        ]], [[
        const octave_base_value x; x.print (std::cout);
@@ -99,5 +99,31 @@
   PKG_CPPFLAGS="$PKG_CPPFLAGS -DHAVE_OCTAVE_BASE_VALUE_PRINT_CONST=1"
 fi
 
+comm_save_CXXFLAGS=$CXXFLAGS
+CXXFLAGS="$CXXFLAGS $comm_CXXFLAGS"
+AC_LANG_PUSH(C++)
+AC_CHECK_HEADERS([octave/base_lu.h],
+  [PKG_CPPFLAGS="$PKG_CPPFLAGS -DHAVE_OCTAVE_BASE_LU_H=1"],
+  [],
+  [#include <octave/oct.h>]
+)
+AC_CHECK_HEADERS([octave/ls-oct-ascii.h],
+  [PKG_CPPFLAGS="$PKG_CPPFLAGS -DHAVE_OCTAVE_LS_OCT_ASCII_H=1"],
+  [],
+  [#include <octave/oct.h>]
+)
+AC_CHECK_HEADERS([octave/ls-oct-text.h],
+  [PKG_CPPFLAGS="$PKG_CPPFLAGS -DHAVE_OCTAVE_LS_OCT_TEXT_H=1"],
+  [],
+  [#include <octave/oct.h>]
+)
+AC_CHECK_HEADERS([octave/oct-hdf5-types.h],
+  [PKG_CPPFLAGS="$PKG_CPPFLAGS -DHAVE_OCTAVE_OCT_HDF5_TYPES_H=1"],
+  [],
+  [#include <octave/oct.h>]
+)
+AC_LANG_POP(C++)
+CXXFLAGS=$comm_save_CXXFLAGS
+
 AC_CONFIG_FILES([Makefile])
 AC_OUTPUT
diff -r e126cad113f0 -r 2e695fa84089 src/galois-ops.h
--- a/src/galois-ops.h	Thu Apr 14 01:07:22 2016 +0100
+++ b/src/galois-ops.h	Fri May 04 15:59:27 2018 -0400
@@ -21,6 +21,32 @@
 #if !defined (galois_octave_ops_h)
 #define galois_octave_ops_h 1
 
+#if ! defined (CAST_BINOP_ARGS)
+#  define CAST_BINOP_ARGS(t1, t2)               \
+  t1 v1 = dynamic_cast<t1> (a1);                \
+  t2 v2 = dynamic_cast<t2> (a2)
+#endif
+
+#if ! defined (CAST_UNOP_ARG)
+#  define CAST_UNOP_ARG(t)                      \
+  t v = dynamic_cast<t> (a)
+#endif
+
+#if ! defined (BINOPDECL)
+#  define BINOPDECL(name, a1, a2)                               \
+  static octave_value                                           \
+  CONCAT2(oct_binop_, name) (const octave_base_value& a1,       \
+                             const octave_base_value& a2)
+#endif
+
+#if ! defined (CATOPDECL)
+#  define CATOPDECL(name, a1, a2)                                       \
+  static octave_value                                                   \
+  CONCAT2(oct_catop_, name) (octave_base_value& a1,                     \
+                             const octave_base_value& a2,               \
+                             const Array<octave_idx_type>& ra_idx)
+#endif
+
 // Override the operator and function definition defines from Octave
 
 #define DEFBINOP_OP_G(name, t1, t2, op) \
diff -r e126cad113f0 -r 2e695fa84089 src/galois.cc
--- a/src/galois.cc	Thu Apr 14 01:07:22 2016 +0100
+++ b/src/galois.cc	Fri May 04 15:59:27 2018 -0400
@@ -18,7 +18,7 @@
 // program with any Open Source program, as defined by the Open Source
 // Initiative (www.opensource.org)
 
-#include <octave/config.h>
+#include <octave/oct.h>
 #include <octave/error.h>
 #include <octave/gripes.h>
 #include <octave/mx-op-defs.h>
@@ -27,7 +27,11 @@
 #include "galoisfield.h"
 #include "galois-def.h"
 
-#include <octave/base-lu.cc>
+#ifdef  HAVE_OCTAVE_BASE_LU_H
+# include <octave/base-lu.cc>
+#else
+# include "base-lu.cc"
+#endif
 
 galois_field_list stored_galois_fields;
 
diff -r e126cad113f0 -r 2e695fa84089 src/galois.h
--- a/src/galois.h	Thu Apr 14 01:07:22 2016 +0100
+++ b/src/galois.h	Fri May 04 15:59:27 2018 -0400
@@ -21,10 +21,15 @@
 #if !defined (octave_galois_int_h)
 #define octave_galois_int_h 1
 
-#include <octave/config.h>
-#include <octave/base-lu.h>
+#include <octave/oct.h>
 #include <octave/mx-base.h>
 
+#ifdef HAVE_OCTAVE_BASE_LU_H
+# include <octave/base-lu.h>
+#else
+# include "base-lu.h"
+#endif
+
 #include "galoisfield.h"
 
 typedef void (*solve_singularity_handler) (double rcond);
diff -r e126cad113f0 -r 2e695fa84089 src/gf.cc
--- a/src/gf.cc	Thu Apr 14 01:07:22 2016 +0100
+++ b/src/gf.cc	Fri May 04 15:59:27 2018 -0400
@@ -29,7 +29,7 @@
 for a GPL release of his code
 */
 
-#include <octave/config.h>
+#include <octave/oct.h>
 #include <octave/defun-dld.h>
 #include <octave/gripes.h>
 #include <octave/oct-locbuf.h>
diff -r e126cad113f0 -r 2e695fa84089 src/op-gm-gm.cc
--- a/src/op-gm-gm.cc	Thu Apr 14 01:07:22 2016 +0100
+++ b/src/op-gm-gm.cc	Fri May 04 15:59:27 2018 -0400
@@ -18,7 +18,7 @@
 // program with any Open Source program, as defined by the Open Source
 // Initiative (www.opensource.org)
 
-#include <octave/config.h>
+#include <octave/oct.h>
 #include <octave/oct-obj.h>
 #include <octave/ops.h>
 
diff -r e126cad113f0 -r 2e695fa84089 src/op-gm-m.cc
--- a/src/op-gm-m.cc	Thu Apr 14 01:07:22 2016 +0100
+++ b/src/op-gm-m.cc	Fri May 04 15:59:27 2018 -0400
@@ -18,7 +18,7 @@
 // program with any Open Source program, as defined by the Open Source
 // Initiative (www.opensource.org)
 
-#include <octave/config.h>
+#include <octave/oct.h>
 #include <octave/ops.h>
 #include <octave/ov-re-mat.h>
 
diff -r e126cad113f0 -r 2e695fa84089 src/op-gm-s.cc
--- a/src/op-gm-s.cc	Thu Apr 14 01:07:22 2016 +0100
+++ b/src/op-gm-s.cc	Fri May 04 15:59:27 2018 -0400
@@ -18,7 +18,7 @@
 // program with any Open Source program, as defined by the Open Source
 // Initiative (www.opensource.org)
 
-#include <octave/config.h>
+#include <octave/oct.h>
 #include <octave/ops.h>
 #include <octave/ov-scalar.h>
 
diff -r e126cad113f0 -r 2e695fa84089 src/op-m-gm.cc
--- a/src/op-m-gm.cc	Thu Apr 14 01:07:22 2016 +0100
+++ b/src/op-m-gm.cc	Fri May 04 15:59:27 2018 -0400
@@ -18,7 +18,7 @@
 // program with any Open Source program, as defined by the Open Source
 // Initiative (www.opensource.org)
 
-#include <octave/config.h>
+#include <octave/oct.h>
 #include <octave/ops.h>
 #include <octave/ov-re-mat.h>
 
diff -r e126cad113f0 -r 2e695fa84089 src/op-s-gm.cc
--- a/src/op-s-gm.cc	Thu Apr 14 01:07:22 2016 +0100
+++ b/src/op-s-gm.cc	Fri May 04 15:59:27 2018 -0400
@@ -18,7 +18,7 @@
 // program with any Open Source program, as defined by the Open Source
 // Initiative (www.opensource.org)
 
-#include <octave/config.h>
+#include <octave/oct.h>
 #include <octave/ops.h>
 #include <octave/ov-scalar.h>
 
diff -r e126cad113f0 -r 2e695fa84089 src/ov-galois.cc
--- a/src/ov-galois.cc	Thu Apr 14 01:07:22 2016 +0100
+++ b/src/ov-galois.cc	Fri May 04 15:59:27 2018 -0400
@@ -20,21 +20,42 @@
 
 #include <iostream>
 
-#include <octave/config.h>
+#include <octave/oct.h>
 #include <octave/byte-swap.h>
 #include <octave/gripes.h>
 #include <octave/lo-ieee.h>
-#include <octave/oct-hdf5.h>
 #include <octave/oct-locbuf.h>
 #include <octave/oct-obj.h>
 #include <octave/ov.h>
 #include <octave/pr-output.h>
 
-#include <octave/ls-oct-ascii.h>
+#if defined(HAVE_OCTAVE_LS_OCT_TEXT_H)
+#  include <octave/ls-oct-text.h>
+#else
+#  include <octave/ls-oct-ascii.h>
+#endif
 
 #include "galois.h"
 #include "ov-galois.h"
 
+#if defined (HAVE_HDF5)
+#  if defined (HAVE_HDF5_H)
+#    include <hdf5.h>
+#  endif
+#  if defined (HAVE_OCTAVE_OCT_HDF5_TYPES_H)
+#    include "oct-hdf5-types.h"
+#  endif
+#  if defined (OCTAVE_ENABLE_64)
+#    define H5T_NATIVE_IDX H5T_NATIVE_INT64
+#  else
+#    define H5T_NATIVE_IDX H5T_NATIVE_INT
+#  endif
+#endif
+
+#if ! defined (X_CAST)
+#  define X_CAST(T, E) (T) (E)
+#endif
+
 #if defined (DEFINE_OCTAVE_ALLOCATOR)
 DEFINE_OCTAVE_ALLOCATOR (octave_galois);
 #endif
diff -r e126cad113f0 -r 2e695fa84089 src/ov-galois.h
--- a/src/ov-galois.h	Thu Apr 14 01:07:22 2016 +0100
+++ b/src/ov-galois.h	Fri May 04 15:59:27 2018 -0400
@@ -44,6 +44,10 @@
 #endif
 #endif
 
+#if ! defined (OV_REP_TYPE)
+#  define OV_REP_TYPE octave_base_value
+#endif
+
 class octave_value_list;
 class tree_walker;
 
diff -r e126cad113f0 -r 2e695fa84089 src/syndtable.cc
--- a/src/syndtable.cc	Thu Apr 14 01:07:22 2016 +0100
+++ b/src/syndtable.cc	Fri May 04 15:59:27 2018 -0400
@@ -20,8 +20,8 @@
 
 #include <octave/oct.h>
 
-#define COL_MAJ(N) (N / (SIZEOF_INT << 3))
-#define COL_MIN(N) (N % (SIZEOF_INT << 3))
+#define COL_MAJ(N) (N / (sizeof (int) << 3))
+#define COL_MIN(N) (N % (sizeof (int) << 3))
 
 Array<int>
 get_errs (const int& nmin, const int& nmax, const int &nerrs)
