city_generator2

Generated conformal 3D meshes representing a city
git clone git://git.meso-star.fr/city_generator2.git
Log | Files | Refs | README | LICENSE

commit 2f977f26b6e7326baf4b7b60d3c9ffe7b01112b8
parent d211a48847a30c16820bcbf449bd82149f0edabd
Author: Christophe Coustet <christophe.coustet@meso-star.com>
Date:   Fri, 13 Jan 2023 11:33:24 +0100

Improve reporting of duplicate catalog dataset names

Diffstat:
Msrc/cg_catalog.c | 66++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--------
Msrc/cg_catalog_parsing.c | 4++--
Msrc/cg_catalog_parsing.h | 4++--
3 files changed, 62 insertions(+), 12 deletions(-)

diff --git a/src/cg_catalog.c b/src/cg_catalog.c @@ -31,6 +31,46 @@ #include <rsys/logger.h> #include <rsys/str.h> +static const char* +find_first_filename + (const char* dataset_name, + const enum parsed_cmode_type dataset_cmode, + const struct parsed_catalog_items* items, + size_t count) +{ + size_t i, j; + + ASSERT(dataset_name && items && count > 0); + + for(i = 0; i < count; i++) { + if(items[i].constructive_mode != dataset_cmode) continue; + switch(items[i].constructive_mode) { + case mode_0: { + const struct parsed_catalog_cmode_0* prsd_0 = items[i].parsed_data; + for(j = 0; j < prsd_0->datasets_count; j++) { + const struct parsed_dataset_cmode_0* prsd_item = prsd_0->datasets + j; + if(0 == strcmp(prsd_item->name, dataset_name)) { + return items[i].filename; + } + } + break; + } + case mode_1: { + const struct parsed_catalog_cmode_1* prsd_1 = items[i].parsed_data; + for(j = 0; j < prsd_1->datasets_count; j++) { + const struct parsed_dataset_cmode_1* prsd_item = prsd_1->datasets + j; + if(0 == strcmp(prsd_item->name, dataset_name)) { + return items[i].filename; + } + } + break; + } + default: FATAL("Invalid enum value."); + } + } + CHK(0); /* Should not be there */ +} + res_T create_catalog (struct mem_allocator* allocator, @@ -66,19 +106,23 @@ create_catalog for(i = 0; i < count; i++) { switch(items[i].constructive_mode) { case mode_0: { - const struct parsed_catalog_cmode_0* parsed_0 = items[i].parsed_items; + const struct parsed_catalog_cmode_0* parsed_0 = items[i].parsed_data; for(j = 0; j < parsed_0->datasets_count; j++) { const struct parsed_dataset_cmode_0* parsed_item = parsed_0->datasets + j; struct dataset_cmode_0 item; ERR(str_set(&name, parsed_item->name)); + /* test name unicity */ if(htable_dataset_cmode_0_find(&catalog->catalog_0, &name)) { + const char* first_filename + = find_first_filename(parsed_item->name, PARSED_CMODE_0, items, count); logger_print(logger, LOG_ERROR, - "Duplicate dataset name: '%s' (in file '%s').\n", - parsed_item->name, items[i].filename); + "Duplicate dataset name: '%s' (in files '%s' and '%s').\n", + parsed_item->name, first_filename, items[i].filename); res = RES_BAD_ARG; goto error; } + /* Setup item */ item.wall_thickness = parsed_item->wall_thickness; item.floor_thickness = parsed_item->floor_thickness; ERR(htable_dataset_cmode_0_set(&catalog->catalog_0, &name, &item)); @@ -86,26 +130,32 @@ create_catalog break; } case mode_1: { - const struct parsed_catalog_cmode_1* parsed_1 = items[i].parsed_items; + const struct parsed_catalog_cmode_1* parsed_1 = items[i].parsed_data; for(j = 0; j < parsed_1->datasets_count; j++) { const struct parsed_dataset_cmode_1* parsed_item = parsed_1->datasets + j; struct dataset_cmode_1 item; ERR(str_set(&name, parsed_item->name)); + /* test name unicity */ if(htable_dataset_cmode_1_find(&catalog->catalog_1, &name)) { + const char* first_filename + = find_first_filename(parsed_item->name, PARSED_CMODE_1, items, count); logger_print(logger, LOG_ERROR, - "Duplicate dataset name: '%s' (in file '%s').\n", - parsed_item->name, items[i].filename); + "Duplicate dataset name: '%s' (in files '%s' and '%s').\n", + parsed_item->name, first_filename, items[i].filename); res = RES_BAD_ARG; goto error; } + /* Setup item */ item.inter_floor_count = parsed_item->inter_floor_count; item.wall_thickness = parsed_item->wall_thickness; item.floor_thickness = parsed_item->floor_thickness; item.inter_floor_thickness = parsed_item->inter_floor_thickness; item.roof_thickness = parsed_item->roof_thickness; - item.internal_insulation_thickness = parsed_item->internal_insulation_thickness; - item.external_insulation_thickness = parsed_item->external_insulation_thickness; + item.internal_insulation_thickness + = parsed_item->internal_insulation_thickness; + item.external_insulation_thickness + = parsed_item->external_insulation_thickness; item.floor_insulation_thickness = parsed_item->floor_insulation_thickness; item.roof_insulation_thickness = parsed_item->roof_insulation_thickness; item.foundation_depth = parsed_item->foundation_depth; diff --git a/src/cg_catalog_parsing.c b/src/cg_catalog_parsing.c @@ -87,7 +87,7 @@ parse_catalog /* Parse catalog items according to constructive mode */ schema = get_schema_from_parsed_cmode(parsed_cmode->cmode_type); - err = cyaml_load_file(filename, config, schema, &items[i].parsed_items, NULL); + err = cyaml_load_file(filename, config, schema, &items[i].parsed_data, NULL); ERR(cyaml_err_to_res_T(err)); /* Set other fields*/ @@ -135,7 +135,7 @@ release_parsed_catalog for(i = 0; i < count; i++) { const struct cyaml_schema_value* schema = get_schema_from_parsed_cmode(items[i].constructive_mode); - cyaml_err_t err = cyaml_free(config, schema, items[i].parsed_items, 1); + cyaml_err_t err = cyaml_free(config, schema, items[i].parsed_data, 1); CHK(RES_OK == cyaml_err_to_res_T(err)); } darray_parsed_catalog_items_release(&parsed->catalog); diff --git a/src/cg_catalog_parsing.h b/src/cg_catalog_parsing.h @@ -32,8 +32,8 @@ struct darray_catalog_filenames; struct parsed_catalog_items { enum parsed_cmode_type constructive_mode; - const char* filename; - void* parsed_items; + char* filename; + void* parsed_data; }; #define DARRAY_NAME parsed_catalog_items