[go: nahoru, domu]

Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Additional functionality #127

Draft
wants to merge 5 commits into
base: master
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
fix pretty progress
  • Loading branch information
Cyberhan123 committed Dec 27, 2023
commit eccbee3f7ee9e467a3bc913325768f21bdcc4afa
39 changes: 24 additions & 15 deletions util.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -182,6 +182,16 @@ void default_sd_logger(SDLogLevel level, const char* text) {

static sd_logger_function_t sd_logger = &default_sd_logger;

// Ref: https://stackoverflow.com/questions/2342162/stdstring-formatting-like-sprintf
template <typename... Args>
std::string string_format(const std::string& format, Args... args) {
int size_s = std::snprintf(nullptr, 0, format.c_str(), args...) + 1; // Extra space for '\0'
auto size = static_cast<size_t>(size_s);
std::unique_ptr<char[]> buf(new char[size]);
std::snprintf(buf.get(), size, format.c_str(), args...);
return {buf.get(), buf.get() + size - 1}; // We don't want the '\0' inside
}

std::string log_prefix(SDLogLevel level, const char* file, int line) {
const char* format = nullptr;
switch (level) {
Expand All @@ -198,38 +208,37 @@ std::string log_prefix(SDLogLevel level, const char* file, int line) {
format = "[ERROR] %s:%-4d - ";
} break;
}

char buffer[128];
const int len = std::snprintf(buffer, sizeof(buffer), format, basename(file).c_str(), line);
if (len >= sizeof(buffer)) {
std::string buffer2(len + 1, '\0');
std::snprintf(&buffer2[0], len + 1, format, basename(file).c_str(), line);
return buffer2;
}
return buffer;
return string_format(format, basename(file).c_str(), line);
}

void log_printf(SDLogLevel level, bool enable_log_tag, const char* file, int line, const char* format, ...) {
void log_printf(SDLogLevel level, bool enable_log_tag, bool enable_log_newline, const char* file, int line, const char* format, ...) {
if (level < log_level) {
return;
}

va_list args;
va_start(args, format);
const char* log_prefix_str = "";
std::string log_prefix_str;
if (enable_log_tag) {
log_prefix_str = log_prefix(level, file, line).c_str();
log_prefix_str = log_prefix(level, file, line);
}

char buffer[128];
const int len = std::vsnprintf(buffer, sizeof(buffer), format, args);
if (len < sizeof(buffer)) {
const std::string log_message = log_prefix_str + std::string(buffer);
std::string log_message = log_prefix_str + std::string(buffer);
if (enable_log_newline) {
log_message += "\n";
}
sd_logger(level, log_message.c_str());
} else {
char* buffer2 = new char[len + 2];
std::vsnprintf(buffer2, len + 1, format, args);
buffer2[len + 1] = 0;
const std::string log_message = log_prefix_str + std::string(buffer2);
buffer2[len + 1] = 0;
std::string log_message = log_prefix_str + std::string(buffer2);
if (enable_log_newline) {
log_message += "\n";
}
sd_logger(level, log_message.c_str());
delete[] buffer2;
}
Expand Down
12 changes: 6 additions & 6 deletions util.h
Original file line number Diff line number Diff line change
Expand Up @@ -34,15 +34,15 @@ enum SDLogLevel {

void set_sd_log_level(SDLogLevel level);

void log_printf(SDLogLevel level, bool enable_log_tag, const char* file, int line, const char* format, ...);
void log_printf(SDLogLevel level, bool enable_log_tag, bool enable_log_newline, const char* file, int line, const char* format, ...);

typedef std::function<void(SDLogLevel level, const char* text)> sd_logger_function_t;

void set_sd_logger(const sd_logger_function_t& sd_logger_function);

#define LOG_DEFAULT(format, ...) log_printf(SDLogLevel::INFO, false, __FILE__, __LINE__, format, ##__VA_ARGS__)
#define LOG_DEBUG(format, ...) log_printf(SDLogLevel::DEBUG, true, __FILE__, __LINE__, format, ##__VA_ARGS__)
#define LOG_INFO(format, ...) log_printf(SDLogLevel::INFO, true, __FILE__, __LINE__, format, ##__VA_ARGS__)
#define LOG_WARN(format, ...) log_printf(SDLogLevel::WARN, true, __FILE__, __LINE__, format, ##__VA_ARGS__)
#define LOG_ERROR(format, ...) log_printf(SDLogLevel::ERROR, true, __FILE__, __LINE__, format, ##__VA_ARGS__)
#define LOG_DEFAULT(format, ...) log_printf(SDLogLevel::INFO, false, false, __FILE__, __LINE__, format, ##__VA_ARGS__)
#define LOG_DEBUG(format, ...) log_printf(SDLogLevel::DEBUG, true, true, __FILE__, __LINE__, format, ##__VA_ARGS__)
#define LOG_INFO(format, ...) log_printf(SDLogLevel::INFO, true, true, __FILE__, __LINE__, format, ##__VA_ARGS__)
#define LOG_WARN(format, ...) log_printf(SDLogLevel::WARN, true, true, __FILE__, __LINE__, format, ##__VA_ARGS__)
#define LOG_ERROR(format, ...) log_printf(SDLogLevel::ERROR, true, true, __FILE__, __LINE__, format, ##__VA_ARGS__)
#endif // __UTIL_H__
Loading