diff --git a/src/metagen/metagen.c b/src/metagen/metagen.c index 73fe8a35..838328c5 100644 --- a/src/metagen/metagen.c +++ b/src/metagen/metagen.c @@ -112,6 +112,18 @@ mg_txt_pt_from_string_off(String8 string, U64 off) return pt; } +//////////////////////////////// +//~ rjf: Message Lists + +internal void +mg_msg_list_push(Arena *arena, MG_MsgList *msgs, MG_Msg *msg) +{ + MG_MsgNode *n = push_array(arena, MG_MsgNode, 1); + MemoryCopyStruct(&n->v, msg); + SLLQueuePush(msgs->first, msgs->last, n); + msgs->count += 1; +} + //////////////////////////////// //~ rjf: String Escaping diff --git a/src/metagen/metagen.h b/src/metagen/metagen.h index 3c86bce6..d15fbe74 100644 --- a/src/metagen/metagen.h +++ b/src/metagen/metagen.h @@ -4,6 +4,32 @@ #ifndef METAGEN_H #define METAGEN_H +//////////////////////////////// +//~ rjf: Message Type + +typedef struct MG_Msg MG_Msg; +struct MG_Msg +{ + String8 location; + String8 kind; + String8 msg; +}; + +typedef struct MG_MsgNode MG_MsgNode; +struct MG_MsgNode +{ + MG_MsgNode *next; + MG_Msg v; +}; + +typedef struct MG_MsgList MG_MsgList; +struct MG_MsgList +{ + MG_MsgNode *first; + MG_MsgNode *last; + U64 count; +}; + //////////////////////////////// //~ rjf: Parse Artifact Types @@ -230,6 +256,11 @@ read_only global MG_StrExpr mg_str_expr_nil = {&mg_str_expr_nil, &mg_str_expr_ni internal U64 mg_hash_from_string(String8 string); internal TxtPt mg_txt_pt_from_string_off(String8 string, U64 off); +//////////////////////////////// +//~ rjf: Message Lists + +internal void mg_msg_list_push(Arena *arena, MG_MsgList *msgs, MG_Msg *msg); + //////////////////////////////// //~ rjf: String Escaping diff --git a/src/metagen/metagen_main.c b/src/metagen/metagen_main.c index d00d4403..36d47408 100644 --- a/src/metagen/metagen_main.c +++ b/src/metagen/metagen_main.c @@ -28,6 +28,7 @@ int main(int argument_count, char **arguments) ////////////////////////////// //- rjf: set up state // + MG_MsgList msgs = {0}; mg_arena = arena_alloc__sized(GB(64), MB(64)); mg_state = push_array(mg_arena, MG_State, 1); mg_state->slots_count = 256; @@ -91,15 +92,11 @@ int main(int argument_count, char **arguments) String8 data = os_data_from_file_path(mg_arena, file_path); MD_TokenizeResult tokenize = md_tokenize_from_text(mg_arena, data); MD_ParseResult parse = md_parse_from_text_tokens(mg_arena, file_path, data, tokenize.tokens); - MG_FileParseNode *parse_n = push_array(mg_arena, MG_FileParseNode, 1); - SLLQueuePush(parses.first, parses.last, parse_n); - parse_n->v.root = parse.root; - parses.count += 1; - for(MD_Msg *msg = parse.msgs.first; msg != 0; msg = msg->next) + for(MD_Msg *m = parse.msgs.first; m != 0; m = m->next) { - TxtPt pt = mg_txt_pt_from_string_off(data, msg->node->src_offset); + TxtPt pt = mg_txt_pt_from_string_off(data, m->node->src_offset); String8 msg_kind_string = {0}; - switch(msg->kind) + switch(m->kind) { default:{}break; case MD_MsgKind_Note: {msg_kind_string = str8_lit("note");}break; @@ -107,8 +104,14 @@ int main(int argument_count, char **arguments) case MD_MsgKind_Error: {msg_kind_string = str8_lit("error");}break; case MD_MsgKind_FatalError: {msg_kind_string = str8_lit("fatal error");}break; } - fprintf(stderr, "%.*s:%i:%i: %.*s: %.*s\n", str8_varg(file_path), (int)pt.line, (int)pt.column, str8_varg(msg_kind_string), str8_varg(msg->string)); + String8 location = push_str8f(mg_arena, "%S:%I64d:%I64d", file_path, pt.line, pt.column); + MG_Msg dst_m = {location, msg_kind_string, m->string}; + mg_msg_list_push(mg_arena, &msgs, &dst_m); } + MG_FileParseNode *parse_n = push_array(mg_arena, MG_FileParseNode, 1); + SLLQueuePush(parses.first, parses.last, parse_n); + parse_n->v.root = parse.root; + parses.count += 1; } } } @@ -429,5 +432,14 @@ int main(int argument_count, char **arguments) } } + ////////////////////////////// + //- rjf: write out all messages to stderr + // + for(MG_MsgNode *n = msgs.first; n != 0; n = n->next) + { + MG_Msg *msg = &n->v; + fprintf(stderr, "%.*s: %.*s: %.*s\n", str8_varg(msg->location), str8_varg(msg->kind), str8_varg(msg->msg)); + } + return 0; }