meta parser better file line reporting
This commit is contained in:
@@ -3,6 +3,7 @@ gb_thread thread_ctx_t global_thread_context = {
|
||||
.break_on_fatal = true,
|
||||
.break_on_error = true,
|
||||
.break_on_warning = true,
|
||||
.print_file_and_line = true,
|
||||
.log_proc = default_log_proc,
|
||||
}
|
||||
};
|
||||
|
||||
@@ -423,22 +423,32 @@ fn lex_t *parser_matchi(parser_t *par, s8_t str) {
|
||||
}
|
||||
}
|
||||
|
||||
fn void parser_panicf(lex_t *token, const char *str, ...) {
|
||||
fn void parser_panicf(b32 print_only_file, lex_t *token, const char *str, ...) {
|
||||
ma_temp_t scratch = ma_begin_scratch();
|
||||
b8 p = tcx->log.print_file_and_line;
|
||||
tcx->log.print_file_and_line = false;
|
||||
|
||||
S8_FMT(scratch.arena, str, str8);
|
||||
fatalf("%s(%d:%d): error: %S", token->file, token->line, token->column, str8);
|
||||
if (print_only_file) {
|
||||
fatalf("%s: error: %S", token->file, str8);
|
||||
} else {
|
||||
fatalf("%S(%d): error: %S", token->file, token->line, str8);
|
||||
}
|
||||
|
||||
|
||||
tcx->log.print_file_and_line = p;
|
||||
ma_end_scratch(scratch);
|
||||
}
|
||||
|
||||
fn lex_t *parser_expect(parser_t *par, lex_kind_t kind) {
|
||||
lex_t *token = parser_match(par, kind);
|
||||
if (!token) parser_panicf(par->at, "expected token kind: %S, got instead: %S", lex_kind_to_s8(kind), lex_kind_to_s8(par->at->kind));
|
||||
if (!token) parser_panicf(par->print_only_file, par->at, "expected token kind: %S, got instead: %S", lex_kind_to_s8(kind), lex_kind_to_s8(par->at->kind));
|
||||
return token;
|
||||
}
|
||||
|
||||
fn lex_t *parser_expecti(parser_t *par, s8_t ident) {
|
||||
lex_t *token = parser_matchi(par, ident);
|
||||
if (!token) parser_panicf(par->at, "expected identifier: '%S'", ident);
|
||||
if (!token) parser_panicf(par->print_only_file, par->at, "expected identifier: '%S'", ident);
|
||||
return token;
|
||||
}
|
||||
|
||||
|
||||
@@ -149,6 +149,7 @@ typedef struct parser_t parser_t;
|
||||
struct parser_t {
|
||||
ma_arena_t *arena;
|
||||
lex_t *at;
|
||||
b8 print_only_file;
|
||||
};
|
||||
|
||||
#define parser_make(ARENA, TOKEN) &(parser_t){.arena = ARENA, .at = TOKEN}
|
||||
@@ -156,7 +157,7 @@ fn lex_t *parser_next(parser_t *par);
|
||||
fn lex_t *parser_match(parser_t *par, lex_kind_t kind);
|
||||
fn lex_t *parser_matchi(parser_t *par, s8_t str);
|
||||
fn lex_t *parser_expect(parser_t *par, lex_kind_t kind);
|
||||
fn void parser_panicf(lex_t *token, const char *str, ...);
|
||||
fn void parser_panicf(b32 print_only_file, lex_t *token, const char *str, ...);
|
||||
fn void parser_eat_until(parser_t *par, lex_kind_t kind);
|
||||
fn void parser_eat_including(parser_t *par, lex_kind_t kind);
|
||||
|
||||
|
||||
@@ -8,21 +8,27 @@ fn void log_basef(log_level_t level, s8_t file_and_line, const char *str, ...) {
|
||||
fn void default_log_proc(log_level_t level, s8_t file_and_line, s8_t string) {
|
||||
ma_temp_t scratch = ma_begin_scratch();
|
||||
|
||||
char *colon = ": ";
|
||||
if (tcx->log.print_file_and_line == false) {
|
||||
file_and_line.len = 0;
|
||||
colon = "";
|
||||
}
|
||||
|
||||
switch(level) {
|
||||
case log_level_debug:
|
||||
case log_level_info: {
|
||||
os_console_log(s8_printf(scratch.arena, "%S\n", string).str);
|
||||
} break;
|
||||
case log_level_warning: {
|
||||
os_console_log(s8_printf(scratch.arena, "%S: warning: %S\n", file_and_line, string).str);
|
||||
os_console_log(s8_printf(scratch.arena, "%S%s%S\n", file_and_line, colon, string).str);
|
||||
if (tcx->log.break_on_warning) debug_break();
|
||||
} break;
|
||||
case log_level_error: {
|
||||
os_console_log(s8_printf(scratch.arena, "%S: error: %S\n", file_and_line, string).str);
|
||||
os_console_log(s8_printf(scratch.arena, "%S%s%S\n", file_and_line, colon, string).str);
|
||||
if (tcx->log.break_on_error) debug_break();
|
||||
} break;
|
||||
case log_level_fatal: {
|
||||
os_error_box(s8_printf(scratch.arena, "%S: fatal error: %S\n", file_and_line, string).str);
|
||||
os_error_box(s8_printf(scratch.arena, "%S%s%S\n", file_and_line, colon, string).str);
|
||||
if (tcx->log.break_on_fatal) debug_break();
|
||||
} break;
|
||||
default_is_invalid;
|
||||
|
||||
@@ -13,6 +13,7 @@ struct logger_t {
|
||||
b8 break_on_fatal;
|
||||
b8 break_on_error;
|
||||
b8 break_on_warning;
|
||||
b8 print_file_and_line;
|
||||
};
|
||||
|
||||
///////////////////////////////
|
||||
@@ -24,7 +25,6 @@ struct logger_t {
|
||||
fn void default_log_proc(log_level_t level, s8_t file_and_line, s8_t string);
|
||||
fn void log_basef(log_level_t level, s8_t file_and_line, const char *str, ...);
|
||||
|
||||
|
||||
#if PLATFORM_DEBUG_ASSERT
|
||||
#define assert(x) (!(x) && (os_error_box(FILE_AND_LINE ": assertion failed: " #x "\n"), debug_break()))
|
||||
#else
|
||||
|
||||
Reference in New Issue
Block a user