commit b57c6dc7aa5a0258a7939768e27e71003b1da407
parent 9fb788a055d42ced6149c0a89280396eba8c7df3
Author: Christophe Coustet <christophe.coustet@meso-star.com>
Date: Tue, 29 Jul 2025 15:41:20 +0200
Fix geometry naming
Get_name used to wrongly return "" for unset names. Now return NULL.
Also now allow to set the same name twice to the same geoemtry (used to
trigger an error).
Diffstat:
1 file changed, 37 insertions(+), 21 deletions(-)
diff --git a/src/scad_geometry.c b/src/scad_geometry.c
@@ -56,22 +56,31 @@ struct coord_pair {
static res_T
geom_set_name
(struct scad_geometry* geom,
- const struct str* name)
+ const struct str* name) /* Can be NULL but not "" */
{
struct scad_device* dev = get_device();
- int same_name;
+ int same_name, name_isnt_null, previous_name_is_null;
res_T res = RES_OK;
ASSERT(geom);
+ ASSERT(!name || !str_is_empty(name));
- if(!str_is_empty(name)) {
- if(str_len(name) == 0) {
- res = RES_BAD_ARG;
- log_error(get_device(), "Geometry name \"\" is invalid.\n");
- goto error;
- }
- if(htable_names_find(&dev->geometry_names, name)) {
- /* if defined, names must be unique */
+ previous_name_is_null = str_is_empty(&geom->name);
+ if(name) {
+ name_isnt_null = 1;
+ same_name = (!previous_name_is_null) && (0 == str_cmp(name, &geom->name));
+ } else {
+ name_isnt_null = 0;
+ same_name = previous_name_is_null;
+ }
+
+ if(same_name) /* No change needed */
+ goto exit;
+
+ if(name_isnt_null) {
+ struct scad_geometry** g
+ = htable_names_find(&dev->geometry_names, name);
+ if(g) { /* if defined, names must be unique */
res = RES_BAD_ARG;
log_error(get_device(), "Geometry name '%s' is allready in use.\n",
str_cget(name));
@@ -79,15 +88,13 @@ geom_set_name
}
}
- same_name = (0 == str_cmp(name, &geom->name));
-
- if(!same_name) {
+ if(!previous_name_is_null) {
size_t n = htable_names_erase(&dev->geometry_names, &geom->name);
- ASSERT((n == 1) == !str_is_empty(&geom->name)); (void)n;
- ERR(str_copy(&geom->name, name));
+ ASSERT((n == 1)); (void)n;
}
- if(name) {
- ERR(htable_names_set(&dev->geometry_names, &geom->name, &geom));
+ if(name_isnt_null) {
+ ERR(str_copy(&geom->name, name));
+ ERR(htable_names_set(&dev->geometry_names, name, &geom));
} else {
str_clear(&geom->name);
}
@@ -722,7 +729,11 @@ scad_geometry_get_name
ERR(check_device(FUNC_NAME));
- *name = str_cget(&geom->name);
+ if(str_is_empty(&geom->name)) {
+ *name = NULL;
+ } else {
+ *name = str_cget(&geom->name);
+ }
exit:
return res;
@@ -2108,13 +2119,18 @@ scad_geometry_set_name
ERR(check_device(FUNC_NAME));
- if(name) {
+ if(!name) {
+ ERR(geom_set_name(geom, NULL));
+ }
+ else if(strlen(name) == 0) {
+ log_error(get_device(), "Geometry name \"\" is invalid.\n");
+ res = RES_BAD_ARG;
+ goto error;
+ } else {
str_init(allocator, &tmp);
initialized = 1;
ERR(str_set(&tmp, name));
ERR(geom_set_name(geom, &tmp));
- } else {
- str_clear(&geom->name);
}
exit: