star-cad

Geometric operators for computer-aided design
git clone git://git.meso-star.fr/star-cad.git
Log | Files | Refs | README | LICENSE

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:
Msrc/scad_geometry.c | 58+++++++++++++++++++++++++++++++++++++---------------------
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: