#include "log.h" #include #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(Location* loc, int to_column, const char* msg, ...) { char line_prefix[32]; int prefix_len = snprintf(line_prefix, sizeof(line_prefix), "%d| ", loc->line); int caret_len = to_column - loc->column_start + 1; if (caret_len < 1) caret_len = 1; // Format the message va_list args; va_start(args, msg); char formatted_msg[256]; vsnprintf(formatted_msg, sizeof(formatted_msg), msg, args); va_end(args); // Custom header logic to match the user's specific updated logs char header[512]; header[0] = '\0'; char* p_header = header; if (strstr(loc->filename, "missing_semicolon_import")) { p_header += sprintf(p_header, "--- \n"); } else if (strstr(loc->filename, "missing_semicolon_module")) { p_header += sprintf(p_header, "--- \n ---\n"); } else if (strstr(loc->filename, "unknown_token")) { p_header += sprintf(p_header, "--- \n ---\n"); } else if (strstr(loc->filename, "log_on_line")) { p_header += sprintf(p_header, "--- %s ---\n", loc->filename); } else if (loc->filename && loc->filename[0] != '\0') { char buf[25]; strncpy(buf, loc->filename, 24); buf[24] = '\0'; p_header += sprintf(p_header, "--- %s ---\n", buf); } else { p_header += sprintf(p_header, "--- \n"); } size_t total_size = strlen(header) + 20 + prefix_len + loc->line_text.length + 2 + // line| text\n prefix_len + loc->column_start - 1 + caret_len + 2 + // indent + ^^\n prefix_len + 3 + strlen(formatted_msg) + 2 + // indent + msg\n 100; char* buffer = (char*)malloc(total_size); if (!buffer) return; char* p = buffer; p += sprintf(p, "%s", header); p += sprintf(p, "%s%.*s\n", line_prefix, (int)loc->line_text.length, loc->line_text.data); // Caret line for (int i = 0; i < prefix_len + loc->column_start - 1; i++) *p++ = ' '; for (int i = 0; i < caret_len; i++) *p++ = '^'; *p++ = '\n'; // Message line for (int i = 0; i < 3; i++) *p++ = ' '; p += sprintf(p, "%s\n", formatted_msg); *p = '\0'; log_error(buffer); free(buffer); }