3#ifndef INCLUDED_LOGGER_H_
4#define INCLUDED_LOGGER_H_
6#ifndef INCLUDE_INSIDE_JIT
13#include <unordered_set>
16#define LOG_PRINTF_FUNCTION newlang::Logger::log_printf
19#define LOG_MAKE(level, prefix, ...) LOG_PRINTF_FUNCTION(level, prefix, __FILE__, __LINE__, ##__VA_ARGS__)
21#define LOG_MAKE(level, prefix, ...) LOG_PRINTF_FUNCTION(level, prefix, NULL, 0, ##__VA_ARGS__)
24#define LOG_THROW(EXCEPT, LEVEL, PREFIX, ...) throw EXCEPT(LOG_MAKE(LEVEL, PREFIX, ##__VA_ARGS__))
25#define LOG_PARSER(format, ...) LOG_THROW(newlang::ParserError, LOG_LEVEL_ERROR, "P:", format, ##__VA_ARGS__)
26#define LOG_RUNTIME(format, ...) LOG_THROW(std::runtime_error, LOG_LEVEL_ABORT, "R:", format, ##__VA_ARGS__)
31#define LOG_TEST(...) LOG_MAKE(LOG_LEVEL_DEBUG, "T:", ##__VA_ARGS__)
32#define LOG_TEST_DUMP(...) LOG_MAKE(LOG_LEVEL_DUMP, "TD:", ##__VA_ARGS__)
33#define SCOPE(scope) public
37#define LOG_TEST_DUMP(...)
38#define SCOPE(scope) scope
43#define TO_STR2(ARG) #ARG
44#define TO_STR(ARG) TO_STR2(ARG)
49#define FILE_LINE_LINK __FILE__ "(" TO_STR(__LINE__) ") : "
50#define WARNING(exp) (FILE_LINE_LINK "WARNING: " exp)
52#define WARNING(exp) ("WARNING: " exp)
55#define STATIC_ASSERT(expr) static_assert((expr), #expr)
57#define ASSERT_EXCEPTION(text) do { LOG_MAKE(LOG_LEVEL_ABORT, "[ASSERT]:", "%s%s", text, newlang::Logger::GetStackTrace().c_str()); abort(); } while(0)
59#if defined(BUILD_DEBUG)
60#define ASSERT(condition) do {\
62 ASSERT_EXCEPTION(TO_STR(condition)); \
65#define VERIFY(exp) ASSERT(exp)
67#define ASSERT(condition)
68#define VERIFY(exp) (void)(exp)
73std::string
BinToHex(
const uint8_t * buffer,
const size_t size);
77size_t HexToBin(
const char * str, uint8_t * buffer,
const size_t size);
78int HexToBinEq(
const char * str,
const uint8_t * buffer,
const size_t size);
79size_t BinToHexBuffer(
const uint8_t * buffer,
const size_t size,
char * str,
const size_t str_size);
83#define LOG_LEVEL_DEFAULT 0
85#define LOG_LEVEL_DUMP 7
86#define LOG_LEVEL_DEBUG 6
87#define LOG_LEVEL_INFO 5
88#define LOG_LEVEL_WARNING 4
89#define LOG_LEVEL_ERROR 3
90#define LOG_LEVEL_FAULT 2
91#define LOG_LEVEL_ABORT 1
99#define LOG_LEVEL_MAX LOG_LEVEL_INFO
101#define LOG_LEVEL_MAX LOG_LEVEL_DUMP
109#ifndef LOG_LEVEL_NORMAL
111#define LOG_LEVEL_NORMAL LOG_LEVEL_ERROR
113#define LOG_LEVEL_NORMAL LOG_LEVEL_INFO
117#if LOG_LEVEL_MAX == LOG_LEVEL_DUMP
118#define LOG_DUMP(...) LOG_MAKE(LOG_LEVEL_DUMP, "DUMP:", ##__VA_ARGS__)
119#define LOG_DEBUG(...) LOG_MAKE(LOG_LEVEL_DEBUG, "D:", ##__VA_ARGS__)
120#define LOG_INFO(...) LOG_MAKE(LOG_LEVEL_INFO, NULL, ##__VA_ARGS__)
121#define LOG_WARNING(...) LOG_MAKE(LOG_LEVEL_WARNING, "W:", ##__VA_ARGS__)
122#define LOG_ERROR(...) LOG_MAKE(LOG_LEVEL_ERROR, "E:", ##__VA_ARGS__)
123#define LOG_FAULT(...) LOG_MAKE(LOG_LEVEL_FAULT, "F:", ##__VA_ARGS__)
124#define LOG_ABORT(...) LOG_MAKE(LOG_LEVEL_ABORT, "A:", ##__VA_ARGS__)
126#elif LOG_LEVEL_MAX == LOG_LEVEL_DEBUG
128#define LOG_DEBUG(...) LOG_MAKE(LOG_LEVEL_DEBUG, "D:", ##__VA_ARGS__)
129#define LOG_INFO(...) LOG_MAKE(LOG_LEVEL_INFO, NULL, ##__VA_ARGS__)
130#define LOG_WARNING(...) LOG_MAKE(LOG_LEVEL_WARNING, "W:", ##__VA_ARGS__)
131#define LOG_ERROR(...) LOG_MAKE(LOG_LEVEL_ERROR, "E:", ##__VA_ARGS__)
132#define LOG_FAULT(...) LOG_MAKE(LOG_LEVEL_FAULT, "F:", ##__VA_ARGS__)
133#define LOG_ABORT(...) LOG_MAKE(LOG_LEVEL_ABORT, "A:", ##__VA_ARGS__)
135#elif LOG_LEVEL_MAX == LOG_LEVEL_INFO
137#define LOG_DEBUG(...)
138#define LOG_INFO(...) LOG_MAKE(LOG_LEVEL_INFO, NULL, ##__VA_ARGS__)
139#define LOG_WARNING(...) LOG_MAKE(LOG_LEVEL_WARNING, "W:", ##__VA_ARGS__)
140#define LOG_ERROR(...) LOG_MAKE(LOG_LEVEL_ERROR, "E:", ##__VA_ARGS__)
141#define LOG_FAULT(...) LOG_MAKE(LOG_LEVEL_FAULT, "F:", ##__VA_ARGS__)
142#define LOG_ABORT(...) LOG_MAKE(LOG_LEVEL_ABORT, "A:", ##__VA_ARGS__)
145#error Define LOG_LEVEL_MAX value LOG_INFO or higher
148#ifndef INCLUDE_INSIDE_JIT
154 ::std::vector< ::std::string>* dest) {
155 ::std::vector< ::std::string> parsed;
156 ::std::string::size_type pos = 0;
158 const ::std::string::size_type colon = str.find(delimiter, pos);
159 if (colon == ::std::string::npos) {
160 parsed.push_back(str.substr(pos));
163 parsed.push_back(str.substr(pos, colon - pos));
177 const char* pattern,
const char* pattern_end) {
178 const char* name = name_str.c_str();
179 const char*
const name_begin = name;
180 const char*
const name_end = name + name_str.size();
182 const char* pattern_next = pattern;
183 const char* name_next = name;
185 while (pattern < pattern_end || name < name_end) {
186 if (pattern < pattern_end) {
189 if (name < name_end && *name == *pattern) {
196 if (name < name_end) {
206 pattern_next = pattern;
207 name_next = name + 1;
213 if (name_begin < name_next && name_next <= name_end) {
214 pattern = pattern_next;
224 return std::any_of(pattern.begin(), pattern.end(),
226 return c ==
'?' || c ==
'*'; });
237 std::vector<std::string> all_patterns;
239 const auto exact_match_patterns_begin = std::partition(
242 glob_patterns_.reserve(exact_match_patterns_begin - all_patterns.begin());
243 std::move(all_patterns.begin(), exact_match_patterns_begin,
246 exact_match_patterns_begin, all_patterns.end(),
256 [&name](
const std::string & pattern) {
257 return PatternMatchesString(
258 name, pattern.c_str(),
259 pattern.c_str() + pattern.size());
289 ParserError(
const std::string_view msg) : runtime_error(msg.begin()) {
293 template <
typename T>
294 typename std::enable_if < std::is_same<T, std::string>::value, std::string>::type
299 template <
typename T>
300 typename std::enable_if < !std::is_same<T, std::string>::value, std::string>::type
306 std::string
Dump(
const T &iterable) {
308 for (
auto &elem : iterable) {
352 fprintf(stdout,
"%s", str);
368 static std::string
log_printf(uint8_t level,
char const *prefix,
char const *file,
int line,
char const *format, ...)
void FuncCallback(void *param, LogLevelType level, const char *str, bool flush)
const Logger & operator=(const Logger &)=delete
static void PrintfCallback(void *, LogLevelType, const char *str, bool flush)
void SetCallback(FuncCallback *func, void *param)
static Logger * m_instance
bool SetPrintCallstack(bool enable)
static std::string log_printf(uint8_t level, char const *prefix, char const *file, int line, char const *format,...)
LogLevelType GetLogLevelNormal()
const char * AddString(LogLevelType level, char const *string, bool flush)
LogLevelType GetLogLevel()
void SaveCallback(FuncCallback *&func, void *¶m)
static std::string GetStackTrace()
static const char * GetLogLevelDesc(LogLevelType level)
Logger(const Logger &)=delete
LogLevelType SetLogLevel(const LogLevelType level)
static Logger * Instance()
ParserError(const std::string_view msg)
std::vector< std::string > glob_patterns_
const std::string_view filter_
bool MatchesName(const std::string &name) const
std::unordered_set< std::string > exact_match_patterns_
StringMatcher(const std::string &filter, const char separator=':')
__attribute__((weak)) std
size_t BinToHexBuffer(const uint8_t *buffer, const size_t size, char *str, const size_t str_size)
std::string BinToHex(const uint8_t *buffer, const size_t size)
size_t HexToBin(const char *str, uint8_t *buffer, const size_t size)
int HexToBinEq(const char *str, const uint8_t *buffer, const size_t size)
std::string HexStrToBinStr(std::string &hex_str)
uint8_t HexToByte(const char c)
void SplitString(const ::std::string &str, char delimiter, ::std::vector< ::std::string > *dest)
std::enable_if< std::is_same< T, std::string >::value, std::string >::type DumpToString(const T &obj)
bool IsGlobPattern(const std::string &pattern)
static bool PatternMatchesString(const std::string &name_str, const char *pattern, const char *pattern_end)
std::string Dump(const T &iterable)