/*
* Project: MoleCuilder
* Description: creates and alters molecular systems
* Copyright (C) 2013 Frederik Heber. All rights reserved.
*
*
* This file is part of MoleCuilder.
*
* MoleCuilder 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 2 of the License, or
* (at your option) any later version.
*
* MoleCuilder 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 MoleCuilder. If not, see .
*/
/* helper_c_capture.cpp
*
* This is inspired by the answer on stackoverflow
* https://stackoverflow.com/questions/35745541/how-to-get-printed-output-from-ctypes-c-functions-into-jupyter-ipython-notebook
* where certain libc functions
* are exposed using a python module (with ctypes). This is however very hacky
* and as I am using a C++ module anyway, I rather expose these functions cleanly
* through an extra library.
*
* Note:
* It was not straight-forward to expose _IO_FILE to boost::python. Hence,
* I simply crippled the exposed function to have not arguments and work on
* stdout directly.
*
* See \b create_c_contextmanager.py
*
* Created on: Apr 15, 2019
* Author: heber
*/
// include config.h
#ifdef HAVE_CONFIG_H
#include
#endif
//#include "CodePatterns/MemDebug.hpp"
#include
#include
#include
#include
#include "CodePatterns/Log.hpp"
using namespace boost::python;
void fflush_stdout() { fflush(stdout); }
void disable_stdout_buffering() { setbuf(stdout, NULL); }
void fflush_stderr() { fflush(stderr); }
void disable_stderr_buffering() { setbuf(stderr, NULL); }
void log_to_fileno(int fileno) {
__gnu_cxx::stdio_filebuf filebuf(fileno, std::ios::in);
std::ostream *out = new std::ostream(&filebuf);
logger::setOutputStream(out);
errorLogger::setOutputStream(out);
}
BOOST_PYTHON_MODULE(pyMoleCuilder_capture)
{
def("fflush_stderr", fflush_stderr, "flushing stderr buffer");
def("fflush_stdout", fflush_stdout, "flushing stdout buffer");
def("disable_stderr_buffering", disable_stderr_buffering,
"disabling the error buffer");
def("disable_stdout_buffering", disable_stdout_buffering,
"disabling the output buffer");
def("log_to_fileno", log_to_fileno, "divert log to a given file handle number");
}