// MAUS WARNING: THIS IS LEGACY CODE.
/* This file is part of MAUS: http://micewww.pp.rl.ac.uk/projects/maus
*
* MAUS 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.
*
* MAUS 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 MAUS. If not, see .
*
*/
#include
#include "Interface/Squeak.hh"
std::ostream* Squeak::stdout = NULL;
std::ostream* Squeak::stdlog = NULL;
std::ostream* Squeak::stderr = NULL;
std::ostream* Squeak::voidout = NULL;
std::map Squeak::output;
Squeak * Squeak::instance = NULL;
const Squeak::errorLevel Squeak::default_error_level = Squeak::warning;
std::ostream & Squeak::mout() {
getInstance();
return Squeak::mout(debug);
}
std::ostream & Squeak::mout(errorLevel level) {
getInstance();
return (*output[level]);
}
std::ostream & Squeak::mout(MAUS::Exception::exceptionLevel level) {
getInstance();
// eventually a map or somesuch I suspect
if (level == MAUS::Exception::recoverable)
return (*output[Squeak::error]);
else
return (*output[Squeak::fatal]);
}
void Squeak::setAnOutput(errorLevel level, std::ostream& out) {
getInstance();
output[level] = &out;
}
Squeak * Squeak::getInstance() {
if (instance == NULL) {
instance = new Squeak();
initialiseOutputs();
setOutputs(default_error_level);
setStandardOutputs(default_error_level);
}
return instance;
}
Squeak::Squeak() {
}
void Squeak::setOutputs(int verboseLevel) {
getInstance();
std::ostream* out[5] = {stdout, stdlog, stderr, stderr, stderr};
for (int i = 0; i <= fatal; ++i) {
if (i >= verboseLevel) output[Squeak::errorLevel(i)] = out[i];
else output[Squeak::errorLevel(i)] = voidout;
}
}
void Squeak::setStandardOutputs(int verboseLevel) {
getInstance();
activateCout(verboseLevel <= Squeak::debug);
activateClog(verboseLevel <= Squeak::info);
activateCerr(verboseLevel <= Squeak::error);
}
void Squeak::activateCout(bool isActive) {
getInstance();
if (isActive) std::cout.rdbuf(stdout->rdbuf());
else std::cout.rdbuf(voidout->rdbuf());
}
bool Squeak::coutIsActive() {
getInstance();
return std::cout.rdbuf() != voidout->rdbuf();
}
void Squeak::activateCerr(bool isActive) {
getInstance();
if (isActive) std::cerr.rdbuf(stdlog->rdbuf());
else std::cerr.rdbuf(voidout->rdbuf());
}
bool Squeak::cerrIsActive() {
getInstance();
return std::cerr.rdbuf() != voidout->rdbuf();
}
void Squeak::activateClog(bool isActive) {
getInstance();
if (isActive) std::clog.rdbuf(stdlog->rdbuf());
else std::clog.rdbuf(voidout->rdbuf());
}
bool Squeak::clogIsActive() {
getInstance();
return std::clog.rdbuf() != voidout->rdbuf();
}
void Squeak::initialiseOutputs() {
// assume they are all uninitialised if one is (we always initialise together)
voidout = new std::ofstream(); // this points at /dev/null by default
stdout = new std::ofstream();
stdout->rdbuf(std::cout.rdbuf());
stdlog = new std::ofstream();
stdlog->rdbuf(std::clog.rdbuf());
stderr = new std::ofstream();
stderr->rdbuf(std::cerr.rdbuf());
}
std::ostream& Squeak::nullOut() {
getInstance();
return *voidout;
}
std::ostream& Squeak::coutOut() {
getInstance();
return *stdout;
}
std::ostream& Squeak::clogOut() {
getInstance();
return *stdlog;
}
std::ostream& Squeak::cerrOut() {
getInstance();
return *stderr;
}