Files
c2/v0/log.c
T

84 lines
2.6 KiB
C

#include "log.h"
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <stdarg.h>
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);
}