combine StringMatchFlags and NodeMatchFlags into MD_MatchFlags

This commit is contained in:
ryanfleury
2021-04-01 22:21:46 -06:00
parent ae2e1c6baa
commit 6dc8487965
7 changed files with 118 additions and 128 deletions
+28 -28
View File
@@ -18,7 +18,7 @@ static void OutputType_C_LHS_Namespace(FILE *file, MD_Map *user_defined_types, M
case MD_ExprKind_Atom:
{
MD_Node *node = type->node;
if(MD_StringMap_Lookup(user_defined_types, type->node->string))
{
fprintf(file, "%.*s", MD_StringExpand(prefix));
@@ -75,10 +75,10 @@ static void OutputPrefixedType(FILE *f, MD_Map *user_defined_types, MD_String8 p
{
I(); fprintf(f, "typedef enum\n");
I(); fprintf(f, "{\n");
MD_String8 singular_flag_type_name = node->string;
if(MD_StringMatch(MD_StringSuffix(singular_flag_type_name, 5), MD_S8Lit("Flags"),
MD_StringMatchFlag_CaseInsensitive))
MD_MatchFlag_CaseInsensitive))
{
singular_flag_type_name = MD_StringChop(singular_flag_type_name, 1);
}
@@ -94,7 +94,7 @@ static void OutputPrefixedType(FILE *f, MD_Map *user_defined_types, MD_String8 p
else if(MD_NodeHasTag(node, MD_S8Lit("union")) || MD_NodeHasTag(node, MD_S8Lit("struct")))
{
MD_String8 aggregate_kind = MD_NodeHasTag(node, MD_S8Lit("union")) ? MD_S8Lit("union") : MD_S8Lit("struct");
if(depth == 0)
{
fprintf(f, "typedef %.*s %.*s%.*s %.*s%.*s;\n",
@@ -102,7 +102,7 @@ static void OutputPrefixedType(FILE *f, MD_Map *user_defined_types, MD_String8 p
MD_StringExpand(prefix), MD_StringExpand(node->string),
MD_StringExpand(prefix), MD_StringExpand(node->string));
}
if(depth == 0)
{
I(); fprintf(f, "%.*s %.*s%.*s\n", MD_StringExpand(aggregate_kind),
@@ -112,7 +112,7 @@ static void OutputPrefixedType(FILE *f, MD_Map *user_defined_types, MD_String8 p
{
I(); fprintf(f, "%.*s\n", MD_StringExpand(aggregate_kind));
}
I(); fprintf(f, "{\n");
for(MD_EachNode(member, node->first_child))
{
@@ -130,12 +130,12 @@ static void OutputPrefixedType(FILE *f, MD_Map *user_defined_types, MD_String8 p
else
{
MD_Expr *type = MD_ParseAsType(node->first_child, node->last_child);
I();
OutputType_C_LHS_Namespace(f, user_defined_types, prefix, type);
fprintf(f, " %.*s", MD_StringExpand(node->string));
MD_OutputType_C_RHS(f, type);
fprintf(f, ";\n");
}
#undef I
@@ -144,12 +144,12 @@ static void OutputPrefixedType(FILE *f, MD_Map *user_defined_types, MD_String8 p
static void AppendConversionCode(FILE *f, MD_Map *user_defined_types, MD_Node *new_element, MD_Node *old_element, MD_String8 member_path)
{
MD_Map new_element_map = MapFromChildren(new_element);
if(MD_NodeHasTag(new_element, MD_S8Lit("struct")))
{
MD_String8 extended_member_path = MD_PushStringF("%.*s.%.*s", MD_StringExpand(member_path),
MD_StringExpand(old_element->string));
for(MD_EachNode(member, old_element->first_child))
{
MD_MapSlot *slot = MD_StringMap_Lookup(&new_element_map, member->string);
@@ -168,11 +168,11 @@ static void AppendConversionCode(FILE *f, MD_Map *user_defined_types, MD_Node *n
if(MD_ChildCountFromNode(new_element) == 1)
{
MD_String8 type_name = new_element->first_child->string;
if(MD_NodeDeepMatch(new_element, old_element, 0, 0))
if(MD_NodeDeepMatch(new_element, old_element, 0))
{
MD_String8 extended_member_path = MD_PushStringF("%.*s.%.*s", MD_StringExpand(member_path),
MD_StringExpand(old_element->string));
if(MD_StringMap_Lookup(user_defined_types, type_name))
{
fprintf(f, " result%.*s = %.*sFromV1(v%.*s);\n",
@@ -210,7 +210,7 @@ int main(int argument_count, char **arguments)
fprintf(stderr, "USAGE: %s spec_file_name.md out_file_name.c\n", arguments[0]);
return -1;
}
MD_ParseResult spec = MD_ParseWholeFile(MD_S8CString(arguments[1]));
if(spec.first_error)
{
@@ -220,16 +220,16 @@ int main(int argument_count, char **arguments)
}
return -1;
}
FILE *f = fopen(arguments[2], "wb");
if(f == 0)
{
fprintf(stderr, "Unable to open destination file \"%s\"\n", arguments[2]);
return -1;
}
MD_Map ns_map = MapFromChildren(spec.namespaces);
// NOTE(mal): Old types get "v1_" as a prefix
fprintf(f, "// V1\n");
MD_Node *v1 = MD_StringMap_Lookup(&ns_map, MD_S8Lit("v1"))->value;
@@ -238,17 +238,17 @@ int main(int argument_count, char **arguments)
{
OutputPrefixedType(f, &v1_map, MD_S8Lit("v1_"), node, 0);
}
// NOTE(mal): New types don't get a prefix
fprintf(f, "// V2\n");
MD_Map empty_map = {0};
MD_Node *v2 = MD_StringMap_Lookup(&ns_map, MD_S8Lit("v2"))->value;
for(MD_EachNodeRef(node, v2->first_child))
{
OutputPrefixedType(f, &empty_map, MD_S8Lit(""), node, 0);
}
// NOTE(mal): Routines that map old into new
fprintf(f, "// V1->V2\n");
MD_Map v2_map = MapFromChildren(v2);
@@ -257,15 +257,15 @@ int main(int argument_count, char **arguments)
MD_MapSlot *slot = MD_StringMap_Lookup(&v2_map, node->string);
MD_Node *v2_type = slot->value;
MD_Map children_map = MapFromChildren(v2_type);
fprintf(f, "static %.*s %.*sFromV1(v1_%.*s v)\n{\n",
MD_StringExpand(node->string), MD_StringExpand(node->string), MD_StringExpand(node->string));
if(MD_NodeHasTag(node, MD_S8Lit("enum")))
{
fprintf(f, " %.*s result = 0;\n", MD_StringExpand(node->string));
fprintf(f, " switch(v)\n {\n");
for(MD_EachNode(enumerand, node->first_child))
{
fprintf(f, " case v1_%.*s_%.*s: ",
@@ -289,14 +289,14 @@ int main(int argument_count, char **arguments)
else if(MD_NodeHasTag(node, MD_S8Lit("flags")))
{
fprintf(f, " %.*s result = 0;\n", MD_StringExpand(node->string));
MD_String8 singular_flag_type_name = node->string;
if(MD_StringMatch(MD_StringSuffix(singular_flag_type_name, 5), MD_S8Lit("Flags"),
MD_StringMatchFlag_CaseInsensitive))
MD_MatchFlag_CaseInsensitive))
{
singular_flag_type_name = MD_StringChop(singular_flag_type_name, 1);
}
for(MD_EachNode(flag, node->first_child))
{
fprintf(f, " if(v & v1_%.*s_%.*s) ",
@@ -316,7 +316,7 @@ int main(int argument_count, char **arguments)
else if(MD_NodeHasTag(node, MD_S8Lit("union")))
{
fprintf(f, " %.*s result = {0};\n", MD_StringExpand(node->string));
MD_Node *authoritative_member = v2_type->first_child;
for(MD_EachNode(member, v2_type->first_child))
{
@@ -326,7 +326,7 @@ int main(int argument_count, char **arguments)
break;
}
}
MD_Map v1_children_map = MapFromChildren(node);
MD_MapSlot *v1_member_slot = MD_StringMap_Lookup(&v1_children_map, authoritative_member->string);
if(v1_member_slot)
@@ -364,7 +364,7 @@ int main(int argument_count, char **arguments)
fprintf(f, "}\n\n");
fflush(f);
}
fclose(f);
return 0;
}