star-cad

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

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:
Msrc/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;