commit 18c279ae94c51b44f785886fbc2a233b29c791ce
parent e20b5a9eb73c33969250f8d53d2de38907727a08
Author: Christophe Coustet <christophe.coustet@meso-star.com>
Date: Wed, 23 Nov 2022 15:02:23 +0100
BugFix: geometry name tracking broken on rename
Diffstat:
| M | src/scad_geometry.c | | | 72 | ++++++++++++++++++++++++++++++++++++++++++++++++++---------------------- |
1 file changed, 50 insertions(+), 22 deletions(-)
diff --git a/src/scad_geometry.c b/src/scad_geometry.c
@@ -51,27 +51,28 @@ struct coord_pair {
};
static res_T
-scad_geometry_create
- (const char* name,
- struct scad_geometry** out_geometry)
+geom_set_name
+ (struct scad_geometry* geom,
+ const char* name)
{
- res_T res = RES_OK;
- struct str str_name;
- struct scad_geometry* geom = NULL;
struct scad_device* dev = get_device();
- char one = 1;
+ struct str str_name;
+ int name_initialized = 0;
+ int same_name;
+ res_T res = RES_OK;
- ASSERT(out_geometry);
+ ASSERT(geom);
- str_init(dev->allocator, &str_name);
if(name) {
if(strlen(name) == 0) {
res = RES_BAD_ARG;
- log_error(get_device(), "Geometry name '' is invalid.\n");
+ log_error(get_device(), "Geometry name \"\" is invalid.\n");
goto error;
}
+ str_init(dev->allocator, &str_name);
+ name_initialized = 1;
ERR(str_set(&str_name, name));
- if(name && htable_names_find(&dev->geometry_names, &str_name)) {
+ if(htable_names_find(&dev->geometry_names, &str_name)) {
/* if defined, names must be unique */
res = RES_BAD_ARG;
log_error(get_device(), "Geometry name '%s' is allready in use.\n",
@@ -80,24 +81,53 @@ scad_geometry_create
}
}
+ same_name = (!name && str_is_empty(&geom->name))
+ || (name && 0 == strcmp(name, str_cget(&geom->name)));
+
+ if(!same_name) {
+ size_t n = htable_names_erase(&dev->geometry_names, &geom->name);
+ ASSERT((n == 1) == !str_is_empty(&geom->name)); (void)n;
+ }
+
+ if(name) {
+ str_set(&geom->name, name);
+ ERR(htable_names_set(&dev->geometry_names, &geom->name, &geom));
+ } else {
+ str_clear(&geom->name);
+ }
+
+exit:
+ if(name_initialized) str_release(&str_name);
+ return res;
+error:
+ goto exit;
+}
+
+static res_T
+scad_geometry_create
+ (const char* name,
+ struct scad_geometry** out_geom)
+{
+ res_T res = RES_OK;
+ struct scad_geometry* geom = NULL;
+ struct scad_device* dev = get_device();
+ char one = 1;
+
+ ASSERT(out_geom);
+
geom = (struct scad_geometry*)MEM_CALLOC(dev->allocator, 1, sizeof(*geom));
if(!geom) {
res = RES_MEM_ERR;
goto error;
}
- ERR(htable_geometries_set(&dev->allgeom, &geom, &one));
-
str_init(dev->allocator, &geom->name);
+ ERR(htable_geometries_set(&dev->allgeom, &geom, &one));
+ ERR(geom_set_name(geom, name));
dev->need_synchro = 1;
- if(name) {
- ERR(str_set(&geom->name, name));
- ERR(htable_names_set(&dev->geometry_names, &geom->name, &geom));
- }
end:
- str_release(&str_name);
- if(out_geometry) *out_geometry = geom;
+ if(out_geom) *out_geom = geom;
return res;
error:
if(geom) {
@@ -1157,9 +1187,7 @@ scad_geometry_rename
ERR(check_device(FUNC_NAME));
- if(!name)
- str_clear(&geom->name);
- else ERR(str_set(&geom->name, name));
+ ERR(geom_set_name(geom, name));
exit:
return res;