[brlcad-commits] SF.net SVN: brlcad:[51462] brlcad/trunk/src/libged/dag.cpp
Open Source Solid Modeling CAD
Brought to you by:
brlcad
From: <cp...@us...> - 2012-07-12 01:24:53
|
Revision: 51462 http://brlcad.svn.sourceforge.net/brlcad/?rev=51462&view=rev Author: cprecup Date: 2012-07-12 01:24:46 +0000 (Thu, 12 Jul 2012) Log Message: ----------- Don't allocate space for the *value* field inside the bu_hash_entry. Instead, use a copy of a pointer for the outside allocated memory. Added a method that frees the space allocated for the *value* field. Modified Paths: -------------- brlcad/trunk/src/libged/dag.cpp Modified: brlcad/trunk/src/libged/dag.cpp =================================================================== --- brlcad/trunk/src/libged/dag.cpp 2012-07-11 22:57:25 UTC (rev 51461) +++ brlcad/trunk/src/libged/dag.cpp 2012-07-12 01:24:46 UTC (rev 51462) @@ -57,7 +57,6 @@ */ struct _ged_dag_data { Avoid::Router *router; - Avoid::ConnRef *connRef; uint16_t object_nr; uint16_t last_connref_id; }; @@ -98,6 +97,24 @@ /** + * Method that frees the memory allocated for each value field of a bu_hash_entry structure. + */ +void +free_hash_values(struct bu_hash_tbl *htbl) +{ + struct bu_hash_entry *entry; + struct bu_hash_record rec; + + entry = bu_hash_tbl_first(htbl, &rec); + + while (entry) { + bu_free(bu_get_hash_value(entry), "hash entry"); + entry = bu_hash_tbl_next(&rec); + } +} + + +/** * Function which processes a combination node. I.e., it adds a new entry into the hash tables, if necessary. * In this case, it also adds a Avoid::ShapeRef object to the graph. It also traverses its subtree, adds * entries into the hash table for solid objects, if neccessary. In this case as well, it also adds a @@ -116,7 +133,7 @@ int new_entry; int was_solid; unsigned int value = 0; - char id[100]; + char *id = (char *)bu_malloc((size_t)6, "hash entry value"); Avoid::ShapeRef *shapeRef1 = NULL; Avoid::ShapeRef *shapeRef2 = NULL; @@ -164,8 +181,7 @@ value = dag->object_nr; } /* Set the id value for this shape */ - hsh_entry->value = (unsigned char *)malloc((size_t)strlen(id) + 1); - memcpy(hsh_entry->value, id, (size_t)strlen(id) + 1); + bu_set_hash_value(hsh_entry, (unsigned char *)id); bu_log("\t\"%s\" [ color=blue shape=box3d ];\n", dp->d_namep); } @@ -180,8 +196,7 @@ value = dag->object_nr; } /* Set the id value for this shape */ - hsh_entry->value = (unsigned char *)malloc((size_t)strlen(id) + 1); - memcpy(hsh_entry->value, id, (size_t)strlen(id) + 1); + bu_set_hash_value(hsh_entry, (unsigned char *)id); bu_log("\t\"%s\" [ color=green ];\n", dp->d_namep); } @@ -260,11 +275,12 @@ 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 ++; + + id = (char *)bu_malloc((size_t)6, "hash entry value"); sprintf(id, "%d", dag->object_nr); /* Set the id value for this shape */ - hsh_entry->value = (unsigned char *)malloc((size_t)strlen(id) + 1); - memcpy(hsh_entry->value, id, (size_t)strlen(id) + 1); + bu_set_hash_value(hsh_entry, (unsigned char *)id); 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); @@ -360,7 +376,6 @@ struct bu_hash_entry *prev = NULL; unsigned long idx; int new_entry; - char id[100]; 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); @@ -371,11 +386,11 @@ dag->object_nr++; struct bu_hash_entry *hsh_entry = bu_hash_add_entry(o.solids, (unsigned char *)dp->d_namep, strlen(dp->d_namep) + 1, &new_entry); + char *id = (char *)bu_malloc((size_t)6, "hash entry value"); sprintf(id, "%d", dag->object_nr); /* Set the id value for this object */ - hsh_entry->value = (unsigned char *)malloc((size_t)strlen(id) + 1); - memcpy(hsh_entry->value, id, (size_t)strlen(id) + 1); + bu_set_hash_value(hsh_entry, (unsigned char *)id); /* Create and add a shape (obstacle) to the router */ shapeRef = add_object(dag, dag->object_nr); @@ -397,10 +412,15 @@ } ged_close(gedp); + + /* Free memory. */ bu_vls_free(&dp_name_vls); dag->router->deleteShape(shapeRef); + free_hash_values(o.regions); bu_hash_tbl_free(o.regions); + free_hash_values(o.groups); bu_hash_tbl_free(o.groups); + free_hash_values(o.solids); 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. |