aboutsummaryrefslogtreecommitdiff
path: root/src/errmsg.cpp
blob: e2722f8d504107d894dd55fcee0b63a482873804 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include "errmsg.hpp"
#include "os.hpp"

#include <stdio.h>

#define RED "\x1b[31;1m"
#define WHITE "\x1b[37;1m"
#define GREEN "\x1b[32;1m"
#define RESET "\x1b[0m"

void print_err_msg(ErrorMsg *err, ErrColor color) {
    if (color == ErrColorOn || (color == ErrColorAuto && os_stderr_tty())) {
        fprintf(stderr, WHITE "%s:%d:%d: " RED "error:" WHITE " %s" RESET "\n",
                buf_ptr(err->path),
                err->line_start + 1, err->column_start + 1,
                buf_ptr(err->msg));

        assert(err->source);
        assert(err->line_offsets);

        int line_start_offset = err->line_offsets->at(err->line_start);
        int end_line = err->line_start + 1;
        int line_end_offset = (end_line >= err->line_offsets->length) ?
            buf_len(err->source) : err->line_offsets->at(err->line_start + 1);

        fwrite(buf_ptr(err->source) + line_start_offset, 1, line_end_offset - line_start_offset - 1, stderr);
        fprintf(stderr, "\n");
        for (int i = 0; i < err->column_start; i += 1) {
            fprintf(stderr, " ");
        }
        fprintf(stderr, GREEN "^" RESET "\n");

    } else {
        fprintf(stderr, "%s:%d:%d: error: %s\n",
                buf_ptr(err->path),
                err->line_start + 1, err->column_start + 1,
                buf_ptr(err->msg));
    }
}