From cda0e0377621580fb24ef4067bc0cb2bbca1b727 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Villemot?= <sebastien@dynare.org> Date: Mon, 18 Mar 2013 13:44:04 +0100 Subject: [PATCH] Add preprocessor messages (stdout, stderr) to the logfile Closes #306 --- matlab/dynare.m | 14 ++++++++++++++ preprocessor/DynareMain.cc | 9 +++++++++ preprocessor/ModFile.cc | 6 +----- 3 files changed, 24 insertions(+), 5 deletions(-) diff --git a/matlab/dynare.m b/matlab/dynare.m index 12072a4255..0ba128ad5c 100644 --- a/matlab/dynare.m +++ b/matlab/dynare.m @@ -102,7 +102,21 @@ for i=2:nargin end [status, result] = system(command); + disp(result) + +% Save preprocessor result in logfile (if `no_log' option not present) +no_log = 0; +for i=2:nargin + no_log = no_log || strcmp(varargin{i-1}, "nolog"); +end +if ~no_log + logname = [ substr(fname, 1, -4) ".log" ]; + fid = fopen(logname, "w"); + fputs(fid, result); + fclose(fid); +end + if status % Should not use "error(result)" since message will be truncated if too long error('DYNARE: preprocessing failed') diff --git a/preprocessor/DynareMain.cc b/preprocessor/DynareMain.cc index 23f75e07ad..79201e3911 100644 --- a/preprocessor/DynareMain.cc +++ b/preprocessor/DynareMain.cc @@ -30,6 +30,8 @@ using namespace std; #endif #include "macro/MacroDriver.hh" +#include <unistd.h> + /* Prototype for second part of main function Splitting main() in two parts was necessary because ParsingDriver.h and MacroDriver.h can't be included simultaneously (because of Bison limitations). @@ -58,6 +60,13 @@ usage() int main(int argc, char **argv) { + /* + Redirect stderr to stdout. + Made necessary because MATLAB/Octave can only capture stdout (but not + stderr), in order to put it in the logfile (see issue #306) + */ + dup2(STDOUT_FILENO, STDERR_FILENO); + if (argc < 2) { cerr << "Missing model file!" << endl; diff --git a/preprocessor/ModFile.cc b/preprocessor/ModFile.cc index 1fbe8a386e..b628c9b396 100644 --- a/preprocessor/ModFile.cc +++ b/preprocessor/ModFile.cc @@ -477,11 +477,7 @@ ModFile::writeOutputFiles(const string &basename, bool clear_all, bool no_log, b mOutputFile << "global_initialization;" << endl << "diary off;" << endl; if (!no_log) - mOutputFile << "logname_ = '" << basename << ".log';" << endl - << "if exist(logname_, 'file')" << endl - << " delete(logname_)" << endl - << "end" << endl - << "diary(logname_)" << endl; + mOutputFile << "diary('" << basename << ".log');" << endl; if (console) mOutputFile << "options_.console_mode = 1;" << endl -- GitLab