#include #include #include namespace FxOS::Log { /* Currently configured log level */ static int loglevel = LEVEL_WRN; /* Level of the last message */ static int lastlevel = -1; /* Prefixes for each level */ static std::map prefixes = { { LEVEL_WRN, "warning: " }, { LEVEL_ERR, "error: " }, }; /* Select the log level */ void log_setminlevel(int level) { loglevel = level; } /* Get the minimum log level */ int log_getminlevel() { return loglevel; } /* General message logger */ void logmsg(int level, char const *function, std::string message) { if(level < loglevel) return; bool endline = true; bool prefix = true; /* Add a newline if last line was unfinished, but level changed */ if(lastlevel >= 0 && lastlevel != level) std::cerr << '\n'; else if(lastlevel >= 0) prefix = false; if(message.size() && message.back() == '\\') { endline = false; message.pop_back(); } if(prefix) { if(level == LEVEL_LOG) std::cerr << "[" << function << "] "; std::cerr << prefixes[level]; } else std::cerr << " "; std::cerr << message; lastlevel = -1; if(endline) std::cerr << '\n'; else lastlevel = level; } } /* namespace FxOS::Log */