From 51b2e49e08901fd649f8cc13b8ba1d33166e413f Mon Sep 17 00:00:00 2001
From: Willem Jan Palenstijn <Willem.Jan.Palenstijn@cwi.nl>
Date: Fri, 18 Nov 2016 17:49:45 +0100
Subject: Improve consts in matlab undocumented function declarations

---
 matlab/mex/mexDataManagerHelpFunctions.cpp | 10 +++++-----
 1 file changed, 5 insertions(+), 5 deletions(-)

diff --git a/matlab/mex/mexDataManagerHelpFunctions.cpp b/matlab/mex/mexDataManagerHelpFunctions.cpp
index 1794abb..95d4640 100644
--- a/matlab/mex/mexDataManagerHelpFunctions.cpp
+++ b/matlab/mex/mexDataManagerHelpFunctions.cpp
@@ -42,10 +42,10 @@ $Id$
 #ifdef USE_MATLAB_UNDOCUMENTED
 extern "C" {
 mxArray *mxCreateSharedDataCopy(const mxArray *pr);
-bool mxUnshareArray(const mxArray *pr, const bool noDeepCopy);
-mxArray *mxUnreference(const mxArray *pr);
+bool mxUnshareArray(mxArray *pr, bool noDeepCopy);
+mxArray *mxUnreference(mxArray *pr);
 #if 0
-// Unsupported in Matlab R2014b
+// Unsupported in Matlab R2014b and later
 bool mxIsSharedArray(const mxArray *pr);
 #endif
 }
@@ -66,12 +66,12 @@ public:
 		// First unshare the input array, so that we may modify it.
 		if (bUnshare) {
 #if 0
-			// Unsupported in Matlab R2014b
+			// Unsupported in Matlab R2014b and later
 			if (mxIsSharedArray(_pArray)) {
 				fprintf(stderr, "Performance note: unsharing shared array in link\n");
 			}
 #endif
-			mxUnshareArray(_pArray, false);
+			mxUnshareArray(const_cast<mxArray*>(_pArray), false);
 			//fprintf(stderr, "Unshared:\narray: %p\tdata: %p\n", (void*)_pArray, (void*)mxGetData(_pArray));
 		}
 		// Then create a (persistent) copy so the data won't be deleted
-- 
cgit v1.2.3


From 64a48bea80b909311351dc3b1345a17c693ddb69 Mon Sep 17 00:00:00 2001
From: Willem Jan Palenstijn <Willem.Jan.Palenstijn@cwi.nl>
Date: Wed, 28 Sep 2016 14:58:41 +0200
Subject: Add experimental support for Octave

Based on initial patch by @kalvdans.
---
 build/linux/Makefile.in                    | 51 +++++++++++++++++++++++++++++-
 build/linux/configure.ac                   | 23 ++++++++++++++
 matlab/mex/mexDataManagerHelpFunctions.cpp |  2 +-
 matlab/mex/octave_support.cpp              | 44 ++++++++++++++++++++++++++
 4 files changed, 118 insertions(+), 2 deletions(-)
 create mode 100644 matlab/mex/octave_support.cpp

diff --git a/build/linux/Makefile.in b/build/linux/Makefile.in
index 14027e1..076cfd1 100644
--- a/build/linux/Makefile.in
+++ b/build/linux/Makefile.in
@@ -5,6 +5,7 @@ boostutf=@HAVEBOOSTUTF@
 
 
 MATLAB_ROOT=@MATLAB_ROOT@
+octave=@HAVEOCTAVE@
 
 TARGETS=libastra.la
 
@@ -16,6 +17,10 @@ ifeq ($(python),yes)
 TARGETS+=py
 endif
 
+ifeq ($(octave),yes)
+TARGETS+=oct
+endif
+
 all: $(TARGETS)
 
 prefix=@prefix@
@@ -46,6 +51,16 @@ LIBS      += -lcudart -lcufft
 NVCC       = @NVCC@
 endif
 
+ifeq ($(octave),yes)
+OCTLDFLAGS:=$(LDFLAGS)
+CPPFLAGS += @OCTAVE_CPPFLAGS@
+ifeq ($(cuda),yes)
+OCTFLAGS=-DASTRA_CUDA
+else
+OCTFLAGS=
+endif
+endif
+
 ifeq ($(matlab),yes)
 CPPFLAGS+=-I$(MATLAB_ROOT)/extern/include -DMATLAB_MEX_FILE
 CXXFLAGS+=-fopenmp
@@ -259,6 +274,20 @@ ifeq ($(python),yes)
 MATLAB_MEX+=matlab/mex/astra_mex_plugin_c.$(MEXSUFFIX)
 endif
 
+OCTAVE_CXX_OBJECTS=\
+	matlab/mex/octave_support.o
+
+OCTAVE_MEX=\
+	matlab/mex/astra_mex_algorithm_c.mex \
+	matlab/mex/astra_mex_data2d_c.mex \
+	matlab/mex/astra_mex_c.mex \
+	matlab/mex/astra_mex_matrix_c.mex \
+	matlab/mex/astra_mex_projector_c.mex \
+	matlab/mex/astra_mex_projector3d_c.mex \
+	matlab/mex/astra_mex_log_c.mex \
+	matlab/mex/astra_mex_data3d_c.mex \
+	matlab/mex/astra_mex_direct_c.mex
+
 OBJECT_DIRS = src/ tests/ cuda/2d/ cuda/3d/ matlab/mex/ ./
 DEPDIRS = $(addsuffix $(DEPDIR),$(OBJECT_DIRS))
 -include $(wildcard $(addsuffix /*.d,$(DEPDIRS)))
@@ -294,6 +323,13 @@ python-root-install: libastra.la
 endif
 
 
+ifeq ($(octave),yes)
+oct: $(OCTAVE_MEX)
+
+%.mex: %.o $(MATLAB_CXX_OBJECTS) $(OCTAVE_CXX_OBJECTS) libastra.la
+	mkoctfile --mex $(OCTFLAGS) $(OCTLDFLAGS) $(LIBS) -L.libs -lastra --output $* $*.o $(MATLAB_CXX_OBJECTS) $(OCTAVE_CXX_OBJECTS)
+endif
+
 libastra.la: $(ALL_OBJECTS)
 	./libtool --mode=link --tag=CXX $(LD) -rpath $(LIBDIR) -o $@ $(LDFLAGS) $(LIBS) $+
 
@@ -374,7 +410,7 @@ distclean: clean
 	rm -rf $(srcdir)/autom4te.cache
 	rm -f $(srcdir)/configure Makefile
 
-install: install-libraries install-matlab install-python
+install: install-libraries install-matlab install-python install-octave
 
 install-libraries: libastra.la
 	$(INSTALL_SH) -m 755 -d @libdir@
@@ -413,6 +449,19 @@ else
 install-python:
 endif
 
+ifeq ($(octave),yes)
+# TODO: This install location doesn't work well for /usr or /usr/local
+install-octave: $(OCTAVE_MEX)
+	$(INSTALL_SH) -m 755 -d @prefix@/octave
+	$(INSTALL_SH) -m 755 -d @prefix@/octave/mex
+	$(INSTALL_SH) -m 755 -d @prefix@/octave/tools
+	$(INSTALL_SH) -m 644 $(OCTAVE_MEX) @prefix@/octave/mex
+	$(INSTALL_SH) -m 644 $(srcdir)/../../matlab/tools/*.m @prefix@/octave/tools
+# TODO: docs
+else
+install-octave:
+endif
+
 
 Makefile: $(srcdir)/Makefile.in config.status
 	CONFIG_HEADERS= CONFIG_LINKS= CONFIG_FILES=$@ $(SHELL) ./config.status
diff --git a/build/linux/configure.ac b/build/linux/configure.ac
index 630b08d..0d80cec 100644
--- a/build/linux/configure.ac
+++ b/build/linux/configure.ac
@@ -175,6 +175,28 @@ fi
 
 AC_SUBST(HAVEMATLAB)
 
+# octave
+
+AC_ARG_ENABLE(octave, [[  --disable-octave      disable Octave support]])
+if test x"$enable_octave" != xno; then
+  AC_PATH_PROG([HAVEOCTAVE], [octave-config], [no], [$PATH])
+  AC_MSG_CHECKING([for octave])
+  if test x"HAVEOCTAVE" != xno -a $HAVEMATLAB = yes; then
+    HAVEOCTAVE=no
+    AC_MSG_RESULT([no (since Matlab support is enabled)])
+  else
+    if test x"$HAVEOCTAVE" != xno; then
+      OCTAVE_CPPFLAGS="-I`octave-config -p OCTINCLUDEDIR`"
+      AC_SUBST(OCTAVE_CPPFLAGS)
+      HAVEOCTAVE=yes
+    fi
+    AC_MSG_RESULT($HAVEOCTAVE)
+  fi
+else
+  HAVEOCTAVE=no
+fi
+AC_SUBST(HAVEOCTAVE)
+
 # python
 
 AC_ARG_WITH(python, [[  --with-python=path      path of Python binary (optional)]],,)
@@ -271,6 +293,7 @@ echo
 echo "Summary of ASTRA Toolbox build options:"
 echo "  CUDA   : $HAVECUDA"
 echo "  Matlab : $HAVEMATLAB"
+echo "  Octave : $HAVEOCTAVE"
 echo "  Python : $HAVEPYTHON"
 echo
 echo "  prefix : $prefix"
diff --git a/matlab/mex/mexDataManagerHelpFunctions.cpp b/matlab/mex/mexDataManagerHelpFunctions.cpp
index 95d4640..a514565 100644
--- a/matlab/mex/mexDataManagerHelpFunctions.cpp
+++ b/matlab/mex/mexDataManagerHelpFunctions.cpp
@@ -79,7 +79,7 @@ public:
 		m_pLink = mxCreateSharedDataCopy(_pArray);
 		//fprintf(stderr, "SharedDataCopy:\narray: %p\tdata: %p\n", (void*)m_pLink, (void*)mxGetData(m_pLink));
 		mexMakeArrayPersistent(m_pLink);
-		m_fPtr = (float *)mxGetData(m_pLink);
+		m_fPtr = (float *)mxGetData(_pArray);
 		m_fPtr += iOffset;
 	}
 	virtual ~CFloat32CustomMemoryMatlab3D() {
diff --git a/matlab/mex/octave_support.cpp b/matlab/mex/octave_support.cpp
new file mode 100644
index 0000000..ed04bf0
--- /dev/null
+++ b/matlab/mex/octave_support.cpp
@@ -0,0 +1,44 @@
+/*
+-----------------------------------------------------------------------
+Copyright: 2010-2016, iMinds-Vision Lab, University of Antwerp
+           2014-2016, CWI, Amsterdam
+
+Contact: astra@uantwerpen.be
+Website: http://sf.net/projects/astra-toolbox
+
+This file is part of the ASTRA Toolbox.
+
+
+The ASTRA Toolbox 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.
+
+The ASTRA Toolbox 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 the ASTRA Toolbox. If not, see <http://www.gnu.org/licenses/>.
+
+-----------------------------------------------------------------------
+*/
+
+#include <oct.h>
+
+extern "C" {
+
+bool utIsInterruptPending() {
+	return octave_signal_caught;
+}
+
+mxArray *mxCreateSharedDataCopy(const mxArray *) {
+	return 0;
+}
+
+bool mxUnshareArray(mxArray *, bool) {
+	return false;
+}
+
+}
-- 
cgit v1.2.3