From 964c7178a371f79123d54a43671375f5c0ceb7e4 Mon Sep 17 00:00:00 2001 From: A404M Date: Sat, 8 Feb 2025 08:54:04 +0330 Subject: better errors --- src/utils/log.c | 63 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 63 insertions(+) (limited to 'src/utils/log.c') diff --git a/src/utils/log.c b/src/utils/log.c index f54394a..e84f3b4 100644 --- a/src/utils/log.c +++ b/src/utils/log.c @@ -1,8 +1,10 @@ #include "log.h" #include +#include #include #include +#include void _printLogBack(const char *format, const char *file, int line, ...) { va_list args; @@ -13,3 +15,64 @@ void _printLogBack(const char *format, const char *file, int line, ...) { printf("\e[0;31mError: %s at compiler %s:%d\e[0m\n", errorStr, file, line); free(errorStr); } + +extern char **fileCodes; +extern const char **fileCodes_names; +extern size_t fileCodes_length; + +void _printErrorBack(const char *format, const char *file, int line, + char *begin, char *end, ...) { + va_list args; + va_start(args, end); + char *errorStr; + vasprintf(&errorStr, format, args); + + size_t file_index = SIZE_MAX; + for (size_t i = 0; i < fileCodes_length; ++i) { + char *fileCode_begin = fileCodes[i]; + char *fileCode_end = fileCodes[i] + strlen(fileCodes[i]); + if (begin >= fileCode_begin && end <= fileCode_end) { + file_index = i; + break; + } + } + + const char firstColor[] = "\e[0;36m"; + const char secondColor[] = "\e[0;31m"; + fprintf(stderr, "%sError: %s at compiler %s:%d\e[0m\n", firstColor, errorStr, + file, line); + free(errorStr); + + if (file_index == SIZE_MAX) { + return; + } + + size_t file_line = 1; + char *file_line_begin = fileCodes[file_index]; + char *file_line_end = fileCodes[file_index]; + for (char *iter = fileCodes[file_index]; *iter != '\0'; ++iter) { + if (*iter == '\n') { + if (iter <= begin) { + file_line_begin = iter + 1; + } else if (iter >= end) { + file_line_end = iter; + } + if (iter <= end) { + ++file_line; + } + } + } + + fprintf(stderr, "\e%sAt %s:%ld\n", firstColor, fileCodes_names[file_index], + file_line); + + for (char *iter = file_line_begin; iter < file_line_end; ++iter) { + if (iter == begin) { + fprintf(stderr, "%s", secondColor); + } else if (iter == end) { + fprintf(stderr, "%s", firstColor); + } + fprintf(stderr, "%c", *iter); + } + fprintf(stderr, "\e[0m"); +} -- cgit v1.2.3