summaryrefslogtreecommitdiff
path: root/src/utils/log.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/utils/log.c')
-rw-r--r--src/utils/log.c63
1 files changed, 63 insertions, 0 deletions
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 <stdarg.h>
+#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
+#include <string.h>
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");
+}