mirror of
https://github.com/Ed94/metadesk.git
synced 2026-08-07 16:18:49 +00:00
[examples] generate type info declarations; generate member tables
This commit is contained in:
@@ -0,0 +1,18 @@
|
|||||||
|
// generated by W:/metadesk/examples/type_metadata/type_metadata.c:193
|
||||||
|
TypeInfoMember Circle_members[2] = {
|
||||||
|
{"r", 1, -1, &F32_type_info},
|
||||||
|
{"pos", 3, -1, &V2F32_type_info},
|
||||||
|
};
|
||||||
|
TypeInfoMember RoundedSegment_members[3] = {
|
||||||
|
{"r", 1, -1, &F32_type_info},
|
||||||
|
{"p1", 2, -1, &V2F32_type_info},
|
||||||
|
{"p2", 2, -1, &V2F32_type_info},
|
||||||
|
};
|
||||||
|
TypeInfoMember RoundedPolygon_members[3] = {
|
||||||
|
{"r", 1, -1, &F32_type_info},
|
||||||
|
{"count", 5, -1, &U32_type_info},
|
||||||
|
{"p", 1, 1, &V2F32_type_info},
|
||||||
|
};
|
||||||
|
|
||||||
|
// generated by W:/metadesk/examples/type_metadata/type_metadata.c:233
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
#if !defined(META_TYEPS_H)
|
#if !defined(META_TYPES_H)
|
||||||
#define META_TYEPS_H
|
#define META_TYPES_H
|
||||||
|
// generated by W:/metadesk/examples/type_metadata/type_metadata.c:93
|
||||||
typedef struct Circle Circle;
|
typedef struct Circle Circle;
|
||||||
struct Circle
|
struct Circle
|
||||||
{
|
{
|
||||||
@@ -26,6 +27,18 @@ Shape_Circle = 1,
|
|||||||
Shape_Segment = 2,
|
Shape_Segment = 2,
|
||||||
Shape_Polygon = 3,
|
Shape_Polygon = 3,
|
||||||
} Shape;
|
} Shape;
|
||||||
|
|
||||||
|
// generated by W:/metadesk/examples/type_metadata/type_metadata.c:152
|
||||||
TypeInfo* type_info_from_shape(Shape v);
|
TypeInfo* type_info_from_shape(Shape v);
|
||||||
U32 max_slot_from_shape(Shape v);
|
U32 max_slot_from_shape(Shape v);
|
||||||
#endif // META_TYEPS_H
|
|
||||||
|
// generated by W:/metadesk/examples/type_metadata/type_metadata.c:177
|
||||||
|
extern TypeInfo U32_type_info;
|
||||||
|
extern TypeInfo F32_type_info;
|
||||||
|
extern TypeInfo V2F32_type_info;
|
||||||
|
extern TypeInfo Circle_type_info;
|
||||||
|
extern TypeInfo RoundedSegment_type_info;
|
||||||
|
extern TypeInfo RoundedPolygon_type_info;
|
||||||
|
extern TypeInfo Shape_type_info;
|
||||||
|
|
||||||
|
#endif // META_TYPES_H
|
||||||
|
|||||||
@@ -30,12 +30,12 @@ struct TypeInfo
|
|||||||
{
|
{
|
||||||
// basic
|
// basic
|
||||||
int size;
|
int size;
|
||||||
|
// struct,enum
|
||||||
// struct: array of TypeInfoMember
|
|
||||||
// enum: array of TypeInfoEnumerant
|
|
||||||
int child_count;
|
int child_count;
|
||||||
void *children;
|
|
||||||
};
|
};
|
||||||
|
// struct: TypeInfoMember*
|
||||||
|
// enum: TypeInfoMember*
|
||||||
|
void *children;
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef struct TypeInfoMember TypeInfoMember;
|
typedef struct TypeInfoMember TypeInfoMember;
|
||||||
@@ -43,7 +43,7 @@ struct TypeInfoMember
|
|||||||
{
|
{
|
||||||
char *name;
|
char *name;
|
||||||
int name_length;
|
int name_length;
|
||||||
int array_count;
|
int array_count_member_index;
|
||||||
TypeInfo *type;
|
TypeInfo *type;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -88,8 +88,10 @@ MD_Map map_map = {0};
|
|||||||
//~ feature generators ////////////////////////////////////////////////////////
|
//~ feature generators ////////////////////////////////////////////////////////
|
||||||
|
|
||||||
void
|
void
|
||||||
generate_type_definitions(FILE *out, TypeInfo *first_type)
|
generate_type_definitions_from_types(FILE *out, TypeInfo *first_type)
|
||||||
{
|
{
|
||||||
|
MD_PrintGenNoteCComment(out);
|
||||||
|
|
||||||
for (TypeInfo *type = first_type;
|
for (TypeInfo *type = first_type;
|
||||||
type != 0;
|
type != 0;
|
||||||
type = type->next)
|
type = type->next)
|
||||||
@@ -140,11 +142,15 @@ generate_type_definitions(FILE *out, TypeInfo *first_type)
|
|||||||
}break;
|
}break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fprintf(out, "\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
generate_function_declarations_from_maps(FILE *out, MapInfo *first_map)
|
generate_function_declarations_from_maps(FILE *out, MapInfo *first_map)
|
||||||
{
|
{
|
||||||
|
MD_PrintGenNoteCComment(out);
|
||||||
|
|
||||||
for (MapInfo *map = first_map;
|
for (MapInfo *map = first_map;
|
||||||
map != 0;
|
map != 0;
|
||||||
map = map->next)
|
map = map->next)
|
||||||
@@ -161,8 +167,85 @@ generate_function_declarations_from_maps(FILE *out, MapInfo *first_map)
|
|||||||
fprintf(out, "%.*s %.*s(%.*s v);\n",
|
fprintf(out, "%.*s %.*s(%.*s v);\n",
|
||||||
MD_S8VArg(out_type), MD_S8VArg(node->string), MD_S8VArg(in_type));
|
MD_S8VArg(out_type), MD_S8VArg(node->string), MD_S8VArg(in_type));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fprintf(out, "\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
generate_type_info_declarations_from_types(FILE *out, TypeInfo *first_type)
|
||||||
|
{
|
||||||
|
MD_PrintGenNoteCComment(out);
|
||||||
|
|
||||||
|
for (TypeInfo *type = first_type;
|
||||||
|
type != 0;
|
||||||
|
type = type->next)
|
||||||
|
{
|
||||||
|
MD_String8 name = type->node->string;
|
||||||
|
fprintf(out, "extern TypeInfo %.*s_type_info;\n", MD_S8VArg(name));
|
||||||
|
}
|
||||||
|
|
||||||
|
fprintf(out, "\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
generate_struct_member_tables_from_types(FILE *out, TypeInfo *first_type)
|
||||||
|
{
|
||||||
|
MD_PrintGenNoteCComment(out);
|
||||||
|
|
||||||
|
for (TypeInfo *type = first_type;
|
||||||
|
type != 0;
|
||||||
|
type = type->next)
|
||||||
|
{
|
||||||
|
if (type->kind == TypeKind_Struct)
|
||||||
|
{
|
||||||
|
MD_String8 type_name = type->node->string;
|
||||||
|
int member_count = type->member_count;
|
||||||
|
|
||||||
|
fprintf(out, "TypeInfoMember %.*s_members[%d] = {\n", MD_S8VArg(type_name), member_count);
|
||||||
|
for (TypeMember *member = type->first_member;
|
||||||
|
member != 0;
|
||||||
|
member = member->next)
|
||||||
|
{
|
||||||
|
MD_String8 member_name = member->node->string;
|
||||||
|
MD_String8 member_type_name = member->type->node->string;
|
||||||
|
|
||||||
|
int array_count_member_index = -1;
|
||||||
|
if (!MD_NodeIsNil(member->array_count))
|
||||||
|
{
|
||||||
|
array_count_member_index = MD_IndexFromNode(member->array_count);
|
||||||
|
}
|
||||||
|
|
||||||
|
fprintf(out, "{\"%.*s\", %d, %d, &%.*s_type_info},\n",
|
||||||
|
MD_S8VArg(member_name), (int)member_name.size,
|
||||||
|
array_count_member_index, MD_S8VArg(member_type_name));
|
||||||
|
}
|
||||||
|
|
||||||
|
fprintf(out, "};\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fprintf(out, "\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
generate_enum_member_tables_from_types(FILE *out, TypeInfo *first_type)
|
||||||
|
{
|
||||||
|
MD_PrintGenNoteCComment(out);
|
||||||
|
|
||||||
|
for (TypeInfo *type = first_type;
|
||||||
|
type != 0;
|
||||||
|
type = type->next)
|
||||||
|
{
|
||||||
|
if (type->kind == TypeKind_Enum)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fprintf(out, "\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
//~ main //////////////////////////////////////////////////////////////////////
|
//~ main //////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
MD_Node*
|
MD_Node*
|
||||||
@@ -187,7 +270,7 @@ main(int argc, char **argv)
|
|||||||
arena = MD_ArenaAlloc();
|
arena = MD_ArenaAlloc();
|
||||||
|
|
||||||
// output stream routing
|
// output stream routing
|
||||||
FILE *fstream_errors = stderr;
|
FILE *error_file = stderr;
|
||||||
|
|
||||||
// parse all files passed to the command line
|
// parse all files passed to the command line
|
||||||
MD_Node *list = MD_MakeList(arena);
|
MD_Node *list = MD_MakeList(arena);
|
||||||
@@ -203,7 +286,7 @@ main(int argc, char **argv)
|
|||||||
message = message->next)
|
message = message->next)
|
||||||
{
|
{
|
||||||
MD_CodeLoc code_loc = MD_CodeLocFromNode(message->node);
|
MD_CodeLoc code_loc = MD_CodeLocFromNode(message->node);
|
||||||
MD_PrintMessage(fstream_errors, code_loc, message->kind, message->string);
|
MD_PrintMessage(error_file, code_loc, message->kind, message->string);
|
||||||
}
|
}
|
||||||
|
|
||||||
// save to parse results list
|
// save to parse results list
|
||||||
@@ -244,7 +327,7 @@ main(int argc, char **argv)
|
|||||||
if (kind == TypeKind_Null)
|
if (kind == TypeKind_Null)
|
||||||
{
|
{
|
||||||
MD_CodeLoc loc = MD_CodeLocFromNode(node);
|
MD_CodeLoc loc = MD_CodeLocFromNode(node);
|
||||||
MD_PrintMessageFmt(fstream_errors, loc, MD_MessageKind_Error,
|
MD_PrintMessageFmt(error_file, loc, MD_MessageKind_Error,
|
||||||
"Unrecognized type kind '%.*s'\n",
|
"Unrecognized type kind '%.*s'\n",
|
||||||
MD_S8VArg(tag_arg_str));
|
MD_S8VArg(tag_arg_str));
|
||||||
}
|
}
|
||||||
@@ -272,18 +355,31 @@ main(int argc, char **argv)
|
|||||||
MD_Node *in = map_tag->first_child;
|
MD_Node *in = map_tag->first_child;
|
||||||
MD_Node *arrow = in->next;
|
MD_Node *arrow = in->next;
|
||||||
MD_Node *out = arrow->next;
|
MD_Node *out = arrow->next;
|
||||||
|
|
||||||
if (!MD_S8Match(arrow->string, MD_S8Lit("->"), 0) ||
|
|
||||||
MD_NodeIsNil(out))
|
|
||||||
{
|
{
|
||||||
// TODO: error map type
|
MD_Node *error_at = 0;
|
||||||
|
if (MD_NodeIsNil(in))
|
||||||
|
{
|
||||||
|
error_at = map_tag;
|
||||||
|
}
|
||||||
|
else if (!MD_S8Match(arrow->string, MD_S8Lit("->"), 0) ||
|
||||||
|
MD_NodeIsNil(out))
|
||||||
|
{
|
||||||
|
error_at = in;
|
||||||
|
}
|
||||||
|
if (error_at != 0)
|
||||||
|
{
|
||||||
|
MD_CodeLoc loc = MD_CodeLocFromNode(error_at);
|
||||||
|
MD_PrintMessage(error_file, loc, MD_MessageKind_Error,
|
||||||
|
MD_S8Lit("Map's type should be specified like: `In -> Out`"));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// check for named children in the map tag
|
||||||
int is_complete = MD_NodeHasChild(map_tag, MD_S8Lit("complete"), 0);
|
int is_complete = MD_NodeHasChild(map_tag, MD_S8Lit("complete"), 0);
|
||||||
|
|
||||||
MD_Node *default_val = get_md_child_value(map_tag, MD_S8Lit("default"));
|
MD_Node *default_val = get_md_child_value(map_tag, MD_S8Lit("default"));
|
||||||
MD_Node *auto_val = get_md_child_value(map_tag, MD_S8Lit("auto"));
|
MD_Node *auto_val = get_md_child_value(map_tag, MD_S8Lit("auto"));
|
||||||
|
|
||||||
|
// save a new map
|
||||||
MapInfo *map_info = MD_PushArrayZero(arena, MapInfo, 1);
|
MapInfo *map_info = MD_PushArrayZero(arena, MapInfo, 1);
|
||||||
map_info->node = node;
|
map_info->node = node;
|
||||||
map_info->in = in;
|
map_info->in = in;
|
||||||
@@ -322,7 +418,7 @@ main(int argc, char **argv)
|
|||||||
if (MD_NodeIsNil(type_name_node))
|
if (MD_NodeIsNil(type_name_node))
|
||||||
{
|
{
|
||||||
MD_CodeLoc loc = MD_CodeLocFromNode(member_node);
|
MD_CodeLoc loc = MD_CodeLocFromNode(member_node);
|
||||||
MD_PrintMessage(fstream_errors, loc, MD_MessageKind_Error,
|
MD_PrintMessage(error_file, loc, MD_MessageKind_Error,
|
||||||
MD_S8Lit("Missing type name for member"));
|
MD_S8Lit("Missing type name for member"));
|
||||||
got_list = 0;
|
got_list = 0;
|
||||||
goto skip_member;
|
goto skip_member;
|
||||||
@@ -336,7 +432,7 @@ main(int argc, char **argv)
|
|||||||
if (type_info_slot == 0)
|
if (type_info_slot == 0)
|
||||||
{
|
{
|
||||||
MD_CodeLoc loc = MD_CodeLocFromNode(type_name_node);
|
MD_CodeLoc loc = MD_CodeLocFromNode(type_name_node);
|
||||||
MD_PrintMessageFmt(fstream_errors, loc, MD_MessageKind_Error,
|
MD_PrintMessageFmt(error_file, loc, MD_MessageKind_Error,
|
||||||
"Could not resolve type name '%.*s'", MD_S8VArg(type_name));
|
"Could not resolve type name '%.*s'", MD_S8VArg(type_name));
|
||||||
got_list = 0;
|
got_list = 0;
|
||||||
goto skip_member;
|
goto skip_member;
|
||||||
@@ -351,10 +447,23 @@ main(int argc, char **argv)
|
|||||||
MD_Node *array_tag = MD_TagFromString(type_name_node, MD_S8Lit("array"), 0);
|
MD_Node *array_tag = MD_TagFromString(type_name_node, MD_S8Lit("array"), 0);
|
||||||
if (!MD_NodeIsNil(array_tag))
|
if (!MD_NodeIsNil(array_tag))
|
||||||
{
|
{
|
||||||
array_count = array_tag->first_child;
|
MD_Node *array_count_referencer = array_tag->first_child;
|
||||||
if (MD_NodeIsNil(array_count))
|
if (array_count_referencer->string.size == 0)
|
||||||
{
|
{
|
||||||
// TODO: error array count
|
MD_CodeLoc loc = MD_CodeLocFromNode(array_tag);
|
||||||
|
MD_PrintMessage(error_file, loc, MD_MessageKind_Error,
|
||||||
|
MD_S8Lit("array tags must specify a parameter for their count"));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
array_count = MD_ChildFromString(type_root_node, array_count_referencer->string, 0);
|
||||||
|
if (MD_NodeIsNil(array_count))
|
||||||
|
{
|
||||||
|
MD_CodeLoc loc = MD_CodeLocFromNode(array_count_referencer);
|
||||||
|
MD_PrintMessageFmt(error_file, loc, MD_MessageKind_Error,
|
||||||
|
"'%.*s' is not a member of %.*s",
|
||||||
|
MD_S8VArg(array_count_referencer->string), MD_S8VArg(type_name));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -450,16 +559,19 @@ main(int argc, char **argv)
|
|||||||
// generate meta types header
|
// generate meta types header
|
||||||
{
|
{
|
||||||
FILE *h = fopen("meta_types.h", "wb");
|
FILE *h = fopen("meta_types.h", "wb");
|
||||||
fprintf(h, "#if !defined(META_TYEPS_H)\n");
|
fprintf(h, "#if !defined(META_TYPES_H)\n");
|
||||||
fprintf(h, "#define META_TYEPS_H\n");
|
fprintf(h, "#define META_TYPES_H\n");
|
||||||
|
|
||||||
// generate type definitions
|
// generate type definitions
|
||||||
generate_type_definitions(h, first_type);
|
generate_type_definitions_from_types(h, first_type);
|
||||||
|
|
||||||
// generate function declarations
|
// generate function declarations
|
||||||
generate_function_declarations_from_maps(h, first_map);
|
generate_function_declarations_from_maps(h, first_map);
|
||||||
|
|
||||||
fprintf(h, "#endif // META_TYEPS_H\n");
|
// generate metadata declarations
|
||||||
|
generate_type_info_declarations_from_types(h, first_type);
|
||||||
|
|
||||||
|
fprintf(h, "#endif // META_TYPES_H\n");
|
||||||
fclose(h);
|
fclose(h);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -468,7 +580,10 @@ main(int argc, char **argv)
|
|||||||
// open output file
|
// open output file
|
||||||
FILE *c = fopen("meta_types.c", "wb");
|
FILE *c = fopen("meta_types.c", "wb");
|
||||||
|
|
||||||
// TODO generate metadata tables
|
// generate metadata tables
|
||||||
|
generate_struct_member_tables_from_types(c, first_type);
|
||||||
|
generate_enum_member_tables_from_types(c, first_type);
|
||||||
|
|
||||||
// TODO generate function definitions
|
// TODO generate function definitions
|
||||||
|
|
||||||
// close output file
|
// close output file
|
||||||
|
|||||||
+5
-3
@@ -80,8 +80,8 @@
|
|||||||
# define MD_DEFAULT_SPRINTF 1
|
# define MD_DEFAULT_SPRINTF 1
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if !defined(MD_ENABLE_PRINT_HELPERS)
|
#if !defined(MD_DISABLE_PRINT_HELPERS)
|
||||||
# define MD_ENABLE_PRINT_HELPERS 0
|
# define MD_DISABLE_PRINT_HELPERS 0
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
@@ -1119,12 +1119,14 @@ MD_FUNCTION MD_String8 MD_StringFromMessageKind(MD_MessageKind kind);
|
|||||||
MD_FUNCTION MD_String8 MD_FormatMessage(MD_Arena *arena, MD_CodeLoc loc, MD_MessageKind kind,
|
MD_FUNCTION MD_String8 MD_FormatMessage(MD_Arena *arena, MD_CodeLoc loc, MD_MessageKind kind,
|
||||||
MD_String8 string);
|
MD_String8 string);
|
||||||
|
|
||||||
#if MD_ENABLE_PRINT_HELPERS
|
#if !MD_DISABLE_PRINT_HELPERS
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
MD_FUNCTION void MD_PrintMessage(FILE *file, MD_CodeLoc loc, MD_MessageKind kind,
|
MD_FUNCTION void MD_PrintMessage(FILE *file, MD_CodeLoc loc, MD_MessageKind kind,
|
||||||
MD_String8 string);
|
MD_String8 string);
|
||||||
MD_FUNCTION void MD_PrintMessageFmt(FILE *file, MD_CodeLoc code_loc, MD_MessageKind kind,
|
MD_FUNCTION void MD_PrintMessageFmt(FILE *file, MD_CodeLoc code_loc, MD_MessageKind kind,
|
||||||
char *fmt, ...);
|
char *fmt, ...);
|
||||||
|
|
||||||
|
#define MD_PrintGenNoteCComment(f) fprintf((f), "// generated by %s:%d\n", __FILE__, __LINE__)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
//~ Tree Comparison/Verification
|
//~ Tree Comparison/Verification
|
||||||
|
|||||||
Reference in New Issue
Block a user