mirror of
https://github.com/Ed94/metadesk.git
synced 2026-06-12 23:51:37 -07:00
[examples] struct member lists
This commit is contained in:
+6
-5
@@ -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 ###########################################################
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user