diff --git a/bin/run_examples.sh b/bin/run_examples.sh index 74a40cb..abd658a 100755 --- a/bin/run_examples.sh +++ b/bin/run_examples.sh @@ -4,18 +4,19 @@ og_path=$PWD cd "$(dirname "$0")" cd .. - root_path=$PWD - build_path=$root_path/build -examples_path=$root_path/examples +root_path=$PWD +build_path=$root_path/build + +examps=$root_path/examples echo ~~~ Running Type Metadata Example ~~~ cd $build_path -./type_metadata.exe $examples_path/mdesk_files/types.mdesk +./type_metadata.exe $examps/type_metadata/types.mdesk echo echo ~~~ Running Error Generation Example ~~~ cd $build_path -./user_errors.exe $examples_path/mdesk_files/user_errors.mdesk +./user_errors.exe $examps/user_errors/user_errors.mdesk echo ###### Restore Path ########################################################### diff --git a/examples/type_metadata/type_metadata.c b/examples/type_metadata/type_metadata.c index 5c085c9..554806f 100644 --- a/examples/type_metadata/type_metadata.c +++ b/examples/type_metadata/type_metadata.c @@ -30,6 +30,19 @@ struct TypeInfo TypeInfo *next; TypeKind kind; MD_Node *node; + + // struct member list + struct TypeMember *first_member; + struct TypeMember *last_member; + int member_count; +}; + +typedef struct TypeMember TypeMember; +struct TypeMember +{ + TypeMember *next; + MD_Node *node; + TypeInfo *type; }; typedef struct MapInfo MapInfo; @@ -56,9 +69,19 @@ MD_Map map_map = {0}; int main(int argc, char **argv) { + char *argv_dummy[2] = { + 0, + "W:/metadesk/examples/type_metadata/types.mdesk" + }; + argc = 2; + argv = argv_dummy; + // setup the global arena arena = MD_ArenaAlloc(); + // output stream routing + FILE *fstream_errors = stderr; + // parse all files passed to the command line MD_Node *list = MD_MakeList(arena); for(int i = 1; i < argc; i += 1) @@ -73,7 +96,7 @@ main(int argc, char **argv) message = message->next) { MD_CodeLoc code_loc = MD_CodeLocFromNode(message->node); - MD_PrintMessage(stderr, code_loc, message->kind, message->string); + MD_PrintMessage(fstream_errors, code_loc, message->kind, message->string); } // save to parse results list @@ -110,12 +133,12 @@ main(int argc, char **argv) if (kind == TypeKind_Null){ MD_CodeLoc loc = MD_CodeLocFromNode(node); - MD_PrintMessageFmt(stderr, loc, MD_MessageKind_Error, + MD_PrintMessageFmt(fstream_errors, loc, MD_MessageKind_Error, "Unrecognized type kind '%.*s'\n", MD_S8VArg(tag_arg_str)); } else{ - TypeInfo *type_info = MD_PushArray(arena, TypeInfo, 1); + TypeInfo *type_info = MD_PushArrayZero(arena, TypeInfo, 1); type_info->kind = kind; type_info->node = node; @@ -138,6 +161,79 @@ main(int argc, char **argv) } } + // build struct member lists + for (TypeInfo *type = first_type; + type != 0; + type = type->next) + { + if (type->kind == TypeKind_Struct) + { + MD_b32 got_list = 1; + TypeMember *first_member = 0; + TypeMember *last_member = 0; + int member_count = 0; + + MD_Node *type_root_node = type->node; + for (MD_EachNode(member_node, type_root_node->first_child)) + { + MD_Node *type_name_node = member_node->first_child; + + // missing type node? + if (MD_NodeIsNil(type_name_node)) + { + MD_CodeLoc loc = MD_CodeLocFromNode(member_node); + MD_PrintMessage(fstream_errors, loc, MD_MessageKind_Error, + MD_S8Lit("Missing type name for member")); + got_list = 0; + goto skip_member; + } + + // has type node: + MD_String8 type_name = type_name_node->string; + MD_MapSlot *type_info_slot = (MD_MapSlot*)MD_MapLookup(&type_map, MD_MapKeyStr(type_name)); + + // could not resolve type? + if (type_info_slot == 0) + { + MD_CodeLoc loc = MD_CodeLocFromNode(type_name_node); + MD_PrintMessageFmt(fstream_errors, loc, MD_MessageKind_Error, + "Could not resolve type name '%.*s'", MD_S8VArg(type_name)); + got_list = 0; + goto skip_member; + } + + // resolved type: + if (got_list) + { + TypeInfo *type_info = (TypeInfo*)type_info_slot->val; + + TypeMember *member = MD_PushArray(arena, TypeMember, 1); + member->node = member_node; + member->type = type_info; + MD_QueuePush(first_member, last_member, member); + member_count += 1; + } + + skip_member:; + } + + if (got_list) + { + type->first_member = first_member; + type->last_member = last_member; + type->member_count = member_count; + } + } + } + + + // TODO check types & build member lists + // TODO check maps & build case lists + // TODO generate type definitions + // TODO generate function declarations + // TODO generate metadata tables + // TODO generate function definitions + // print state for (TypeInfo *type = first_type; type != 0; @@ -152,6 +248,15 @@ main(int argc, char **argv) MD_Node *node = type->node; printf("%.*s: %s\n", MD_S8VArg(node->string), kind_string); + + // print member lists + for (TypeMember *member = type->first_member; + member != 0; + member = member->next){ + printf(" %.*s: %.*s\n", + MD_S8VArg(member->node->string), + MD_S8VArg(member->type->node->string)); + } } for (MapInfo *map = first_map; @@ -160,11 +265,4 @@ main(int argc, char **argv) MD_Node *node = map->node; printf("%.*s: map\n", MD_S8VArg(node->string)); } - - // TODO check types & build member lists - // TODO check maps & build case lists - // TODO generate type definitions - // TODO generate function declarations - // TODO generate metadata tables - // TODO generate function definitions }