#include "log.h" #include #include #include static LogError* s_logError = NULL; void log_set_output(LogError* destination) { s_logError = destination; } void log_error(const char* msg) { if (s_logError != NULL) { s_logError(msg); } else { fprintf(stderr, "Error: %s\n", msg); } } void log_on_line(const char* filename, const char* line_text, int line, int from, int to, const char* msg) { char line_prefix[32]; int prefix_len = snprintf(line_prefix, sizeof(line_prefix), "%d| ", line); int caret_len = to - from + 1; if (caret_len < 1) caret_len = 1; size_t total_size = strlen(filename) + 16 + // --- filename --- prefix_len + strlen(line_text) + 2 + // line| text\n prefix_len + from - 1 + caret_len + 2 + // indent + ^^\n prefix_len + strlen(msg) + 2 + // indent + msg\n 1; char* buffer = (char*)malloc(total_size); if (!buffer) return; char* p = buffer; p += sprintf(p, "--- %s ---\n", filename); p += sprintf(p, "%s%s\n", line_prefix, line_text); // Caret line for (int i = 0; i < prefix_len + from - 1; i++) *p++ = ' '; for (int i = 0; i < caret_len; i++) *p++ = '^'; *p++ = '\n'; // Message line for (int i = 0; i < prefix_len; i++) *p++ = ' '; p += sprintf(p, "%s\n", msg); *p = '\0'; log_error(buffer); free(buffer); }