Revision: 56400
          http://sourceforge.net/p/brlcad/code/56400
Author:   starseeker
Date:     2013-08-01 03:33:01 +0000 (Thu, 01 Aug 2013)
Log Message:
-----------
string search plans are likely to be a very common input - provide functions to 
handle them automatically.

Modified Paths:
--------------
    brlcad/trunk/include/raytrace.h
    brlcad/trunk/src/libged/comb.c
    brlcad/trunk/src/librt/search.c

Modified: brlcad/trunk/include/raytrace.h
===================================================================
--- brlcad/trunk/include/raytrace.h     2013-07-31 23:42:24 UTC (rev 56399)
+++ brlcad/trunk/include/raytrace.h     2013-08-01 03:33:01 UTC (rev 56400)
@@ -3696,8 +3696,8 @@
 RT_EXPORT extern void db_free_full_path_list(struct db_full_path_list 
*path_list);
 
 /**
- * process the command line and create a "plan" corresponding to the
- * command arguments.
+ * Low level command to process the command line and create a "plan" 
corresponding to the
+ * command arguments. 
  */
 RT_EXPORT extern void *db_search_formplan(char **argv,
                                          struct db_i *dbip,
@@ -3709,6 +3709,9 @@
  */
 RT_EXPORT extern void db_search_freeplan(void **plan);
 
+/**
+ * Low level routines for invocation of search plans
+ */
 RT_EXPORT extern struct db_full_path_list *db_search_full_paths(void 
*searchplan,
                                                                struct 
db_full_path_list *path_list,
                                                                struct db_i 
*dbip,
@@ -3719,6 +3722,21 @@
                                                          struct db_i *dbip,
                                                          struct rt_wdb *wdbp);
 
+/**
+ * Use the string form of a search plan to build and execute a search
+ */
+RT_EXPORT extern struct db_full_path_list *db_search_full_paths_strplan(const 
char *plan_string,
+                                                               struct 
db_full_path_list *path_list,
+                                                               struct db_i 
*dbip,
+                                                               struct rt_wdb 
*wdbp);
+
+RT_EXPORT extern struct bu_ptbl *db_search_unique_objects_strplan(const char 
*plan_string,
+                                                         struct 
db_full_path_list *path_list,
+                                                         struct db_i *dbip,
+                                                         struct rt_wdb *wdbp);
+
+
+
 /* db_open.c */
 /**
  * D B _ S Y N C

Modified: brlcad/trunk/src/libged/comb.c
===================================================================
--- brlcad/trunk/src/libged/comb.c      2013-07-31 23:42:24 UTC (rev 56399)
+++ brlcad/trunk/src/libged/comb.c      2013-08-01 03:33:01 UTC (rev 56400)
@@ -257,8 +257,6 @@
     char *only_unions_in_tree_plan = "! -bool u";
     char *solids_in_tree_plan = "! -type comb";
     char *combs_in_tree_plan = "-type comb";
-    void *dbplan;
-    char *plan_argv[9];
     struct bu_ptbl *non_union_objects = BU_PTBL_NULL;
     struct bu_ptbl *solids = BU_PTBL_NULL;
     struct bu_ptbl *combs = BU_PTBL_NULL;
@@ -274,28 +272,18 @@
     /* Turn directory's name into a full path structure */
     if (db_full_path_list_add(dp->d_namep, 0, gedp->ged_wdbp->dbip, path_list) 
== -1) {
        bu_vls_printf(gedp->ged_result_str,  "Failed to add path %s to search 
list.\n", dp->d_namep);
-       bu_free((char *)plan_argv, "free plan argv");
        db_free_full_path_list(path_list);
        return GED_ERROR;
     }
 
 
-    /* bu_argv_from_string needs a writable string, so re-use one vls for the 
plans */
-    bu_vls_init(&plan_string);
-
-
     /* if there are non-union booleans in this comb's tree, error out */
-    bu_vls_sprintf(&plan_string, "%s", only_unions_in_tree_plan);
-    bu_argv_from_string(&plan_argv[0], 8, bu_vls_addr(&plan_string));
-    dbplan = db_search_formplan(plan_argv, gedp->ged_wdbp->dbip, 
gedp->ged_wdbp);
-    non_union_objects = db_search_unique_objects(dbplan, path_list, 
gedp->ged_wdbp->dbip, gedp->ged_wdbp);
-    db_search_freeplan(&dbplan);
+    non_union_objects = 
db_search_unique_objects_strplan(only_unions_in_tree_plan, path_list, 
gedp->ged_wdbp->dbip, gedp->ged_wdbp);
     /* if non_union_objects isn't empty, error out */
     if (BU_PTBL_LEN(non_union_objects)) {
        bu_vls_printf(gedp->ged_result_str, "ERROR: %s tree contains non-union 
booleans", dp->d_namep);
        db_free_full_path_list(path_list);
        bu_ptbl_free(non_union_objects);
-       bu_vls_free(&plan_string);
        return GED_ERROR;
     }
     /* Done with non_union_objects */
@@ -303,25 +291,16 @@
 
 
     /* Find the solids */
-    bu_vls_sprintf(&plan_string, "%s", solids_in_tree_plan);
-    bu_argv_from_string(&plan_argv[0], 8, bu_vls_addr(&plan_string));
-    dbplan = db_search_formplan(plan_argv, gedp->ged_wdbp->dbip, 
gedp->ged_wdbp);
-    solids = db_search_unique_objects(dbplan, path_list, gedp->ged_wdbp->dbip, 
gedp->ged_wdbp);
-    db_search_freeplan(&dbplan);
+    solids = db_search_unique_objects_strplan(solids_in_tree_plan, path_list, 
gedp->ged_wdbp->dbip, gedp->ged_wdbp);
 
 
     /* Find the combs in the tree */
-    bu_vls_sprintf(&plan_string, "%s", combs_in_tree_plan);
-    bu_argv_from_string(&plan_argv[0], 8, bu_vls_addr(&plan_string));
-    dbplan = db_search_formplan(plan_argv, gedp->ged_wdbp->dbip, 
gedp->ged_wdbp);
-    combs = db_search_unique_objects(dbplan, path_list, gedp->ged_wdbp->dbip, 
gedp->ged_wdbp);
-    db_search_freeplan(&dbplan);
+    combs = db_search_unique_objects_strplan(combs_in_tree_plan, path_list, 
gedp->ged_wdbp->dbip, gedp->ged_wdbp);
     /* If it's all solids already, nothing to do */
     if (!BU_PTBL_LEN(combs)) {
        db_free_full_path_list(path_list);
        bu_ptbl_free(solids);
        bu_ptbl_free(combs);
-       bu_vls_free(&plan_string);
        return GED_OK;
     }
 
@@ -330,15 +309,13 @@
     BU_ALLOC(toplevel_list, struct db_full_path_list);
     BU_LIST_INIT(&(toplevel_list->l));
     db_full_path_list_add_toplevel(gedp->ged_wdbp->dbip, toplevel_list, 0);
+    bu_vls_init(&plan_string);
     bu_vls_sprintf(&plan_string, "-mindepth 1 ! -above -name %s -type comb", 
dp->d_namep);
-    bu_argv_from_string(&plan_argv[0], 8, bu_vls_addr(&plan_string));
-    dbplan = db_search_formplan(plan_argv, gedp->ged_wdbp->dbip, 
gedp->ged_wdbp);
-    combs_outside_of_tree = db_search_unique_objects(dbplan, toplevel_list, 
gedp->ged_wdbp->dbip, gedp->ged_wdbp);
-    db_search_freeplan(&dbplan);
+    combs_outside_of_tree = 
db_search_unique_objects_strplan(bu_vls_addr(&plan_string), toplevel_list, 
gedp->ged_wdbp->dbip, gedp->ged_wdbp);
+    bu_vls_free(&plan_string);
     db_free_full_path_list(toplevel_list);
 
-    /* Done searching - now we can free search structures and clear the 
original tree */
-    bu_vls_free(&plan_string);
+    /* Done searching - now we can free the path list and clear the original 
tree */
     db_free_full_path_list(path_list);
     if (_ged_clear_comb_tree(gedp, dp) == GED_ERROR) {
        bu_vls_printf(gedp->ged_result_str, "ERROR: %s tree clearing failed", 
dp->d_namep);

Modified: brlcad/trunk/src/librt/search.c
===================================================================
--- brlcad/trunk/src/librt/search.c     2013-07-31 23:42:24 UTC (rev 56399)
+++ brlcad/trunk/src/librt/search.c     2013-08-01 03:33:01 UTC (rev 56400)
@@ -2218,7 +2218,54 @@
     return uniq_db_objs;
 }
 
+struct db_full_path_list *
+db_search_full_paths_strplan(const char *plan_string,        /* search plan */
+                    struct db_full_path_list *pathnames,      /* list of 
pathnames to traverse */
+                    struct db_i *dbip,
+                    struct rt_wdb *wdbp)
+{
+    struct db_full_path_list *results = NULL;
+    struct bu_vls plan_string_vls;
+    void *dbplan;
+    char **plan_argv = (char **)bu_calloc(strlen(plan_string) + 1, sizeof(char 
*), "plan argv");
+    bu_vls_init(&plan_string_vls);
+    bu_vls_sprintf(&plan_string_vls, "%s", plan_string);
+    bu_argv_from_string(&plan_argv[0], strlen(plan_string), 
bu_vls_addr(&plan_string_vls));
+    dbplan = db_search_formplan(plan_argv, dbip, wdbp);
+    results = db_search_full_paths(dbplan, pathnames, dbip, wdbp);
+    bu_vls_free(&plan_string_vls);
+    bu_free((char *)plan_argv, "free plan argv");
+    db_search_freeplan(&dbplan);
+    return results;
+}
 
+
+/**
+ *
+ */
+struct bu_ptbl *
+db_search_unique_objects_strplan(const char *plan_string,        /* search 
plan */
+                        struct db_full_path_list *pathnames,      /* list of 
pathnames to traverse */
+                        struct db_i *dbip,
+                        struct rt_wdb *wdbp)
+{
+    struct bu_ptbl *results = NULL;
+    struct bu_vls plan_string_vls;
+    void *dbplan;
+    char **plan_argv = (char **)bu_calloc(strlen(plan_string) + 1, sizeof(char 
*), "plan argv");
+    bu_vls_init(&plan_string_vls);
+    bu_vls_sprintf(&plan_string_vls, "%s", plan_string);
+    bu_argv_from_string(&plan_argv[0], strlen(plan_string), 
bu_vls_addr(&plan_string_vls));
+    dbplan = db_search_formplan(plan_argv, dbip, wdbp);
+    results = db_search_unique_objects(dbplan, pathnames, dbip, wdbp);
+    bu_vls_free(&plan_string_vls);
+    bu_free((char *)plan_argv, "free plan argv");
+    db_search_freeplan(&dbplan);
+    return results;
+}
+
+
+
 /*
  * Local Variables:
  * tab-width: 8

This was sent by the SourceForge.net collaborative development platform, the 
world's largest Open Source development site.


------------------------------------------------------------------------------
Get your SQL database under version control now!
Version control is standard for application code, but databases havent 
caught up. So what steps can you take to put your SQL databases under 
version control? Why should you start doing it? Read more to find out.
http://pubads.g.doubleclick.net/gampad/clk?id=49501711&iu=/4140/ostg.clktrk
_______________________________________________
BRL-CAD Source Commits mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/brlcad-commits

Reply via email to