Skip to content
Merged
Changes from all commits
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
73 changes: 44 additions & 29 deletions src/core/util.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -62,17 +62,34 @@ void replace_all_chars(std::string& str, char target, char replacement) {
}
}

std::string sd_format(const char* fmt, ...) {
va_list ap;
static std::string sd_vformat(const char* fmt, va_list ap) {
char small[128];
va_list ap2;
va_start(ap, fmt);
va_copy(ap2, ap);
int size = vsnprintf(nullptr, 0, fmt, ap);
std::vector<char> buf(size + 1);
int size2 = vsnprintf(buf.data(), size + 1, fmt, ap2);
int size = vsnprintf(small, sizeof small, fmt, ap);
if (size < 0) {
va_end(ap2);
return {};
}
size_t needed = (size_t)size;
if (needed < sizeof small) {
va_end(ap2);
return std::string(small, needed);
}
std::string out(needed, '\0');
int size2 = vsnprintf(out.data(), needed + 1, fmt, ap2);
va_end(ap2);
if (size2 < 0)
out.clear();
return out;
}

std::string sd_format(const char* fmt, ...) {
va_list ap;
va_start(ap, fmt);
std::string result = sd_vformat(fmt, ap);
va_end(ap);
return std::string(buf.data(), size);
return result;
}

int round_up_to(int value, int base) {
Expand Down Expand Up @@ -624,47 +641,45 @@ std::string trim(const std::string& s) {
static sd_log_cb_t sd_log_cb = nullptr;
void* sd_log_cb_data = nullptr;

#define LOG_BUFFER_SIZE 4096
static void sd_log_dispatch(sd_log_level_t level, const std::string& origin, const std::string& text) {
if (sd_log_cb == nullptr)
return;
std::string message = origin + " - " + text;
if (message.back() != '\n') {
message += '\n';
}
sd_log_cb(level, message.c_str(), sd_log_cb_data);
}

void log_printf(sd_log_level_t level, const char* file, int line, const char* format, ...) {
va_list args;
va_start(args, format);

static char log_buffer[LOG_BUFFER_SIZE + 1];
int written = snprintf(log_buffer, LOG_BUFFER_SIZE, "%s:%-4d - ", sd_basename(file).c_str(), line);

if (written >= 0 && written < LOG_BUFFER_SIZE) {
vsnprintf(log_buffer + written, LOG_BUFFER_SIZE - written, format, args);
}
size_t len = strlen(log_buffer);
if (log_buffer[len - 1] != '\n') {
strncat(log_buffer, "\n", LOG_BUFFER_SIZE - len);
}

if (sd_log_cb) {
sd_log_cb(level, log_buffer, sd_log_cb_data);
}

std::string message = sd_vformat(format, args);
va_end(args);
std::string origin = sd_format("%s:%-4d", sd_basename(file).c_str(), line);
sd_log_dispatch(level, origin, message);
}

void sd_ggml_log_callback(ggml_log_level level, const char* text, void*) {
sd_log_level_t sd_level = SD_LOG_VERBOSE;
switch (level) {
case GGML_LOG_LEVEL_DEBUG:
LOG_VERBOSE(text);
sd_level = SD_LOG_VERBOSE;
break;
case GGML_LOG_LEVEL_INFO:
LOG_INFO(text);
sd_level = SD_LOG_INFO;
break;
case GGML_LOG_LEVEL_WARN:
LOG_WARN(text);
sd_level = SD_LOG_WARN;
break;
case GGML_LOG_LEVEL_ERROR:
LOG_ERROR(text);
sd_level = SD_LOG_ERROR;
break;
default:
LOG_VERBOSE(text);
sd_level = SD_LOG_VERBOSE;
break;
}
sd_log_dispatch(sd_level, "ggml", text);
}

void sd_set_log_callback(sd_log_cb_t cb, void* data) {
Expand Down
Loading