From 1d204361e64f0d1f319e7eabb33b750101433aeb Mon Sep 17 00:00:00 2001 From: Allen Webster Date: Sat, 25 Sep 2021 21:45:35 -0700 Subject: [PATCH] [example] duplicate case checker --- bin/type_info_example.sh | 3 +- examples/type_metadata/generated/meta_types.c | 6 +-- examples/type_metadata/generated/meta_types.h | 6 +-- examples/type_metadata/type_metadata.c | 40 ++++++++++++++++++- examples/type_metadata/type_metadata.h | 1 + 5 files changed, 48 insertions(+), 8 deletions(-) diff --git a/bin/type_info_example.sh b/bin/type_info_example.sh index 1b41764..84dc9f9 100644 --- a/bin/type_info_example.sh +++ b/bin/type_info_example.sh @@ -18,9 +18,11 @@ examps=examples ###### Script ################################################################# echo ~~~ Type Info Example ~~~ $bin_path/bld_core.sh show_ctx +echo echo ~~~ Building Metaprogram ~~~ $bin_path/bld_core.sh unit type_metadata $examps/type_metadata/type_metadata.c +echo echo ~~~ Running Metaprogram ~~~ cd $examps/type_metadata/generated @@ -33,7 +35,6 @@ $bin_path/bld_core.sh unit type_info $examps/type_metadata/type_info_final_progr else echo !!! Skipping Program !!! fi - echo ###### Restore Path ########################################################### diff --git a/examples/type_metadata/generated/meta_types.c b/examples/type_metadata/generated/meta_types.c index e73169b..a1c71c2 100644 --- a/examples/type_metadata/generated/meta_types.c +++ b/examples/type_metadata/generated/meta_types.c @@ -1,4 +1,4 @@ -// generated by W:/metadesk/examples/type_metadata/type_metadata.c:707 +// generated by W:/metadesk/examples/type_metadata/type_metadata.c:744 TypeInfoMember Circle_members[2] = { {"r", 1, -1, &F32_type_info}, {"pos", 3, -1, &V2F32_type_info}, @@ -14,14 +14,14 @@ TypeInfoMember RoundedPolygon_members[3] = { {"p", 1, 1, &V2F32_type_info}, }; -// generated by W:/metadesk/examples/type_metadata/type_metadata.c:746 +// generated by W:/metadesk/examples/type_metadata/type_metadata.c:783 TypeInfoEnumerant Shape_members[3] = { {"Circle", 6, 1}, {"Segment", 7, 2}, {"Polygon", 7, 3}, }; -// generated by W:/metadesk/examples/type_metadata/type_metadata.c:782 +// generated by W:/metadesk/examples/type_metadata/type_metadata.c:819 TypeInfo U32_type_info = {TypeKind_Basic, "U32", 3, 4, 0, 0}; TypeInfo F32_type_info = {TypeKind_Basic, "F32", 3, 4, 0, 0}; TypeInfo V2F32_type_info = {TypeKind_Basic, "V2F32", 5, 8, 0, 0}; diff --git a/examples/type_metadata/generated/meta_types.h b/examples/type_metadata/generated/meta_types.h index 25dd5de..6f6f35b 100644 --- a/examples/type_metadata/generated/meta_types.h +++ b/examples/type_metadata/generated/meta_types.h @@ -1,6 +1,6 @@ #if !defined(META_TYPES_H) #define META_TYPES_H -// generated by W:/metadesk/examples/type_metadata/type_metadata.c:575 +// generated by W:/metadesk/examples/type_metadata/type_metadata.c:612 typedef struct Circle Circle; struct Circle { @@ -29,11 +29,11 @@ Shape_Segment = 2, Shape_Polygon = 3, }; -// generated by W:/metadesk/examples/type_metadata/type_metadata.c:659 +// generated by W:/metadesk/examples/type_metadata/type_metadata.c:696 TypeInfo* type_info_from_shape(Shape v); U32 max_slot_from_shape(Shape v); -// generated by W:/metadesk/examples/type_metadata/type_metadata.c:691 +// generated by W:/metadesk/examples/type_metadata/type_metadata.c:728 extern TypeInfo U32_type_info; extern TypeInfo F32_type_info; extern TypeInfo V2F32_type_info; diff --git a/examples/type_metadata/type_metadata.c b/examples/type_metadata/type_metadata.c index 4a27a20..ae8396f 100644 --- a/examples/type_metadata/type_metadata.c +++ b/examples/type_metadata/type_metadata.c @@ -499,9 +499,10 @@ gen_equip_map_cases(void) map != 0; map = map->next) { - if (map->types_are_good) { + + // get in type GEN_TypeInfo *in_type = map->in; // build the list @@ -567,6 +568,42 @@ gen_equip_map_cases(void) } } +void +gen_check_duplicate_cases(void) +{ + for (GEN_MapInfo *map = first_map; + map != 0; + map = map->next) + { + + for (GEN_MapCase *node = map->first_case; + node != 0; + node = node->next) + { + MD_String8 name = node->in->string; + for (GEN_MapCase *check = map->first_case; + check != 0; + check = check->next) + { + if (node == check) + { + break; + } + if (MD_S8Match(name, check->in->string, 0)) + { + MD_CodeLoc my_loc = MD_CodeLocFromNode(node->in); + MD_CodeLoc og_loc = MD_CodeLocFromNode(check->in); + MD_PrintMessageFmt(error_file, my_loc, MD_MessageKind_Error, + "'%.*s' is already defined", MD_S8VArg(name)); + MD_PrintMessageFmt(error_file, og_loc, MD_MessageKind_Note, + "see previous definition of '%.*s'", MD_S8VArg(name)); + break; + } + } + } + } +} + //~ generators //////////////////////////////////////////////////////////////// void @@ -887,6 +924,7 @@ main(int argc, char **argv) gen_equip_enum_members(); gen_equip_map_in_out_types(); gen_equip_map_cases(); + gen_check_duplicate_cases(); // generate header file { diff --git a/examples/type_metadata/type_metadata.h b/examples/type_metadata/type_metadata.h index 9fde97e..6383f73 100644 --- a/examples/type_metadata/type_metadata.h +++ b/examples/type_metadata/type_metadata.h @@ -101,6 +101,7 @@ void gen_equip_enum_underlying_type(void); void gen_equip_enum_members(void); void gen_equip_map_in_out_types(void); void gen_equip_map_cases(void); +void gen_check_duplicate_cases(void); //~ generators //////////////////////////////////////////////////////////////// void gen_type_definitions_from_types(FILE *out);