From e4614cf09b90cc9a0e38d370bb090a11f3877b33 Mon Sep 17 00:00:00 2001
From: "Daniel M. Pelt" <D.M.Pelt@cwi.nl>
Date: Fri, 13 Mar 2015 14:21:53 +0100
Subject: Add logging support to Matlab

---
 build/linux/Makefile.in        |   1 +
 matlab/mex/astra_mex_log_c.cpp | 302 +++++++++++++++++++++++++++++++++++++++++
 matlab/tools/astra_mex_log.m   |  33 +++++
 3 files changed, 336 insertions(+)
 create mode 100644 matlab/mex/astra_mex_log_c.cpp
 create mode 100644 matlab/tools/astra_mex_log.m

diff --git a/build/linux/Makefile.in b/build/linux/Makefile.in
index c2b9994..f862114 100644
--- a/build/linux/Makefile.in
+++ b/build/linux/Makefile.in
@@ -225,6 +225,7 @@ MATLAB_MEX=\
 	matlab/mex/astra_mex_matrix_c.$(MEXSUFFIX) \
 	matlab/mex/astra_mex_projector_c.$(MEXSUFFIX) \
 	matlab/mex/astra_mex_projector3d_c.$(MEXSUFFIX) \
+	matlab/mex/astra_mex_log_c.$(MEXSUFFIX) \
 	matlab/mex/astra_mex_data3d_c.$(MEXSUFFIX)
 
 
diff --git a/matlab/mex/astra_mex_log_c.cpp b/matlab/mex/astra_mex_log_c.cpp
new file mode 100644
index 0000000..14ae391
--- /dev/null
+++ b/matlab/mex/astra_mex_log_c.cpp
@@ -0,0 +1,302 @@
+/*
+-----------------------------------------------------------------------
+Copyright: 2010-2015, iMinds-Vision Lab, University of Antwerp
+           2014-2015, 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/>.
+
+-----------------------------------------------------------------------
+$Id$
+*/
+
+/** \file astra_mex_algorithm_c.cpp
+ *
+ *  \brief Creates and manages algorithms (reconstruction,projection,...).
+ */
+#include <mex.h>
+#include "mexHelpFunctions.h"
+
+#include "astra/Logging.h"
+
+using namespace std;
+using namespace astra;
+//-----------------------------------------------------------------------------------------
+/** astra_mex_log('debug', file, line, message);
+ *
+ * Log a debug message.
+ * file: Originating file name
+ * line: Originating line number
+ * message: Log message.
+ */
+void astra_mex_log_debug(int nlhs, mxArray* plhs[], int nrhs, const mxArray* prhs[])
+{
+	if (nrhs < 4) {
+		mexErrMsgTxt("Not enough arguments.  See the help document for a detailed argument list. \n");
+		return;
+	}
+    string filename = mexToString(prhs[1]);
+    int linenumber = (int)mxGetScalar(prhs[2]);
+    string message = mexToString(prhs[3]);
+    astra::CLogger::debug(filename.c_str(),linenumber,message.c_str());
+}
+
+//-----------------------------------------------------------------------------------------
+/** astra_mex_log('info', file, line, message);
+ *
+ * Log an info message.
+ * file: Originating file name
+ * line: Originating line number
+ * message: Log message.
+ */
+void astra_mex_log_info(int nlhs, mxArray* plhs[], int nrhs, const mxArray* prhs[])
+{
+	if (nrhs < 4) {
+		mexErrMsgTxt("Not enough arguments.  See the help document for a detailed argument list. \n");
+		return;
+	}
+    string filename = mexToString(prhs[1]);
+    int linenumber = (int)mxGetScalar(prhs[2]);
+    string message = mexToString(prhs[3]);
+    astra::CLogger::info(filename.c_str(),linenumber,message.c_str());
+}
+
+//-----------------------------------------------------------------------------------------
+/** astra_mex_log('warn', file, line, message);
+ *
+ * Log a warning message.
+ * file: Originating file name
+ * line: Originating line number
+ * message: Log message.
+ */
+void astra_mex_log_warn(int nlhs, mxArray* plhs[], int nrhs, const mxArray* prhs[])
+{
+	if (nrhs < 4) {
+		mexErrMsgTxt("Not enough arguments.  See the help document for a detailed argument list. \n");
+		return;
+	}
+    string filename = mexToString(prhs[1]);
+    int linenumber = (int)mxGetScalar(prhs[2]);
+    string message = mexToString(prhs[3]);
+    astra::CLogger::warn(filename.c_str(),linenumber,message.c_str());
+}
+
+//-----------------------------------------------------------------------------------------
+/** astra_mex_log('error', file, line, message);
+ *
+ * Log an error message.
+ * file: Originating file name
+ * line: Originating line number
+ * message: Log message.
+ */
+void astra_mex_log_error(int nlhs, mxArray* plhs[], int nrhs, const mxArray* prhs[])
+{
+	if (nrhs < 4) {
+		mexErrMsgTxt("Not enough arguments.  See the help document for a detailed argument list. \n");
+		return;
+	}
+    string filename = mexToString(prhs[1]);
+    int linenumber = (int)mxGetScalar(prhs[2]);
+    string message = mexToString(prhs[3]);
+    astra::CLogger::error(filename.c_str(),linenumber,message.c_str());
+}
+
+//-----------------------------------------------------------------------------------------
+/** astra_mex_log('enable', type);
+ *
+ * Enable logging.
+ * type: which output to enable ('all', 'file', 'screen')
+ */
+void astra_mex_log_enable(int nlhs, mxArray* plhs[], int nrhs, const mxArray* prhs[])
+{
+	if (nrhs < 2) {
+		mexErrMsgTxt("Not enough arguments.  See the help document for a detailed argument list. \n");
+		return;
+	}
+    string sType = mexToString(prhs[1]);
+    if(sType == "all"){
+        astra::CLogger::enable();
+    }else if(sType == "file"){
+        astra::CLogger::enableFile();
+    }else if(sType == "screen"){
+        astra::CLogger::enableScreen();
+    } else {
+        mexErrMsgTxt("Specify which output to enable ('all', 'file', or 'screen')");
+	}
+}
+
+//-----------------------------------------------------------------------------------------
+/** astra_mex_log('disable', type);
+ *
+ * Disable logging.
+ * type: which output to disable ('all', 'file', 'screen')
+ */
+void astra_mex_log_disable(int nlhs, mxArray* plhs[], int nrhs, const mxArray* prhs[])
+{
+	if (nrhs < 2) {
+		mexErrMsgTxt("Not enough arguments.  See the help document for a detailed argument list. \n");
+		return;
+	}
+    string sType = mexToString(prhs[1]);
+    if(sType == "all"){
+        astra::CLogger::disable();
+    }else if(sType == "file"){
+        astra::CLogger::disableFile();
+    }else if(sType == "screen"){
+        astra::CLogger::disableScreen();
+    } else {
+        mexErrMsgTxt("Specify which output to disable ('all', 'file', or 'screen')");
+	}
+}
+
+//-----------------------------------------------------------------------------------------
+/** astra_mex_log('format', type, fmt);
+ *
+ * Enable logging.
+ * type: which output to format ('file', 'screen')
+ * fmt: format string
+ *      Here are the substitutions you may use:
+ *      %f: Source file name generating the log call.
+ *      %n: Source line number where the log call was made.
+ *      %m: The message text sent to the logger (after printf formatting).
+ *      %d: The current date, formatted using the logger's date format.
+ *      %t: The current time, formatted using the logger's time format.
+ *      %l: The log level (one of "DEBUG", "INFO", "WARN", or "ERROR").
+ *      %%: A literal percent sign.
+ *      The default format string is "%d %t %f(%n): %l: %m\n".
+ */
+void astra_mex_log_format(int nlhs, mxArray* plhs[], int nrhs, const mxArray* prhs[])
+{
+	if (nrhs < 3) {
+		mexErrMsgTxt("Not enough arguments.  See the help document for a detailed argument list. \n");
+		return;
+	}
+    string sType = mexToString(prhs[1]);
+    string sFormat = mexToString(prhs[2]);
+    if (!sFormat.empty())
+    {
+        char lastChar = *sFormat.rbegin();
+        if (lastChar!='\n'){
+            sFormat += '\n';
+        }
+    }else{
+        sFormat += '\n';
+    }
+    if(sType == "file"){
+        astra::CLogger::setFormatFile(sFormat.c_str());
+    }else if(sType == "screen"){
+        astra::CLogger::setFormatScreen(sFormat.c_str());
+    } else {
+        mexErrMsgTxt("Specify which output to format ('file' or 'screen')");
+	}
+}
+
+//-----------------------------------------------------------------------------------------
+/** astra_mex_log('output', type, output, level);
+ *
+ * Set output file / output screen.
+ * type: which output to set ('file', 'screen')
+ * output: which output file / screen to use:
+ *         'file': filename
+ *         'screen': 'stdout' or 'stderr'
+ * level: logging level to use ('debug', 'info', 'warn', or 'error')
+ */
+void astra_mex_log_output(int nlhs, mxArray* plhs[], int nrhs, const mxArray* prhs[])
+{
+	if (nrhs < 4) {
+		mexErrMsgTxt("Not enough arguments.  See the help document for a detailed argument list. \n");
+		return;
+	}
+    string sType = mexToString(prhs[1]);
+    string sOutput = mexToString(prhs[2]);
+    string sLevel = mexToString(prhs[3]);
+    log_level eLevel;
+    if(sLevel == "debug"){
+        eLevel = LOG_DEBUG;
+    }else if(sLevel == "info"){
+        eLevel = LOG_INFO;
+    }else if(sLevel == "warn"){
+        eLevel = LOG_WARN;
+    }else if(sLevel == "error"){
+        eLevel = LOG_ERROR;
+    }else{
+        mexErrMsgTxt("Specify which log level to use ('debug', 'info', 'warn', or 'error')");
+    }
+    if(sType == "file"){
+        astra::CLogger::setOutputFile(sOutput.c_str(),eLevel);
+    }else if(sType == "screen"){
+        int fd;
+        if(sOutput == "stdout"){
+            fd=1;
+        }else if(sOutput == "stderr"){
+            fd=2;
+        }else{
+            mexErrMsgTxt("Specify which screen to output to ('stdout' or 'stderr')");
+        }
+        astra::CLogger::setOutputScreen(fd,eLevel);
+    } else {
+        mexErrMsgTxt("Specify which output to set ('file' or 'screen')");
+	}
+}
+
+//-----------------------------------------------------------------------------------------
+static void printHelp()
+{
+	mexPrintf("Please specify a mode of operation.\n");
+	mexPrintf("Valid modes: debug, info, warn, error, enable, disable, format, output\n");
+}
+
+//-----------------------------------------------------------------------------------------
+/**
+ * ... = astra_mex_log(mode, ...);
+ */
+void mexFunction(int nlhs, mxArray* plhs[],
+				 int nrhs, const mxArray* prhs[])
+{
+	// INPUT: Mode
+	string sMode = "";
+	if (1 <= nrhs) {
+		sMode = mexToString(prhs[0]);	
+	} else {
+		printHelp();
+		return;
+	}
+
+	// SWITCH (MODE)
+	if (sMode == "debug") {
+		astra_mex_log_debug(nlhs, plhs, nrhs, prhs);
+    }else if (sMode == "info") {
+		astra_mex_log_info(nlhs, plhs, nrhs, prhs);
+    }else if (sMode == "warn") {
+        astra_mex_log_warn(nlhs, plhs, nrhs, prhs);
+    }else if (sMode == "error") {
+        astra_mex_log_error(nlhs, plhs, nrhs, prhs);
+    }else if (sMode == "enable") {
+        astra_mex_log_enable(nlhs, plhs, nrhs, prhs);
+    }else if (sMode == "disable") {
+        astra_mex_log_disable(nlhs, plhs, nrhs, prhs);
+    }else if (sMode == "format") {
+        astra_mex_log_format(nlhs, plhs, nrhs, prhs);
+    }else if (sMode == "output") {
+        astra_mex_log_output(nlhs, plhs, nrhs, prhs);
+	} else {
+		printHelp();
+	}
+	return;
+}
diff --git a/matlab/tools/astra_mex_log.m b/matlab/tools/astra_mex_log.m
new file mode 100644
index 0000000..28cfa18
--- /dev/null
+++ b/matlab/tools/astra_mex_log.m
@@ -0,0 +1,33 @@
+function [varargout] = astra_mex_log(varargin)
+%------------------------------------------------------------------------
+% Reference page in Help browser
+%    <a href="matlab:docsearch('astra_mex_log' )">astra_mex_log</a>.
+%------------------------------------------------------------------------
+%------------------------------------------------------------------------
+% This file is part of the ASTRA Toolbox
+% 
+% Copyright: 2010-2015, iMinds-Vision Lab, University of Antwerp
+%            2014-2015, CWI, Amsterdam
+% License: Open Source under GPLv3
+% Contact: astra@uantwerpen.be
+% Website: http://sf.net/projects/astra-toolbox
+%------------------------------------------------------------------------
+% $Id$
+if size(varargin,2)==2 && (strcmp(varargin{1},'debug') || strcmp(varargin{1},'info') || strcmp(varargin{1},'warn') || strcmp(varargin{1},'error'))
+    d = dbstack(1);
+    if size(d,1)==0
+        astra_mex_log_c(varargin{1},'Unknown',0,varargin{2})
+    else
+        astra_mex_log_c(varargin{1},d(1).file,d(1).line,varargin{2})
+    end
+else
+    if nargout == 0
+        astra_mex_log_c(varargin{:});
+        if exist('ans','var')
+            varargout{1} = ans;
+        end
+    else
+        varargout = cell(1,nargout);
+        [varargout{:}] = astra_mex_log_c(varargin{:});
+    end
+end
\ No newline at end of file
-- 
cgit v1.2.3