X-Git-Url: https://git.dogcows.com/gitweb?p=chaz%2Fyoink;a=blobdiff_plain;f=src%2Fmoof%2Flog.cc;h=d0acf2e103334e98c99a562b8688b2f644c0a9aa;hp=a11b7d0233efa7538a3bacef99f758c0d3354e8b;hb=6c9943707d4f33035830eba0587a61a34eaecbc2;hpb=831f04d4bc19a390415ac0bbac4331c7a65509bc diff --git a/src/moof/log.cc b/src/moof/log.cc index a11b7d0..d0acf2e 100644 --- a/src/moof/log.cc +++ b/src/moof/log.cc @@ -11,6 +11,13 @@ #include +#if !defined(__WIN32) +#include +#else +inline int isatty(int dummy) { return 0; } +#endif + + #include "log.hh" #include "script.hh" @@ -18,33 +25,80 @@ namespace moof { -enum log::level log::gLevel = log::info; +enum log::level log::global_level_ = log::info; void log::level(enum level level) { - gLevel = level; + global_level_ = level; } enum log::level log::level() { - return gLevel; + return global_level_; } -std::ostream& log(std::clog); +log::log(enum level level) : + level_(level) +{ + if (isatty(1) == 0) + switch (level) + { + case log::error: prefix_ = " error: "; break; + case log::warning: prefix_ = "warning: "; break; + case log::info: prefix_ = " info: "; break; + case log::debug: prefix_ = " debug: "; break; + case log::none: break; + } + else + switch (level) + { + case log::error: prefix_ = "\033[30;101m error: "; break; + case log::warning: prefix_ = "\033[30;103mwarning: "; break; + case log::info: prefix_ = " info: "; break; + case log::debug: prefix_ = "\033[2m debug: "; break; + case log::none: break; + } +} + +std::ostream& operator << (class log& log, log::endl_ endl) +{ + if (log::global_level_ < log.level_) return null_log; + if (isatty(1) == 0) return moof::log << std::endl; + else return moof::log << "\033[0m" << std::endl; +} + +std::ostream& operator << (std::ostream& stream, log::endl_ endl) +{ + if (isatty(1) == 0) return stream << std::endl; + else return stream << "\033[0m" << std::endl; +} + + +std::ostream& log(std::cout); static std::ofstream null_log_; std::ostream& null_log(null_log_); -class log log_error( log::error, " error: "); -class log log_warning(log::warning, "warning: "); -class log log_info( log::info, " info: "); + +// These objects are intentionally not deconstructed so that logging will +// still be available after this module has been cleaned up. +class log& log_error(*new class log(log::error)); +class log& log_warning(*new class log(log::warning)); +class log& log_info(*new class log(log::info)); +class log& log_debug(*new class log(log::debug)); static int log_script(script& script, enum log::level level) { - static class log* logs[] = {0, &log_error, &log_warning, &log_info}; + static class log* logs[] = { + 0, + &log_error, + &log_warning, + &log_info, + &log_debug + }; script::slot param = script[1]; @@ -67,6 +121,8 @@ void log::import(script& script) boost::bind(log_script, _1, log::info)); script.import_function("print", boost::bind(log_script, _1, log::info)); + script.import_function("LogDebug", + boost::bind(log_script, _1, log::debug)); }