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:
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