[brlcad-commits] SF.net SVN: brlcad:[51449] brlcad/trunk/src/libged/dag.cpp
Open Source Solid Modeling CAD
Brought to you by:
brlcad
From: <cp...@us...> - 2012-07-11 03:04:55
|
Revision: 51449 http://brlcad.svn.sourceforge.net/brlcad/?rev=51449&view=rev Author: cprecup Date: 2012-07-11 03:04:49 +0000 (Wed, 11 Jul 2012) Log Message: ----------- Removed entries from the solids hash table whenever a object is discovered to be a region or a group. Switched to working with pointers for bu_hash_tbl structures. Freed memory for each allocation. Modified Paths: -------------- brlcad/trunk/src/libged/dag.cpp Modified: brlcad/trunk/src/libged/dag.cpp =================================================================== --- brlcad/trunk/src/libged/dag.cpp 2012-07-10 02:14:51 UTC (rev 51448) +++ brlcad/trunk/src/libged/dag.cpp 2012-07-11 03:04:49 UTC (rev 51449) @@ -46,9 +46,9 @@ * This structure has fields that correspond to three hash tables for solid, group and region type objects of a database. */ struct output { - struct bu_hash_tbl groups; - struct bu_hash_tbl regions; - struct bu_hash_tbl solids; + struct bu_hash_tbl *groups; + struct bu_hash_tbl *regions; + struct bu_hash_tbl *solids; }; @@ -128,32 +128,49 @@ comb = (struct rt_comb_internal *)intern.idb_ptr; struct bu_hash_entry *hsh_entry_solid = NULL; - if ((hsh_entry_solid = bu_find_hash_entry(&(o->solids), (unsigned char *)dp->d_namep, strlen(dp->d_namep), &prev, &idx))) { + if ((hsh_entry_solid = bu_find_hash_entry(o->solids, (unsigned char *)dp->d_namep, strlen(dp->d_namep) + 1, &prev, &idx))) { value = atoi((const char*)hsh_entry_solid->value); was_solid = 1; + + if (hsh_entry_solid == o->solids->lists[idx]) { + o->solids->lists[idx] = hsh_entry_solid->next; + } else { + prev->next = hsh_entry_solid->next; + } + free(hsh_entry_solid->value); + hsh_entry_solid->value = NULL; + free(hsh_entry_solid->key); + hsh_entry_solid->key = NULL; + free(hsh_entry_solid); + hsh_entry_solid = NULL; + + o->solids->num_entries--; } else { was_solid = 0; } if (comb->region_flag) { - if (bu_find_hash_entry(&(o->regions), (unsigned char *)dp->d_namep, strlen(dp->d_namep), &prev, &idx) == NULL) { - struct bu_hash_entry *hsh_entry = bu_hash_add_entry(&(o->regions), (unsigned char *)dp->d_namep, strlen(dp->d_namep), &new_entry); + if (bu_find_hash_entry(o->regions, (unsigned char *)dp->d_namep, strlen(dp->d_namep) + 1, &prev, &idx) == NULL) { + struct bu_hash_entry *hsh_entry = bu_hash_add_entry(o->regions, (unsigned char *)dp->d_namep, strlen(dp->d_namep) + 1, &new_entry); + bu_log("index: %d\n", idx); if (was_solid == 1) { + bu_log("it already is a SOLID\n"); sprintf(id, "%d", value); } else { + bu_log("it isn't a solid\n"); dag->object_nr ++; sprintf(id, "%d", dag->object_nr); value = dag->object_nr; } /* Set the id value for this shape */ - hsh_entry->value = (unsigned char *)malloc((size_t)strlen(id)); + hsh_entry->value = (unsigned char *)malloc((size_t)strlen(id) + 1); memcpy(hsh_entry->value, id, (size_t)strlen(id) + 1); bu_log("\t\"%s\" [ color=blue shape=box3d ];\n", dp->d_namep); } } else { - if (bu_find_hash_entry(&(o->groups), (unsigned char *)dp->d_namep, strlen(dp->d_namep), &prev, &idx) == NULL) { - struct bu_hash_entry *hsh_entry = bu_hash_add_entry(&(o->groups), (unsigned char *)dp->d_namep, strlen(dp->d_namep), &new_entry); + if (bu_find_hash_entry(o->groups, (unsigned char *)dp->d_namep, strlen(dp->d_namep) + 1, &prev, &idx) == NULL) { + struct bu_hash_entry *hsh_entry = bu_hash_add_entry(o->groups, (unsigned char *)dp->d_namep, strlen(dp->d_namep) + 1, &new_entry); if (was_solid == 1) { sprintf(id, "%d", value); } else { @@ -162,7 +179,7 @@ value = dag->object_nr; } /* Set the id value for this shape */ - hsh_entry->value = (unsigned char *)malloc((size_t)strlen(id)); + hsh_entry->value = (unsigned char *)malloc((size_t)strlen(id) + 1); memcpy(hsh_entry->value, id, (size_t)strlen(id) + 1); bu_log("\t\"%s\" [ color=green ];\n", dp->d_namep); @@ -233,22 +250,24 @@ struct bu_hash_entry *hsh_entry1, *hsh_entry2, *hsh_entry3; - hsh_entry1 = bu_find_hash_entry(&(o->regions), (unsigned char *)rt_tree_array[i].tl_tree->tr_l.tl_name, strlen(rt_tree_array[i].tl_tree->tr_l.tl_name), &prev, &idx); - hsh_entry2 = bu_find_hash_entry(&(o->groups), (unsigned char *)rt_tree_array[i].tl_tree->tr_l.tl_name, strlen(rt_tree_array[i].tl_tree->tr_l.tl_name), &prev, &idx); - hsh_entry3 = bu_find_hash_entry(&(o->solids), (unsigned char *)rt_tree_array[i].tl_tree->tr_l.tl_name, strlen(rt_tree_array[i].tl_tree->tr_l.tl_name), &prev, &idx); + hsh_entry1 = bu_find_hash_entry(o->regions, (unsigned char *)rt_tree_array[i].tl_tree->tr_l.tl_name, strlen(rt_tree_array[i].tl_tree->tr_l.tl_name) + 1, &prev, &idx); + hsh_entry2 = bu_find_hash_entry(o->groups, (unsigned char *)rt_tree_array[i].tl_tree->tr_l.tl_name, strlen(rt_tree_array[i].tl_tree->tr_l.tl_name) + 1, &prev, &idx); + hsh_entry3 = bu_find_hash_entry(o->solids, (unsigned char *)rt_tree_array[i].tl_tree->tr_l.tl_name, strlen(rt_tree_array[i].tl_tree->tr_l.tl_name) + 1, &prev, &idx); if ((!hsh_entry1) && (!hsh_entry2) && (!hsh_entry3)) { /* This object hasn't been registered yet. Add it into the solids hash table and create a shape for it. */ - struct bu_hash_entry *hsh_entry = bu_hash_add_entry(&(o->solids), (unsigned char *)rt_tree_array[i].tl_tree->tr_l.tl_name, strlen(rt_tree_array[i].tl_tree->tr_l.tl_name), &new_entry); + struct bu_hash_entry *hsh_entry = bu_hash_add_entry(o->solids, (unsigned char *)rt_tree_array[i].tl_tree->tr_l.tl_name, strlen(rt_tree_array[i].tl_tree->tr_l.tl_name) + 1, &new_entry); + bu_log("index: %d\n", idx); dag->object_nr ++; sprintf(id, "%d", dag->object_nr); /* Set the id value for this shape */ - hsh_entry->value = (unsigned char *)malloc((size_t)strlen(id)); + hsh_entry->value = (unsigned char *)malloc((size_t)strlen(id) + 1); memcpy(hsh_entry->value, id, (size_t)strlen(id) + 1); value = dag->object_nr; bu_log("\t\"%s\" -> \"%s\" [ label=\"%c\" ];\n", dp->d_namep, rt_tree_array[i].tl_tree->tr_l.tl_name, op); + bu_log("[SOLID]added %d objects.\n", dag->object_nr); /* Create a shape for the current node of the subtree */ shapeRef2 = add_object(dag, value); @@ -269,10 +288,6 @@ } } - /* Create connection pins on shapes for linking the parent node with the subnode. */ - new Avoid::ShapeConnectionPin(shapeRef1, CENTRE, Avoid::ATTACH_POS_CENTRE, Avoid::ATTACH_POS_CENTRE); - new Avoid::ShapeConnectionPin(shapeRef2, CENTRE, Avoid::ATTACH_POS_CENTRE, Avoid::ATTACH_POS_CENTRE); - /* Create connector from each shape shapeRef2 to the input pin on shapeRef1. */ Avoid::ConnEnd dstEnd(shapeRef1, CENTRE); Avoid::ConnEnd srcEnd(shapeRef2, CENTRE); @@ -303,17 +318,15 @@ struct directory *dp = NULL, *ndp = NULL; struct bu_vls dp_name_vls = BU_VLS_INIT_ZERO; int i; - struct output o = {BU_HASH_TBL_INIT_ZERO, BU_HASH_TBL_INIT_ZERO, BU_HASH_TBL_INIT_ZERO}; + struct output o; struct db_i *dbip = gedp->ged_wdbp->dbip; Avoid::ShapeRef *shapeRef = NULL; /* Create the hash tables. Each one will have at most 64 entries. */ - o.regions = *bu_create_hash_tbl(1); - o.groups = *bu_create_hash_tbl(1); - o.solids = *bu_create_hash_tbl(1); + o.regions = bu_create_hash_tbl(1); + o.groups = bu_create_hash_tbl(1); + o.solids = bu_create_hash_tbl(1); - dag->router = new Avoid::Router(Avoid::PolyLineRouting); - /* Sets a spacing distance for overlapping orthogonal connectors to be nudged apart. */ dag->router->setOrthogonalNudgeDistance(25); @@ -344,19 +357,19 @@ int new_entry; char id[100]; - hsh_entry1 = bu_find_hash_entry(&(o.regions), (unsigned char *)dp->d_namep, strlen(dp->d_namep), &prev, &idx); - hsh_entry2 = bu_find_hash_entry(&(o.groups), (unsigned char *)dp->d_namep, strlen(dp->d_namep), &prev, &idx); - hsh_entry3 = bu_find_hash_entry(&(o.solids), (unsigned char *)dp->d_namep, strlen(dp->d_namep), &prev, &idx); + hsh_entry1 = bu_find_hash_entry(o.regions, (unsigned char *)dp->d_namep, strlen(dp->d_namep) + 1, &prev, &idx); + hsh_entry2 = bu_find_hash_entry(o.groups, (unsigned char *)dp->d_namep, strlen(dp->d_namep) + 1, &prev, &idx); + hsh_entry3 = bu_find_hash_entry(o.solids, (unsigned char *)dp->d_namep, strlen(dp->d_namep) + 1, &prev, &idx); if ((!hsh_entry1) && (!hsh_entry2) && (!hsh_entry3)) { /* This object hasn't been registered yet. Add it into the solids hash table and create a shape for it. */ dag->object_nr++; - struct bu_hash_entry *hsh_entry = bu_hash_add_entry(&(o.solids), (unsigned char *)dp->d_namep, strlen(dp->d_namep), &new_entry); + struct bu_hash_entry *hsh_entry = bu_hash_add_entry(o.solids, (unsigned char *)dp->d_namep, strlen(dp->d_namep) + 1, &new_entry); sprintf(id, "%d", dag->object_nr); /* Set the id value for this object */ - hsh_entry->value = (unsigned char *)malloc((size_t)strlen(id)); + hsh_entry->value = (unsigned char *)malloc((size_t)strlen(id) + 1); memcpy(hsh_entry->value, id, (size_t)strlen(id) + 1); /* Create and add a shape (obstacle) to the router */ @@ -381,6 +394,9 @@ ged_close(gedp); bu_vls_free(&dp_name_vls); dag->router->deleteShape(shapeRef); + bu_hash_tbl_free(o.regions); + bu_hash_tbl_free(o.groups); + bu_hash_tbl_free(o.solids); return GED_OK; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |