diff --git a/README.md b/README.md index 4e934ad7..2edcca0b 100644 --- a/README.md +++ b/README.md @@ -33,65 +33,64 @@ output: #include "nestlog/scope.hpp" + using namespace xo; + int fib(int n) { - XO_SCOPE(log); + scope log(XO_ENTER0(info), ":n ", n); int retval = 1; if (n >= 2) { - log(":n ", n); retval = fib(n - 1) + fib(n - 2); + log && log(":n ", n); } - log(":n ", n, " -> :retval ", retval); + log.end_scope("<- :retval ", retval); return retval; } int main(int argc, char ** argv) { - XO_SCOPE(log); + log_config::min_log_level = xo::log_level::info; + log_config::indent_width = 4; - int n = 4; - int fn = fib(n); + int n = 4; - log(":n ", n, " :fib(n) ", fn); + scope log(XO_ENTER0(info), ":n ", 4); + + int fn = fib(n); + + log && log(":n ", n); + log && log("<- :fib(n) ", fn); } output: - +main - +fib - :n 4 - +fib - :n 3 - +fib - :n 2 - +fib - :n 1 -> :retval 1 - -fib - +fib - :n 0 -> :retval 1 - -fib - :n 2 -> :retval 2 - -fib - +fib - :n 1 -> :retval 1 - -fib - :n 3 -> :retval 3 - -fib - +fib - :n 2 - +fib - :n 1 -> :retval 1 - -fib - +fib - :n 0 -> :retval 1 - -fib - :n 2 -> :retval 2 - -fib - :n 4 -> :retval 5 - -fib - :n 4 :fib(n) 5 - -main + 20:13:12.992909 +(0) main :n 4 [ex2.cpp:30] + 20:13:12.992968 +(1) fib :n 4 [ex2.cpp:9] + 20:13:12.992986 +(2) fib :n 3 [ex2.cpp:9] + 20:13:12.992999 +(3) fib :n 2 [ex2.cpp:9] + 20:13:12.993002 +(4) fib :n 1 [ex2.cpp:9] + 20:13:12.993012 -(4) fib <- :retval 1 + 20:13:12.993022 +(4) fib :n 0 [ex2.cpp:9] + 20:13:12.993032 -(4) fib <- :retval 1 + :n 2 + 20:13:12.993049 -(3) fib <- :retval 2 + 20:13:12.993059 +(3) fib :n 1 [ex2.cpp:9] + 20:13:12.993069 -(3) fib <- :retval 1 + :n 3 + 20:13:12.993085 -(2) fib <- :retval 3 + 20:13:12.993095 +(2) fib :n 2 [ex2.cpp:9] + 20:13:12.993105 +(3) fib :n 1 [ex2.cpp:9] + 20:13:12.993115 -(3) fib <- :retval 1 + 20:13:12.993124 +(3) fib :n 0 [ex2.cpp:9] + 20:13:12.993134 -(3) fib <- :retval 1 + :n 2 + 20:13:12.993145 -(2) fib <- :retval 2 + :n 4 + 20:13:12.993155 -(1) fib <- :retval 5 + :n 4 + <- :fib(n) 5 + 20:13:12.993172 -(0) main diff --git a/example/ex2/ex2.cpp b/example/ex2/ex2.cpp index 016fe177..23bb2b3e 100644 --- a/example/ex2/ex2.cpp +++ b/example/ex2/ex2.cpp @@ -12,7 +12,7 @@ fib(int n) { if (n >= 2) { retval = fib(n - 1) + fib(n - 2); - log(":n ", n); + log && log(":n ", n); } log.end_scope("<- :retval ", retval); @@ -22,6 +22,7 @@ fib(int n) { int main(int argc, char ** argv) { + log_config::min_log_level = xo::log_level::info; log_config::indent_width = 4; int n = 4; @@ -30,6 +31,6 @@ main(int argc, char ** argv) { int fn = fib(n); - log(":n ", n); - log("<- :fib(n) ", fn); + log && log(":n ", n); + log && log("<- :fib(n) ", fn); } diff --git a/example/ex3/ex3.cpp b/example/ex3/ex3.cpp index 0d9121dc..d20f0f65 100644 --- a/example/ex3/ex3.cpp +++ b/example/ex3/ex3.cpp @@ -26,14 +26,14 @@ main(int argc, char ** argv) { log_config::time_local_flag = true; log_config::style = FS_Streamlined; log_config::indent_width = 4; - log_config::max_indent_width = 14; - log_config::location_tab = 80; + log_config::max_indent_width = 30; + log_config::location_tab = 100; log_config::encoding = CE_Xterm; log_config::function_entry_color = 69; log_config::function_exit_color = 70; log_config::code_location_color = 166; - int n = 4; + int n = 9; scope log(XO_ENTER0(info), ":n ", 4); diff --git a/include/nestlog/color.hpp b/include/nestlog/color.hpp index 2c2419c2..20ea0bb1 100644 --- a/include/nestlog/color.hpp +++ b/include/nestlog/color.hpp @@ -33,6 +33,8 @@ namespace xo { void print(std::ostream & os) const { if ((flags_ & CF_ColorOn) && (color_ > 0)) { switch(encoding_) { + case CE_None: + break; case CE_Ansi: os << "\033[" << color_ << "m"; break; @@ -45,8 +47,16 @@ namespace xo { if (flags_ & CF_Contents) os << contents_; - if ((flags_ & CF_ColorOff) && (color_ > 0)) - os << "\033[0m"; + if ((flags_ & CF_ColorOff) && (color_ > 0)) { + switch(encoding_) { + case CE_None: + break; + case CE_Ansi: + case CE_Xterm: + os << "\033[0m"; + break; + } + } } /*print*/ private: diff --git a/include/nestlog/log_level.hpp b/include/nestlog/log_level.hpp index f5d5f4db..55c4f2a4 100644 --- a/include/nestlog/log_level.hpp +++ b/include/nestlog/log_level.hpp @@ -5,13 +5,28 @@ namespace xo { enum class log_level : std::uint32_t { /* control log message severity - * silent > severe > error > warning > info > chatty + * silent > always > severe > error > warning > info > chatty > never + * + * never: + * used internally e.g. by XO_ENTER1() + * a log message with this severity will never be printed + * + * always: + * use with XO_ENTER1(): + * scope log(XO_ENTER1(always, mydebug_flag)); + * to log message whenever mydebug_flag is true (for any .min_log_level except silent) + * + * silent: + * use in log_config to suppress all log messages */ + never, + verbose, chatty, info, warning, error, severe, + always, silent, default_level = error diff --git a/include/nestlog/scope.hpp b/include/nestlog/scope.hpp index f15515df..fac759c2 100644 --- a/include/nestlog/scope.hpp +++ b/include/nestlog/scope.hpp @@ -17,7 +17,13 @@ namespace xo { class state_impl; # define XO_ENTER0(lvl) xo::scope_setup(xo::log_level::lvl, xo::log_config::style, __PRETTY_FUNCTION__, __FILE__, __LINE__) -# define XO_ENTER1(lvl, debug_flag) xo::scope_setup(xo::log_level::lvl, xo::log_config::style, __PRETTY_FUNCTION__, __FILE__, __LINE__, debug_flag) +# define XO_ENTER1(lvl, debug_flag) XO_ENTER2(lvl, debug_flag, __PRETTY_FUNCTION__) +# define XO_ENTER2(lvl, debug_flag, name1) xo::scope_setup((debug_flag ? xo::log_level::lvl : xo::log_level::never), xo::log_config::style, name1, __FILE__, __LINE__) + +# define XO_DEBUG(debug_flag) XO_ENTER1(always, debug_flag) +# define XO_DEBUG2(debug_flag, name1) XO_ENTER2(always, debug_flag, name1) + +# define XO_LITERAL(lvl, name1, name2) xo::scope_setup(xo::log_level::lvl, FS_Literal, name1, name2, __FILE__, __LINE__) //# define XO_SSETUP0() xo::scope_setup(__FUNCTION__) //# define XO_SSETUP0(lvl) xo::scope_setup(xo::log_level::lvl, xo::log_config::style, __PRETTY_FUNCTION__, __FILE__, __LINE__) @@ -27,8 +33,8 @@ namespace xo { /* establish scope using current function name */ # define XO_SCOPE(name, lvl) xo::scope name(xo::scope_setup(xo::log_level::lvl, xo::log_config::style, __PRETTY_FUNCTION__, __FILE__, __LINE__)) /* like XO_SCOPE(name), but also set enabled flag */ -# define XO_SCOPE2(name, debug_flag) xo::scope name(xo::scope_setup(xo::log_config::style, __PRETTY_FUNCTION__, __FILE__, __LINE__, debug_flag)) -# define XO_SCOPE_DISABLED(name) xo::scope name(xo::scope_setup(xo::log_config::style, __PRETTY_FUNCTION__, __FILE__, __LINE__, false)) +//# define XO_SCOPE2(name, debug_flag) xo::scope name(xo::scope_setup(xo::log_config::style, __PRETTY_FUNCTION__, __FILE__, __LINE__, debug_flag)) +# define XO_SCOPE_DISABLED(name) xo::scope name(xo::scope_setup(xo::log_level::never, xo::log_config::style, __PRETTY_FUNCTION__, __FILE__, __LINE__)) # define XO_STUB() { XO_SCOPE(logr); logr.log("STUB"); } /* convenience class for basic_scope<..> construction (see below).