Thread: [brlcad-commits] SF.net SVN: brlcad:[31858] brlcad/trunk/src/libged
Open Source Solid Modeling CAD
Brought to you by:
brlcad
From: <bo...@us...> - 2008-07-17 11:57:50
|
Revision: 31858 http://brlcad.svn.sourceforge.net/brlcad/?rev=31858&view=rev Author: bob1961 Date: 2008-07-17 11:57:38 +0000 (Thu, 17 Jul 2008) Log Message: ----------- Initial check-in. Added Paths: ----------- brlcad/trunk/src/libged/perspective.c brlcad/trunk/src/libged/rmat.c Added: brlcad/trunk/src/libged/perspective.c =================================================================== --- brlcad/trunk/src/libged/perspective.c (rev 0) +++ brlcad/trunk/src/libged/perspective.c 2008-07-17 11:57:38 UTC (rev 31858) @@ -0,0 +1,88 @@ +/* P E R S P E C T I V E . C + * BRL-CAD + * + * Copyright (c) 2008 United States Government as represented by + * the U.S. Army Research Laboratory. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * version 2.1 as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this file; see the file named COPYING for more + * information. + */ +/** @file perspective.c + * + * The perspective command. + * + */ + +#include "common.h" + +#include <stdlib.h> +#include <ctype.h> +#include <string.h> + +#include "ged_private.h" + + +int +ged_perspective(struct ged *gedp, int argc, const char *argv[]) +{ + fastf_t perspective; + static const char *usage = "[angle]"; + + GED_CHECK_DATABASE_OPEN(gedp, BRLCAD_ERROR); + GED_CHECK_VIEW(gedp, BRLCAD_ERROR); + + /* initialize result */ + bu_vls_trunc(&gedp->ged_result_str, 0); + gedp->ged_result = GED_RESULT_NULL; + gedp->ged_result_flags = 0; + + /* get the perspective angle */ + if (argc == 1) { + bu_vls_printf(&gedp->ged_result_str, "%g", gedp->ged_gvp->gv_perspective); + return BRLCAD_OK; + } + + /* set perspective angle */ + if (argc == 2) { + if (sscanf(argv[1], "%lf", &perspective) != 1) { + bu_vls_printf(&gedp->ged_result_str, "bad perspective angle - %s", argv[1]); + return BRLCAD_ERROR; + } + + gedp->ged_gvp->gv_perspective = perspective; +#if 1 + /* This way works, with reasonable Z-clipping */ + ged_persp_mat(gedp->ged_gvp->gv_pmat, gedp->ged_gvp->gv_perspective, + 1.0, 0.01, 1.0e10, 1.0); +#else + ged_mike_persp_mat(gedp->ged_gvp->gv_pmat, gedp->ged_gvp->gv_eye_pos); +#endif + ged_view_update(gedp->ged_gvp); + + return BRLCAD_OK; + } + + bu_vls_printf(&gedp->ged_result_str, "Usage: %s %s", argv[0], usage); + return BRLCAD_ERROR; +} + + +/* + * Local Variables: + * tab-width: 8 + * mode: C + * indent-tabs-mode: t + * c-file-style: "stroustrup" + * End: + * ex: shiftwidth=4 tabstop=8 + */ Property changes on: brlcad/trunk/src/libged/perspective.c ___________________________________________________________________ Added: svn:mime-type + text/plain Added: svn:eol-style + native Added: brlcad/trunk/src/libged/rmat.c =================================================================== --- brlcad/trunk/src/libged/rmat.c (rev 0) +++ brlcad/trunk/src/libged/rmat.c 2008-07-17 11:57:38 UTC (rev 31858) @@ -0,0 +1,76 @@ +/* R M A T . C + * BRL-CAD + * + * Copyright (c) 2008 United States Government as represented by + * the U.S. Army Research Laboratory. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * version 2.1 as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this file; see the file named COPYING for more + * information. + */ +/** @file rmat.c + * + * The rmat command. + * + */ + +#include "common.h" + +#include <stdlib.h> +#include <ctype.h> +#include <string.h> + +#include "ged_private.h" + + +int +ged_rmat(struct ged *gedp, int argc, const char *argv[]) +{ + mat_t rotation; + + GED_CHECK_DATABASE_OPEN(gedp, BRLCAD_ERROR); + GED_CHECK_VIEW(gedp, BRLCAD_ERROR); + + /* initialize result */ + bu_vls_trunc(&gedp->ged_result_str, 0); + gedp->ged_result = GED_RESULT_NULL; + gedp->ged_result_flags = 0; + + /* get the rotation matrix */ + if (argc == 1) { + bn_encode_mat(&gedp->ged_result_str, gedp->ged_gvp->gv_rotation); + return BRLCAD_OK; + } else if (argc == 2) { + /* set rotation matrix */ + if (bn_decode_mat(rotation, argv[1]) != 16) + return BRLCAD_ERROR; + + MAT_COPY(gedp->ged_gvp->gv_rotation, rotation); + ged_view_update(gedp->ged_gvp); + + return TCL_OK; + } + + bu_vls_printf(&gedp->ged_result_str, "Usage: %s", argv[0]); + return BRLCAD_ERROR; +} + + +/* + * Local Variables: + * tab-width: 8 + * mode: C + * indent-tabs-mode: t + * c-file-style: "stroustrup" + * End: + * ex: shiftwidth=4 tabstop=8 + */ Property changes on: brlcad/trunk/src/libged/rmat.c ___________________________________________________________________ Added: svn:mime-type + text/plain Added: svn:eol-style + native This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <br...@us...> - 2008-07-27 05:50:29
|
Revision: 31972 http://brlcad.svn.sourceforge.net/brlcad/?rev=31972&view=rev Author: brlcad Date: 2008-07-27 05:50:31 +0000 (Sun, 27 Jul 2008) Log Message: ----------- ws style Modified Paths: -------------- brlcad/trunk/src/libged/attr.c brlcad/trunk/src/libged/bigE.c brlcad/trunk/src/libged/bot_decimate.c brlcad/trunk/src/libged/concat.c brlcad/trunk/src/libged/dg_obj.c brlcad/trunk/src/libged/draw.c brlcad/trunk/src/libged/how.c brlcad/trunk/src/libged/illum.c brlcad/trunk/src/libged/ls.c brlcad/trunk/src/libged/make.c brlcad/trunk/src/libged/make_name.c brlcad/trunk/src/libged/mirror.c brlcad/trunk/src/libged/nirt.c brlcad/trunk/src/libged/rt.c Modified: brlcad/trunk/src/libged/attr.c =================================================================== --- brlcad/trunk/src/libged/attr.c 2008-07-27 03:33:42 UTC (rev 31971) +++ brlcad/trunk/src/libged/attr.c 2008-07-27 05:50:31 UTC (rev 31972) @@ -309,7 +309,6 @@ } - return BRLCAD_OK; } Modified: brlcad/trunk/src/libged/bigE.c =================================================================== --- brlcad/trunk/src/libged/bigE.c 2008-07-27 03:33:42 UTC (rev 31971) +++ brlcad/trunk/src/libged/bigE.c 2008-07-27 05:50:31 UTC (rev 31972) @@ -2356,7 +2356,7 @@ bu_ptbl_free(&dgcdp->leaf_list); bu_vls_printf(&gedp->ged_result_str, "E: %ld vectors in %ld sec\n", - dgcdp->nvectors, (long)(dgcdp->etime - dgcdp->start_time)); + dgcdp->nvectors, (long)(dgcdp->etime - dgcdp->start_time)); return BRLCAD_OK; } Modified: brlcad/trunk/src/libged/bot_decimate.c =================================================================== --- brlcad/trunk/src/libged/bot_decimate.c 2008-07-27 03:33:42 UTC (rev 31971) +++ brlcad/trunk/src/libged/bot_decimate.c 2008-07-27 05:50:31 UTC (rev 31972) @@ -33,7 +33,7 @@ #include "rtgeom.h" #include "ged.h" - + int ged_bot_decimate(struct ged *gedp, int argc, const char *argv[]) { Modified: brlcad/trunk/src/libged/concat.c =================================================================== --- brlcad/trunk/src/libged/concat.c 2008-07-27 03:33:42 UTC (rev 31971) +++ brlcad/trunk/src/libged/concat.c 2008-07-27 05:50:31 UTC (rev 31972) @@ -417,7 +417,7 @@ if ( dsp->dsp_datasrc == RT_DSP_SRC_OBJ ) { /* This dsp references a database object, may need to change its name */ new_name = ged_get_new_name( bu_vls_addr( &dsp->dsp_name ), curr_dbip, - name_tbl, used_names_tbl, cc_data ); + name_tbl, used_names_tbl, cc_data ); if ( new_name ) { bu_vls_free( &dsp->dsp_name ); bu_vls_strcpy( &dsp->dsp_name, new_name ); Modified: brlcad/trunk/src/libged/dg_obj.c =================================================================== --- brlcad/trunk/src/libged/dg_obj.c 2008-07-27 03:33:42 UTC (rev 31971) +++ brlcad/trunk/src/libged/dg_obj.c 2008-07-27 05:50:31 UTC (rev 31972) @@ -456,7 +456,7 @@ return TCL_OK; -bad: + bad: bu_vls_init(&vls); bu_vls_printf(&vls, "helplib_alias dgo_illum %s", argv[0]); Tcl_Eval(interp, bu_vls_addr(&vls)); @@ -845,7 +845,7 @@ /* match NOT found */ Tcl_AppendResult(interp, "-1", (char *)NULL); -good: + good: if (dpp != (struct directory **)NULL) bu_free((genptr_t)dpp, "dgo_how_cmd: directory pointers"); bu_vls_free(&vls); @@ -2577,7 +2577,7 @@ return TCL_OK; } -bad: + bad: bu_vls_init(&vls); bu_vls_printf(&vls, "helplib_alias dgo_shaded_mode %s", argv[0]); Tcl_Eval(interp, bu_vls_addr(&vls)); @@ -2807,7 +2807,7 @@ rt_db_free_internal(&intern, tsp->ts_resp); return 0; -out: + out: /* Successful fastpath drawing of this solid */ db_add_node_to_full_path(pathp, dp); dgo_drawH_part2(0, &vhead, pathp, tsp, SOLID_NULL, dgcdp); Modified: brlcad/trunk/src/libged/draw.c =================================================================== --- brlcad/trunk/src/libged/draw.c 2008-07-27 03:33:42 UTC (rev 31971) +++ brlcad/trunk/src/libged/draw.c 2008-07-27 05:50:31 UTC (rev 31972) @@ -51,7 +51,6 @@ int dmode); - /** * Compute the min, max, and center points of the solid. Also finds * s_vlen. @@ -384,7 +383,7 @@ rt_db_free_internal(&intern, tsp->ts_resp); return 0; -out: + out: /* Successful fastpath drawing of this solid */ db_add_node_to_full_path(pathp, dp); ged_drawH_part2(0, &vhead, pathp, tsp, SOLID_NULL, dgcdp); Modified: brlcad/trunk/src/libged/how.c =================================================================== --- brlcad/trunk/src/libged/how.c 2008-07-27 03:33:42 UTC (rev 31971) +++ brlcad/trunk/src/libged/how.c 2008-07-27 05:50:31 UTC (rev 31972) @@ -106,7 +106,7 @@ /* match NOT found */ bu_vls_printf(&gedp->ged_result_str, "-1"); -good: + good: if (dpp != (struct directory **)NULL) bu_free((genptr_t)dpp, "ged_how: directory pointers"); Modified: brlcad/trunk/src/libged/illum.c =================================================================== --- brlcad/trunk/src/libged/illum.c 2008-07-27 03:33:42 UTC (rev 31971) +++ brlcad/trunk/src/libged/illum.c 2008-07-27 05:50:31 UTC (rev 31972) @@ -92,7 +92,7 @@ return BRLCAD_OK; -bad: + bad: bu_vls_printf(&gedp->ged_result_str, "Usage: %s %s", argv[0], usage); return BRLCAD_ERROR; } Modified: brlcad/trunk/src/libged/ls.c =================================================================== --- brlcad/trunk/src/libged/ls.c 2008-07-27 03:33:42 UTC (rev 31971) +++ brlcad/trunk/src/libged/ls.c 2008-07-27 05:50:31 UTC (rev 31972) @@ -38,7 +38,6 @@ register int num_entries); - /* * List objects in this database */ Modified: brlcad/trunk/src/libged/make.c =================================================================== --- brlcad/trunk/src/libged/make.c 2008-07-27 03:33:42 UTC (rev 31971) +++ brlcad/trunk/src/libged/make.c 2008-07-27 05:50:31 UTC (rev 31972) @@ -86,41 +86,41 @@ /* Process arguments */ while ((k = bu_getopt(argc, (char * const *)argv, "hHo:O:s:S:tT")) != EOF) { switch (k) { - case 'o': - case 'O': - if (sscanf(bu_optarg, "%lf %lf %lf", - &origin[X], - &origin[Y], - &origin[Z]) != 3) { + case 'o': + case 'O': + if (sscanf(bu_optarg, "%lf %lf %lf", + &origin[X], + &origin[Y], + &origin[Z]) != 3) { + bu_vls_printf(&gedp->ged_result_str, "Usage: %s %s", argv[0], usage); + return BRLCAD_ERROR; + } + break; + case 's': + case 'S': + if (sscanf(bu_optarg, "%lf", &scale) != 1) { + bu_vls_printf(&gedp->ged_result_str, "Usage: %s %s", argv[0], usage); + return BRLCAD_ERROR; + } + break; + case 't': + case 'T': + if (argc == 2) { + gedp->ged_result_flags |= GED_RESULT_FLAGS_HELP_BIT; + bu_vls_printf(&gedp->ged_result_str, "arb8 arb7 arb6 arb5 arb4 arbn ars bot ehy ell ell1 epa eto extrude grip half nmg part pipe rcc rec rhc rpc rpp sketch sph tec tgc tor trc superell metaball"); + return BRLCAD_OK; + } + bu_vls_printf(&gedp->ged_result_str, "Usage: %s %s", argv[0], usage); return BRLCAD_ERROR; - } - break; - case 's': - case 'S': - if (sscanf(bu_optarg, "%lf", &scale) != 1) { + case 'h': + case 'H': + gedp->ged_result_flags |= GED_RESULT_FLAGS_HELP_BIT; bu_vls_printf(&gedp->ged_result_str, "Usage: %s %s", argv[0], usage); + return BRLCAD_OK; + default: + bu_vls_printf(&gedp->ged_result_str, "Usage: %s %s", argv[0], usage); return BRLCAD_ERROR; - } - break; - case 't': - case 'T': - if (argc == 2) { - gedp->ged_result_flags |= GED_RESULT_FLAGS_HELP_BIT; - bu_vls_printf(&gedp->ged_result_str, "arb8 arb7 arb6 arb5 arb4 arbn ars bot ehy ell ell1 epa eto extrude grip half nmg part pipe rcc rec rhc rpc rpp sketch sph tec tgc tor trc superell metaball"); - return BRLCAD_OK; - } - - bu_vls_printf(&gedp->ged_result_str, "Usage: %s %s", argv[0], usage); - return BRLCAD_ERROR; - case 'h': - case 'H': - gedp->ged_result_flags |= GED_RESULT_FLAGS_HELP_BIT; - bu_vls_printf(&gedp->ged_result_str, "Usage: %s %s", argv[0], usage); - return BRLCAD_OK; - default: - bu_vls_printf(&gedp->ged_result_str, "Usage: %s %s", argv[0], usage); - return BRLCAD_ERROR; } } @@ -145,9 +145,9 @@ arb_ip = (struct rt_arb_internal *)internal.idb_ptr; arb_ip->magic = RT_ARB_INTERNAL_MAGIC; VSET(arb_ip->pt[0] , - origin[X] +scale, - origin[Y] -scale, - origin[Z] -scale); + origin[X] +scale, + origin[Y] -scale, + origin[Z] -scale); for (i=1; i<8; i++) VMOVE(arb_ip->pt[i], arb_ip->pt[0]); arb_ip->pt[1][Y] += scale; @@ -168,9 +168,9 @@ arb_ip = (struct rt_arb_internal *)internal.idb_ptr; arb_ip->magic = RT_ARB_INTERNAL_MAGIC; VSET(arb_ip->pt[0] , - origin[X] + scale, - origin[Y] - scale, - origin[Z] - 0.5*scale); + origin[X] + scale, + origin[Y] - scale, + origin[Z] - 0.5*scale); for (i=1; i<8; i++) VMOVE(arb_ip->pt[i], arb_ip->pt[0]); arb_ip->pt[1][Y] += scale; @@ -190,9 +190,9 @@ arb_ip = (struct rt_arb_internal *)internal.idb_ptr; arb_ip->magic = RT_ARB_INTERNAL_MAGIC; VSET(arb_ip->pt[0], - origin[X] +scale, - origin[Y] -scale, - origin[Z] -scale); + origin[X] +scale, + origin[Y] -scale, + origin[Z] -scale); for (i=1; i<8; i++) VMOVE(arb_ip->pt[i], arb_ip->pt[0]); arb_ip->pt[1][Y] += scale; @@ -215,9 +215,9 @@ arb_ip = (struct rt_arb_internal *)internal.idb_ptr; arb_ip->magic = RT_ARB_INTERNAL_MAGIC; VSET(arb_ip->pt[0] , - origin[X] + scale, - origin[Y] - scale, - origin[Z] - scale); + origin[X] + scale, + origin[Y] - scale, + origin[Z] - scale); for (i=1; i<8; i++) VMOVE(arb_ip->pt[i], arb_ip->pt[0]); arb_ip->pt[1][Y] += scale; @@ -238,9 +238,9 @@ arb_ip = (struct rt_arb_internal *)internal.idb_ptr; arb_ip->magic = RT_ARB_INTERNAL_MAGIC; VSET(arb_ip->pt[0] , - origin[X] +scale, - origin[Y] -scale, - origin[Z] -scale); + origin[X] +scale, + origin[Y] -scale, + origin[Z] -scale); for (i=1; i<8; i++) VMOVE(arb_ip->pt[i], arb_ip->pt[0]); arb_ip->pt[1][Y] += scale; @@ -264,7 +264,7 @@ arbn_ip->magic = RT_ARBN_INTERNAL_MAGIC; arbn_ip->neqn = 8; arbn_ip->eqn = (plane_t *)bu_calloc(arbn_ip->neqn, - sizeof(plane_t), "arbn plane eqns"); + sizeof(plane_t), "arbn plane eqns"); VSET(arbn_ip->eqn[0], 1, 0, 0); arbn_ip->eqn[0][3] = 0.5*scale; VSET(arbn_ip->eqn[1], -1, 0, 0); @@ -282,9 +282,9 @@ VSET(arbn_ip->eqn[7], -0.57735, -0.57735, -0.57735); arbn_ip->eqn[7][3] = 0.5*scale; VSET(view_center, - origin[X], - origin[Y], - origin[Z]); + origin[X], + origin[Y], + origin[Z]); for (i=0; i<arbn_ip->neqn; i++) { arbn_ip->eqn[i][3] += VDOT(view_center, arbn_ip->eqn[i]); @@ -308,16 +308,16 @@ if (curve == 0) { VSET(&(ars_ip->curves[0][0]), - origin[X], - origin[Y], - origin[Z]); + origin[X], + origin[Y], + origin[Z]); VMOVE(&(ars_ip->curves[curve][3]), &(ars_ip->curves[curve][0])); VMOVE(&(ars_ip->curves[curve][6]), &(ars_ip->curves[curve][0])); } else if (curve == (ars_ip->ncurves - 1)) { VSET(&(ars_ip->curves[curve][0]), - origin[X], - origin[Y], - origin[Z]+curve*0.5*scale); + origin[X], + origin[Y], + origin[Z]+curve*0.5*scale); VMOVE(&(ars_ip->curves[curve][3]), &(ars_ip->curves[curve][0])); VMOVE(&(ars_ip->curves[curve][6]), &(ars_ip->curves[curve][0])); @@ -360,7 +360,7 @@ grp_ip = (struct rt_grip_internal *) internal.idb_ptr; grp_ip->magic = RT_GRIP_INTERNAL_MAGIC; VSET(grp_ip->center, origin[X], origin[Y], - origin[Z]); + origin[Z]); VSET(grp_ip->normal, 1.0, 0.0, 0.0); grp_ip->mag = scale; } else if (strcmp(argv[bu_optind+1], "ell1") == 0) { Modified: brlcad/trunk/src/libged/make_name.c =================================================================== --- brlcad/trunk/src/libged/make_name.c 2008-07-27 03:33:42 UTC (rev 31971) +++ brlcad/trunk/src/libged/make_name.c 2008-07-27 05:50:31 UTC (rev 31972) @@ -52,27 +52,27 @@ } switch (argc) { - case 2: - if (strcmp(argv[1], "-s") != 0) - break; - else { - i = 0; - return BRLCAD_OK; - } - case 3: - { - int new_i; + case 2: + if (strcmp(argv[1], "-s") != 0) + break; + else { + i = 0; + return BRLCAD_OK; + } + case 3: + { + int new_i; - if ((strcmp(argv[1], "-s") == 0) - && (sscanf(argv[2], "%d", &new_i) == 1)) { - i = new_i; - return BRLCAD_OK; + if ((strcmp(argv[1], "-s") == 0) + && (sscanf(argv[2], "%d", &new_i) == 1)) { + i = new_i; + return BRLCAD_OK; + } } + default: + bu_vls_printf(&gedp->ged_result_str, "Usage: %s %s", argv[0], usage); + return BRLCAD_ERROR; } - default: - bu_vls_printf(&gedp->ged_result_str, "Usage: %s %s", argv[0], usage); - return BRLCAD_ERROR; - } bu_vls_init(&obj_name); for (cp = (char *)argv[1], len = 0; *cp != '\0'; ++cp, ++len) { Modified: brlcad/trunk/src/libged/mirror.c =================================================================== --- brlcad/trunk/src/libged/mirror.c 2008-07-27 03:33:42 UTC (rev 31971) +++ brlcad/trunk/src/libged/mirror.c 2008-07-27 05:50:31 UTC (rev 31972) @@ -62,109 +62,109 @@ bu_optind = 1; while ((k = bu_getopt(argc, (char * const *)argv, (const char *)"d:D:hHo:O:p:P:xXyYzZ")) != EOF) { #else - /* get a writable copy of argv */ - bu_vls_init(&vlsargv); - bu_vls_from_argv(&vlsargv, argc, argv); - nargv = bu_calloc(argc+1, sizeof(char *), "calloc f_ill nargv"); - bu_argv_from_string(nargv, argc, bu_vls_addr(&vlsargv)); + /* get a writable copy of argv */ + bu_vls_init(&vlsargv); + bu_vls_from_argv(&vlsargv, argc, argv); + nargv = bu_calloc(argc+1, sizeof(char *), "calloc f_ill nargv"); + bu_argv_from_string(nargv, argc, bu_vls_addr(&vlsargv)); - bu_optind = 1; + bu_optind = 1; - /* Process arguments */ - while ((k = bu_getopt(argc, nargv, "d:D:hHo:O:p:P:xXyYzZ")) != EOF) { + /* Process arguments */ + while ((k = bu_getopt(argc, nargv, "d:D:hHo:O:p:P:xXyYzZ")) != EOF) { #endif - switch (k) { - case 'd': - case 'D': - if (sscanf(bu_optarg, "%lf %lf %lf", - &mirror_dir[X], - &mirror_dir[Y], - &mirror_dir[Z]) != 3) { - bu_vls_printf(&gedp->ged_result_str, "Usage: %s %s", argv[0], usage); - early_out = 1; - } - break; - case 'p': - case 'P': - if (sscanf(bu_optarg, "%lf", &mirror_pt) != 1) { - bu_vls_printf(&gedp->ged_result_str, "Usage: %s %s", argv[0], usage); - early_out = 1; - } - break; - case 'o': - case 'O': - if (sscanf(bu_optarg, "%lf %lf %lf", - &mirror_origin[X], - &mirror_origin[Y], - &mirror_origin[Z]) != 3) { - bu_vls_printf(&gedp->ged_result_str, "Usage: %s %s", argv[0], usage); - early_out = 1; - } - break; - case 'x': - case 'X': - VSET(mirror_dir, 1.0, 0.0, 0.0); - break; - case 'y': - case 'Y': - VSET(mirror_dir, 0.0, 1.0, 0.0); - break; - case 'z': - case 'Z': - VSET(mirror_dir, 0.0, 0.0, 1.0); - break; - case 'h': - case 'H': - gedp->ged_result_flags |= GED_RESULT_FLAGS_HELP_BIT; - bu_vls_printf(&gedp->ged_result_str, "Usage: %s %s", argv[0], usage); + switch (k) { + case 'd': + case 'D': + if (sscanf(bu_optarg, "%lf %lf %lf", + &mirror_dir[X], + &mirror_dir[Y], + &mirror_dir[Z]) != 3) { + bu_vls_printf(&gedp->ged_result_str, "Usage: %s %s", argv[0], usage); + early_out = 1; + } + break; + case 'p': + case 'P': + if (sscanf(bu_optarg, "%lf", &mirror_pt) != 1) { + bu_vls_printf(&gedp->ged_result_str, "Usage: %s %s", argv[0], usage); + early_out = 1; + } + break; + case 'o': + case 'O': + if (sscanf(bu_optarg, "%lf %lf %lf", + &mirror_origin[X], + &mirror_origin[Y], + &mirror_origin[Z]) != 3) { + bu_vls_printf(&gedp->ged_result_str, "Usage: %s %s", argv[0], usage); + early_out = 1; + } + break; + case 'x': + case 'X': + VSET(mirror_dir, 1.0, 0.0, 0.0); + break; + case 'y': + case 'Y': + VSET(mirror_dir, 0.0, 1.0, 0.0); + break; + case 'z': + case 'Z': + VSET(mirror_dir, 0.0, 0.0, 1.0); + break; + case 'h': + case 'H': + gedp->ged_result_flags |= GED_RESULT_FLAGS_HELP_BIT; + bu_vls_printf(&gedp->ged_result_str, "Usage: %s %s", argv[0], usage); #if 0 - bu_free(nargv, "free f_ill nargv"); - bu_vls_free(&vlsargv); + bu_free(nargv, "free f_ill nargv"); + bu_vls_free(&vlsargv); #endif - return BRLCAD_OK; - default: - bu_vls_printf(&gedp->ged_result_str, "Usage: %s %s", argv[0], usage); - early_out = 1; - break; + return BRLCAD_OK; + default: + bu_vls_printf(&gedp->ged_result_str, "Usage: %s %s", argv[0], usage); + early_out = 1; + break; + } } - } #if 0 - bu_free(nargv, "free f_ill nargv"); - bu_vls_free(&vlsargv); + bu_free(nargv, "free f_ill nargv"); + bu_vls_free(&vlsargv); #endif - if (early_out) { - return BRLCAD_ERROR; - } + if (early_out) { + return BRLCAD_ERROR; + } - argc -= bu_optind; + argc -= bu_optind; - if (argc < 2) { - bu_vls_printf(&gedp->ged_result_str, "Usage: %s %s", argv[0], usage); - return BRLCAD_ERROR; - } + if (argc < 2) { + bu_vls_printf(&gedp->ged_result_str, "Usage: %s %s", argv[0], usage); + return BRLCAD_ERROR; + } - /* mirror the object */ - VUNITIZE(mirror_dir); + /* mirror the object */ + VUNITIZE(mirror_dir); - if (rt_mirror(gedp->ged_wdbp->dbip, - argv[bu_optind], - argv[bu_optind+1], - mirror_origin, - mirror_dir, - mirror_pt, - &rt_uniresource) == DIR_NULL) { - bu_vls_printf(&gedp->ged_result_str, "%s: not able to perform the mirror", argv[0]); - return BRLCAD_ERROR; + if (rt_mirror(gedp->ged_wdbp->dbip, + argv[bu_optind], + argv[bu_optind+1], + mirror_origin, + mirror_dir, + mirror_pt, + &rt_uniresource) == DIR_NULL) { + bu_vls_printf(&gedp->ged_result_str, "%s: not able to perform the mirror", argv[0]); + return BRLCAD_ERROR; + } + + return BRLCAD_OK; } - return BRLCAD_OK; -} - /* * Local Variables: * tab-width: 8 Modified: brlcad/trunk/src/libged/nirt.c =================================================================== --- brlcad/trunk/src/libged/nirt.c 2008-07-27 03:33:42 UTC (rev 31971) +++ brlcad/trunk/src/libged/nirt.c 2008-07-27 05:50:31 UTC (rev 31972) @@ -270,9 +270,9 @@ /* Note - gd_build_tops sets the last vp to (char *)0 */ gedp->ged_gdp->gd_rt_cmd_len += dgo_build_tops(&gedp->ged_result_str, - (struct solid *)&gedp->ged_gdp->gd_headSolid, - vp, - &gedp->ged_gdp->gd_rt_cmd[RT_MAXARGS]); + (struct solid *)&gedp->ged_gdp->gd_headSolid, + vp, + &gedp->ged_gdp->gd_rt_cmd[RT_MAXARGS]); if (gedp->ged_gdp->gd_qray_cmd_echo) { /* Print out the command we are about to run */ @@ -305,7 +305,7 @@ #if 1 bu_vls_printf(&gedp->ged_result_str, "\nFiring from view center...\n"); #else - Tcl_AppendResult(interp, "\nFiring from view center...\n", (char *)NULL); + Tcl_AppendResult(interp, "\nFiring from view center...\n", (char *)NULL); #endif #ifndef _WIN32 @@ -535,7 +535,7 @@ #if 1 bu_vls_printf(&gedp->ged_result_str, "%s", line); #else - Tcl_AppendResult(interp, line, (char *)NULL); + Tcl_AppendResult(interp, line, (char *)NULL); #endif } @@ -545,7 +545,7 @@ #if 1 bu_vls_printf(&gedp->ged_result_str, "%s", line); #else - Tcl_AppendResult(interp, line, (char *)NULL); + Tcl_AppendResult(interp, line, (char *)NULL); #endif (void)fclose(fp_err); Modified: brlcad/trunk/src/libged/rt.c =================================================================== --- brlcad/trunk/src/libged/rt.c 2008-07-27 03:33:42 UTC (rev 31971) +++ brlcad/trunk/src/libged/rt.c 2008-07-27 05:50:31 UTC (rev 31972) @@ -25,16 +25,20 @@ #include "common.h" +#include <stdlib.h> #include "bio.h" -#include "ged_private.h" + #include "cmd.h" #include "solid.h" +#include "ged_private.h" + + #if GED_USE_RUN_RT static int ged_run_rt(struct ged *gdp); static void ged_rt_write(struct ged *gedp, - FILE *fp, - vect_t eye_model); + FILE *fp, + vect_t eye_model); static void ged_rt_output_handler(ClientData clientData, int mask); static int ged_build_tops(struct ged *gedp, This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bo...@us...> - 2008-07-29 12:25:36
|
Revision: 32041 http://brlcad.svn.sourceforge.net/brlcad/?rev=32041&view=rev Author: bob1961 Date: 2008-07-29 12:25:43 +0000 (Tue, 29 Jul 2008) Log Message: ----------- Temporarily adding wdb_track. Modified Paths: -------------- brlcad/trunk/src/libged/Makefile.am Added Paths: ----------- brlcad/trunk/src/libged/wdb_track.c Modified: brlcad/trunk/src/libged/Makefile.am =================================================================== --- brlcad/trunk/src/libged/Makefile.am 2008-07-29 12:14:37 UTC (rev 32040) +++ brlcad/trunk/src/libged/Makefile.am 2008-07-29 12:25:43 UTC (rev 32041) @@ -141,6 +141,7 @@ vutil.c \ wdb_comb_std.c \ wdb_obj.c \ + wdb_track.c \ whatid.c \ which.c \ who.c \ Added: brlcad/trunk/src/libged/wdb_track.c =================================================================== --- brlcad/trunk/src/libged/wdb_track.c (rev 0) +++ brlcad/trunk/src/libged/wdb_track.c 2008-07-29 12:25:43 UTC (rev 32041) @@ -0,0 +1,1268 @@ +/* T R A C K . C + * BRL-CAD + * + * Copyright (c) 1994-2008 United States Government as represented by + * the U.S. Army Research Laboratory. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * version 2.1 as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this file; see the file named COPYING for more + * information. + */ +/** @addtogroup librt */ +/** @{ */ +/** @file track.c + * + * Adds "tracks" to the data file given the required info + * + * Acknowledgements: + * Modifications by Bob Parker (SURVICE Engineering): + * *- adapt for use in LIBRT's database object + * *- removed prompting for input + * *- removed signal catching + * *- added basename parameter + */ +/** @} */ + +#include "common.h" + +#include <stdlib.h> +#include <stdio.h> +#include <math.h> +#include <string.h> +#include "bio.h" + +#include "bu.h" +#include "vmath.h" +#include "bn.h" +#include "rtgeom.h" +#include "raytrace.h" +#include "wdb.h" + +/*XXX The following WDB_ defines need to go inside of a header file */ +#define WDB_TCL_CHECK_READ_ONLY \ + if (interp) { \ + if (wdbp->dbip->dbi_read_only) { \ + Tcl_AppendResult(interp, "Sorry, this database is READ-ONLY\n", (char *)NULL); \ + return TCL_ERROR; \ + } \ + } else { \ + bu_log("Sorry, this database is READ-ONLY\n"); \ + } +#define WDB_TCL_ERROR_RECOVERY_SUGGESTION\ + Tcl_AppendResult(interp, "\ +The in-memory table of contents may not match the status of the on-disk\n\ +database. The on-disk database should still be intact. For safety,\n\ +you should exit now, and resolve the I/O problem, before continuing.\n", (char *)NULL) + +extern void aexists(); + +static int Trackpos = 0; +static int mat_default = 1; +static int los_default = 50; +static int item_default = 500; +static fastf_t plano[4], plant[4]; +static int grpname_len; +static int extraTypeChars = 3; +static int extraChars = 4; + +static struct track_solid { + int s_type; + char *s_name; + fastf_t s_values[24]; +} sol; + +static int wrobj(); +static void slope(), crdummy(), trcurve(); +static void bottom(), top(); + +static void track_mk_tree_pure(); +static int track_mk_tree_gift(); +static struct wmember *track_mk_addmember(); +static void track_mk_freemembers(); +static int track_mk_comb(); + + +/* ==== I T O A ( ) + * convert integer to ascii wd format + */ +static void +itoa(Tcl_Interp *interp, + int n, + char s[], + int w) { + int c, i, j, sign; + + if ( (sign = n) < 0 ) n = -n; + i = 0; + do s[i++] = n % 10 + '0'; while ( (n /= 10) > 0 ); + if ( sign < 0 ) s[i++] = '-'; + + /* blank fill array + */ + for ( j = i; j < w; j++ ) s[j] = ' '; + if ( i > w ) + Tcl_AppendResult(interp, "itoa: field length too small\n", (char *)NULL); + s[w] = '\0'; + /* reverse the array + */ + for ( i = 0, j = w - 1; i < j; i++, j-- ) { + c = s[i]; + s[i] = s[j]; + s[j] = c; + } +} + + +static void +crname(Tcl_Interp *interp, + char name[], + int pos, + int maxlen) +{ + char temp[4]; + + itoa(interp, pos, temp, 1); + bu_strlcat(name, temp, maxlen); + + return; +} + +static void +crregion(struct rt_wdb *wdbp, + Tcl_Interp *interp, + char region[], + char op[], + int members[], + int number, + char solidname[], + int maxlen) +{ + int i; + struct bu_list head; + + if (wdbp->dbip == DBI_NULL) + return; + + BU_LIST_INIT(&head); + + for (i=0; i<number; i++) { + solidname[grpname_len + extraTypeChars] = '\0'; + crname(interp, solidname, members[i], maxlen); + if ( db_lookup( wdbp->dbip, solidname, LOOKUP_QUIET) == DIR_NULL ) { + Tcl_AppendResult(interp, "region: ", region, " will skip member: ", + solidname, "\n", (char *)NULL); + continue; + } + track_mk_addmember( solidname, &head, NULL, op[i] ); + } + (void)track_mk_comb( wdbp, region, &head, + 1, NULL, NULL, NULL, + 500+Trackpos+i, 0, mat_default, los_default, + 0, 1, 1 ); +} + + +/* + * + * Adds track given "wheel" info + * + */ +int +wdb_track_cmd(struct rt_wdb *wdbp, + Tcl_Interp *interp, + int argc, + char *argv[]) { + fastf_t fw[3], lw[3], iw[3], dw[3], tr[3]; + char *solname = NULL; + char *regname = NULL; + char *grpname = NULL; + char oper[3]; + int i, memb[4]; + vect_t temp1, temp2; + int item, mat, los; + int arg; + int edit_result = TCL_OK; + struct bu_list head; + int len; + + WDB_TCL_CHECK_READ_ONLY; + + BU_LIST_INIT(&head); + + if (argc != 15) { + struct bu_vls vls; + + bu_vls_init(&vls); + bu_vls_printf(&vls, "helplib_alias wdb_track %s", argv[0]); + Tcl_Eval(interp, bu_vls_addr(&vls)); + bu_vls_free(&vls); + return TCL_ERROR; + } + + oper[0] = oper[2] = WMOP_INTERSECT; + oper[1] = WMOP_SUBTRACT; + + /* base name */ + arg = 1; + grpname = bu_strdup(argv[arg]); + grpname_len = strlen(grpname); + len = grpname_len + 1 + extraChars; + solname = bu_malloc(len, "solid name"); + regname = bu_malloc(len, "region name"); + sol.s_name = bu_malloc(len, "sol.s_name"); + + /* first road wheel X */ + ++arg; + fw[0] = atof(argv[arg]) * wdbp->dbip->dbi_local2base; + + /* last road wheel X */ + ++arg; + lw[0] = atof(argv[arg]) * wdbp->dbip->dbi_local2base; + + if (fw[0] <= lw[0]) { + Tcl_AppendResult(interp, "First wheel after last wheel - STOP\n", (char *)NULL); + edit_result = TCL_ERROR; + goto end; + } + + /* road wheel Z */ + ++arg; + fw[1] = lw[1] = atof(argv[arg]) * wdbp->dbip->dbi_local2base; + + /* roadwheel radius */ + ++arg; + fw[2] = lw[2] = atof(argv[arg]) * wdbp->dbip->dbi_local2base; + + if ( fw[2] <= 0 ) { + Tcl_AppendResult(interp, "Radius <= 0 - STOP\n", (char *)NULL); + edit_result = TCL_ERROR; + goto end; + } + + /* drive sprocket X */ + ++arg; + dw[0] = atof( argv[arg] ) * wdbp->dbip->dbi_local2base; + + if ( dw[0] >= lw[0] ) { + Tcl_AppendResult(interp, "DRIVE wheel not in the rear - STOP \n", (char *)NULL); + edit_result = TCL_ERROR; + goto end; + } + + /* drive sprocket Z */ + ++arg; + dw[1] = atof( argv[arg] ) * wdbp->dbip->dbi_local2base; + + /* drive sprocket radius */ + ++arg; + dw[2] = atof( argv[arg] ) * wdbp->dbip->dbi_local2base; + + if ( dw[2] <= 0 ) { + Tcl_AppendResult(interp, "Radius <= 0 - STOP\n", (char *)NULL); + edit_result = TCL_ERROR; + goto end; + } + + /* idler wheel X */ + ++arg; + iw[0] = atof( argv[arg] ) * wdbp->dbip->dbi_local2base; + + if ( iw[0] <= fw[0] ) { + Tcl_AppendResult(interp, "IDLER wheel not in the front - STOP \n", (char *)NULL); + edit_result = TCL_ERROR; + goto end; + } + + /* idler wheel Z */ + ++arg; + iw[1] = atof( argv[arg] ) * wdbp->dbip->dbi_local2base; + + /* idler wheel radius */ + ++arg; + iw[2] = atof( argv[arg] ) * wdbp->dbip->dbi_local2base; + + if ( iw[2] <= 0 ) { + Tcl_AppendResult(interp, "Radius <= 0 - STOP\n", (char *)NULL); + edit_result = TCL_ERROR; + goto end; + } + + /* track MIN Y */ + ++arg; + tr[2] = tr[0] = atof( argv[arg] ) * wdbp->dbip->dbi_local2base; + + /* track MAX Y */ + ++arg; + tr[1] = atof( argv[arg] ) * wdbp->dbip->dbi_local2base; + + if ( tr[0] == tr[1] ) { + Tcl_AppendResult(interp, "MIN == MAX ... STOP\n", (char *)NULL); + edit_result = TCL_ERROR; + goto end; + } + if ( tr[0] > tr[1] ) { + Tcl_AppendResult(interp, "MIN > MAX .... will switch\n", (char *)NULL); + tr[1] = tr[0]; + tr[0] = tr[2]; + } + + /* track thickness */ + ++arg; + tr[2] = atof( argv[arg] ) * wdbp->dbip->dbi_local2base; + + if ( tr[2] <= 0 ) { + Tcl_AppendResult(interp, "Track thickness <= 0 - STOP\n", (char *)NULL); + edit_result = TCL_ERROR; + goto end; + } + + for (i = 0; i < grpname_len; ++i) { + solname[i] = grpname[i]; + regname[i] = grpname[i]; + } + + solname[i] = regname[i] = '.'; + ++i; + solname[i] = 's'; + regname[i] = 'r'; + ++i; + solname[i] = regname[i] = '.'; + ++i; + solname[i] = regname[i] = '\0'; +/* + bu_log("\nX of first road wheel %10.4f\n", fw[0]); + bu_log("X of last road wheel %10.4f\n", lw[0]); + bu_log("Z of road wheels %10.4f\n", fw[1]); + bu_log("radius of road wheels %10.4f\n", fw[2]); + bu_log("\nX of drive wheel %10.4f\n", dw[0]); + bu_log("Z of drive wheel %10.4f\n", dw[1]); + bu_log("radius of drive wheel %10.4f\n", dw[2]); + bu_log("\nX of idler wheel %10.4f\n", iw[0]); + bu_log("Z of idler wheel %10.4f\n", iw[1]); + bu_log("radius of idler wheel %10.4f\n", iw[2]); + bu_log("\nY MIN of track %10.4f\n", tr[0]); + bu_log("Y MAX of track %10.4f\n", tr[1]); + bu_log("thickness of track %10.4f\n", tr[2]); +*/ + +/* Check for names to use: + * grpname.s.0->9 and grpname.r.0->9 + */ + + for (i=0; i<10; i++) { + crname(interp, solname, i, len); + crname(interp, regname, i, len); + if ((db_lookup( wdbp->dbip, solname, LOOKUP_QUIET) != DIR_NULL) || + (db_lookup( wdbp->dbip, regname, LOOKUP_QUIET) != DIR_NULL)) { + /* name already exists */ + Tcl_AppendResult(interp, "Track: naming error -- STOP\n", + (char *)NULL); + edit_result = TCL_ERROR; + goto end; + } + + solname[grpname_len + extraTypeChars] = '\0'; + regname[grpname_len + extraTypeChars] = '\0'; + } + + /* find the front track slope to the idler */ + for (i=0; i<24; i++) + sol.s_values[i] = 0.0; + + /* add the solids */ + /* solid 0 */ + slope(interp, fw, iw, tr); + VMOVE(temp2, &sol.s_values[0]); + crname(interp, solname, 0, len); + bu_strlcpy(sol.s_name, solname, len); + + sol.s_type = ID_ARB8; + if (wrobj(wdbp, interp, solname, DIR_SOLID)) + return TCL_ERROR; + + solname[grpname_len + extraTypeChars] = '\0'; + + /* solid 1 */ + /* find track around idler */ + for (i=0; i<24; i++) + sol.s_values[i] = 0.0; + sol.s_type = ID_TGC; + trcurve(iw, tr); + crname(interp, solname, 1, len); + bu_strlcpy(sol.s_name, solname, len); + if (wrobj(wdbp, interp, solname, DIR_SOLID ) ) + return TCL_ERROR; + solname[grpname_len + extraTypeChars] = '\0'; + /* idler dummy rcc */ + sol.s_values[6] = iw[2]; + sol.s_values[11] = iw[2]; + VMOVE(&sol.s_values[12], &sol.s_values[6]); + VMOVE(&sol.s_values[15], &sol.s_values[9]); + /* solid 2 */ + crname(interp, solname, 2, len); + bu_strlcpy(sol.s_name, solname, len); + if (wrobj(wdbp, interp, solname, DIR_SOLID ) ) + return TCL_ERROR; + solname[grpname_len + extraTypeChars] = '\0'; + + /* solid 3 */ + /* find idler track dummy arb8 */ + for (i=0; i<24; i++) + sol.s_values[i] = 0.0; + crname(interp, solname, 3, len); + bu_strlcpy(sol.s_name, solname, len); + sol.s_type = ID_ARB8; + crdummy(iw, tr, 1); + if (wrobj(wdbp, interp, solname, DIR_SOLID) ) + return TCL_ERROR; + solname[grpname_len + extraTypeChars] = '\0'; + + /* solid 4 */ + /* track slope to drive */ + for (i=0; i<24; i++) + sol.s_values[i] = 0.0; + slope(interp, lw, dw, tr); + VMOVE(temp1, &sol.s_values[0]); + crname(interp, solname, 4, len); + bu_strlcpy(sol.s_name, solname, len); + if (wrobj(wdbp, interp, solname, DIR_SOLID)) + return TCL_ERROR; + solname[grpname_len + extraTypeChars] = '\0'; + + /* solid 5 */ + /* track around drive */ + for (i=0; i<24; i++) + sol.s_values[i] = 0.0; + sol.s_type = ID_TGC; + trcurve(dw, tr); + crname(interp, solname, 5, len); + bu_strlcpy(sol.s_name, solname, len); + if (wrobj(wdbp, interp, solname, DIR_SOLID) ) + return TCL_ERROR; + solname[grpname_len + extraTypeChars] = '\0'; + + /* solid 6 */ + /* drive dummy rcc */ + sol.s_values[6] = dw[2]; + sol.s_values[11] = dw[2]; + VMOVE(&sol.s_values[12], &sol.s_values[6]); + VMOVE(&sol.s_values[15], &sol.s_values[9]); + crname(interp, solname, 6, len); + bu_strlcpy(sol.s_name, solname, len); + if (wrobj(wdbp, interp, solname, DIR_SOLID) ) + return TCL_ERROR; + solname[grpname_len + extraTypeChars] = '\0'; + + /* solid 7 */ + /* drive dummy arb8 */ + for (i=0; i<24; i++) + sol.s_values[i] = 0.0; + crname(interp, solname, 7, len); + bu_strlcpy(sol.s_name, solname, len); + sol.s_type = ID_ARB8; + crdummy(dw, tr, 2); + if (wrobj(wdbp, interp, solname, DIR_SOLID) ) + return TCL_ERROR; + solname[grpname_len + extraTypeChars] = '\0'; + + /* solid 8 */ + /* track bottom */ + temp1[1] = temp2[1] = tr[0]; + bottom(temp1, temp2, tr); + crname(interp, solname, 8, len); + bu_strlcpy(sol.s_name, solname, len); + if (wrobj(wdbp, interp, solname, DIR_SOLID) ) + return TCL_ERROR; + solname[grpname_len + extraTypeChars] = '\0'; + + /* solid 9 */ + /* track top */ + temp1[0] = dw[0]; + temp1[1] = temp2[1] = tr[0]; + temp1[2] = dw[1] + dw[2]; + temp2[0] = iw[0]; + temp2[2] = iw[1] + iw[2]; + top(temp1, temp2, tr); + crname(interp, solname, 9, len); + bu_strlcpy(sol.s_name, solname, len); + if (wrobj(wdbp, interp, solname, DIR_SOLID) ) + return TCL_ERROR; + solname[grpname_len + extraTypeChars] = '\0'; + + /* add the regions */ + /* region 0 */ + item = item_default; + mat = mat_default; + los = los_default; + item_default = 500; + mat_default = 1; + los_default = 50; + /* region 1 */ + memb[0] = 0; + memb[1] = 3; + crname(interp, regname, 0, len); + crregion(wdbp, interp, regname, oper, memb, 2, solname, len); + solname[grpname_len + extraTypeChars] = '\0'; + regname[grpname_len + extraTypeChars] = '\0'; + + /* region 1 */ + crname(interp, regname, 1, len); + memb[0] = 1; + memb[1] = 2; + memb[2] = 3; + crregion(wdbp, interp, regname, oper, memb, 3, solname, len); + solname[grpname_len + extraTypeChars] = '\0'; + regname[grpname_len + extraTypeChars] = '\0'; + + /* region 4 */ + crname(interp, regname, 4, len); + memb[0] = 4; + memb[1] = 7; + crregion(wdbp, interp, regname, oper, memb, 2, solname, len); + solname[grpname_len + extraTypeChars] = '\0'; + regname[grpname_len + extraTypeChars] = '\0'; + + /* region 5 */ + crname(interp, regname, 5, len); + memb[0] = 5; + memb[1] = 6; + memb[2] = 7; + crregion(wdbp, interp, regname, oper, memb, 3, solname, len); + solname[grpname_len + extraTypeChars] = '\0'; + regname[grpname_len + extraTypeChars] = '\0'; + + /* region 8 */ + crname(interp, regname, 8, len); + memb[0] = 8; + memb[1] = 0; + memb[2] = 4; + oper[2] = WMOP_SUBTRACT; + crregion(wdbp, interp, regname, oper, memb, 3, solname, len); + solname[grpname_len + extraTypeChars] = '\0'; + regname[grpname_len + extraTypeChars] = '\0'; + + /* region 9 */ + crname(interp, regname, 9, len); + memb[0] = 9; + memb[1] = 3; + memb[2] = 7; + crregion(wdbp, interp, regname, oper, memb, 3, solname, len); + solname[grpname_len + extraTypeChars] = '\0'; + regname[grpname_len + extraTypeChars] = '\0'; + + /* group all the track regions */ + for (i=0; i<10; i++) { + if (i == 2 || i == 3 || i == 6 || i == 7) + continue; + regname[grpname_len + extraTypeChars] = '\0'; + crname(interp, regname, i, len); + if (db_lookup( wdbp->dbip, regname, LOOKUP_QUIET) == DIR_NULL) { + Tcl_AppendResult(interp, "group: ", grpname, " will skip member: ", + regname, "\n", (char *)NULL); + continue; + } + track_mk_addmember(regname, &head, NULL, WMOP_UNION); + } + + /* Add them all at once */ + if (track_mk_comb( wdbp, grpname, &head, + 0, NULL, NULL, NULL, + 0, 0, 0, 0, + 0, 1, 1) < 0) { + Tcl_AppendResult(interp, + "An error has occured while adding '", + grpname, "' to the database.\n", (char *)NULL); + } + + Trackpos += 10; + item_default = item; + mat_default = mat; + los_default = los; + + bu_free((genptr_t)solname, "solid name"); + bu_free((genptr_t)regname, "region name"); + bu_free((genptr_t)grpname, "group name"); + bu_free((genptr_t)sol.s_name, "sol.s_name"); + + return edit_result; + + end: + bu_free((genptr_t)solname, "solid name"); + bu_free((genptr_t)regname, "region name"); + bu_free((genptr_t)grpname, "group name"); + bu_free((genptr_t)sol.s_name, "sol.s_name"); + + return edit_result; +} + + +static int +wrobj(struct rt_wdb *wdbp, + Tcl_Interp *interp, + char name[], + int flags) { + struct directory *tdp; + struct rt_db_internal intern; + int i; + + if (wdbp->dbip == DBI_NULL) + return 0; + + if ( db_lookup( wdbp->dbip, name, LOOKUP_QUIET) != DIR_NULL ) { + Tcl_AppendResult(interp, "track naming error: ", name, + " already exists\n", (char *)NULL); + return(-1); + } + + if ( flags != DIR_SOLID ) + { + Tcl_AppendResult(interp, "wrobj can only write solids, aborting\n" ); + return( -1 ); + } + + RT_INIT_DB_INTERNAL( &intern ); + switch ( sol.s_type ) + { + case ID_ARB8: + { + struct rt_arb_internal *arb; + + BU_GETSTRUCT( arb, rt_arb_internal ); + + arb->magic = RT_ARB_INTERNAL_MAGIC; + + VMOVE( arb->pt[0], &sol.s_values[0] ); + for ( i=1; i<8; i++ ) + VADD2( arb->pt[i], &sol.s_values[i*3], arb->pt[0] ) + + intern.idb_ptr = (genptr_t)arb; + intern.idb_major_type = DB5_MAJORTYPE_BRLCAD; + intern.idb_type = ID_ARB8; + intern.idb_meth = &rt_functab[ID_ARB8]; + } + break; + case ID_TGC: + { + struct rt_tgc_internal *tgc; + + BU_GETSTRUCT( tgc, rt_tgc_internal ); + + tgc->magic = RT_TGC_INTERNAL_MAGIC; + + VMOVE( tgc->v, &sol.s_values[0] ); + VMOVE( tgc->h, &sol.s_values[3] ); + VMOVE( tgc->a, &sol.s_values[6] ); + VMOVE( tgc->b, &sol.s_values[9] ); + VMOVE( tgc->c, &sol.s_values[12] ); + VMOVE( tgc->d, &sol.s_values[15] ); + + intern.idb_ptr = (genptr_t)tgc; + intern.idb_major_type = DB5_MAJORTYPE_BRLCAD; + intern.idb_type = ID_TGC; + intern.idb_meth = &rt_functab[ID_TGC]; + } + break; + default: + Tcl_AppendResult(interp, "Unrecognized solid type in 'wrobj', aborting\n", (char *)NULL ); + return( -1 ); + } + + if ( (tdp = db_diradd( wdbp->dbip, name, -1L, 0, flags, (genptr_t)&intern.idb_type)) == DIR_NULL ) + { + rt_db_free_internal( &intern, &rt_uniresource ); + Tcl_AppendResult(interp, "Cannot add '", name, "' to directory, aborting\n", (char *)NULL ); + return( -1 ); + } + + if ( rt_db_put_internal( tdp, wdbp->dbip, &intern, &rt_uniresource ) < 0 ) + { + rt_db_free_internal( &intern, &rt_uniresource ); + Tcl_AppendResult(interp, "wrobj(wdbp, interp, ", name, "): write error\n", (char *)NULL); + WDB_TCL_ERROR_RECOVERY_SUGGESTION; + return( -1 ); + } + return(0); +} + +static void +tancir(Tcl_Interp *interp, + register fastf_t cir1[], + register fastf_t cir2[]) { + static fastf_t mag; + vect_t work; + fastf_t f; + static fastf_t temp, tempp, ang, angc; + + work[0] = cir2[0] - cir1[0]; + work[2] = cir2[1] - cir1[1]; + work[1] = 0.0; + mag = MAGNITUDE( work ); + if ( mag > 1.0e-20 || mag < -1.0e-20 ) { + f = 1.0/mag; + } else { + Tcl_AppendResult(interp, "tancir(): 0-length vector!\n", (char *)NULL); + return; + } + VSCALE(work, work, f); + temp = acos( work[0] ); + if ( work[2] < 0.0 ) + temp = 6.28318512717958646 - temp; + tempp = acos( (cir1[2] - cir2[2]) * f ); + ang = temp + tempp; + angc = temp - tempp; + if ( (cir1[1] + cir1[2] * sin(ang)) > + (cir1[1] + cir1[2] * sin(angc)) ) + ang = angc; + plano[0] = cir1[0] + cir1[2] * cos(ang); + plano[1] = cir1[1] + cir1[2] * sin(ang); + plant[0] = cir2[0] + cir2[2] * cos(ang); + plant[1] = cir2[1] + cir2[2] * sin(ang); + + return; +} + +static void +slope(Tcl_Interp *interp, + fastf_t wh1[], + fastf_t wh2[], + fastf_t t[]) { + int i, j, switchs; + fastf_t temp; + fastf_t mag; + fastf_t z, r, b; + vect_t del, work; + + switchs = 0; + if ( wh1[2] < wh2[2] ) { + switchs++; + for (i=0; i<3; i++) { + temp = wh1[i]; + wh1[i] = wh2[i]; + wh2[i] = temp; + } + } + tancir(interp, wh1, wh2); + if ( switchs ) { + for (i=0; i<3; i++) { + temp = wh1[i]; + wh1[i] = wh2[i]; + wh2[i] = temp; + } + } + if (plano[1] <= plant[1]) { + for (i=0; i<2; i++) { + temp = plano[i]; + plano[i] = plant[i]; + plant[i] = temp; + } + } + del[1] = 0.0; + del[0] = plano[0] - plant[0]; + del[2] = plano[1] - plant[1]; + mag = MAGNITUDE( del ); + work[0] = -1.0 * t[2] * del[2] / mag; + if ( del[0] < 0.0 ) + work[0] *= -1.0; + work[1] = 0.0; + work[2] = t[2] * fabs(del[0]) / mag; + b = (plano[1] - work[2]) - (del[2]/del[0]*(plano[0] - work[0])); + z = wh1[1]; + r = wh1[2]; + if ( wh1[1] >= wh2[1] ) { + z = wh2[1]; + r = wh2[2]; + } + sol.s_values[2] = z - r - t[2]; + sol.s_values[1] = t[0]; + sol.s_values[0] = (sol.s_values[2] - b) / (del[2] / del[0]); + sol.s_values[3] = plano[0] + (del[0]/mag) - work[0] - sol.s_values[0]; + sol.s_values[4] = 0.0; + sol.s_values[5] = plano[1] + (del[2]/mag) - work[2] - sol.s_values[2]; + VADD2(&sol.s_values[6], &sol.s_values[3], work); + VMOVE(&sol.s_values[9], work); + work[0] = work[2] = 0.0; + work[1] = t[1] - t[0]; + VMOVE(&sol.s_values[12], work); + for (i=3; i<=9; i+=3) { + j = i + 12; + VADD2(&sol.s_values[j], &sol.s_values[i], work); + } + + return; +} + +static void +crdummy( w, t, flag ) + fastf_t w[3], t[3]; + int flag; +{ + fastf_t temp; + vect_t vec; + int i, j; + + vec[1] = 0.0; + if (plano[1] <= plant[1]) { + for (i=0; i<2; i++) { + temp = plano[i]; + plano[i] = plant[i]; + plant[i] = temp; + } + } + + vec[0] = w[2] + t[2] + 1.0; + vec[2] = ( (plano[1] - w[1]) * vec[0] ) / (plano[0] - w[0]); + if ( flag > 1 ) + vec[0] *= -1.0; + if (vec[2] >= 0.0) + vec[2] *= -1.0; + sol.s_values[0] = w[0]; + sol.s_values[1] = t[0] -1.0; + sol.s_values[2] = w[1]; + VMOVE(&sol.s_values[3], vec); + vec[2] = w[2] + t[2] + 1.0; + VMOVE(&sol.s_values[6], vec); + vec[0] = 0.0; + VMOVE(&sol.s_values[9], vec); + vec[2] = 0.0; + vec[1] = t[1] - t[0] + 2.0; + VMOVE(&sol.s_values[12], vec); + for (i=3; i<=9; i+=3) { + j = i + 12; + VADD2(&sol.s_values[j], &sol.s_values[i], vec); + } + + return; + +} + +static void +trcurve( wh, t ) + fastf_t wh[], t[]; +{ + sol.s_values[0] = wh[0]; + sol.s_values[1] = t[0]; + sol.s_values[2] = wh[1]; + sol.s_values[4] = t[1] - t[0]; + sol.s_values[6] = wh[2] + t[2]; + sol.s_values[11] = wh[2] + t[2]; + VMOVE(&sol.s_values[12], &sol.s_values[6]); + VMOVE(&sol.s_values[15], &sol.s_values[9]); +} + +static void +bottom( vec1, vec2, t ) + vect_t vec1, vec2; + fastf_t t[]; +{ + vect_t tvec; + int i, j; + + VMOVE(&sol.s_values[0], vec1); + tvec[0] = vec2[0] - vec1[0]; + tvec[1] = tvec[2] = 0.0; + VMOVE(&sol.s_values[3], tvec); + tvec[0] = tvec[1] = 0.0; + tvec[2] = t[2]; + VADD2(&sol.s_values[6], &sol.s_values[3], tvec); + VMOVE(&sol.s_values[9], tvec); + tvec[0] = tvec[2] = 0.0; + tvec[1] = t[1] - t[0]; + VMOVE(&sol.s_values[12], tvec); + + for (i=3; i<=9; i+=3) { + j = i + 12; + VADD2(&sol.s_values[j], &sol.s_values[i], tvec); + } +} + +static void +top( vec1, vec2, t ) + vect_t vec1, vec2; + fastf_t t[]; +{ + fastf_t tooch, mag; + vect_t del, tvec; + int i, j; + + tooch = t[2] * .25; + del[0] = vec2[0] - vec1[0]; + del[1] = 0.0; + del[2] = vec2[2] - vec1[2]; + mag = MAGNITUDE( del ); + VSCALE(tvec, del, tooch/mag); + VSUB2(&sol.s_values[0], vec1, tvec); + VADD2(del, del, tvec); + VADD2(&sol.s_values[3], del, tvec); + tvec[0] = tvec[2] = 0.0; + tvec[1] = t[1] - t[0]; + VCROSS(del, tvec, &sol.s_values[3]); + mag = MAGNITUDE( del ); + if (del[2] < 0) + mag *= -1.0; + VSCALE(&sol.s_values[9], del, t[2]/mag); + VADD2(&sol.s_values[6], &sol.s_values[3], &sol.s_values[9]); + VMOVE(&sol.s_values[12], tvec); + + for (i=3; i<=9; i+=3) { + j = i + 12; + VADD2(&sol.s_values[j], &sol.s_values[i], tvec); + } +} + + +/* + * The following functions were pulled in from libwdb + * to prevent creating a new dependency. + */ + +/* + * M K _ T R E E _ P U R E + * + * Given a list of wmember structures, build a tree that performs + * the boolean operations in the given sequence. + * No GIFT semantics or precedence is provided. + * For that, use mk_tree_gift(). + */ +static void +track_mk_tree_pure( struct rt_comb_internal *comb, struct bu_list *member_hd ) +{ + register struct wmember *wp; + + for ( BU_LIST_FOR( wp, wmember, member_hd ) ) { + union tree *leafp, *nodep; + + WDB_CK_WMEMBER(wp); + + BU_GETUNION( leafp, tree ); + leafp->tr_l.magic = RT_TREE_MAGIC; + leafp->tr_l.tl_op = OP_DB_LEAF; + leafp->tr_l.tl_name = bu_strdup( wp->wm_name ); + if ( !bn_mat_is_identity( wp->wm_mat ) ) { + leafp->tr_l.tl_mat = bn_mat_dup( wp->wm_mat ); + } + + if ( !comb->tree ) { + comb->tree = leafp; + continue; + } + /* Build a left-heavy tree */ + BU_GETUNION( nodep, tree ); + nodep->tr_b.magic = RT_TREE_MAGIC; + switch ( wp->wm_op ) { + case WMOP_UNION: + nodep->tr_b.tb_op = OP_UNION; + break; + case WMOP_INTERSECT: + nodep->tr_b.tb_op = OP_INTERSECT; + break; + case WMOP_SUBTRACT: + nodep->tr_b.tb_op = OP_SUBTRACT; + break; + default: + bu_bomb("track_mk_tree_pure() bad wm_op"); + } + nodep->tr_b.tb_left = comb->tree; + nodep->tr_b.tb_right = leafp; + comb->tree = nodep; + } +} + +/* + * M K _ T R E E _ G I F T + * + * Add some nodes to a new or existing combination's tree, + * with GIFT precedence and semantics. + * + * NON-PARALLEL due to rt_uniresource + * + * Returns - + * -1 ERROR + * 0 OK + */ +static int +track_mk_tree_gift( struct rt_comb_internal *comb, struct bu_list *member_hd ) +{ + struct wmember *wp; + union tree *tp; + struct rt_tree_array *tree_list; + int node_count; + int actual_count; + int new_nodes; + + if ( (new_nodes = bu_list_len( member_hd )) <= 0 ) + return 0; /* OK, nothing to do */ + + if ( comb->tree && db_ck_v4gift_tree( comb->tree ) < 0 ) + { + db_non_union_push( comb->tree, &rt_uniresource ); + if ( db_ck_v4gift_tree( comb->tree ) < 0 ) + { + bu_log("track_mk_tree_gift() Cannot flatten tree for editing\n"); + return -1; + } + } + + /* make space for an extra leaf */ + node_count = db_tree_nleaves( comb->tree ); + tree_list = (struct rt_tree_array *)bu_calloc( node_count + new_nodes, + sizeof( struct rt_tree_array ), "tree list" ); + + /* flatten tree */ + if ( comb->tree ) { + /* Release storage for non-leaf nodes, steal leaves */ + actual_count = (struct rt_tree_array *)db_flatten_tree( + tree_list, comb->tree, OP_UNION, + 1, &rt_uniresource ) - tree_list; + BU_ASSERT_LONG( actual_count, ==, node_count ); + comb->tree = TREE_NULL; + } else { + actual_count = 0; + } + + /* Add new members to the array */ + for ( BU_LIST_FOR( wp, wmember, member_hd ) ) { + WDB_CK_WMEMBER(wp); + + switch ( wp->wm_op ) { + case WMOP_INTERSECT: + tree_list[node_count].tl_op = OP_INTERSECT; + break; + case WMOP_SUBTRACT: + tree_list[node_count].tl_op = OP_SUBTRACT; + break; + default: + bu_log("track_mk_tree_gift() unrecognized relation %c (assuming UNION)\n", wp->wm_op); + /* Fall through */ + case WMOP_UNION: + tree_list[node_count].tl_op = OP_UNION; + break; + } + + /* make new leaf node, and insert at end of array */ + BU_GETUNION( tp, tree ); + tree_list[node_count++].tl_tree = tp; + tp->tr_l.magic = RT_TREE_MAGIC; + tp->tr_l.tl_op = OP_DB_LEAF; + tp->tr_l.tl_name = bu_strdup( wp->wm_name ); + if ( !bn_mat_is_identity( wp->wm_mat ) ) { + tp->tr_l.tl_mat = bn_mat_dup( wp->wm_mat ); + } else { + tp->tr_l.tl_mat = (matp_t)NULL; + } + } + BU_ASSERT_LONG( node_count, ==, actual_count + new_nodes ); + + /* rebuild the tree with GIFT semantics */ + comb->tree = (union tree *)db_mkgift_tree( tree_list, node_count, &rt_uniresource ); + + bu_free( (char *)tree_list, "track_mk_tree_gift: tree_list" ); + + return 0; /* OK */ +} + +/* + * M K _ A D D M E M B E R + * + * Obtain dynamic storage for a new wmember structure, fill in the + * name, default the operation and matrix, and add to doubly linked + * list. In typical use, a one-line call is sufficient. To change + * the defaults, catch the pointer that is returned, and adjust the + * structure to taste. + * + * The caller is responsible for initializing the header structures + * forward and backward links. + */ +static struct wmember * +track_mk_addmember( + const char *name, + struct bu_list *headp, + mat_t mat, + int op) +{ + register struct wmember *wp; + + BU_GETSTRUCT( wp, wmember ); + wp->l.magic = WMEMBER_MAGIC; + wp->wm_name = bu_strdup( name ); + switch ( op ) { + case WMOP_UNION: + case WMOP_INTERSECT: + case WMOP_SUBTRACT: + wp->wm_op = op; + break; + default: + bu_log("mk_addmember() op=x%x is bad\n", op); + return(WMEMBER_NULL); + } + + /* if the user gave a matrix, use it. otherwise use identity matrix*/ + if (mat) { + MAT_COPY( wp->wm_mat, mat ); + } else { + MAT_IDN( wp->wm_mat ); + } + + /* Append to end of doubly linked list */ + BU_LIST_INSERT( headp, &wp->l ); + return(wp); +} + +/* + * M K _ F R E E M E M B E R S + */ +static void +track_mk_freemembers( struct bu_list *headp ) +{ + register struct wmember *wp; + + while ( BU_LIST_WHILE( wp, wmember, headp ) ) { + WDB_CK_WMEMBER(wp); + BU_LIST_DEQUEUE( &wp->l ); + bu_free( (char *)wp->wm_name, "wm_name" ); + bu_free( (char *)wp, "wmember" ); + } +} + +/* + * M K _ C O M B + * + * Make a combination, where the + * members are described by a linked list of wmember structs. + * + * The linked list is freed when it has been output. + * + * Has many operating modes. + * + * Returns - + * -1 ERROR + * 0 OK + */ +static int +track_mk_comb( + struct rt_wdb *wdbp, + const char *combname, + struct bu_list *headp, /* Made by mk_addmember() */ + int region_kind, /* 1 => region. 'P' and 'V' for FASTGEN */ + const char *shadername, /* shader name, or NULL */ + const char *shaderargs, /* shader args, or NULL */ + const unsigned char *rgb, /* NULL => no color */ + int id, /* region_id */ + int air, /* aircode */ + int material, /* GIFTmater */ + int los, + int inherit, + int append_ok, /* 0 = obj must not exit */ + int gift_semantics) /* 0 = pure, 1 = gift */ +{ + struct rt_db_internal intern; + struct rt_comb_internal *comb; + int fresh_combination; + + RT_CK_WDB(wdbp); + + RT_INIT_DB_INTERNAL(&intern); + + if ( append_ok && + wdb_import( wdbp, &intern, combname, (matp_t)NULL ) >= 0 ) { + /* We retrieved an existing object, append to it */ + comb = (struct rt_comb_internal *)intern.idb_ptr; + RT_CK_COMB( comb ); + + fresh_combination = 0; + } else { + /* Create a fresh new object for export */ + BU_GETSTRUCT( comb, rt_comb_internal ); + comb->magic = RT_COMB_MAGIC; + bu_vls_init( &comb->shader ); + bu_vls_init( &comb->material ); + + intern.idb_major_type = DB5_MAJORTYPE_BRLCAD; + intern.idb_type = ID_COMBINATION; + intern.idb_ptr = (genptr_t)comb; + intern.idb_meth = &rt_functab[ID_COMBINATION]; + + fresh_combination = 1; + } + + if ( gift_semantics ) + track_mk_tree_gift( comb, headp ); + else + track_mk_tree_pure( comb, headp ); + + /* Release the wmember list dynamic storage */ + track_mk_freemembers( headp ); + + /* Don't change these things when appending to existing combination */ + if ( fresh_combination ) { + if ( region_kind ) { + comb->region_flag = 1; + switch ( region_kind ) { + case 'P': + comb->is_fastgen = REGION_FASTGEN_PLATE; + break; + case 'V': + comb->is_fastgen = REGION_FASTGEN_VOLUME; + break; + case 'R': + case 1: + /* Regular non-FASTGEN Region */ + break; + default: + bu_log("mk_comb(%s) unknown region_kind=%d (%c), assuming normal non-FASTGEN\n", + combname, region_kind, region_kind); + } + } + if ( shadername ) bu_vls_strcat( &comb->shader, shadername ); + if ( shaderargs ) { + bu_vls_strcat( &comb->shader, " " ); + bu_vls_strcat( &comb->shader, shaderargs ); + /* Convert to Tcl form if necessary. Use heuristics */ + if ( strchr( shaderargs, '=' ) != NULL && + strchr( shaderargs, '{' ) == NULL ) + { + struct bu_vls old; + bu_vls_init(&old); + bu_vls_vlscatzap(&old, &comb->shader); + if ( bu_shader_to_tcl_list( bu_vls_addr(&old), &comb->shader) ) + bu_log("Unable to convert shader string '%s %s'\n", shadername, shaderargs); + bu_vls_free(&old); + } + } + + if ( rgb ) { + comb->rgb_valid = 1; + comb->rgb[0] = rgb[0]; + comb->rgb[1] = rgb[1]; + comb->rgb[2] = rgb[2]; + } + + comb->region_id = id; + comb->aircode = air; + comb->GIFTmater = material; + comb->los = los; + + comb->inherit = inherit; + } + + /* The internal representation will be freed */ + return wdb_put_internal( wdbp, combname, &intern, 1.0); +} + +/* + * Local Variables: + * mode: C + * tab-width: 8 + * indent-tabs-mode: t + * c-file-style: "stroustrup" + * End: + * ex: shiftwidth=4 tabstop=8 + */ Property changes on: brlcad/trunk/src/libged/wdb_track.c ___________________________________________________________________ Added: svn:mime-type + text/plain Added: svn:eol-style + native This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bo...@us...> - 2008-07-29 12:30:25
|
Revision: 32042 http://brlcad.svn.sourceforge.net/brlcad/?rev=32042&view=rev Author: bob1961 Date: 2008-07-29 12:30:34 +0000 (Tue, 29 Jul 2008) Log Message: ----------- Adding killrefs. Modified Paths: -------------- brlcad/trunk/src/libged/Makefile.am Added Paths: ----------- brlcad/trunk/src/libged/killrefs.c Modified: brlcad/trunk/src/libged/Makefile.am =================================================================== --- brlcad/trunk/src/libged/Makefile.am 2008-07-29 12:25:43 UTC (rev 32041) +++ brlcad/trunk/src/libged/Makefile.am 2008-07-29 12:30:34 UTC (rev 32042) @@ -61,6 +61,7 @@ keypoint.c \ kill.c \ killall.c \ + killrefs.c \ killtree.c \ list.c \ log.c \ Added: brlcad/trunk/src/libged/killrefs.c =================================================================== --- brlcad/trunk/src/libged/killrefs.c (rev 0) +++ brlcad/trunk/src/libged/killrefs.c 2008-07-29 12:30:34 UTC (rev 32042) @@ -0,0 +1,113 @@ +/* K I L L R E F S . C + * BRL-CAD + * + * Copyright (c) 2008 United States Government as represented by + * the U.S. Army Research Laboratory. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * version 2.1 as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this file; see the file named COPYING for more + * information. + */ +/** @file killall.c + * + * The killall command. + * + */ + +#include "common.h" + +#include <string.h> + +#include "bio.h" +#include "cmd.h" +#include "ged_private.h" + +int +ged_killrefs(struct ged *gedp, int argc, const char *argv[]) +{ + register int k; + register struct directory *dp; + struct rt_db_internal intern; + struct rt_comb_internal *comb; + int ret; + static const char *usage = "object(s)"; + + GED_CHECK_DATABASE_OPEN(gedp, BRLCAD_ERROR); + GED_CHECK_READ_ONLY(gedp, BRLCAD_ERROR); + + /* initialize result */ + bu_vls_trunc(&gedp->ged_result_str, 0); + gedp->ged_result = GED_RESULT_NULL; + gedp->ged_result_flags = 0; + + /* must be wanting help */ + if (argc == 1) { + gedp->ged_result_flags |= GED_RESULT_FLAGS_HELP_BIT; + bu_vls_printf(&gedp->ged_result_str, "Usage: %s %s", argv[0], usage); + return BRLCAD_OK; + } + + if (argc < 2 || MAXARGS < argc) { + bu_vls_printf(&gedp->ged_result_str, "Usage: %s %s", argv[0], usage); + return BRLCAD_ERROR; + } + + ret = BRLCAD_OK; + + FOR_ALL_DIRECTORY_START(dp, gedp->ged_wdbp->dbip) { + if ( !(dp->d_flags & DIR_COMB) ) + continue; + + if (rt_db_get_internal(&intern, dp, gedp->ged_wdbp->dbip, (fastf_t *)NULL, &rt_uniresource) < 0) { + bu_vls_printf(&gedp->ged_result_str, "rt_db_get_internal(%s) failure", dp->d_namep); + ret = BRLCAD_ERROR; + continue; + } + comb = (struct rt_comb_internal *)intern.idb_ptr; + RT_CK_COMB(comb); + + for (k=1; k<argc; k++) { + int code; + + code = db_tree_del_dbleaf(&(comb->tree), argv[k], &rt_uniresource); + if (code == -1) + continue; /* not found */ + if (code == -2) + continue; /* empty tree */ + if (code < 0) { + bu_vls_printf(&gedp->ged_result_str, " ERROR_deleting %s/%s\n", dp->d_namep, argv[k]); + ret = BRLCAD_ERROR; + } else { + bu_vls_printf(&gedp->ged_result_str, "deleted %s/%s\n", dp->d_namep, argv[k]); + } + } + + if (rt_db_put_internal(dp, gedp->ged_wdbp->dbip, &intern, &rt_uniresource) < 0) { + bu_vls_printf(&gedp->ged_result_str, "ERROR: Unable to write new combination into database.\n"); + ret = BRLCAD_ERROR; + continue; + } + } FOR_ALL_DIRECTORY_END; + + return ret; +} + + +/* + * Local Variables: + * tab-width: 8 + * mode: C + * indent-tabs-mode: t + * c-file-style: "stroustrup" + * End: + * ex: shiftwidth=4 tabstop=8 + */ Property changes on: brlcad/trunk/src/libged/killrefs.c ___________________________________________________________________ Added: svn:mime-type + text/plain Added: svn:eol-style + native This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bo...@us...> - 2008-08-11 19:14:51
|
Revision: 32395 http://brlcad.svn.sourceforge.net/brlcad/?rev=32395&view=rev Author: bob1961 Date: 2008-08-11 19:14:44 +0000 (Mon, 11 Aug 2008) Log Message: ----------- Added the following commands to libged and libtclcad: idents, regions, solids, loadview, saveview and solids_on_ray. Added Paths: ----------- brlcad/trunk/src/libged/loadview.c brlcad/trunk/src/libged/saveview.c brlcad/trunk/src/libged/solids_on_ray.c brlcad/trunk/src/libged/tables.c Added: brlcad/trunk/src/libged/loadview.c =================================================================== --- brlcad/trunk/src/libged/loadview.c (rev 0) +++ brlcad/trunk/src/libged/loadview.c 2008-08-11 19:14:44 UTC (rev 32395) @@ -0,0 +1,375 @@ +/* L O A D V I E W . C + * BRL-CAD + * + * Copyright (c) 2008 United States Government as represented by + * the U.S. Army Research Laboratory. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * version 2.1 as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this file; see the file named COPYING for more + * information. + */ +/** @file loadview.c + * + * The loadview command. + * + */ + +#include "common.h" + +#include <stdlib.h> +#include <ctype.h> +#include <string.h> + +#include "ged_private.h" + +int ged_cm_vsize(int argc, char **argv); +int ged_cm_eyept(int argc, char **argv); +int ged_cm_lookat_pt(int argc, char **argv); +int ged_cm_vrot(int argc, char **argv); +int ged_cm_orientation(int argc, char **argv); +int ged_cm_set(int argc, char **argv); +int ged_cm_null(int argc, char **argv); + + +static vect_t ged_eye_model; +static mat_t ged_viewrot; +static struct ged *current_gedp; + +/** + * here we define a minimal table of commands that are supported by the + * loadview command. unsupported commands are those that have no bearing on + * view restoration. + */ +struct command_tab ged_loadview_cmdtab[] = { + {"viewsize", "size in mm", "set view size", + ged_cm_vsize, 2, 2}, + {"eye_pt", "xyz of eye", "set eye point", + ged_cm_eyept, 4, 4}, + {"lookat_pt", "x y z [yflip]", "set eye look direction, in X-Y plane", + ged_cm_lookat_pt, 4, 5}, + {"viewrot", "4x4 matrix", "set view direction from matrix", + ged_cm_vrot, 17, 17}, + {"orientation", "quaturnion", "set view direction from quaturnion", + ged_cm_orientation, 5, 5}, + {"set", "", "show or set parameters", + ged_cm_set, 1, 999}, + + /* begin unsupported commands (for view loading) */ + + {"start", "frame number", "start a new frame", + ged_cm_null, 2, 2}, + {"clean", "", "clean articulation from previous frame", + ged_cm_null, 1, 1}, + {"end", "", "end of frame setup, begin raytrace", + ged_cm_null, 1, 1}, + + /* not output, by default in saveview */ + + {"multiview", "", "produce stock set of views", + ged_cm_null, 1, 1}, + {"anim", "path type args", "specify articulation animation", + ged_cm_null, 4, 999}, + {"tree", "treetop(s)", "specify alternate list of tree tops", + ged_cm_null, 1, 999}, + {"ae", "azim elev", "specify view as azim and elev, in degrees", + ged_cm_null, 3, 3}, + {"opt", "-flags", "set flags, like on command line", + ged_cm_null, 2, 999}, + + /* this is a quick hack used for quietly parsing the EOF delimiter in the + * script files. + */ + {"EOF", "", "End of file delimiter", + ged_cm_null, 1, 1}, + + /* XXX support for the ae command is not included, though it probably should */ + {(char *)0, (char *)0, (char *)0, + 0, 0, 0 /* END */} +}; + +int +ged_loadview(struct ged *gedp, int argc, const char *argv[]) +{ + register FILE *fp; + char buffer[512] = {0}; + + /* data pulled from script file */ + int perspective=-1; +#define MAX_DBNAME 2048 + char dbName[MAX_DBNAME] = {0}; + char objects[10000] = {0}; + char *editArgv[3]; + int prevPerspective; + static const char *usage = "filename"; + + GED_CHECK_DATABASE_OPEN(gedp, BRLCAD_ERROR); + GED_CHECK_VIEW(gedp, BRLCAD_ERROR); + + /* initialize result */ + bu_vls_trunc(&gedp->ged_result_str, 0); + gedp->ged_result = GED_RESULT_NULL; + gedp->ged_result_flags = 0; + + /* must be wanting help */ + if (argc == 1) { + gedp->ged_result_flags |= GED_RESULT_FLAGS_HELP_BIT; + bu_vls_printf(&gedp->ged_result_str, "Usage: %s %s", argv[0], usage); + return BRLCAD_OK; + } + + if (argc < 2) { + bu_vls_printf(&gedp->ged_result_str, "Usage: %s %s", argv[0], usage); + return BRLCAD_ERROR; + } + + /* make sure the file exists */ + if (!bu_file_exists(argv[1])) { + bu_log("Error: File %s does not exist\n", argv[1]); + return BRLCAD_ERROR; + } + + /* open the file for reading */ + if ((fp = fopen( argv[1], "r")) == NULL) { + perror(argv[1]); + return BRLCAD_ERROR; + } + + prevPerspective = gedp->ged_gvp->gv_perspective; + current_gedp = gedp; + + /* turn perspective mode off, by default. A "-p" option in the + * view script will turn it back on. + */ + gedp->ged_gvp->gv_perspective = 0; + + /* iterate over the contents of the raytrace script */ + while (!feof(fp)) { + memset(buffer, 0, 512); + fscanf(fp, "%512s", buffer); + + if (strncmp(buffer, "-p", 2)==0) { + /* we found perspective */ + + buffer[0]=' '; + buffer[1]=' '; + sscanf(buffer, "%d", &perspective); + /* bu_log("perspective=%d\n", perspective);*/ + gedp->ged_gvp->gv_perspective = perspective; + + } else if (strncmp(buffer, "$*", 2)==0) { + /* the next read is the file name, the objects come + * after that + */ + + memset(dbName, 0, MAX_DBNAME); + fscanf(fp, "%2048s", dbName); /* MAX_DBNAME */ + + /* if the last character is a line termination, + * remove it (it should always be unless the user + * modifies the file) + */ + if ( *(dbName + strlen(dbName) - 1)=='\\' ) { + memset(dbName+strlen(dbName)-1, 0, 1); + } + /* bu_log("dbName=%s\n", dbName); */ + + if (!bu_same_file(gedp->ged_wdbp->dbip->dbi_filename, dbName)) { + /* stop here if they are not the same file, + * otherwise, we may proceed as expected, and load + * the objects. + */ + bu_vls_printf(&gedp->ged_result_str, "View script references a different database\nCannot load the view without closing the current database\n(i.e. run \"opendb %s\")\n", dbName); + + /* restore state before leaving */ + gedp->ged_gvp->gv_perspective = prevPerspective; + + return BRLCAD_ERROR; + } + + /* get rid of anything that may be displayed, since we + * will load objects that are listed in the script next. + */ + (void)ged_zap(gedp, 1, NULL); + + /* now get the objects listed */ + fscanf(fp, "%10000s", objects); + /* bu_log("OBJECTS=%s\n", objects);*/ + while ((!feof(fp)) && (strncmp(objects, "\\", 1)!=0)) { + + /* clean off the single quotes... */ + if (strncmp(objects, "'", 1)==0) { + objects[0]=' '; + memset(objects+strlen(objects)-1, ' ', 1); + sscanf(objects, "%10000s", objects); + } + + editArgv[0] = "draw"; + editArgv[1] = objects; + editArgv[2] = (char *)NULL; + if (ged_draw(gedp, 2, editArgv) != BRLCAD_OK) { + bu_vls_printf(&gedp->ged_result_str, "Unable to load object: %s\n", objects); + } + + /* bu_log("objects=%s\n", objects);*/ + fscanf(fp, "%10000s", objects); + } + + /* end iteration over reading in listed objects */ + } else if (strncmp(buffer, "<<EOF", 5)==0) { + char *cmdBuffer = NULL; + /* we are almost done .. read in the view commands */ + + while ( (cmdBuffer = rt_read_cmd( fp )) != NULL ) { + /* even unsupported commands should return successfully as + * they should be calling ged_cm_null() + */ + if ( rt_do_cmd( (struct rt_i *)0, cmdBuffer, ged_loadview_cmdtab ) < 0 ) { + bu_vls_printf(&gedp->ged_result_str, "command failed: %s\n", cmdBuffer); + } + bu_free( (genptr_t)cmdBuffer, "loadview cmdBuffer" ); + } + /* end iteration over rt commands */ + + } + /* end check for non-view values (dbname, etc) */ + + } + /* end iteration over file until eof */ + fclose(fp); + + /* now we have to finish the eye point calculations that usually get + * postponed until the end command runs. Since we are at the "end" + * of a commands section, we may finish the computations. + */ + /* First step: put eye at view center (view 0, 0, 0) */ + MAT_COPY(gedp->ged_gvp->gv_rotation, ged_viewrot); + MAT_DELTAS_VEC_NEG(gedp->ged_gvp->gv_center, ged_eye_model); + ged_view_update(gedp->ged_gvp); + + return BRLCAD_OK; +} + + +int +ged_cm_vsize(int argc, char **argv) +{ + if ( argc < 2 ) + return(-1); + /* for some reason, scale is supposed to be half of size... */ + current_gedp->ged_gvp->gv_size = atof(argv[1]); + current_gedp->ged_gvp->gv_scale = current_gedp->ged_gvp->gv_size * 0.5; + current_gedp->ged_gvp->gv_isize = 1.0 / current_gedp->ged_gvp->gv_size; + return(0); +} + + +int +ged_cm_eyept(int argc, char **argv) +{ + if ( argc < 4 ) + return(-1); + ged_eye_model[X] = atof(argv[1]); + ged_eye_model[Y] = atof(argv[2]); + ged_eye_model[Z] = atof(argv[3]); + /* Processing is deferred until ged_cm_end() */ + return(0); +} + + +int +ged_cm_lookat_pt(int argc, char **argv) +{ + point_t pt; + vect_t dir; + + if ( argc < 4 ) + return(-1); + pt[X] = atof(argv[1]); + pt[Y] = atof(argv[2]); + pt[Z] = atof(argv[3]); + + VSUB2( dir, pt, ged_eye_model ); + VUNITIZE( dir ); + +#if 1 + /* + At the moment bn_mat_lookat will return NAN's if the direction vector + is aligned with the Z axis. The following is a temporary workaround. + */ + { + vect_t neg_Z_axis; + + VSET(neg_Z_axis, 0.0, 0.0, -1.0); + bn_mat_fromto( ged_viewrot, dir, neg_Z_axis); + } +#else + bn_mat_lookat( ged_viewrot, dir, yflip ); +#endif + + /* Final processing is deferred until ged_cm_end(), but eye_pt + * must have been specified before here (for now) + */ + return(0); +} + + +int +ged_cm_vrot(int argc, char **argv) +{ + register int i; + + if ( argc < 17 ) + return(-1); + for ( i=0; i<16; i++ ) + ged_viewrot[i] = atof(argv[i+1]); + /* Processing is deferred until ged_cm_end() */ + return(0); +} + +int +ged_cm_orientation(int argc, char **argv) +{ + register int i; + quat_t quat; + + for ( i=0; i<4; i++ ) + quat[i] = atof( argv[i+1] ); + quat_quat2mat( ged_viewrot, quat ); + return(0); +} + +int +ged_cm_set(int argc, char **argv) +{ + return(-1); +} + +/** + * any commands that are not supported or implemented may call this null + * routine to avoid rt_do_cmd() "command not found" error reporting + */ +int +ged_cm_null(int argc, char **argv) +{ + return(0); +} + + +/* + * Local Variables: + * tab-width: 8 + * mode: C + * indent-tabs-mode: t + * c-file-style: "stroustrup" + * End: + * ex: shiftwidth=4 tabstop=8 + */ Property changes on: brlcad/trunk/src/libged/loadview.c ___________________________________________________________________ Added: svn:executable + * Added: svn:mime-type + text/plain Added: svn:eol-style + native Added: brlcad/trunk/src/libged/saveview.c =================================================================== --- brlcad/trunk/src/libged/saveview.c (rev 0) +++ brlcad/trunk/src/libged/saveview.c 2008-08-11 19:14:44 UTC (rev 32395) @@ -0,0 +1,220 @@ +/* S A V E V I E W . C + * BRL-CAD + * + * Copyright (c) 2008 United States Government as represented by + * the U.S. Army Research Laboratory. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * version 2.1 as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this file; see the file named COPYING for more + * information. + */ +/** @file saveview.c + * + * The saveview command. + * + */ + +#include "common.h" + +#include <stdlib.h> +#include <ctype.h> +#include <string.h> + +#include "bio.h" +#include "solid.h" +#include "ged_private.h" + +static char *ged_basename_without_suffix(register const char *p1, register const char *suff); + + +int +ged_saveview(struct ged *gedp, int argc, const char *argv[]) +{ + register struct solid *sp; + register int i; + register FILE *fp; + char *base; + int c; + char rtcmd[255] = {'r', 't', 0}; + char outlog[255] = {0}; + char outpix[255] = {0}; + char inputg[255] = {0}; + static const char *usage = "[-e] [-i] [-l] [-o] filename [args]"; + + GED_CHECK_DATABASE_OPEN(gedp, BRLCAD_ERROR); + GED_CHECK_VIEW(gedp, BRLCAD_ERROR); + + /* initialize result */ + bu_vls_trunc(&gedp->ged_result_str, 0); + gedp->ged_result = GED_RESULT_NULL; + gedp->ged_result_flags = 0; + + /* must be wanting help */ + if (argc == 1) { + gedp->ged_result_flags |= GED_RESULT_FLAGS_HELP_BIT; + bu_vls_printf(&gedp->ged_result_str, "Usage: %s %s", argv[0], usage); + return BRLCAD_OK; + } + + if (argc < 2) { + bu_vls_printf(&gedp->ged_result_str, "Usage: %s %s", argv[0], usage); + return BRLCAD_ERROR; + } + + bu_optind = 1; + while ((c = bu_getopt(argc, (char * const *)argv, "e:i:l:o:")) != EOF) { + switch (c) { + case 'e': + snprintf(rtcmd, 255, "%s", bu_optarg); + break; + case 'l': + snprintf(outlog, 255, "%s", bu_optarg); + break; + case 'o': + snprintf(outpix, 255, "%s", bu_optarg); + break; + case 'i': + snprintf(inputg, 255, "%s", bu_optarg); + break; + default: { + bu_vls_printf(&gedp->ged_result_str, "Option '%c' unknown\n", c); + bu_vls_printf(&gedp->ged_result_str, "help saveview"); + return BRLCAD_ERROR; + } + } + } + argc -= bu_optind-1; + argv += bu_optind-1; + + if (argc < 2) { + bu_vls_printf(&gedp->ged_result_str, "Usage: %s %s", argv[0], usage); + return BRLCAD_ERROR; + } + + if ( (fp = fopen( argv[1], "a")) == NULL ) { + perror(argv[1]); + return BRLCAD_ERROR; + } + (void)bu_fchmod(fp, 0755); /* executable */ + + if (!gedp->ged_wdbp->dbip->dbi_filename) { + bu_log("Error: geometry file is not specified\n"); + return BRLCAD_ERROR; + } + + if (!bu_file_exists(gedp->ged_wdbp->dbip->dbi_filename)) { + bu_log("Error: %s does not exist\n", gedp->ged_wdbp->dbip->dbi_filename); + return BRLCAD_ERROR; + } + + base = ged_basename_without_suffix( argv[1], ".sh" ); + if (outpix[0] == '\0') { + snprintf(outpix, 255, "%s.pix", base); + } + if (outlog[0] == '\0') { + snprintf(outlog, 255, "%s.log", base); + } + + /* Do not specify -v option to rt; batch jobs must print everything. -Mike */ + (void)fprintf(fp, "#!/bin/sh\n%s -M ", rtcmd); + if ( gedp->ged_gvp->gv_perspective > 0 ) + (void)fprintf(fp, "-p%g ", gedp->ged_gvp->gv_perspective); + for ( i=2; i < argc; i++ ) + (void)fprintf(fp, "%s ", argv[i]); + + if (strncmp(rtcmd,"nirt",4) != 0) + (void)fprintf(fp, "\\\n -o %s\\\n $*\\\n", outpix); + + if (inputg[0] == '\0') { + snprintf(inputg, 255, "%s", gedp->ged_wdbp->dbip->dbi_filename); + } + (void)fprintf(fp, " %s\\\n ", inputg); + + /* Find all unique top-level entries. + * Mark ones already done with s_wflag == UP + */ + FOR_ALL_SOLIDS(sp, &gedp->ged_gdp->gd_headSolid) + sp->s_wflag = DOWN; + FOR_ALL_SOLIDS(sp, &gedp->ged_gdp->gd_headSolid) { + register struct solid *forw; /* XXX */ + struct directory *dp = FIRST_SOLID(sp); + + if ( sp->s_wflag == UP ) + continue; + if (dp->d_addr == RT_DIR_PHONY_ADDR) continue; + (void)fprintf(fp, "'%s' ", dp->d_namep); + sp->s_wflag = UP; + for (BU_LIST_PFOR(forw, sp, solid, &gedp->ged_gdp->gd_headSolid)) { + if ( FIRST_SOLID(forw) == dp ) + forw->s_wflag = UP; + } + } + (void)fprintf(fp, "\\\n 2>> %s\\\n", outlog); + (void)fprintf(fp, " <<EOF\n"); + + { + vect_t eye_model; + + ged_rt_set_eye_model(gedp, eye_model); + ged_rt_write(gedp, fp, eye_model); + } + + (void)fprintf(fp, "\nEOF\n"); + (void)fclose( fp ); + + FOR_ALL_SOLIDS(sp, &gedp->ged_gdp->gd_headSolid) + sp->s_wflag = DOWN; + + return BRLCAD_OK; +} + +/** + * Return basename of path, removing leading slashes and trailing suffix. + */ +static char * +ged_basename_without_suffix(register const char *p1, register const char *suff) +{ + register char *p2, *p3; + static char buf[128]; + + /* find the basename */ + p2 = (char *)p1; + while (*p1) { + if (*p1++ == '/') + p2 = (char *)p1; + } + + /* find the end of suffix */ + for (p3=(char *)suff; *p3; p3++) + ; + + /* early out */ + while (p1>p2 && p3>suff) { + if (*--p3 != *--p1) + return(p2); + } + + /* stash and return filename, sans suffix */ + bu_strlcpy( buf, p2, p1-p2+1 ); + return(buf); +} + + +/* + * Local Variables: + * tab-width: 8 + * mode: C + * indent-tabs-mode: t + * c-file-style: "stroustrup" + * End: + * ex: shiftwidth=4 tabstop=8 + */ Property changes on: brlcad/trunk/src/libged/saveview.c ___________________________________________________________________ Added: svn:executable + * Added: svn:mime-type + text/plain Added: svn:eol-style + native Added: brlcad/trunk/src/libged/solids_on_ray.c =================================================================== --- brlcad/trunk/src/libged/solids_on_ray.c (rev 0) +++ brlcad/trunk/src/libged/solids_on_ray.c 2008-08-11 19:14:44 UTC (rev 32395) @@ -0,0 +1,316 @@ +/* S O L I D S _ O N _ R A Y . C + * BRL-CAD + * + * Copyright (c) 2008 United States Government as represented by + * the U.S. Army Research Laboratory. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * version 2.1 as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this file; see the file named COPYING for more + * information. + */ +/** @file skel.c + * + * The skel command. + * + */ + +#include "common.h" + +#include <stdlib.h> +#include <ctype.h> +#include <string.h> + +#include "bio.h" +#include "bu.h" +#include "bn.h" +#include "cmd.h" +#include "solid.h" +#include "ged_private.h" + +static char **ged_skewer_solids(struct ged *gedp, int argc, const char **argv, fastf_t *ray_orig, fastf_t *ray_dir, int full_path); + +static char *rt_cmd_vec[MAXARGS]; +static int rt_cmd_vec_len; + +int +ged_solids_on_ray(struct ged *gedp, int argc, const char *argv[]) +{ + char **snames; + int h = 0; + int v = 0; + int i; /* Dummy loop index */ + double t; + double t_in; + point_t ray_orig; + vect_t ray_dir; + point_t extremum[2]; + vect_t unit_H, unit_V; + static const char *usage = "[h v]"; + + GED_CHECK_DATABASE_OPEN(gedp, BRLCAD_ERROR); + GED_CHECK_READ_ONLY(gedp, BRLCAD_ERROR); + GED_CHECK_DRAWABLE(gedp, BRLCAD_ERROR); + GED_CHECK_VIEW(gedp, BRLCAD_ERROR); + + /* initialize result */ + bu_vls_trunc(&gedp->ged_result_str, 0); + gedp->ged_result = GED_RESULT_NULL; + gedp->ged_result_flags = 0; + + /* must be wanting help */ + if (argc == 1) { + gedp->ged_result_flags |= GED_RESULT_FLAGS_HELP_BIT; + bu_vls_printf(&gedp->ged_result_str, "Usage: %s %s", argv[0], usage); + return BRLCAD_OK; + } + + if (argc != 1 && argc != 3) { + bu_vls_printf(&gedp->ged_result_str, "Usage: %s %s", argv[0], usage); + return BRLCAD_ERROR; + } + + if (argc == 3 && + (sscanf(argv[1], "%d", &h) != 1 || + sscanf(argv[2], "%d", &v) != 1)) { + bu_vls_printf(&gedp->ged_result_str, "Usage: %s %s", argv[0], usage); + return BRLCAD_ERROR; + } + + if ((int)GED_VMIN > h || h > (int)GED_VMAX || (int)GED_VMIN > v || v > (int)GED_VMAX) { + bu_vls_printf(&gedp->ged_result_str, "Screen coordinates out of range\nMust be between +/-2048"); + return BRLCAD_ERROR; + } + + VSET(ray_orig, -gedp->ged_gvp->gv_center[MDX], + -gedp->ged_gvp->gv_center[MDY], -gedp->ged_gvp->gv_center[MDZ]); + /* + * Compute bounding box of all objects displayed. + * Borrowed from size_reset() in chgview.c + */ + for (i = 0; i < 3; ++i) + { + extremum[0][i] = INFINITY; + extremum[1][i] = -INFINITY; + } +#if 0 + FOR_ALL_SOLIDS (sp, &gedp->ged_gdp->gd_headSolid) + { + minus[X] = sp->s_center[X] - sp->s_size; + minus[Y] = sp->s_center[Y] - sp->s_size; + minus[Z] = sp->s_center[Z] - sp->s_size; + VMIN(extremum[0], minus); + plus[X] = sp->s_center[X] + sp->s_size; + plus[Y] = sp->s_center[Y] + sp->s_size; + plus[Z] = sp->s_center[Z] + sp->s_size; + VMAX(extremum[1], plus); + } +#endif + VMOVEN(ray_dir, gedp->ged_gvp->gv_rotation + 8, 3); + VSCALE(ray_dir, ray_dir, -1.0); + for (i = 0; i < 3; ++i) + if (NEAR_ZERO(ray_dir[i], 1e-10)) + ray_dir[i] = 0.0; + if ((ray_orig[X] >= extremum[0][X]) && + (ray_orig[X] <= extremum[1][X]) && + (ray_orig[Y] >= extremum[0][Y]) && + (ray_orig[Y] <= extremum[1][Y]) && + (ray_orig[Z] >= extremum[0][Z]) && + (ray_orig[Z] <= extremum[1][Z])) + { + t_in = -INFINITY; + for (i = 0; i < 6; ++i) { + if (ray_dir[i%3] == 0) + continue; + t = (extremum[i/3][i%3] - ray_orig[i%3]) / + ray_dir[i%3]; + if ((t < 0) && (t > t_in)) + t_in = t; + } + VJOIN1(ray_orig, ray_orig, t_in, ray_dir); + } + + VMOVEN(unit_H, gedp->ged_gvp->gv_model2view, 3); + VMOVEN(unit_V, gedp->ged_gvp->gv_model2view + 4, 3); + VJOIN1(ray_orig, ray_orig, h * gedp->ged_gvp->gv_scale * INV_GED_V, unit_H); + VJOIN1(ray_orig, ray_orig, v * gedp->ged_gvp->gv_scale * INV_GED_V, unit_V); + + /* + * Build a list of all the top-level objects currently displayed + */ + rt_cmd_vec_len = ged_build_tops(gedp, (struct solid *)&gedp->ged_gdp->gd_headSolid, &rt_cmd_vec[0], &rt_cmd_vec[MAXARGS]); + +#if 0 + start_catching_output(&gedp->ged_result_str); +#endif + snames = ged_skewer_solids(gedp, rt_cmd_vec_len, (const char **)rt_cmd_vec, ray_orig, ray_dir, 1); +#if 0 + stop_catching_output(&gedp->ged_result_str); +#endif + + if (snames == 0) { + bu_vls_printf(&gedp->ged_result_str, "Error executing ged_skewer_solids: "); + return (BRLCAD_ERROR); + } + + for (i = 0; snames[i] != 0; ++i) + bu_vls_printf(&gedp->ged_result_str, " %s", snames[i]); + + bu_free((genptr_t) snames, "solid names"); + + return BRLCAD_OK; +} + + +/* + * G E D _ N O _ O P + * + * Null event handler for use by rt_shootray(). + * + * Does nothing. Returns 1. + */ +static int +ged_no_op(struct application *ap, struct partition *ph, struct region *r1, struct region *r2, struct partition *hp) +{ + return (1); +} + +/* + * R P T _ H I T S _ M I K E + * + * Each partition represents a segment, i.e. a single solid. + * Boolean operations have not been performed. + * The partition list is sorted by ascending inhit distance. + * This code does not attempt to eliminate duplicate segs, + * e.g. from piercing the torus twice. + */ +static int +ged_rpt_hits_mike(struct application *ap, struct partition *PartHeadp, struct seg *segp) +{ + register struct partition *pp; + int len; + char **list; + int i; + + len = rt_partition_len(PartHeadp) + 2; + list = (char **)bu_calloc( len, sizeof(char *), "hit list[]"); + + i = 0; + for (pp = PartHeadp->pt_forw; pp != PartHeadp; pp = pp->pt_forw) { + RT_CK_PT(pp); + list[i++] = db_path_to_string(&(pp->pt_inseg->seg_stp->st_path)); + } + list[i++] = NULL; + if (i > len) bu_exit(EXIT_FAILURE, "rpt_hits_mike: array overflow\n"); + + ap->a_uptr = (genptr_t)list; + return len; +} + +/* + * R P T _ M I S S + * + * Miss handler for use by rt_shootray(). + * + * Stuffs the address of a null string in ap->a_uptr and returns 0. + */ + +static int +ged_rpt_miss(struct application *ap) +{ + ap->a_uptr = NULL; + + return (0); +} + +/* + * G E D _ S K E W E R _ S O L I D S + * + * Fire a ray at some geometry and obtain a list of + * the solids encountered, sorted by first intersection. + * + * The function has five parameters: the model and objects at which + * to fire (in an argc/argv pair) the origination point and direction + * for the ray, and a result-format specifier. So long as it could + * find the objects in the model, skewer_solids() returns a null- + * terminated array of solid names. Otherwise, it returns 0. If + * full_path is nonzero, then the entire path for each solid is + * recorded. Otherwise, only the basename is recorded. + * + * N.B. - It is the caller's responsibility to free the array + * of solid names. + */ +static char ** +ged_skewer_solids (struct ged *gedp, int argc, const char **argv, fastf_t *ray_orig, fastf_t *ray_dir, int full_path) +{ + struct application ap; + struct rt_i *rtip; + struct bu_list sol_list; + + if (argc <= 0) { + bu_vls_printf(&gedp->ged_result_str, "skewer_solids argc<=0\n"); + return ((char **) 0); + } + + /* .inmem rt_gettrees .rt -i -u [who] */ + rtip = rt_new_rti( gedp->ged_wdbp->dbip ); + rtip->useair = 1; + rtip->rti_dont_instance = 1; /* full paths to solids, too. */ + if (rt_gettrees(rtip, argc, argv, 1) == -1) { + bu_vls_printf(&gedp->ged_result_str, "rt_gettrees() failed\n"); + rt_clean(rtip); + bu_free((genptr_t)rtip, "struct rt_i"); + return ((char **) 0); + } + + /* .rt prep 1 */ + rtip->rti_hasty_prep = 1; + rt_prep(rtip); + + BU_LIST_INIT(&sol_list); + + /* + * Initialize the application + */ + RT_APPLICATION_INIT(&ap); + ap.a_magic = RT_AP_MAGIC; + ap.a_ray.magic = RT_RAY_MAGIC; + ap.a_hit = ged_rpt_hits_mike; + ap.a_miss = ged_rpt_miss; + ap.a_resource = RESOURCE_NULL; + ap.a_overlap = ged_no_op; + ap.a_onehit = 0; + ap.a_user = 1; /* Requests full paths to solids, not just basenames */ + ap.a_rt_i = rtip; + ap.a_zero1 = ap.a_zero2 = 0; + ap.a_purpose = "skewer_solids()"; + ap.a_no_booleans = 1; /* full paths, no booleans */ + VMOVE(ap.a_ray.r_pt, ray_orig); + VMOVE(ap.a_ray.r_dir, ray_dir); + + (void) rt_shootray(&ap); + + rt_clean(rtip); + bu_free((genptr_t)rtip, "struct rt_i"); + + return ((char **) ap.a_uptr); +} + + +/* + * Local Variables: + * tab-width: 8 + * mode: C + * indent-tabs-mode: t + * c-file-style: "stroustrup" + * End: + * ex: shiftwidth=4 tabstop=8 + */ Property changes on: brlcad/trunk/src/libged/solids_on_ray.c ___________________________________________________________________ Added: svn:executable + * Added: svn:mime-type + text/plain Added: svn:eol-style + native Added: brlcad/trunk/src/libged/tables.c =================================================================== --- brlcad/trunk/src/libged/tables.c (rev 0) +++ brlcad/trunk/src/libged/tables.c 2008-08-11 19:14:44 UTC (rev 32395) @@ -0,0 +1,466 @@ +/* T A B L E S . C + * BRL-CAD + * + * Copyright (c) 2008 United States Government as represented by + * the U.S. Army Research Laboratory. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * version 2.1 as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this file; see the file named COPYING for more + * information. + */ +/** @file tables.c + * + * The tables command. + * + */ + +#include "common.h" + +#include <stdlib.h> +#ifdef HAVE_SYS_TYPES_H +# include <sys/types.h> +#endif +#ifdef HAVE_PWD_H +# include <pwd.h> +#endif +#include <ctype.h> +#include <string.h> + +#include "bio.h" +#include "ged_private.h" + +/* structure to distinguish new solids from existing (old) solids */ +struct identt { + int i_index; + char i_name[NAMESIZE+1]; + mat_t i_mat; +}; + +#define ABORTED -99 +#define OLDSOLID 0 +#define NEWSOLID 1 +#define SOL_TABLE 1 +#define REG_TABLE 2 +#define ID_TABLE 3 + +static struct identt identt, idbuf; +static int idfd; +static int rd_idfd; +static int numreg; +static int numsol; +static FILE *tabptr; + +static int ged_check(register char *a, register char *b); +static int ged_sol_number(matp_t matrix, char *name, int *old); +static void ged_new_tables(struct ged *gedp, struct directory *dp, struct bu_ptbl *cur_path, fastf_t *old_mat, int flag); + +int +ged_tables(struct ged *gedp, int argc, const char *argv[]) +{ + static const char sortcmd[] = "sort -n +1 -2 -o /tmp/ord_id "; + static const char catcmd[] = "cat /tmp/ord_id >> "; + struct bu_vls tmp_vls; + struct bu_vls cmd; + struct bu_ptbl cur_path; + int flag; + int status; + char *timep; + time_t now; + int i; + static const char *usage = "file object(s)"; + + GED_CHECK_DATABASE_OPEN(gedp, BRLCAD_ERROR); + + /* initialize result */ + bu_vls_trunc(&gedp->ged_result_str, 0); + gedp->ged_result = GED_RESULT_NULL; + gedp->ged_result_flags = 0; + + /* must be wanting help */ + if (argc == 1) { + gedp->ged_result_flags |= GED_RESULT_FLAGS_HELP_BIT; + bu_vls_printf(&gedp->ged_result_str, "Usage: %s %s", argv[0], usage); + return BRLCAD_OK; + } + + if (argc < 3) { + bu_vls_printf(&gedp->ged_result_str, "Usage: %s %s", argv[0], usage); + return BRLCAD_ERROR; + } + + + bu_vls_init(&tmp_vls); + bu_vls_init( &cmd ); + bu_ptbl_init( &cur_path, 8, "f_tables: cur_path" ); + numreg = 0; + numsol = 0; + +#if 0 + if ( setjmp( jmp_env ) == 0 ) { + /* allow interupts */ + (void)signal( SIGINT, sig3); + } else { + bu_vls_free( &cmd ); + bu_vls_free(&tmp_vls); + bu_ptbl_free( &cur_path ); + return BRLCAD_OK; + } +#endif + status = BRLCAD_OK; + + /* find out which ascii table is desired */ + if ( strcmp(argv[0], "solids") == 0 ) { + /* complete summary - down to solids/paremeters */ + flag = SOL_TABLE; + } else if ( strcmp(argv[0], "regions") == 0 ) { + /* summary down to solids as members of regions */ + flag = REG_TABLE; + } else if ( strcmp(argv[0], "idents") == 0 ) { + /* summary down to regions */ + flag = ID_TABLE; + } else { + /* should never reach here */ + bu_vls_printf(&gedp->ged_result_str, "%s: input error\n", argv[0]); + status = BRLCAD_ERROR; + goto end; + } + + /* open the file */ + if ((tabptr=fopen(argv[1], "w+")) == NULL) { + bu_vls_printf(&gedp->ged_result_str, "%s: Can't open %s\n", argv[0], argv[1]); + status = BRLCAD_ERROR; + goto end; + } + + if ( flag == SOL_TABLE || flag == REG_TABLE ) { + /* temp file for discrimination of solids */ + if ( (idfd = creat("/tmp/mged_discr", 0600)) < 0 ) { + perror( "/tmp/mged_discr" ); + status = BRLCAD_ERROR; + goto end; + } + rd_idfd = open( "/tmp/mged_discr", 2 ); + } + + (void)time( &now ); + timep = ctime( &now ); + timep[24] = '\0'; + (void)fprintf(tabptr, "1 -8 Summary Table {%s} (written: %s)\n", argv[0], timep); + (void)fprintf(tabptr, "2 -7 file name : %s\n", gedp->ged_wdbp->dbip->dbi_filename); + (void)fprintf(tabptr, "3 -6 \n"); + (void)fprintf(tabptr, "4 -5 \n"); +#ifndef _WIN32 + (void)fprintf(tabptr, "5 -4 user : %s\n", getpwuid(getuid())->pw_gecos); +#else + { + char uname[256]; + DWORD dwNumBytes = 256; + if (GetUserName(uname, &dwNumBytes)) + (void)fprintf(tabptr, "5 -4 user : %s\n", uname); + else + (void)fprintf(tabptr, "5 -4 user : UNKNOWN\n"); + } +#endif + (void)fprintf(tabptr, "6 -3 target title : %s\n", gedp->ged_wdbp->dbip->dbi_title); + (void)fprintf(tabptr, "7 -2 target units : %s\n", + bu_units_string(gedp->ged_wdbp->dbip->dbi_local2base) ); + (void)fprintf(tabptr, "8 -1 objects :"); + for (i=2; i<argc; i++) { + if ( (i%8) == 0 ) + (void)fprintf(tabptr, "\n "); + (void)fprintf(tabptr, " %s", argv[i]); + } + (void)fprintf(tabptr, "\n\n"); + + /* make the tables */ + for ( i=2; i<argc; i++ ) { + struct directory *dp; + + bu_ptbl_reset( &cur_path ); + if ( (dp = db_lookup(gedp->ged_wdbp->dbip, argv[i], LOOKUP_NOISY)) != DIR_NULL ) + ged_new_tables(gedp, dp, &cur_path, (fastf_t *)bn_mat_identity, flag); + else + bu_vls_printf(&gedp->ged_result_str, "%s: skip this object\n"); + } + + bu_vls_printf(&gedp->ged_result_str, "Summary written in: %s\n", argv[1]); + + if ( flag == SOL_TABLE || flag == REG_TABLE ) { + (void)unlink( "/tmp/mged_discr\0" ); + (void)fprintf(tabptr, "\n\nNumber Primitives = %d Number Regions = %d\n", + numsol, numreg); + + bu_vls_printf(&gedp->ged_result_str, "Processed %d Primitives and %d Regions\n", + numsol, numreg); + + (void)fclose( tabptr ); + } else { + (void)fprintf(tabptr, "* 9999999\n* 9999999\n* 9999999\n* 9999999\n* 9999999\n"); + (void)fclose( tabptr ); + + bu_vls_printf(&gedp->ged_result_str, "Processed %d Regions\n", numreg); + + /* make ordered idents */ + bu_vls_strcpy(&cmd, sortcmd); + bu_vls_strcat(&cmd, argv[1]); + bu_vls_printf(&gedp->ged_result_str, "%S\n", &cmd); + (void)system( bu_vls_addr(&cmd) ); + + bu_vls_trunc( &cmd, 0 ); + bu_vls_strcpy( &cmd, catcmd ); + bu_vls_strcat( &cmd, argv[1] ); + bu_vls_printf(&gedp->ged_result_str, "%S\n", &cmd); + (void)system( bu_vls_addr(&cmd) ); + + (void)unlink( "/tmp/ord_id\0" ); + } + + end: + bu_vls_free( &cmd ); + bu_vls_free(&tmp_vls); + bu_ptbl_free( &cur_path ); +#if 0 + (void)signal( SIGINT, SIG_IGN ); +#endif + return status; +} + +static int +ged_check(register char *a, register char *b) +{ + + register int c= sizeof( struct identt ); + + while ( c-- ) if ( *a++ != *b++ ) return( 0 ); /* no match */ + return( 1 ); /* match */ + +} + +static int +ged_sol_number(matp_t matrix, char *name, int *old) +{ + int i; + struct identt idbuf1, idbuf2; + int readval; + + memset(&idbuf1, 0, sizeof( struct identt )); + bu_strlcpy(idbuf1.i_name, name, sizeof(idbuf1.i_name)); + MAT_COPY(idbuf1.i_mat, matrix); + + for ( i=0; i<numsol; i++ ) { + (void)lseek(rd_idfd, i*(long)sizeof identt, 0); + readval = read(rd_idfd, &idbuf2, sizeof identt); + + if (readval < 0) { + perror("READ ERROR"); + } + + idbuf1.i_index = i + 1; + + if (ged_check( (char *)&idbuf1, (char *)&idbuf2 ) == 1) { + *old = 1; + return( idbuf2.i_index ); + } + } + numsol++; + idbuf1.i_index = numsol; + + (void)lseek(idfd, (off_t)0L, 2); + (void)write(idfd, &idbuf1, sizeof identt); + + *old = 0; + return( idbuf1.i_index ); +} + +static void +ged_new_tables(struct ged *gedp, struct directory *dp, struct bu_ptbl *cur_path, fastf_t *old_mat, int flag) +{ + struct rt_db_internal intern; + struct rt_comb_internal *comb; + struct rt_tree_array *tree_list; + int node_count; + int actual_count; + int i, k; + + RT_CK_DIR( dp ); + BU_CK_PTBL( cur_path ); + + if ( !(dp->d_flags & DIR_COMB) ) + return; + + if ( rt_db_get_internal( &intern, dp, gedp->ged_wdbp->dbip, (fastf_t *)NULL, &rt_uniresource ) < 0 ) { + bu_vls_printf(&gedp->ged_result_str, "Database read error, aborting\n"); + return; + } + + comb = (struct rt_comb_internal *)intern.idb_ptr; + RT_CK_COMB( comb ); + + if ( comb->tree && db_ck_v4gift_tree( comb->tree ) < 0 ) { + db_non_union_push( comb->tree, &rt_uniresource ); + if ( db_ck_v4gift_tree( comb->tree ) < 0 ) { + bu_vls_printf(&gedp->ged_result_str, "Cannot flatten tree for editing\n"); + rt_comb_ifree( &intern, &rt_uniresource ); + return; + } + } + + if (!comb->tree) { + /* empty combination */ + rt_comb_ifree( &intern, &rt_uniresource ); + return; + } + + node_count = db_tree_nleaves( comb->tree ); + tree_list = (struct rt_tree_array *)bu_calloc( node_count, + sizeof( struct rt_tree_array ), "tree list" ); + + /* flatten tree */ + actual_count = (struct rt_tree_array *)db_flatten_tree( tree_list, + comb->tree, OP_UNION, 0, &rt_uniresource ) - tree_list; + BU_ASSERT_LONG( actual_count, ==, node_count ); + + if ( dp->d_flags & DIR_REGION ) { + numreg++; + (void)fprintf( tabptr, " %-4d %4d %4d %4d %4d ", + numreg, comb->region_id, comb->aircode, comb->GIFTmater, + comb->los ); + for ( k=0; k<BU_PTBL_END( cur_path ); k++ ) { + struct directory *path_dp; + + path_dp = (struct directory *)BU_PTBL_GET( cur_path, k ); + RT_CK_DIR( path_dp ); + (void)fprintf( tabptr, "/%s", path_dp->d_namep ); + } + (void)fprintf( tabptr, "/%s:\n", dp->d_namep ); + + if ( flag == ID_TABLE ) + goto out; + + for ( i=0; i<actual_count; i++ ) { + char op; + int nsoltemp=0; + struct rt_db_internal sol_intern; + struct directory *sol_dp; + mat_t temp_mat; + struct bu_vls tmp_vls; + int old; + + switch ( tree_list[i].tl_op ) { + case OP_UNION: + op = 'u'; + break; + case OP_SUBTRACT: + op = '-'; + break; + case OP_INTERSECT: + op = '+'; + break; + default: + bu_log( "unrecognized operation in region %s\n", dp->d_namep ); + op = '?'; + break; + } + + if ( (sol_dp=db_lookup( gedp->ged_wdbp->dbip, tree_list[i].tl_tree->tr_l.tl_name, LOOKUP_QUIET )) != DIR_NULL ) { + if ( sol_dp->d_flags & DIR_COMB ) { + (void)fprintf(tabptr, " RG %c %s\n", + op, sol_dp->d_namep); + continue; + } else if ( !(sol_dp->d_flags & DIR_SOLID) ) { + (void)fprintf( tabptr, " ?? %c %s\n", + op, sol_dp->d_namep); + continue; + } else { + if ( tree_list[i].tl_tree->tr_l.tl_mat ) { + bn_mat_mul( temp_mat, old_mat, + tree_list[i].tl_tree->tr_l.tl_mat ); + } else { + MAT_COPY( temp_mat, old_mat ); + } + if ( rt_db_get_internal( &sol_intern, sol_dp, gedp->ged_wdbp->dbip, temp_mat, &rt_uniresource ) < 0 ) { + bu_log( "Could not import %s\n", tree_list[i].tl_tree->tr_l.tl_name ); + nsoltemp = 0; + } + nsoltemp = ged_sol_number( temp_mat, tree_list[i].tl_tree->tr_l.tl_name, &old ); + (void)fprintf(tabptr, " %c [%d] ", op, nsoltemp ); + } + } else { + nsoltemp = ged_sol_number( old_mat, tree_list[i].tl_tree->tr_l.tl_name, &old ); + (void)fprintf(tabptr, " %c [%d] ", op, nsoltemp ); + continue; + } + + if ( flag == REG_TABLE || old ) { + (void) fprintf( tabptr, "%s\n", tree_list[i].tl_tree->tr_l.tl_name ); + continue; + } else + (void) fprintf( tabptr, "%s: ", tree_list[i].tl_tree->tr_l.tl_name ); + + if ( !old && (sol_dp->d_flags & DIR_SOLID) ) { + /* if we get here, we must be looking for a solid table */ + bu_vls_init_if_uninit( &tmp_vls ); + if ( rt_functab[sol_intern.idb_type].ft_describe( &tmp_vls, &sol_intern, 1, gedp->ged_wdbp->dbip->dbi_base2local, &rt_uniresource, gedp->ged_wdbp->dbip ) < 0 ) { + bu_vls_printf(&gedp->ged_result_str, "%s describe error\n", tree_list[i].tl_tree->tr_l.tl_name); + } + fprintf( tabptr, "%s", bu_vls_addr(&tmp_vls)); + bu_vls_free( &tmp_vls ); + } + if ( nsoltemp && (sol_dp->d_flags & DIR_SOLID) ) + rt_db_free_internal( &sol_intern, &rt_uniresource ); + } + } else if ( dp->d_flags & DIR_COMB ) { + int cur_length; + + bu_ptbl_ins( cur_path, (long *)dp ); + cur_length = BU_PTBL_END( cur_path ); + + for ( i=0; i<actual_count; i++ ) { + struct directory *nextdp; + mat_t new_mat; + + nextdp = db_lookup( gedp->ged_wdbp->dbip, tree_list[i].tl_tree->tr_l.tl_name, LOOKUP_NOISY ); + if ( nextdp == DIR_NULL ) { + bu_vls_printf(&gedp->ged_result_str, "\tskipping this object\n"); + continue; + } + + /* recurse */ + if ( tree_list[i].tl_tree->tr_l.tl_mat ) { + bn_mat_mul( new_mat, old_mat, tree_list[i].tl_tree->tr_l.tl_mat ); + } else { + MAT_COPY( new_mat, old_mat ); + } + ged_new_tables(gedp, nextdp, cur_path, new_mat, flag); + bu_ptbl_trunc(cur_path, cur_length); + } + } else { + bu_vls_printf(&gedp->ged_result_str, "Illegal flags for %s skipping\n", dp->d_namep); + return; + } + + out: + bu_free( (char *)tree_list, "new_tables: tree_list" ); + rt_comb_ifree( &intern, &rt_uniresource ); + return; +} + + +/* + * Local Variables: + * tab-width: 8 + * mode: C + * indent-tabs-mode: t + * c-file-style: "stroustrup" + * End: + * ex: shiftwidth=4 tabstop=8 + */ Property changes on: brlcad/trunk/src/libged/tables.c ___________________________________________________________________ Added: svn:executable + * Added: svn:mime-type + text/plain Added: svn:eol-style + native This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ma...@us...> - 2008-08-20 12:22:30
|
Revision: 32494 http://brlcad.svn.sourceforge.net/brlcad/?rev=32494&view=rev Author: mafm Date: 2008-08-20 12:22:32 +0000 (Wed, 20 Aug 2008) Log Message: ----------- Bug fixing: not using argv[0] when argc<1, it tends to be crashy ;) (it happened to me when trying to use the library). I did some minor normalization in other commands, initializing the result and so on, hopefully I didn't introduce new bugs due to poor understanding of the way it works. Modified Paths: -------------- brlcad/trunk/src/libged/adjust.c brlcad/trunk/src/libged/arced.c brlcad/trunk/src/libged/attr.c brlcad/trunk/src/libged/bot_decimate.c brlcad/trunk/src/libged/bot_face_sort.c brlcad/trunk/src/libged/bot_smooth.c brlcad/trunk/src/libged/cat.c brlcad/trunk/src/libged/comb.c brlcad/trunk/src/libged/comb_std.c brlcad/trunk/src/libged/concat.c brlcad/trunk/src/libged/copyeval.c brlcad/trunk/src/libged/dup.c brlcad/trunk/src/libged/edcomb.c brlcad/trunk/src/libged/erase.c brlcad/trunk/src/libged/erase_all.c brlcad/trunk/src/libged/expand.c brlcad/trunk/src/libged/facetize.c brlcad/trunk/src/libged/find.c brlcad/trunk/src/libged/fracture.c brlcad/trunk/src/libged/get.c brlcad/trunk/src/libged/get_type.c brlcad/trunk/src/libged/group.c brlcad/trunk/src/libged/hide.c brlcad/trunk/src/libged/how.c brlcad/trunk/src/libged/instance.c brlcad/trunk/src/libged/item.c brlcad/trunk/src/libged/keep.c brlcad/trunk/src/libged/kill.c brlcad/trunk/src/libged/killall.c brlcad/trunk/src/libged/killrefs.c brlcad/trunk/src/libged/killtree.c brlcad/trunk/src/libged/list.c brlcad/trunk/src/libged/loadview.c brlcad/trunk/src/libged/ls.c brlcad/trunk/src/libged/make_bb.c brlcad/trunk/src/libged/match.c brlcad/trunk/src/libged/mirror.c brlcad/trunk/src/libged/nirt.c brlcad/trunk/src/libged/nmg_collapse.c brlcad/trunk/src/libged/nmg_simplify.c brlcad/trunk/src/libged/overlay.c brlcad/trunk/src/libged/pathlist.c brlcad/trunk/src/libged/pathsum.c brlcad/trunk/src/libged/prefix.c brlcad/trunk/src/libged/push.c brlcad/trunk/src/libged/put.c brlcad/trunk/src/libged/regdef.c brlcad/trunk/src/libged/region.c brlcad/trunk/src/libged/remove.c brlcad/trunk/src/libged/report.c brlcad/trunk/src/libged/rmap.c brlcad/trunk/src/libged/rt.c brlcad/trunk/src/libged/saveview.c brlcad/trunk/src/libged/set_output_script.c brlcad/trunk/src/libged/set_uplotOutputMode.c brlcad/trunk/src/libged/shaded_mode.c brlcad/trunk/src/libged/summary.c brlcad/trunk/src/libged/tables.c brlcad/trunk/src/libged/title.c brlcad/trunk/src/libged/tree.c brlcad/trunk/src/libged/unhide.c brlcad/trunk/src/libged/units.c brlcad/trunk/src/libged/vdraw.c brlcad/trunk/src/libged/view.c brlcad/trunk/src/libged/which.c brlcad/trunk/src/libged/who.c brlcad/trunk/src/libged/wmater.c Modified: brlcad/trunk/src/libged/adjust.c =================================================================== --- brlcad/trunk/src/libged/adjust.c 2008-08-20 08:01:02 UTC (rev 32493) +++ brlcad/trunk/src/libged/adjust.c 2008-08-20 12:22:32 UTC (rev 32494) @@ -49,6 +49,12 @@ gedp->ged_result = GED_RESULT_NULL; gedp->ged_result_flags = 0; + /* invalid command name */ + if (argc < 1) { + bu_vls_printf(&gedp->ged_result_str, "Error: command name not provided"); + return BRLCAD_ERROR; + } + /* must be wanting help */ if (argc == 1) { gedp->ged_result_flags |= GED_RESULT_FLAGS_HELP_BIT; Modified: brlcad/trunk/src/libged/arced.c =================================================================== --- brlcad/trunk/src/libged/arced.c 2008-08-20 08:01:02 UTC (rev 32493) +++ brlcad/trunk/src/libged/arced.c 2008-08-20 12:22:32 UTC (rev 32494) @@ -49,6 +49,12 @@ gedp->ged_result = GED_RESULT_NULL; gedp->ged_result_flags = 0; + /* invalid command name */ + if (argc < 1) { + bu_vls_printf(&gedp->ged_result_str, "Error: command name not provided"); + return BRLCAD_ERROR; + } + /* must be wanting help */ if (argc == 1) { gedp->ged_result_flags |= GED_RESULT_FLAGS_HELP_BIT; Modified: brlcad/trunk/src/libged/attr.c =================================================================== --- brlcad/trunk/src/libged/attr.c 2008-08-20 08:01:02 UTC (rev 32493) +++ brlcad/trunk/src/libged/attr.c 2008-08-20 12:22:32 UTC (rev 32494) @@ -44,6 +44,12 @@ gedp->ged_result = GED_RESULT_NULL; gedp->ged_result_flags = 0; + /* invalid command name */ + if (argc < 1) { + bu_vls_printf(&gedp->ged_result_str, "Error: command name not provided"); + return BRLCAD_ERROR; + } + /* must be wanting help */ if (argc == 1) { gedp->ged_result_flags |= GED_RESULT_FLAGS_HELP_BIT; @@ -56,7 +62,6 @@ return BRLCAD_ERROR; } - /* this is only valid for v5 databases */ if (gedp->ged_wdbp->dbip->dbi_version < 5) { bu_vls_printf(&gedp->ged_result_str, "Attributes are not available for this database format.\nPlease upgrade your database format using \"dbupgrade\" to enable attributes.", (char *)NULL); Modified: brlcad/trunk/src/libged/bot_decimate.c =================================================================== --- brlcad/trunk/src/libged/bot_decimate.c 2008-08-20 08:01:02 UTC (rev 32493) +++ brlcad/trunk/src/libged/bot_decimate.c 2008-08-20 12:22:32 UTC (rev 32494) @@ -54,6 +54,12 @@ gedp->ged_result = GED_RESULT_NULL; gedp->ged_result_flags = 0; + /* invalid command name */ + if (argc < 1) { + bu_vls_printf(&gedp->ged_result_str, "Error: command name not provided"); + return BRLCAD_ERROR; + } + /* must be wanting help */ if (argc == 1) { gedp->ged_result_flags |= GED_RESULT_FLAGS_HELP_BIT; Modified: brlcad/trunk/src/libged/bot_face_sort.c =================================================================== --- brlcad/trunk/src/libged/bot_face_sort.c 2008-08-20 08:01:02 UTC (rev 32493) +++ brlcad/trunk/src/libged/bot_face_sort.c 2008-08-20 12:22:32 UTC (rev 32494) @@ -49,6 +49,12 @@ gedp->ged_result = GED_RESULT_NULL; gedp->ged_result_flags = 0; + /* invalid command name */ + if (argc < 1) { + bu_vls_printf(&gedp->ged_result_str, "Error: command name not provided"); + return BRLCAD_ERROR; + } + /* must be wanting help */ if (argc == 1) { gedp->ged_result_flags |= GED_RESULT_FLAGS_HELP_BIT; Modified: brlcad/trunk/src/libged/bot_smooth.c =================================================================== --- brlcad/trunk/src/libged/bot_smooth.c 2008-08-20 08:01:02 UTC (rev 32493) +++ brlcad/trunk/src/libged/bot_smooth.c 2008-08-20 12:22:32 UTC (rev 32494) @@ -53,6 +53,12 @@ gedp->ged_result = GED_RESULT_NULL; gedp->ged_result_flags = 0; + /* invalid command name */ + if (argc < 1) { + bu_vls_printf(&gedp->ged_result_str, "Error: command name not provided"); + return BRLCAD_ERROR; + } + /* must be wanting help */ if (argc == 1) { gedp->ged_result_flags |= GED_RESULT_FLAGS_HELP_BIT; Modified: brlcad/trunk/src/libged/cat.c =================================================================== --- brlcad/trunk/src/libged/cat.c 2008-08-20 08:01:02 UTC (rev 32493) +++ brlcad/trunk/src/libged/cat.c 2008-08-20 12:22:32 UTC (rev 32494) @@ -45,6 +45,12 @@ gedp->ged_result = GED_RESULT_NULL; gedp->ged_result_flags = 0; + /* invalid command name */ + if (argc < 1) { + bu_vls_printf(&gedp->ged_result_str, "Error: command name not provided"); + return BRLCAD_ERROR; + } + /* must be wanting help */ if (argc == 1) { gedp->ged_result_flags |= GED_RESULT_FLAGS_HELP_BIT; Modified: brlcad/trunk/src/libged/comb.c =================================================================== --- brlcad/trunk/src/libged/comb.c 2008-08-20 08:01:02 UTC (rev 32493) +++ brlcad/trunk/src/libged/comb.c 2008-08-20 12:22:32 UTC (rev 32494) @@ -42,6 +42,12 @@ GED_CHECK_DATABASE_OPEN(gedp, BRLCAD_ERROR); GED_CHECK_READ_ONLY(gedp, BRLCAD_ERROR); + /* invalid command name */ + if (argc < 1) { + bu_vls_printf(&gedp->ged_result_str, "Error: command name not provided"); + return BRLCAD_ERROR; + } + /* initialize result */ bu_vls_trunc(&gedp->ged_result_str, 0); gedp->ged_result = GED_RESULT_NULL; Modified: brlcad/trunk/src/libged/comb_std.c =================================================================== --- brlcad/trunk/src/libged/comb_std.c 2008-08-20 08:01:02 UTC (rev 32493) +++ brlcad/trunk/src/libged/comb_std.c 2008-08-20 12:22:32 UTC (rev 32494) @@ -449,6 +449,12 @@ bu_vls_trunc(&gedp->ged_result_str, 0); gedp->ged_result = GED_RESULT_NULL; gedp->ged_result_flags = 0; + + /* invalid command name */ + if (argc < 1) { + bu_vls_printf(&gedp->ged_result_str, "Error: command name not provided"); + return BRLCAD_ERROR; + } if (argc < 3 || RT_MAXARGS < argc) { bu_vls_printf(&gedp->ged_result_str, "Usage: %s %s", argv[0], usage); Modified: brlcad/trunk/src/libged/concat.c =================================================================== --- brlcad/trunk/src/libged/concat.c 2008-08-20 08:01:02 UTC (rev 32493) +++ brlcad/trunk/src/libged/concat.c 2008-08-20 12:22:32 UTC (rev 32494) @@ -81,6 +81,12 @@ gedp->ged_result = GED_RESULT_NULL; gedp->ged_result_flags = 0; + /* invalid command name */ + if (argc < 1) { + bu_vls_printf(&gedp->ged_result_str, "Error: command name not provided"); + return BRLCAD_ERROR; + } + /* must be wanting help */ if (argc == 1) { gedp->ged_result_flags |= GED_RESULT_FLAGS_HELP_BIT; Modified: brlcad/trunk/src/libged/copyeval.c =================================================================== --- brlcad/trunk/src/libged/copyeval.c 2008-08-20 08:01:02 UTC (rev 32493) +++ brlcad/trunk/src/libged/copyeval.c 2008-08-20 12:22:32 UTC (rev 32494) @@ -51,6 +51,12 @@ gedp->ged_result = GED_RESULT_NULL; gedp->ged_result_flags = 0; + /* invalid command name */ + if (argc < 1) { + bu_vls_printf(&gedp->ged_result_str, "Error: command name not provided"); + return BRLCAD_ERROR; + } + /* must be wanting help */ if (argc == 1) { gedp->ged_result_flags |= GED_RESULT_FLAGS_HELP_BIT; Modified: brlcad/trunk/src/libged/dup.c =================================================================== --- brlcad/trunk/src/libged/dup.c 2008-08-20 08:01:02 UTC (rev 32493) +++ brlcad/trunk/src/libged/dup.c 2008-08-20 12:22:32 UTC (rev 32494) @@ -67,6 +67,12 @@ gedp->ged_result = GED_RESULT_NULL; gedp->ged_result_flags = 0; + /* invalid command name */ + if (argc < 1) { + bu_vls_printf(&gedp->ged_result_str, "Error: command name not provided"); + return BRLCAD_ERROR; + } + /* must be wanting help */ if (argc == 1) { gedp->ged_result_flags |= GED_RESULT_FLAGS_HELP_BIT; @@ -74,7 +80,7 @@ return BRLCAD_OK; } - if (argc < 2 || 3 < argc) { + if (3 < argc) { bu_vls_printf(&gedp->ged_result_str, "Usage: %s %s", argv[0], usage); return BRLCAD_ERROR; } Modified: brlcad/trunk/src/libged/edcomb.c =================================================================== --- brlcad/trunk/src/libged/edcomb.c 2008-08-20 08:01:02 UTC (rev 32493) +++ brlcad/trunk/src/libged/edcomb.c 2008-08-20 12:22:32 UTC (rev 32494) @@ -43,6 +43,12 @@ gedp->ged_result = GED_RESULT_NULL; gedp->ged_result_flags = 0; + /* invalid command name */ + if (argc < 1) { + bu_vls_printf(&gedp->ged_result_str, "Error: command name not provided"); + return BRLCAD_ERROR; + } + /* must be wanting help */ if (argc == 1) { gedp->ged_result_flags |= GED_RESULT_FLAGS_HELP_BIT; Modified: brlcad/trunk/src/libged/erase.c =================================================================== --- brlcad/trunk/src/libged/erase.c 2008-08-20 08:01:02 UTC (rev 32493) +++ brlcad/trunk/src/libged/erase.c 2008-08-20 12:22:32 UTC (rev 32494) @@ -54,6 +54,12 @@ gedp->ged_result = GED_RESULT_NULL; gedp->ged_result_flags = 0; + /* invalid command name */ + if (argc < 1) { + bu_vls_printf(&gedp->ged_result_str, "Error: command name not provided"); + return BRLCAD_ERROR; + } + /* must be wanting help */ if (argc == 1) { gedp->ged_result_flags |= GED_RESULT_FLAGS_HELP_BIT; @@ -61,11 +67,6 @@ return BRLCAD_OK; } - if (argc < 2) { - bu_vls_printf(&gedp->ged_result_str, "Usage: %s %s", argv[0], usage); - return BRLCAD_ERROR; - } - ged_eraseobjpath(gedp, argc-1, argv+1, LOOKUP_QUIET, 0); return BRLCAD_OK; Modified: brlcad/trunk/src/libged/erase_all.c =================================================================== --- brlcad/trunk/src/libged/erase_all.c 2008-08-20 08:01:02 UTC (rev 32493) +++ brlcad/trunk/src/libged/erase_all.c 2008-08-20 12:22:32 UTC (rev 32494) @@ -54,6 +54,12 @@ gedp->ged_result = GED_RESULT_NULL; gedp->ged_result_flags = 0; + /* invalid command name */ + if (argc < 1) { + bu_vls_printf(&gedp->ged_result_str, "Error: command name not provided"); + return BRLCAD_ERROR; + } + /* must be wanting help */ if (argc == 1) { gedp->ged_result_flags |= GED_RESULT_FLAGS_HELP_BIT; @@ -61,11 +67,6 @@ return BRLCAD_OK; } - if (argc < 2) { - bu_vls_printf(&gedp->ged_result_str, "Usage: %s %s", argv[0], usage); - return BRLCAD_ERROR; - } - ged_eraseobjpath(gedp, argc-1, argv+1, LOOKUP_QUIET, 1); return BRLCAD_OK; Modified: brlcad/trunk/src/libged/expand.c =================================================================== --- brlcad/trunk/src/libged/expand.c 2008-08-20 08:01:02 UTC (rev 32493) +++ brlcad/trunk/src/libged/expand.c 2008-08-20 12:22:32 UTC (rev 32494) @@ -51,6 +51,12 @@ gedp->ged_result = GED_RESULT_NULL; gedp->ged_result_flags = 0; + /* invalid command name */ + if (argc < 1) { + bu_vls_printf(&gedp->ged_result_str, "Error: command name not provided"); + return BRLCAD_ERROR; + } + /* must be wanting help */ if (argc == 1) { gedp->ged_result_flags |= GED_RESULT_FLAGS_HELP_BIT; @@ -58,7 +64,7 @@ return BRLCAD_OK; } - if (argc < 1 || MAXARGS < argc) { + if (MAXARGS < argc) { bu_vls_printf(&gedp->ged_result_str, "Usage: %s %s", argv[0], usage); return BRLCAD_ERROR; } Modified: brlcad/trunk/src/libged/facetize.c =================================================================== --- brlcad/trunk/src/libged/facetize.c 2008-08-20 08:01:02 UTC (rev 32493) +++ brlcad/trunk/src/libged/facetize.c 2008-08-20 12:22:32 UTC (rev 32494) @@ -61,6 +61,12 @@ gedp->ged_result = GED_RESULT_NULL; gedp->ged_result_flags = 0; + /* invalid command name */ + if (argc < 1) { + bu_vls_printf(&gedp->ged_result_str, "Error: command name not provided"); + return BRLCAD_ERROR; + } + /* must be wanting help */ if (argc == 1) { gedp->ged_result_flags |= GED_RESULT_FLAGS_HELP_BIT; Modified: brlcad/trunk/src/libged/find.c =================================================================== --- brlcad/trunk/src/libged/find.c 2008-08-20 08:01:02 UTC (rev 32493) +++ brlcad/trunk/src/libged/find.c 2008-08-20 12:22:32 UTC (rev 32494) @@ -57,6 +57,12 @@ gedp->ged_result = GED_RESULT_NULL; gedp->ged_result_flags = 0; + /* invalid command name */ + if (argc < 1) { + bu_vls_printf(&gedp->ged_result_str, "Error: command name not provided"); + return BRLCAD_ERROR; + } + /* must be wanting help */ if (argc == 1) { gedp->ged_result_flags |= GED_RESULT_FLAGS_HELP_BIT; @@ -64,7 +70,7 @@ return BRLCAD_OK; } - if (argc < 2 || MAXARGS < argc) { + if (MAXARGS < argc) { bu_vls_printf(&gedp->ged_result_str, "Usage: %s %s", argv[0], usage); return BRLCAD_ERROR; } Modified: brlcad/trunk/src/libged/fracture.c =================================================================== --- brlcad/trunk/src/libged/fracture.c 2008-08-20 08:01:02 UTC (rev 32493) +++ brlcad/trunk/src/libged/fracture.c 2008-08-20 12:22:32 UTC (rev 32494) @@ -60,6 +60,12 @@ gedp->ged_result = GED_RESULT_NULL; gedp->ged_result_flags = 0; + /* invalid command name */ + if (argc < 1) { + bu_vls_printf(&gedp->ged_result_str, "Error: command name not provided"); + return BRLCAD_ERROR; + } + /* must be wanting help */ if (argc == 1) { gedp->ged_result_flags |= GED_RESULT_FLAGS_HELP_BIT; @@ -67,7 +73,7 @@ return BRLCAD_OK; } - if (argc < 2 || 3 < argc) { + if (3 < argc) { bu_vls_printf(&gedp->ged_result_str, "Usage: %s %s", argv[0], usage); return BRLCAD_ERROR; } Modified: brlcad/trunk/src/libged/get.c =================================================================== --- brlcad/trunk/src/libged/get.c 2008-08-20 08:01:02 UTC (rev 32493) +++ brlcad/trunk/src/libged/get.c 2008-08-20 12:22:32 UTC (rev 32494) @@ -46,6 +46,12 @@ gedp->ged_result = GED_RESULT_NULL; gedp->ged_result_flags = 0; + /* invalid command name */ + if (argc < 1) { + bu_vls_printf(&gedp->ged_result_str, "Error: command name not provided"); + return BRLCAD_ERROR; + } + /* must be wanting help */ if (argc == 1) { gedp->ged_result_flags |= GED_RESULT_FLAGS_HELP_BIT; @@ -53,7 +59,7 @@ return BRLCAD_OK; } - if (argc < 2 || argc > 3) { + if (argc > 3) { bu_vls_printf(&gedp->ged_result_str, "Usage: %s %s", argv[0], usage); return BRLCAD_ERROR; } Modified: brlcad/trunk/src/libged/get_type.c =================================================================== --- brlcad/trunk/src/libged/get_type.c 2008-08-20 08:01:02 UTC (rev 32493) +++ brlcad/trunk/src/libged/get_type.c 2008-08-20 12:22:32 UTC (rev 32494) @@ -43,6 +43,12 @@ gedp->ged_result = GED_RESULT_NULL; gedp->ged_result_flags = 0; + /* invalid command name */ + if (argc < 1) { + bu_vls_printf(&gedp->ged_result_str, "Error: command name not provided"); + return BRLCAD_ERROR; + } + /* must be wanting help */ if (argc == 1) { gedp->ged_result_flags |= GED_RESULT_FLAGS_HELP_BIT; @@ -50,7 +56,7 @@ return BRLCAD_OK; } - if (argc < 2 || MAXARGS < argc) { + if (MAXARGS < argc) { bu_vls_printf(&gedp->ged_result_str, "Usage: %s %s", argv[0], usage); return BRLCAD_ERROR; } Modified: brlcad/trunk/src/libged/group.c =================================================================== --- brlcad/trunk/src/libged/group.c 2008-08-20 08:01:02 UTC (rev 32493) +++ brlcad/trunk/src/libged/group.c 2008-08-20 12:22:32 UTC (rev 32494) @@ -47,6 +47,12 @@ gedp->ged_result = GED_RESULT_NULL; gedp->ged_result_flags = 0; + /* invalid command name */ + if (argc < 1) { + bu_vls_printf(&gedp->ged_result_str, "Error: command name not provided"); + return BRLCAD_ERROR; + } + /* must be wanting help */ if (argc == 1) { gedp->ged_result_flags |= GED_RESULT_FLAGS_HELP_BIT; Modified: brlcad/trunk/src/libged/hide.c =================================================================== --- brlcad/trunk/src/libged/hide.c 2008-08-20 08:01:02 UTC (rev 32493) +++ brlcad/trunk/src/libged/hide.c 2008-08-20 12:22:32 UTC (rev 32494) @@ -50,6 +50,12 @@ gedp->ged_result = GED_RESULT_NULL; gedp->ged_result_flags = 0; + /* invalid command name */ + if (argc < 1) { + bu_vls_printf(&gedp->ged_result_str, "Error: command name not provided"); + return BRLCAD_ERROR; + } + /* must be wanting help */ if (argc == 1) { gedp->ged_result_flags |= GED_RESULT_FLAGS_HELP_BIT; @@ -57,11 +63,6 @@ return BRLCAD_OK; } - if (argc < 2) { - bu_vls_printf(&gedp->ged_result_str, "Usage: %s %s", argv[0], usage); - return BRLCAD_ERROR; - } - dbip = gedp->ged_wdbp->dbip; if (dbip->dbi_version < 5) { Modified: brlcad/trunk/src/libged/how.c =================================================================== --- brlcad/trunk/src/libged/how.c 2008-08-20 08:01:02 UTC (rev 32493) +++ brlcad/trunk/src/libged/how.c 2008-08-20 12:22:32 UTC (rev 32494) @@ -58,6 +58,12 @@ gedp->ged_result = GED_RESULT_NULL; gedp->ged_result_flags = 0; + /* invalid command name */ + if (argc < 1) { + bu_vls_printf(&gedp->ged_result_str, "Error: command name not provided"); + return BRLCAD_ERROR; + } + /* must be wanting help */ if (argc == 1) { gedp->ged_result_flags |= GED_RESULT_FLAGS_HELP_BIT; @@ -65,7 +71,7 @@ return BRLCAD_OK; } - if (argc < 2 || 3 < argc) { + if (3 < argc) { bu_vls_printf(&gedp->ged_result_str, "Usage: %s %s", argv[0], usage); return BRLCAD_ERROR; } Modified: brlcad/trunk/src/libged/instance.c =================================================================== --- brlcad/trunk/src/libged/instance.c 2008-08-20 08:01:02 UTC (rev 32493) +++ brlcad/trunk/src/libged/instance.c 2008-08-20 12:22:32 UTC (rev 32494) @@ -47,6 +47,12 @@ gedp->ged_result = GED_RESULT_NULL; gedp->ged_result_flags = 0; + /* invalid command name */ + if (argc < 1) { + bu_vls_printf(&gedp->ged_result_str, "Error: command name not provided"); + return BRLCAD_ERROR; + } + /* must be wanting help */ if (argc == 1) { gedp->ged_result_flags |= GED_RESULT_FLAGS_HELP_BIT; Modified: brlcad/trunk/src/libged/item.c =================================================================== --- brlcad/trunk/src/libged/item.c 2008-08-20 08:01:02 UTC (rev 32493) +++ brlcad/trunk/src/libged/item.c 2008-08-20 12:22:32 UTC (rev 32494) @@ -45,6 +45,12 @@ gedp->ged_result = GED_RESULT_NULL; gedp->ged_result_flags = 0; + /* invalid command name */ + if (argc < 1) { + bu_vls_printf(&gedp->ged_result_str, "Error: command name not provided"); + return BRLCAD_ERROR; + } + /* must be wanting help */ if (argc == 1) { gedp->ged_result_flags |= GED_RESULT_FLAGS_HELP_BIT; Modified: brlcad/trunk/src/libged/keep.c =================================================================== --- brlcad/trunk/src/libged/keep.c 2008-08-20 08:01:02 UTC (rev 32493) +++ brlcad/trunk/src/libged/keep.c 2008-08-20 12:22:32 UTC (rev 32494) @@ -60,6 +60,12 @@ gedp->ged_result = GED_RESULT_NULL; gedp->ged_result_flags = 0; + /* invalid command name */ + if (argc < 1) { + bu_vls_printf(&gedp->ged_result_str, "Error: command name not provided"); + return BRLCAD_ERROR; + } + /* must be wanting help */ if (argc == 1) { gedp->ged_result_flags |= GED_RESULT_FLAGS_HELP_BIT; Modified: brlcad/trunk/src/libged/kill.c =================================================================== --- brlcad/trunk/src/libged/kill.c 2008-08-20 08:01:02 UTC (rev 32493) +++ brlcad/trunk/src/libged/kill.c 2008-08-20 12:22:32 UTC (rev 32494) @@ -48,6 +48,12 @@ gedp->ged_result = GED_RESULT_NULL; gedp->ged_result_flags = 0; + /* invalid command name */ + if (argc < 1) { + bu_vls_printf(&gedp->ged_result_str, "Error: command name not provided"); + return BRLCAD_ERROR; + } + /* must be wanting help */ if (argc == 1) { gedp->ged_result_flags |= GED_RESULT_FLAGS_HELP_BIT; @@ -55,7 +61,7 @@ return BRLCAD_OK; } - if (argc < 2 || MAXARGS < argc) { + if (MAXARGS < argc) { bu_vls_printf(&gedp->ged_result_str, "Usage: %s %s", argv[0], usage); return BRLCAD_ERROR; } Modified: brlcad/trunk/src/libged/killall.c =================================================================== --- brlcad/trunk/src/libged/killall.c 2008-08-20 08:01:02 UTC (rev 32493) +++ brlcad/trunk/src/libged/killall.c 2008-08-20 12:22:32 UTC (rev 32494) @@ -45,6 +45,12 @@ gedp->ged_result = GED_RESULT_NULL; gedp->ged_result_flags = 0; + /* invalid command name */ + if (argc < 1) { + bu_vls_printf(&gedp->ged_result_str, "Error: command name not provided"); + return BRLCAD_ERROR; + } + /* must be wanting help */ if (argc == 1) { gedp->ged_result_flags |= GED_RESULT_FLAGS_HELP_BIT; @@ -52,7 +58,7 @@ return BRLCAD_OK; } - if (argc < 2 || MAXARGS < argc) { + if (MAXARGS < argc) { bu_vls_printf(&gedp->ged_result_str, "Usage: %s %s", argv[0], usage); return BRLCAD_ERROR; } Modified: brlcad/trunk/src/libged/killrefs.c =================================================================== --- brlcad/trunk/src/libged/killrefs.c 2008-08-20 08:01:02 UTC (rev 32493) +++ brlcad/trunk/src/libged/killrefs.c 2008-08-20 12:22:32 UTC (rev 32494) @@ -49,6 +49,12 @@ gedp->ged_result = GED_RESULT_NULL; gedp->ged_result_flags = 0; + /* invalid command name */ + if (argc < 1) { + bu_vls_printf(&gedp->ged_result_str, "Error: command name not provided"); + return BRLCAD_ERROR; + } + /* must be wanting help */ if (argc == 1) { gedp->ged_result_flags |= GED_RESULT_FLAGS_HELP_BIT; @@ -56,7 +62,7 @@ return BRLCAD_OK; } - if (argc < 2 || MAXARGS < argc) { + if (MAXARGS < argc) { bu_vls_printf(&gedp->ged_result_str, "Usage: %s %s", argv[0], usage); return BRLCAD_ERROR; } Modified: brlcad/trunk/src/libged/killtree.c =================================================================== --- brlcad/trunk/src/libged/killtree.c 2008-08-20 08:01:02 UTC (rev 32493) +++ brlcad/trunk/src/libged/killtree.c 2008-08-20 12:22:32 UTC (rev 32494) @@ -59,6 +59,12 @@ gedp->ged_result = GED_RESULT_NULL; gedp->ged_result_flags = 0; + /* invalid command name */ + if (argc < 1) { + bu_vls_printf(&gedp->ged_result_str, "Error: command name not provided"); + return BRLCAD_ERROR; + } + /* must be wanting help */ if (argc == 1) { gedp->ged_result_flags |= GED_RESULT_FLAGS_HELP_BIT; @@ -66,7 +72,7 @@ return BRLCAD_OK; } - if (argc < 2 || MAXARGS < argc) { + if (MAXARGS < argc) { bu_vls_printf(&gedp->ged_result_str, "Usage: %s %s", argv[0], usage); return BRLCAD_ERROR; } Modified: brlcad/trunk/src/libged/list.c =================================================================== --- brlcad/trunk/src/libged/list.c 2008-08-20 08:01:02 UTC (rev 32493) +++ brlcad/trunk/src/libged/list.c 2008-08-20 12:22:32 UTC (rev 32494) @@ -51,6 +51,12 @@ gedp->ged_result = GED_RESULT_NULL; gedp->ged_result_flags = 0; + /* invalid command name */ + if (argc < 1) { + bu_vls_printf(&gedp->ged_result_str, "Error: command name not provided"); + return BRLCAD_ERROR; + } + if (argc < 2 || MAXARGS < argc) { bu_vls_printf(&gedp->ged_result_str, "Usage: %s %s", argv[0], usage); return BRLCAD_ERROR; Modified: brlcad/trunk/src/libged/loadview.c =================================================================== --- brlcad/trunk/src/libged/loadview.c 2008-08-20 08:01:02 UTC (rev 32493) +++ brlcad/trunk/src/libged/loadview.c 2008-08-20 12:22:32 UTC (rev 32494) @@ -119,6 +119,12 @@ gedp->ged_result = GED_RESULT_NULL; gedp->ged_result_flags = 0; + /* invalid command name */ + if (argc < 1) { + bu_vls_printf(&gedp->ged_result_str, "Error: command name not provided"); + return BRLCAD_ERROR; + } + /* must be wanting help */ if (argc == 1) { gedp->ged_result_flags |= GED_RESULT_FLAGS_HELP_BIT; @@ -126,11 +132,6 @@ return BRLCAD_OK; } - if (argc < 2) { - bu_vls_printf(&gedp->ged_result_str, "Usage: %s %s", argv[0], usage); - return BRLCAD_ERROR; - } - /* make sure the file exists */ if (!bu_file_exists(argv[1])) { bu_log("Error: File %s does not exist\n", argv[1]); Modified: brlcad/trunk/src/libged/ls.c =================================================================== --- brlcad/trunk/src/libged/ls.c 2008-08-20 08:01:02 UTC (rev 32493) +++ brlcad/trunk/src/libged/ls.c 2008-08-20 12:22:32 UTC (rev 32494) @@ -67,7 +67,13 @@ gedp->ged_result = GED_RESULT_NULL; gedp->ged_result_flags = 0; - if (argc < 1 || MAXARGS < argc) { + /* invalid command name */ + if (argc < 1) { + bu_vls_printf(&gedp->ged_result_str, "Error: command name not provided"); + return BRLCAD_ERROR; + } + + if (MAXARGS < argc) { bu_vls_printf(&gedp->ged_result_str, "Usage: %s %s", argv[0], usage); return BRLCAD_ERROR; } Modified: brlcad/trunk/src/libged/make_bb.c =================================================================== --- brlcad/trunk/src/libged/make_bb.c 2008-08-20 08:01:02 UTC (rev 32493) +++ brlcad/trunk/src/libged/make_bb.c 2008-08-20 12:22:32 UTC (rev 32494) @@ -52,6 +52,12 @@ gedp->ged_result = GED_RESULT_NULL; gedp->ged_result_flags = 0; + /* invalid command name */ + if (argc < 1) { + bu_vls_printf(&gedp->ged_result_str, "Error: command name not provided"); + return BRLCAD_ERROR; + } + /* must be wanting help */ if (argc == 1) { gedp->ged_result_flags |= GED_RESULT_FLAGS_HELP_BIT; Modified: brlcad/trunk/src/libged/match.c =================================================================== --- brlcad/trunk/src/libged/match.c 2008-08-20 08:01:02 UTC (rev 32493) +++ brlcad/trunk/src/libged/match.c 2008-08-20 12:22:32 UTC (rev 32494) @@ -43,6 +43,12 @@ gedp->ged_result = GED_RESULT_NULL; gedp->ged_result_flags = 0; + /* invalid command name */ + if (argc < 1) { + bu_vls_printf(&gedp->ged_result_str, "Error: command name not provided"); + return BRLCAD_ERROR; + } + /* must be wanting help */ if (argc == 1) { gedp->ged_result_flags |= GED_RESULT_FLAGS_HELP_BIT; @@ -50,7 +56,7 @@ return BRLCAD_OK; } - if (argc < 2 || MAXARGS < argc) { + if (MAXARGS < argc) { bu_vls_printf(&gedp->ged_result_str, "Usage: %s %s", argv[0], usage); return BRLCAD_ERROR; } Modified: brlcad/trunk/src/libged/mirror.c =================================================================== --- brlcad/trunk/src/libged/mirror.c 2008-08-20 08:01:02 UTC (rev 32493) +++ brlcad/trunk/src/libged/mirror.c 2008-08-20 12:22:32 UTC (rev 32494) @@ -51,6 +51,12 @@ gedp->ged_result = GED_RESULT_NULL; gedp->ged_result_flags = 0; + /* invalid command name */ + if (argc < 1) { + bu_vls_printf(&gedp->ged_result_str, "Error: command name not provided"); + return BRLCAD_ERROR; + } + /* must be wanting help */ if (argc == 1) { gedp->ged_result_flags |= GED_RESULT_FLAGS_HELP_BIT; @@ -142,7 +148,7 @@ argc -= bu_optind; - if (argc < 2) { + if (argc == 1) { bu_vls_printf(&gedp->ged_result_str, "Usage: %s %s", argv[0], usage); return BRLCAD_ERROR; } Modified: brlcad/trunk/src/libged/nirt.c =================================================================== --- brlcad/trunk/src/libged/nirt.c 2008-08-20 08:01:02 UTC (rev 32493) +++ brlcad/trunk/src/libged/nirt.c 2008-08-20 12:22:32 UTC (rev 32494) @@ -114,6 +114,12 @@ gedp->ged_result = GED_RESULT_NULL; gedp->ged_result_flags = 0; + /* invalid command name */ + if (argc < 1) { + bu_vls_printf(&gedp->ged_result_str, "Error: command name not provided"); + return BRLCAD_ERROR; + } + vp = &gedp->ged_gdp->gd_rt_cmd[0]; *vp++ = "nirt"; @@ -588,6 +594,12 @@ gedp->ged_result = GED_RESULT_NULL; gedp->ged_result_flags = 0; + /* invalid command name */ + if (argc < 1) { + bu_vls_printf(&gedp->ged_result_str, "Error: command name not provided"); + return BRLCAD_ERROR; + } + if (argc < 3 || MAXARGS < argc) { bu_vls_printf(&gedp->ged_result_str, "Usage: %s %s", argv[0], usage); return BRLCAD_ERROR; Modified: brlcad/trunk/src/libged/nmg_collapse.c =================================================================== --- brlcad/trunk/src/libged/nmg_collapse.c 2008-08-20 08:01:02 UTC (rev 32493) +++ brlcad/trunk/src/libged/nmg_collapse.c 2008-08-20 12:22:32 UTC (rev 32494) @@ -51,6 +51,12 @@ gedp->ged_result = GED_RESULT_NULL; gedp->ged_result_flags = 0; + /* invalid command name */ + if (argc < 1) { + bu_vls_printf(&gedp->ged_result_str, "Error: command name not provided"); + return BRLCAD_ERROR; + } + /* must be wanting help */ if (argc == 1) { gedp->ged_result_flags |= GED_RESULT_FLAGS_HELP_BIT; Modified: brlcad/trunk/src/libged/nmg_simplify.c =================================================================== --- brlcad/trunk/src/libged/nmg_simplify.c 2008-08-20 08:01:02 UTC (rev 32493) +++ brlcad/trunk/src/libged/nmg_simplify.c 2008-08-20 12:22:32 UTC (rev 32494) @@ -60,6 +60,12 @@ gedp->ged_result = GED_RESULT_NULL; gedp->ged_result_flags = 0; + /* invalid command name */ + if (argc < 1) { + bu_vls_printf(&gedp->ged_result_str, "Error: command name not provided"); + return BRLCAD_ERROR; + } + /* must be wanting help */ if (argc == 1) { gedp->ged_result_flags |= GED_RESULT_FLAGS_HELP_BIT; Modified: brlcad/trunk/src/libged/overlay.c =================================================================== --- brlcad/trunk/src/libged/overlay.c 2008-08-20 08:01:02 UTC (rev 32493) +++ brlcad/trunk/src/libged/overlay.c 2008-08-20 12:22:32 UTC (rev 32494) @@ -44,6 +44,12 @@ gedp->ged_result = GED_RESULT_NULL; gedp->ged_result_flags = 0; + /* invalid command name */ + if (argc < 1) { + bu_vls_printf(&gedp->ged_result_str, "Error: command name not provided"); + return BRLCAD_ERROR; + } + /* must be wanting help */ if (argc == 1) { gedp->ged_result_flags |= GED_RESULT_FLAGS_HELP_BIT; Modified: brlcad/trunk/src/libged/pathlist.c =================================================================== --- brlcad/trunk/src/libged/pathlist.c 2008-08-20 08:01:02 UTC (rev 32493) +++ brlcad/trunk/src/libged/pathlist.c 2008-08-20 12:22:32 UTC (rev 32494) @@ -51,6 +51,12 @@ gedp->ged_result = GED_RESULT_NULL; gedp->ged_result_flags = 0; + /* invalid command name */ + if (argc < 1) { + bu_vls_printf(&gedp->ged_result_str, "Error: command name not provided"); + return BRLCAD_ERROR; + } + /* must be wanting help */ if (argc == 1) { gedp->ged_result_flags |= GED_RESULT_FLAGS_HELP_BIT; @@ -58,7 +64,7 @@ return BRLCAD_OK; } - if (argc < 2 || 3 < argc) { + if (3 < argc) { bu_vls_printf(&gedp->ged_result_str, "Usage: %s %s", argv[0], usage); return BRLCAD_ERROR; } Modified: brlcad/trunk/src/libged/pathsum.c =================================================================== --- brlcad/trunk/src/libged/pathsum.c 2008-08-20 08:01:02 UTC (rev 32493) +++ brlcad/trunk/src/libged/pathsum.c 2008-08-20 12:22:32 UTC (rev 32494) @@ -45,6 +45,12 @@ gedp->ged_result = GED_RESULT_NULL; gedp->ged_result_flags = 0; + /* invalid command name */ + if (argc < 1) { + bu_vls_printf(&gedp->ged_result_str, "Error: command name not provided"); + return BRLCAD_ERROR; + } + /* must be wanting help */ if (argc == 1) { gedp->ged_result_flags |= GED_RESULT_FLAGS_HELP_BIT; @@ -52,7 +58,7 @@ return BRLCAD_OK; } - if (argc < 2 || MAXARGS < argc) { + if (MAXARGS < argc) { bu_vls_printf(&gedp->ged_result_str, "Usage: %s %s", argv[0], usage); return BRLCAD_ERROR; } Modified: brlcad/trunk/src/libged/prefix.c =================================================================== --- brlcad/trunk/src/libged/prefix.c 2008-08-20 08:01:02 UTC (rev 32493) +++ brlcad/trunk/src/libged/prefix.c 2008-08-20 12:22:32 UTC (rev 32494) @@ -54,6 +54,12 @@ gedp->ged_result = GED_RESULT_NULL; gedp->ged_result_flags = 0; + /* invalid command name */ + if (argc < 1) { + bu_vls_printf(&gedp->ged_result_str, "Error: command name not provided"); + return BRLCAD_ERROR; + } + /* must be wanting help */ if (argc == 1) { gedp->ged_result_flags |= GED_RESULT_FLAGS_HELP_BIT; Modified: brlcad/trunk/src/libged/push.c =================================================================== --- brlcad/trunk/src/libged/push.c 2008-08-20 08:01:02 UTC (rev 32493) +++ brlcad/trunk/src/libged/push.c 2008-08-20 12:22:32 UTC (rev 32494) @@ -89,6 +89,12 @@ gedp->ged_result = GED_RESULT_NULL; gedp->ged_result_flags = 0; + /* invalid command name */ + if (argc < 1) { + bu_vls_printf(&gedp->ged_result_str, "Error: command name not provided"); + return BRLCAD_ERROR; + } + /* must be wanting help */ if (argc == 1) { gedp->ged_result_flags |= GED_RESULT_FLAGS_HELP_BIT; @@ -96,7 +102,7 @@ return BRLCAD_OK; } - if (argc < 2 || MAXARGS < argc) { + if (MAXARGS < argc) { bu_vls_printf(&gedp->ged_result_str, "Usage: %s %s", argv[0], usage); return BRLCAD_ERROR; } Modified: brlcad/trunk/src/libged/put.c =================================================================== --- brlcad/trunk/src/libged/put.c 2008-08-20 08:01:02 UTC (rev 32493) +++ brlcad/trunk/src/libged/put.c 2008-08-20 12:22:32 UTC (rev 32494) @@ -50,6 +50,12 @@ gedp->ged_result = GED_RESULT_NULL; gedp->ged_result_flags = 0; + /* invalid command name */ + if (argc < 1) { + bu_vls_printf(&gedp->ged_result_str, "Error: command name not provided"); + return BRLCAD_ERROR; + } + /* must be wanting help */ if (argc == 1) { gedp->ged_result_flags |= GED_RESULT_FLAGS_HELP_BIT; Modified: brlcad/trunk/src/libged/regdef.c =================================================================== --- brlcad/trunk/src/libged/regdef.c 2008-08-20 08:01:02 UTC (rev 32493) +++ brlcad/trunk/src/libged/regdef.c 2008-08-20 12:22:32 UTC (rev 32494) @@ -40,6 +40,12 @@ gedp->ged_result = GED_RESULT_NULL; gedp->ged_result_flags = 0; + /* invalid command name */ + if (argc < 1) { + bu_vls_printf(&gedp->ged_result_str, "Error: command name not provided"); + return BRLCAD_ERROR; + } + if (argc < 2 || 5 < argc) { bu_vls_printf(&gedp->ged_result_str, "Usage: %s %s", argv[0], usage); return BRLCAD_ERROR; Modified: brlcad/trunk/src/libged/region.c =================================================================== --- brlcad/trunk/src/libged/region.c 2008-08-20 08:01:02 UTC (rev 32493) +++ brlcad/trunk/src/libged/region.c 2008-08-20 12:22:32 UTC (rev 32494) @@ -49,6 +49,12 @@ gedp->ged_result = GED_RESULT_NULL; gedp->ged_result_flags = 0; + /* invalid command name */ + if (argc < 1) { + bu_vls_printf(&gedp->ged_result_str, "Error: command name not provided"); + return BRLCAD_ERROR; + } + /* must be wanting help */ if (argc == 1) { gedp->ged_result_flags |= GED_RESULT_FLAGS_HELP_BIT; Modified: brlcad/trunk/src/libged/remove.c =================================================================== --- brlcad/trunk/src/libged/remove.c 2008-08-20 08:01:02 UTC (rev 32493) +++ brlcad/trunk/src/libged/remove.c 2008-08-20 12:22:32 UTC (rev 32494) @@ -50,6 +50,12 @@ gedp->ged_result = GED_RESULT_NULL; gedp->ged_result_flags = 0; + /* invalid command name */ + if (argc < 1) { + bu_vls_printf(&gedp->ged_result_str, "Error: command name not provided"); + return BRLCAD_ERROR; + } + /* must be wanting help */ if (argc == 1) { gedp->ged_result_flags |= GED_RESULT_FLAGS_HELP_BIT; Modified: brlcad/trunk/src/libged/report.c =================================================================== --- brlcad/trunk/src/libged/report.c 2008-08-20 08:01:02 UTC (rev 32493) +++ brlcad/trunk/src/libged/report.c 2008-08-20 12:22:32 UTC (rev 32494) @@ -54,13 +54,18 @@ gedp->ged_result = GED_RESULT_NULL; gedp->ged_result_flags = 0; - if (argc < 1 || 2 < argc) { + /* invalid command name */ + if (argc < 1) { + bu_vls_printf(&gedp->ged_result_str, "Error: command name not provided"); + return BRLCAD_ERROR; + } + + if (argc != 2) { bu_vls_printf(&gedp->ged_result_str, "Usage: %s %s", argv[0], usage); return BRLCAD_ERROR; } - if (argc == 2) - lvl = atoi(argv[1]); + lvl = atoi(argv[1]); if (lvl <= 3) ged_print_schain(gedp, lvl); Modified: brlcad/trunk/src/libged/rmap.c =================================================================== --- brlcad/trunk/src/libged/rmap.c 2008-08-20 08:01:02 UTC (rev 32493) +++ brlcad/trunk/src/libged/rmap.c 2008-08-20 12:22:32 UTC (rev 32494) @@ -41,6 +41,12 @@ gedp->ged_result = GED_RESULT_NULL; gedp->ged_result_flags = 0; + /* invalid command name */ + if (argc < 1) { + bu_vls_printf(&gedp->ged_result_str, "Error: command name not provided"); + return BRLCAD_ERROR; + } + /* must be wanting help */ if (argc == 1) { gedp->ged_result_flags |= GED_RESULT_FLAGS_HELP_BIT; @@ -48,7 +54,7 @@ return BRLCAD_OK; } - if (argc < 2 || MAXARGS < argc) { + if (MAXARGS < argc) { bu_vls_printf(&gedp->ged_result_str, "Usage: %s", argv[0]); return BRLCAD_ERROR; } Modified: brlcad/trunk/src/libged/rt.c =================================================================== --- brlcad/trunk/src/libged/rt.c 2008-08-20 08:01:02 UTC (rev 32493) +++ brlcad/trunk/src/libged/rt.c 2008-08-20 12:22:32 UTC (rev 32494) @@ -51,7 +51,13 @@ gedp->ged_result = GED_RESULT_NULL; gedp->ged_result_flags = 0; - if (argc < 1 || MAXARGS < argc) { + /* invalid command name */ + if (argc < 1) { + bu_vls_printf(&gedp->ged_result_str, "Error: command name not provided"); + return BRLCAD_ERROR; + } + + if (MAXARGS < argc) { bu_vls_printf(&gedp->ged_result_str, "Usage: %s %s", argv[0], usage); return BRLCAD_ERROR; } Modified: brlcad/trunk/src/libged/saveview.c =================================================================== --- brlcad/trunk/src/libged/saveview.c 2008-08-20 08:01:02 UTC (rev 32493) +++ brlcad/trunk/src/libged/saveview.c 2008-08-20 12:22:32 UTC (rev 32494) @@ -58,6 +58,12 @@ gedp->ged_result = GED_RESULT_NULL; gedp->ged_result_flags = 0; + /* invalid command name */ + if (argc < 1) { + bu_vls_printf(&gedp->ged_result_str, "Error: command name not provided"); + return BRLCAD_ERROR; + } + /* must be wanting help */ if (argc == 1) { gedp->ged_result_flags |= GED_RESULT_FLAGS_HELP_BIT; @@ -65,11 +71,6 @@ return BRLCAD_OK; } - if (argc < 2) { - bu_vls_printf(&gedp->ged_result_str, "Usage: %s %s", argv[0], usage); - return BRLCAD_ERROR; - } - bu_optind = 1; while ((c = bu_getopt(argc, (char * const *)argv, "e:i:l:o:")) != EOF) { switch (c) { Modified: brlcad/trunk/src/libged/set_output_script.c =================================================================== --- brlcad/trunk/src/libged/set_output_script.c 2008-08-20 08:01:02 UTC (rev 32493) +++ brlcad/trunk/src/libged/set_output_script.c 2008-08-20 12:22:32 UTC (rev 32494) @@ -44,7 +44,13 @@ gedp->ged_result = GED_RESULT_NULL; gedp->ged_result_flags = 0; - if (argc < 1 || 2 < argc) { + /* invalid command name */ + if (argc < 1) { + bu_vls_printf(&gedp->ged_result_str, "Error: command name not provided"); + return BRLCAD_ERROR; + } + + if (2 < argc) { bu_vls_printf(&gedp->ged_result_str, "Usage: %s %s", argv[0], usage); return BRLCAD_ERROR; } Modified: brlcad/trunk/src/libged/set_uplotOutputMode.c =================================================================== --- brlcad/trunk/src/libged/set_uplotOutputMode.c 2008-08-20 08:01:02 UTC (rev 32493) +++ brlcad/trunk/src/libged/set_uplotOutputMode.c 2008-08-20 12:22:32 UTC (rev 32494) @@ -47,8 +47,13 @@ gedp->ged_result = GED_RESULT_NULL; gedp->ged_result_flags = 0; + /* invalid command name */ + if (argc < 1) { + bu_vls_printf(&gedp->ged_result_str, "Error: command name not provided"); + return BRLCAD_ERROR; + } - if (argc < 1 || 2 < argc) { + if (2 < argc) { bu_vls_printf(&gedp->ged_result_str, "Usage: %s %s", argv[0], usage); return BRLCAD_ERROR; } Modified: brlcad/trunk/src/libged/shaded_mode.c =================================================================== --- brlcad/trunk/src/libged/shaded_mode.c 2008-08-20 08:01:02 UTC (rev 32493) +++ brlcad/trunk/src/libged/shaded_mode.c 2008-08-20 12:22:32 UTC (rev 32494) @@ -51,7 +51,13 @@ gedp->ged_result = GED_RESULT_NULL; gedp->ged_result_flags = 0; - if (argc < 1 || 2 < argc) { + /* invalid command name */ + if (argc < 1) { + bu_vls_printf(&gedp->ged_result_str, "Error: command name not provided"); + return BRLCAD_ERROR; + } + + if (2 < argc) { bu_vls_printf(&gedp->ged_result_str, "Usage: %s %s", argv[0], usage); return BRLCAD_ERROR; } Modified: brlcad/trunk/src/libged/summary.c =================================================================== --- brlcad/trunk/src/libged/summary.c 2008-08-20 08:01:02 UTC (rev 32493) +++ brlcad/trunk/src/libged/summary.c 2008-08-20 12:22:32 UTC (rev 32494) @@ -49,12 +49,18 @@ gedp->ged_result = GED_RESULT_NULL; gedp->ged_result_flags = 0; + /* invalid command name */ + if (argc < 1) { + bu_vls_printf(&gedp->ged_result_str, "Error: command name not provided"); + return BRLCAD_ERROR; + } + if (argc == 1) { ged_dir_summary(gedp, 0); return BRLCAD_OK; } - if (argc < 1 || 2 < argc) { + if (2 < argc) { bu_vls_printf(&gedp->ged_result_str, "Usage: %s %s", argv[0], usage); return BRLCAD_ERROR; } Modified: brlcad/trunk/src/libged/tables.c =================================================================== --- brlcad/trunk/src/libged/tables.c 2008-08-20 08:01:02 UTC (rev 32493) +++ brlcad/trunk/src/libged/tables.c 2008-08-20 12:22:32 UTC (rev 32494) @@ -85,6 +85,12 @@ gedp->ged_result = GED_RESULT_NULL; gedp->ged_result_flags = 0; + /* invalid command name */ + if (argc < 1) { + bu_vls_printf(&gedp->ged_result_str, "Error: command name not provided"); + return BRLCAD_ERROR; + } + /* must be wanting help */ if (argc == 1) { gedp->ged_result_flags |= GED_RESULT_FLAGS_HELP_BIT; Modified: brlcad/trunk/src/libged/title.c =================================================================== --- brlcad/trunk/src/libged/title.c 2008-08-20 08:01:02 UTC (rev 32493) +++ brlcad/trunk/src/libged/title.c 2008-08-20 12:22:32 UTC (rev 32494) @@ -45,13 +45,19 @@ gedp->ged_result = GED_RESULT_NULL; gedp->ged_result_flags = 0; + /* invalid command name */ + if (argc < 1) { + bu_vls_printf(&gedp->ged_result_str, "Error: command name not provided"); + return BRLCAD_ERROR; + } + /* get title */ if (argc == 1) { bu_vls_printf(&gedp->ged_result_str, "%s", gedp->ged_wdbp->dbip->dbi_title); return BRLCAD_OK; } - if (argc < 1 || MAXARGS < argc) { + if (MAXARGS < argc) { bu_vls_printf(&gedp->ged_result_str, "Usage: %s %s", argv[0], usage); return BRLCAD_ERROR; } Modified: brlcad/trunk/src/libged/tree.c =================================================================== --- brlcad/trunk/src/libged/tree.c 2008-08-20 08:01:02 UTC (rev 32493) +++ brlcad/trunk/src/libged/tree.c 2008-08-20 12:22:32 UTC (rev 32494) @@ -64,7 +64,13 @@ gedp->ged_result = GED_RESULT_NULL; gedp->ged_result_flags = 0; - if (argc < 1 || MAXARGS < argc) { + /* invalid command name */ + if (argc < 1) { + bu_vls_printf(&gedp->ged_result_str, "Error: command name not provided"); + return BRLCAD_ERROR; + } + + if (MAXARGS < argc) { bu_vls_printf(&gedp->ged_result_str, "Usage: %s %s", argv[0], usage); return BRLCAD_ERROR; } Modified: brlcad/trunk/src/libged/unhide.c =================================================================== --- brlcad/trunk/src/libged/unhide.c 2008-08-20 08:01:02 UTC (rev 32493) +++ brlcad/trunk/src/libged/unhide.c 2008-08-20 12:22:32 UTC (rev 32494) @@ -50,6 +50,12 @@ gedp->ged_result = GED_RESULT_NULL; gedp->ged_result_flags = 0; + /* invalid command name */ + if (argc < 1) { + bu_vls_printf(&gedp->ged_result_str, "Error: command name not provided"); + return BRLCAD_ERROR; + } + /* must be wanting help */ if (argc == 1) { gedp->ged_result_flags |= GED_RESULT_FLAGS_HELP_BIT; @@ -57,11 +63,6 @@ return BRLCAD_OK; } - if (argc < 2) { - bu_vls_printf(&gedp->ged_result_str, "Usage: %s %s", argv[0], usage); - return BRLCAD_ERROR; - } - dbip = gedp->ged_wdbp->dbip; if ( dbip->dbi_version < 5 ) { Modified: brlcad/trunk/src/libged/units.c =================================================================== --- brlcad/trunk/src/libged/units.c 2008-08-20 08:01:02 UTC (rev 32493) +++ brlcad/trunk/src/libged/units.c 2008-08-20 12:22:32 UTC (rev 32494) @@ -46,7 +46,13 @@ gedp->ged_result = GED_RESULT_NULL; gedp->ged_result_flags = 0; - if (argc < 1 || 2 < argc) { + /* invalid command name */ + if (argc < 1) { + bu_vls_printf(&gedp->ged_result_str, "Error: command name not provided"); + return BRLCAD_ERROR; + } + + if (2 < argc) { bu_vls_printf(&gedp->ged_result_str, "Usage: %s %s", argv[0], usage); return BRLCAD_ERROR; } Modified: brlcad/trunk/src/libged/vdraw.c =================================================================== --- brlcad/trunk/src/libged/vdraw.c 2008-08-20 08:01:02 UTC (rev 32493) +++ brlcad/trunk/src/libged/vdraw.c 2008-08-20 12:22:32 UTC (rev 32494) @@ -167,6 +167,12 @@ gedp->ged_result = GED_RESULT_NULL; gedp->ged_result_flags = 0; + /* invalid command name */ + if (argc < 1) { + bu_vls_printf(&gedp->ged_result_str, "Error: command name not provided"); + return BRLCAD_ERROR; + } + /* must be wanting help */ if (argc == 1) { gedp->ged_result_flags |= GED_RESULT_FLAGS_HELP_BIT; @@ -197,6 +203,17 @@ struct bn_vlist *vp, *cp; static const char *usage = "i|next c x y z"; + /* initialize result */ + bu_vls_trunc(&gedp->ged_result_str, 0); + gedp->ged_result = GED_RESULT_NULL; + gedp->ged_result_flags = 0; + + /* invalid command name */ + if (argc < 1) { + bu_vls_printf(&gedp->ged_result_str, "Error: command name not provided"); + return BRLCAD_ERROR; + } + /* must be wanting help */ if (argc == 2) { gedp->ged_result_flags |= GED_RESULT_FLAGS_HELP_BIT; @@ -305,6 +322,17 @@ int uind; static const char *usage = "i c x y z"; + /* initialize result */ + bu_vls_trunc(&gedp->ged_result_str, 0); + gedp->ged_result = GED_RESULT_NULL; + gedp->ged_result_flags = 0; + + /* invalid command name */ + if (argc < 1) { + bu_vls_printf(&gedp->ged_result_str, "Error: command name not provided"); + return BRLCAD_ERROR; + } + /* must be wanting help */ if (argc == 2) { gedp->ged_result_flags |= GED_RESULT_FLAGS_HELP_BIT; @@ -395,6 +423,17 @@ int uind; static const char *usage = "i|last|all"; + /* initialize result */ + bu_vls_trunc(&gedp->ged_result_str, 0); + gedp->ged_result = GED_RESULT_NULL; + gedp->ged_result_flags = 0; + + /* invalid command name */ + if (argc < 1) { + bu_vls_printf(&gedp->ged_result_str, "Error: command name not provided"); + return BRLCAD_ERROR; + } + /* must be wanting help */ if (argc == 2) { gedp->ged_result_flags |= GED_RESULT_FLAGS_HELP_BIT; @@ -493,6 +532,17 @@ int length; static const char *usage = "read i|color|length|name"; + /* initialize result */ + bu_vls_trunc(&gedp->ged_result_str, 0); + gedp->ged_result = GED_RESULT_NULL; + gedp->ged_result_flags = 0; + + /* invalid command name */ + if (argc < 1) { + bu_vls_printf(&gedp->ged_result_str, "Error: command name not provided"); + return BRLCAD_ERROR; + } + /* must be wanting help */ if (argc == 2) { gedp->ged_result_flags |= GED_RESULT_FLAGS_HELP_BIT; @@ -570,6 +620,17 @@ int index; int real_flag; + /* initialize result */ + bu_vls_trunc(&gedp->ged_result_str, 0); + gedp->ged_result = GED_RESULT_NULL; + gedp->ged_result_flags = 0; + + /* invalid command name */ + if (argc < 1) { + bu_vls_printf(&gedp->ged_result_str, "Error: command name not provided"); + return BRLCAD_ERROR; + } + if (!gedp->ged_gdp->gd_currVHead) { bu_vls_printf(&gedp->ged_result_str, "%s %s: no vlist is currently open.", argv[0], argv[1]); return BRLCAD_ERROR; @@ -614,6 +675,17 @@ unsigned long rgb; static const char *usage = "color|name args"; + /* initialize result */ + bu_vls_trunc(&gedp->ged_result_str, 0); + gedp->ged_result = GED_RESULT_NULL; + gedp->ged_result_flags = 0; + + /* invalid command name */ + if (argc < 1) { + bu_vls_printf(&gedp->ged_result_str, "Error: command name not provided"); + return BRLCAD_ERROR; + } + /* must be wanting help */ if (argc == 2) { gedp->ged_result_flags |= GED_RESULT_FLAGS_HELP_BIT; @@ -664,6 +736,17 @@ char temp_name[RT_VDRW_MAXNAME+1]; static const char *usage = "[name]"; + /* initialize result */ + bu_vls_trunc(&gedp->ged_result_str, 0); + gedp->ged_result = GED_RESULT_NULL; + gedp->ged_result_flags = 0; + + /* invalid command name */ + if (argc < 1) { + bu_vls_printf(&gedp->ged_result_str, "Error: command name not provided"); + return BRLCAD_ERROR; + } + if (argc == 2) { if (gedp->ged_gdp->gd_currVHead) { bu_vls_printf(&gedp->ged_result_str, "1"); @@ -728,6 +811,17 @@ struct vd_curve *rcp, *rcp2; static const char *usage = "list\n\tdelete name"; + /* initialize result */ + bu_vls_trunc(&gedp->ged_result_str, 0); + gedp->ged_result = GED_RESULT_NULL; + gedp->ged_result_flags = 0; + + /* invalid command name */ + if (argc < 1) { + bu_vls_printf(&gedp->ged_result_str, "Error: command name not provided"); + return BRLCAD_ERROR; + } + /* must be wanting help */ if (argc == 2) { gedp->ged_result_flags |= GED_RESULT_FLAGS_HELP_BIT; Modified: brlcad/trunk/src/libged/view.c =================================================================== --- brlcad/trunk/src/libged/view.c 2008-08-20 08:01:02 UTC (rev 32493) +++ brlcad/trunk/src/libged/view.c 2008-08-20 12:22:32 UTC (rev 32494) @@ -44,6 +44,12 @@ gedp->ged_result = GED_RESULT_NULL; gedp->ged_result_flags = 0; + /* invalid command name */ + if (argc < 1) { + bu_vls_printf(&gedp->ged_result_str, "Error: command name not provided"); + return BRLCAD_ERROR; + } + /* must be wanting help */ if (argc == 1) { gedp->ged_result_flags |= GED_RESULT_FLAGS_HELP_BIT; @@ -51,7 +57,7 @@ return BRLCAD_OK; } - if (argc < 1 || 6 < argc) { + if (6 < argc) { bu_vls_printf(&gedp->ged_result_str, "Usage: %s %s", argv[0], usage); return BRLCAD_ERROR; } Modified: brlcad/trunk/src/libged/which.c =================================================================== --- brlcad/trunk/src/libged/which.c 2008-08-20 08:01:02 UTC (rev 32493) +++ brlcad/trunk/src/libged/which.c 2008-08-20 12:22:32 UTC (rev 32494) @@ -64,6 +64,12 @@ gedp->ged_result = GED_RESULT_NULL; gedp->ged_result_flags = 0; + /* invalid command name */ + if (argc < 1) { + bu_vls_printf(&gedp->ged_result_str, "Error: command name not provided"); + return BRLCAD_ERROR; + } + if (!strcmp(argv[0], "whichair")) isAir = 1; else Modified: brlcad/trunk/src/libged/who.c =================================================================== --- brlcad/trunk/src/libged/who.c 2008-08-20 08:01:02 UTC (rev 32493) +++ brlcad/trunk/src/libged/who.c 2008-08-20 12:22:32 UTC (rev 32494) @@ -49,7 +49,13 @@ gedp->ged_result = GED_RESULT_NULL; gedp->ged_result_flags = 0; - if (argc < 1 || 2 < argc) { + /* invalid command name */ + if (argc < 1) { + bu_vls_printf(&gedp->ged_result_str, "Error: command name not provided"); + return BRLCAD_ERROR; + } + + if (2 < argc) { bu_vls_printf(&gedp->ged_result_str, "Usage: %s %s", argv[0], usage); return BRLCAD_ERROR; } Modified: brlcad/trunk/src/libged/wmater.c =================================================================== --- brlcad/trunk/src/libged/wmater.c 2008-08-20 08:01:02 UTC (rev 32493) +++ brlcad/trunk/src/libged/wmater.c 2008-08-20 12:22:32 UTC (rev 32494) @@ -46,6 +46,12 @@ gedp->ged_result = GED_RESULT_NULL; gedp->ged_result_flags = 0; + /* invalid command name */ + if (argc < 1) { + bu_vls_printf(&gedp->ged_result_str, "Error: command name not provided"); + return BRLCAD_ERROR; + } + /* must be wanting help */ if (argc == 1) { gedp->ged_result_flags |= GED_RESULT_FLAGS_HELP_BIT; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <br...@us...> - 2008-08-22 04:31:00
|
Revision: 32504 http://brlcad.svn.sourceforge.net/brlcad/?rev=32504&view=rev Author: brlcad Date: 2008-08-22 04:30:51 +0000 (Fri, 22 Aug 2008) Log Message: ----------- use the new GED_CHECK_ARGC_GT_0 macro throughout to elimiate the 'invalid command name' block. really belongs in a wrapper, but good enough until there are command categories. Modified Paths: -------------- brlcad/trunk/src/libged/adjust.c brlcad/trunk/src/libged/ae2dir.c brlcad/trunk/src/libged/aet.c brlcad/trunk/src/libged/arced.c brlcad/trunk/src/libged/arot.c brlcad/trunk/src/libged/attr.c brlcad/trunk/src/libged/autoview.c brlcad/trunk/src/libged/bigE.c brlcad/trunk/src/libged/binary.c brlcad/trunk/src/libged/blast.c brlcad/trunk/src/libged/bot_decimate.c brlcad/trunk/src/libged/bot_face_sort.c brlcad/trunk/src/libged/bot_smooth.c brlcad/trunk/src/libged/cat.c brlcad/trunk/src/libged/center.c brlcad/trunk/src/libged/color.c brlcad/trunk/src/libged/comb.c brlcad/trunk/src/libged/comb_color.c brlcad/trunk/src/libged/comb_std.c brlcad/trunk/src/libged/concat.c brlcad/trunk/src/libged/copy.c brlcad/trunk/src/libged/copyeval.c brlcad/trunk/src/libged/dbip.c brlcad/trunk/src/libged/dir2ae.c brlcad/trunk/src/libged/draw.c brlcad/trunk/src/libged/dump.c brlcad/trunk/src/libged/dup.c brlcad/trunk/src/libged/edcodes.c brlcad/trunk/src/libged/edcomb.c brlcad/trunk/src/libged/edmater.c brlcad/trunk/src/libged/erase.c brlcad/trunk/src/libged/erase_all.c brlcad/trunk/src/libged/expand.c brlcad/trunk/src/libged/eye.c brlcad/trunk/src/libged/eye_pos.c brlcad/trunk/src/libged/facetize.c brlcad/trunk/src/libged/find.c brlcad/trunk/src/libged/form.c brlcad/trunk/src/libged/fracture.c brlcad/trunk/src/libged/get.c brlcad/trunk/src/libged/get_autoview.c brlcad/trunk/src/libged/get_eyemodel.c brlcad/trunk/src/libged/get_type.c brlcad/trunk/src/libged/group.c brlcad/trunk/src/libged/hide.c brlcad/trunk/src/libged/how.c brlcad/trunk/src/libged/illum.c brlcad/trunk/src/libged/importFg4Section.c brlcad/trunk/src/libged/instance.c brlcad/trunk/src/libged/isize.c brlcad/trunk/src/libged/item.c brlcad/trunk/src/libged/keep.c brlcad/trunk/src/libged/keypoint.c brlcad/trunk/src/libged/kill.c brlcad/trunk/src/libged/killall.c brlcad/trunk/src/libged/killrefs.c brlcad/trunk/src/libged/killtree.c brlcad/trunk/src/libged/label.c brlcad/trunk/src/libged/list.c brlcad/trunk/src/libged/loadview.c brlcad/trunk/src/libged/log.c brlcad/trunk/src/libged/lookat.c brlcad/trunk/src/libged/ls.c brlcad/trunk/src/libged/lt.c brlcad/trunk/src/libged/m2v_point.c brlcad/trunk/src/libged/make.c brlcad/trunk/src/libged/make_bb.c brlcad/trunk/src/libged/make_name.c brlcad/trunk/src/libged/match.c brlcad/trunk/src/libged/mater.c brlcad/trunk/src/libged/mirror.c brlcad/trunk/src/libged/model2view.c brlcad/trunk/src/libged/move.c brlcad/trunk/src/libged/move_all.c brlcad/trunk/src/libged/move_arb_edge.c brlcad/trunk/src/libged/move_arb_face.c brlcad/trunk/src/libged/mrot.c brlcad/trunk/src/libged/nirt.c brlcad/trunk/src/libged/nmg_collapse.c brlcad/trunk/src/libged/nmg_simplify.c brlcad/trunk/src/libged/ocenter.c brlcad/trunk/src/libged/open.c brlcad/trunk/src/libged/orient.c brlcad/trunk/src/libged/orotate.c brlcad/trunk/src/libged/oscale.c brlcad/trunk/src/libged/otranslate.c brlcad/trunk/src/libged/overlay.c brlcad/trunk/src/libged/pathlist.c brlcad/trunk/src/libged/pathsum.c brlcad/trunk/src/libged/perspective.c brlcad/trunk/src/libged/pmat.c brlcad/trunk/src/libged/pmodel2view.c brlcad/trunk/src/libged/pov.c brlcad/trunk/src/libged/prcolor.c brlcad/trunk/src/libged/prefix.c brlcad/trunk/src/libged/push.c brlcad/trunk/src/libged/put.c brlcad/trunk/src/libged/qray.c brlcad/trunk/src/libged/quat.c brlcad/trunk/src/libged/rcodes.c brlcad/trunk/src/libged/regdef.c brlcad/trunk/src/libged/region.c brlcad/trunk/src/libged/remove.c brlcad/trunk/src/libged/report.c brlcad/trunk/src/libged/rmap.c brlcad/trunk/src/libged/rmat.c brlcad/trunk/src/libged/rmater.c brlcad/trunk/src/libged/rot.c brlcad/trunk/src/libged/rot_point.c brlcad/trunk/src/libged/rotate_about.c brlcad/trunk/src/libged/rotate_arb_face.c brlcad/trunk/src/libged/rt.c brlcad/trunk/src/libged/rtabort.c brlcad/trunk/src/libged/rtcheck.c brlcad/trunk/src/libged/saveview.c brlcad/trunk/src/libged/scale.c brlcad/trunk/src/libged/set_output_script.c brlcad/trunk/src/libged/set_transparency.c brlcad/trunk/src/libged/set_uplotOutputMode.c brlcad/trunk/src/libged/setview.c brlcad/trunk/src/libged/shaded_mode.c brlcad/trunk/src/libged/shader.c brlcad/trunk/src/libged/shells.c brlcad/trunk/src/libged/showmats.c brlcad/trunk/src/libged/size.c brlcad/trunk/src/libged/slew.c brlcad/trunk/src/libged/solids_on_ray.c brlcad/trunk/src/libged/summary.c brlcad/trunk/src/libged/tables.c brlcad/trunk/src/libged/title.c brlcad/trunk/src/libged/tol.c brlcad/trunk/src/libged/tops.c brlcad/trunk/src/libged/tra.c brlcad/trunk/src/libged/track.c brlcad/trunk/src/libged/tree.c brlcad/trunk/src/libged/unhide.c brlcad/trunk/src/libged/units.c brlcad/trunk/src/libged/v2m_point.c brlcad/trunk/src/libged/vdraw.c brlcad/trunk/src/libged/version.c brlcad/trunk/src/libged/view.c brlcad/trunk/src/libged/view2model.c brlcad/trunk/src/libged/viewdir.c brlcad/trunk/src/libged/vrot.c brlcad/trunk/src/libged/wcodes.c brlcad/trunk/src/libged/whatid.c brlcad/trunk/src/libged/which.c brlcad/trunk/src/libged/which_shader.c brlcad/trunk/src/libged/who.c brlcad/trunk/src/libged/wmater.c brlcad/trunk/src/libged/xpush.c brlcad/trunk/src/libged/ypr.c brlcad/trunk/src/libged/zap.c brlcad/trunk/src/libged/zoom.c Modified: brlcad/trunk/src/libged/adjust.c =================================================================== --- brlcad/trunk/src/libged/adjust.c 2008-08-22 04:30:32 UTC (rev 32503) +++ brlcad/trunk/src/libged/adjust.c 2008-08-22 04:30:51 UTC (rev 32504) @@ -43,18 +43,13 @@ GED_CHECK_DATABASE_OPEN(gedp, BRLCAD_ERROR); GED_CHECK_READ_ONLY(gedp, BRLCAD_ERROR); + GED_CHECK_ARGC_GT_0(gedp, argc, BRLCAD_ERROR); /* initialize result */ bu_vls_trunc(&gedp->ged_result_str, 0); gedp->ged_result = GED_RESULT_NULL; gedp->ged_result_flags = 0; - /* invalid command name */ - if (argc < 1) { - bu_vls_printf(&gedp->ged_result_str, "Error: command name not provided"); - return BRLCAD_ERROR; - } - /* must be wanting help */ if (argc == 1) { gedp->ged_result_flags |= GED_RESULT_FLAGS_HELP_BIT; Modified: brlcad/trunk/src/libged/ae2dir.c =================================================================== --- brlcad/trunk/src/libged/ae2dir.c 2008-08-22 04:30:32 UTC (rev 32503) +++ brlcad/trunk/src/libged/ae2dir.c 2008-08-22 04:30:51 UTC (rev 32504) @@ -40,6 +40,7 @@ static const char *usage = "[-i] az el"; GED_CHECK_DATABASE_OPEN(gedp, BRLCAD_ERROR); + GED_CHECK_ARGC_GT_0(gedp, argc, BRLCAD_ERROR); /* initialize result */ bu_vls_trunc(&gedp->ged_result_str, 0); Modified: brlcad/trunk/src/libged/aet.c =================================================================== --- brlcad/trunk/src/libged/aet.c 2008-08-22 04:30:32 UTC (rev 32503) +++ brlcad/trunk/src/libged/aet.c 2008-08-22 04:30:51 UTC (rev 32504) @@ -41,6 +41,7 @@ GED_CHECK_DATABASE_OPEN(gedp, BRLCAD_ERROR); GED_CHECK_VIEW(gedp, BRLCAD_ERROR); + GED_CHECK_ARGC_GT_0(gedp, argc, BRLCAD_ERROR); /* initialize result */ bu_vls_trunc(&gedp->ged_result_str, 0); Modified: brlcad/trunk/src/libged/arced.c =================================================================== --- brlcad/trunk/src/libged/arced.c 2008-08-22 04:30:32 UTC (rev 32503) +++ brlcad/trunk/src/libged/arced.c 2008-08-22 04:30:51 UTC (rev 32504) @@ -43,18 +43,13 @@ GED_CHECK_DATABASE_OPEN(gedp, BRLCAD_ERROR); GED_CHECK_READ_ONLY(gedp, BRLCAD_ERROR); + GED_CHECK_ARGC_GT_0(gedp, argc, BRLCAD_ERROR); /* initialize result */ bu_vls_trunc(&gedp->ged_result_str, 0); gedp->ged_result = GED_RESULT_NULL; gedp->ged_result_flags = 0; - /* invalid command name */ - if (argc < 1) { - bu_vls_printf(&gedp->ged_result_str, "Error: command name not provided"); - return BRLCAD_ERROR; - } - /* must be wanting help */ if (argc == 1) { gedp->ged_result_flags |= GED_RESULT_FLAGS_HELP_BIT; Modified: brlcad/trunk/src/libged/arot.c =================================================================== --- brlcad/trunk/src/libged/arot.c 2008-08-22 04:30:32 UTC (rev 32503) +++ brlcad/trunk/src/libged/arot.c 2008-08-22 04:30:51 UTC (rev 32504) @@ -42,6 +42,7 @@ GED_CHECK_DATABASE_OPEN(gedp, BRLCAD_ERROR); GED_CHECK_VIEW(gedp, BRLCAD_ERROR); + GED_CHECK_ARGC_GT_0(gedp, argc, BRLCAD_ERROR); /* initialize result */ bu_vls_trunc(&gedp->ged_result_str, 0); Modified: brlcad/trunk/src/libged/attr.c =================================================================== --- brlcad/trunk/src/libged/attr.c 2008-08-22 04:30:32 UTC (rev 32503) +++ brlcad/trunk/src/libged/attr.c 2008-08-22 04:30:51 UTC (rev 32504) @@ -38,18 +38,13 @@ GED_CHECK_DATABASE_OPEN(gedp, BRLCAD_ERROR); GED_CHECK_READ_ONLY(gedp, BRLCAD_ERROR); + GED_CHECK_ARGC_GT_0(gedp, argc, BRLCAD_ERROR); /* initialize result */ bu_vls_trunc(&gedp->ged_result_str, 0); gedp->ged_result = GED_RESULT_NULL; gedp->ged_result_flags = 0; - /* invalid command name */ - if (argc < 1) { - bu_vls_printf(&gedp->ged_result_str, "Error: command name not provided"); - return BRLCAD_ERROR; - } - /* must be wanting help */ if (argc == 1) { gedp->ged_result_flags |= GED_RESULT_FLAGS_HELP_BIT; Modified: brlcad/trunk/src/libged/autoview.c =================================================================== --- brlcad/trunk/src/libged/autoview.c 2008-08-22 04:30:32 UTC (rev 32503) +++ brlcad/trunk/src/libged/autoview.c 2008-08-22 04:30:51 UTC (rev 32504) @@ -44,15 +44,15 @@ vect_t small; GED_CHECK_DATABASE_OPEN(gedp, BRLCAD_ERROR); + GED_CHECK_DRAWABLE(gedp, BRLCAD_ERROR); + GED_CHECK_VIEW(gedp, BRLCAD_ERROR); + GED_CHECK_ARGC_GT_0(gedp, argc, BRLCAD_ERROR); /* initialize result */ bu_vls_trunc(&gedp->ged_result_str, 0); gedp->ged_result = GED_RESULT_NULL; gedp->ged_result_flags = 0; - GED_CHECK_DRAWABLE(gedp, BRLCAD_ERROR); - GED_CHECK_VIEW(gedp, BRLCAD_ERROR); - if (argc != 1) { bu_vls_printf(&gedp->ged_result_str, "Usage: %s", argv[0]); return BRLCAD_ERROR; Modified: brlcad/trunk/src/libged/bigE.c =================================================================== --- brlcad/trunk/src/libged/bigE.c 2008-08-22 04:30:32 UTC (rev 32503) +++ brlcad/trunk/src/libged/bigE.c 2008-08-22 04:30:51 UTC (rev 32504) @@ -2221,6 +2221,7 @@ GED_CHECK_DATABASE_OPEN(gedp, BRLCAD_ERROR); GED_CHECK_DRAWABLE(gedp, BRLCAD_ERROR); + GED_CHECK_ARGC_GT_0(gedp, argc, BRLCAD_ERROR); /* must be wanting help */ if (argc == 1) { Modified: brlcad/trunk/src/libged/binary.c =================================================================== --- brlcad/trunk/src/libged/binary.c 2008-08-22 04:30:32 UTC (rev 32503) +++ brlcad/trunk/src/libged/binary.c 2008-08-22 04:30:51 UTC (rev 32504) @@ -49,6 +49,7 @@ GED_CHECK_DATABASE_OPEN(gedp, BRLCAD_ERROR); GED_CHECK_READ_ONLY(gedp, BRLCAD_ERROR); + GED_CHECK_ARGC_GT_0(gedp, argc, BRLCAD_ERROR); /* initialize result */ bu_vls_trunc(&gedp->ged_result_str, 0); Modified: brlcad/trunk/src/libged/blast.c =================================================================== --- brlcad/trunk/src/libged/blast.c 2008-08-22 04:30:32 UTC (rev 32503) +++ brlcad/trunk/src/libged/blast.c 2008-08-22 04:30:51 UTC (rev 32504) @@ -41,6 +41,7 @@ GED_CHECK_DATABASE_OPEN(gedp, BRLCAD_ERROR); GED_CHECK_DRAWABLE(gedp, BRLCAD_ERROR); + GED_CHECK_ARGC_GT_0(gedp, argc, BRLCAD_ERROR); /* initialize result */ bu_vls_trunc(&gedp->ged_result_str, 0); Modified: brlcad/trunk/src/libged/bot_decimate.c =================================================================== --- brlcad/trunk/src/libged/bot_decimate.c 2008-08-22 04:30:32 UTC (rev 32503) +++ brlcad/trunk/src/libged/bot_decimate.c 2008-08-22 04:30:51 UTC (rev 32504) @@ -48,18 +48,13 @@ GED_CHECK_DATABASE_OPEN(gedp, BRLCAD_ERROR); GED_CHECK_READ_ONLY(gedp, BRLCAD_ERROR); + GED_CHECK_ARGC_GT_0(gedp, argc, BRLCAD_ERROR); /* initialize result */ bu_vls_trunc(&gedp->ged_result_str, 0); gedp->ged_result = GED_RESULT_NULL; gedp->ged_result_flags = 0; - /* invalid command name */ - if (argc < 1) { - bu_vls_printf(&gedp->ged_result_str, "Error: command name not provided"); - return BRLCAD_ERROR; - } - /* must be wanting help */ if (argc == 1) { gedp->ged_result_flags |= GED_RESULT_FLAGS_HELP_BIT; Modified: brlcad/trunk/src/libged/bot_face_sort.c =================================================================== --- brlcad/trunk/src/libged/bot_face_sort.c 2008-08-22 04:30:32 UTC (rev 32503) +++ brlcad/trunk/src/libged/bot_face_sort.c 2008-08-22 04:30:51 UTC (rev 32504) @@ -43,18 +43,13 @@ GED_CHECK_DATABASE_OPEN(gedp, BRLCAD_ERROR); GED_CHECK_READ_ONLY(gedp, BRLCAD_ERROR); + GED_CHECK_ARGC_GT_0(gedp, argc, BRLCAD_ERROR); /* initialize result */ bu_vls_trunc(&gedp->ged_result_str, 0); gedp->ged_result = GED_RESULT_NULL; gedp->ged_result_flags = 0; - /* invalid command name */ - if (argc < 1) { - bu_vls_printf(&gedp->ged_result_str, "Error: command name not provided"); - return BRLCAD_ERROR; - } - /* must be wanting help */ if (argc == 1) { gedp->ged_result_flags |= GED_RESULT_FLAGS_HELP_BIT; Modified: brlcad/trunk/src/libged/bot_smooth.c =================================================================== --- brlcad/trunk/src/libged/bot_smooth.c 2008-08-22 04:30:32 UTC (rev 32503) +++ brlcad/trunk/src/libged/bot_smooth.c 2008-08-22 04:30:51 UTC (rev 32504) @@ -47,18 +47,13 @@ GED_CHECK_DATABASE_OPEN(gedp, BRLCAD_ERROR); GED_CHECK_READ_ONLY(gedp, BRLCAD_ERROR); + GED_CHECK_ARGC_GT_0(gedp, argc, BRLCAD_ERROR); /* initialize result */ bu_vls_trunc(&gedp->ged_result_str, 0); gedp->ged_result = GED_RESULT_NULL; gedp->ged_result_flags = 0; - /* invalid command name */ - if (argc < 1) { - bu_vls_printf(&gedp->ged_result_str, "Error: command name not provided"); - return BRLCAD_ERROR; - } - /* must be wanting help */ if (argc == 1) { gedp->ged_result_flags |= GED_RESULT_FLAGS_HELP_BIT; Modified: brlcad/trunk/src/libged/cat.c =================================================================== --- brlcad/trunk/src/libged/cat.c 2008-08-22 04:30:32 UTC (rev 32503) +++ brlcad/trunk/src/libged/cat.c 2008-08-22 04:30:51 UTC (rev 32504) @@ -39,18 +39,13 @@ static const char *usage = "<objects>"; GED_CHECK_DATABASE_OPEN(gedp, BRLCAD_ERROR); + GED_CHECK_ARGC_GT_0(gedp, argc, BRLCAD_ERROR); /* initialize result */ bu_vls_trunc(&gedp->ged_result_str, 0); gedp->ged_result = GED_RESULT_NULL; gedp->ged_result_flags = 0; - /* invalid command name */ - if (argc < 1) { - bu_vls_printf(&gedp->ged_result_str, "Error: command name not provided"); - return BRLCAD_ERROR; - } - /* must be wanting help */ if (argc == 1) { gedp->ged_result_flags |= GED_RESULT_FLAGS_HELP_BIT; Modified: brlcad/trunk/src/libged/center.c =================================================================== --- brlcad/trunk/src/libged/center.c 2008-08-22 04:30:32 UTC (rev 32503) +++ brlcad/trunk/src/libged/center.c 2008-08-22 04:30:51 UTC (rev 32504) @@ -40,6 +40,7 @@ GED_CHECK_DATABASE_OPEN(gedp, BRLCAD_ERROR); GED_CHECK_VIEW(gedp, BRLCAD_ERROR); + GED_CHECK_ARGC_GT_0(gedp, argc, BRLCAD_ERROR); /* initialize result */ bu_vls_trunc(&gedp->ged_result_str, 0); Modified: brlcad/trunk/src/libged/color.c =================================================================== --- brlcad/trunk/src/libged/color.c 2008-08-22 04:30:32 UTC (rev 32503) +++ brlcad/trunk/src/libged/color.c 2008-08-22 04:30:51 UTC (rev 32504) @@ -51,6 +51,7 @@ GED_CHECK_DATABASE_OPEN(gedp, BRLCAD_ERROR); GED_CHECK_READ_ONLY(gedp, BRLCAD_ERROR); + GED_CHECK_ARGC_GT_0(gedp, argc, BRLCAD_ERROR); /* initialize result */ bu_vls_trunc(&gedp->ged_result_str, 0); Modified: brlcad/trunk/src/libged/comb.c =================================================================== --- brlcad/trunk/src/libged/comb.c 2008-08-22 04:30:32 UTC (rev 32503) +++ brlcad/trunk/src/libged/comb.c 2008-08-22 04:30:51 UTC (rev 32504) @@ -41,13 +41,8 @@ GED_CHECK_DATABASE_OPEN(gedp, BRLCAD_ERROR); GED_CHECK_READ_ONLY(gedp, BRLCAD_ERROR); + GED_CHECK_ARGC_GT_0(gedp, argc, BRLCAD_ERROR); - /* invalid command name */ - if (argc < 1) { - bu_vls_printf(&gedp->ged_result_str, "Error: command name not provided"); - return BRLCAD_ERROR; - } - /* initialize result */ bu_vls_trunc(&gedp->ged_result_str, 0); gedp->ged_result = GED_RESULT_NULL; Modified: brlcad/trunk/src/libged/comb_color.c =================================================================== --- brlcad/trunk/src/libged/comb_color.c 2008-08-22 04:30:32 UTC (rev 32503) +++ brlcad/trunk/src/libged/comb_color.c 2008-08-22 04:30:51 UTC (rev 32504) @@ -38,6 +38,7 @@ GED_CHECK_DATABASE_OPEN(gedp, BRLCAD_ERROR); GED_CHECK_READ_ONLY(gedp, BRLCAD_ERROR); + GED_CHECK_ARGC_GT_0(gedp, argc, BRLCAD_ERROR); /* initialize result */ bu_vls_trunc(&gedp->ged_result_str, 0); Modified: brlcad/trunk/src/libged/comb_std.c =================================================================== --- brlcad/trunk/src/libged/comb_std.c 2008-08-22 04:30:32 UTC (rev 32503) +++ brlcad/trunk/src/libged/comb_std.c 2008-08-22 04:30:51 UTC (rev 32504) @@ -444,18 +444,13 @@ GED_CHECK_DATABASE_OPEN(gedp, BRLCAD_ERROR); GED_CHECK_READ_ONLY(gedp, BRLCAD_ERROR); + GED_CHECK_ARGC_GT_0(gedp, argc, BRLCAD_ERROR); /* initialize result */ bu_vls_trunc(&gedp->ged_result_str, 0); gedp->ged_result = GED_RESULT_NULL; gedp->ged_result_flags = 0; - /* invalid command name */ - if (argc < 1) { - bu_vls_printf(&gedp->ged_result_str, "Error: command name not provided"); - return BRLCAD_ERROR; - } - if (argc < 3 || RT_MAXARGS < argc) { bu_vls_printf(&gedp->ged_result_str, "Usage: %s %s", argv[0], usage); return BRLCAD_ERROR; Modified: brlcad/trunk/src/libged/concat.c =================================================================== --- brlcad/trunk/src/libged/concat.c 2008-08-22 04:30:32 UTC (rev 32503) +++ brlcad/trunk/src/libged/concat.c 2008-08-22 04:30:51 UTC (rev 32504) @@ -75,18 +75,13 @@ GED_CHECK_DATABASE_OPEN(gedp, BRLCAD_ERROR); GED_CHECK_READ_ONLY(gedp, BRLCAD_ERROR); + GED_CHECK_ARGC_GT_0(gedp, argc, BRLCAD_ERROR); /* initialize result */ bu_vls_trunc(&gedp->ged_result_str, 0); gedp->ged_result = GED_RESULT_NULL; gedp->ged_result_flags = 0; - /* invalid command name */ - if (argc < 1) { - bu_vls_printf(&gedp->ged_result_str, "Error: command name not provided"); - return BRLCAD_ERROR; - } - /* must be wanting help */ if (argc == 1) { gedp->ged_result_flags |= GED_RESULT_FLAGS_HELP_BIT; Modified: brlcad/trunk/src/libged/copy.c =================================================================== --- brlcad/trunk/src/libged/copy.c 2008-08-22 04:30:32 UTC (rev 32503) +++ brlcad/trunk/src/libged/copy.c 2008-08-22 04:30:51 UTC (rev 32504) @@ -41,6 +41,7 @@ GED_CHECK_DATABASE_OPEN(gedp, BRLCAD_ERROR); GED_CHECK_READ_ONLY(gedp, BRLCAD_ERROR); + GED_CHECK_ARGC_GT_0(gedp, argc, BRLCAD_ERROR); /* initialize result */ bu_vls_trunc(&gedp->ged_result_str, 0); Modified: brlcad/trunk/src/libged/copyeval.c =================================================================== --- brlcad/trunk/src/libged/copyeval.c 2008-08-22 04:30:32 UTC (rev 32503) +++ brlcad/trunk/src/libged/copyeval.c 2008-08-22 04:30:51 UTC (rev 32504) @@ -45,18 +45,13 @@ GED_CHECK_DATABASE_OPEN(gedp, BRLCAD_ERROR); GED_CHECK_READ_ONLY(gedp, BRLCAD_ERROR); + GED_CHECK_ARGC_GT_0(gedp, argc, BRLCAD_ERROR); /* initialize result */ bu_vls_trunc(&gedp->ged_result_str, 0); gedp->ged_result = GED_RESULT_NULL; gedp->ged_result_flags = 0; - /* invalid command name */ - if (argc < 1) { - bu_vls_printf(&gedp->ged_result_str, "Error: command name not provided"); - return BRLCAD_ERROR; - } - /* must be wanting help */ if (argc == 1) { gedp->ged_result_flags |= GED_RESULT_FLAGS_HELP_BIT; Modified: brlcad/trunk/src/libged/dbip.c =================================================================== --- brlcad/trunk/src/libged/dbip.c 2008-08-22 04:30:32 UTC (rev 32503) +++ brlcad/trunk/src/libged/dbip.c 2008-08-22 04:30:51 UTC (rev 32504) @@ -35,6 +35,7 @@ ged_dbip(struct ged *gedp, int argc, const char *argv[]) { GED_CHECK_DATABASE_OPEN(gedp, BRLCAD_ERROR); + GED_CHECK_ARGC_GT_0(gedp, argc, BRLCAD_ERROR); /* initialize result */ bu_vls_trunc(&gedp->ged_result_str, 0); @@ -49,7 +50,17 @@ #if defined(_WIN32) && !defined(__CYGWIN__) bu_vls_printf(&gedp->ged_result_str, "%llu", (_int64)gedp->ged_wdbp->dbip); #else - bu_vls_printf(&gedp->ged_result_str, "%llu", (unsigned long long)gedp->ged_wdbp->dbip); + switch (sizeof(gedp->ged_wdbp->dbip)) { + case sizeof(long long unsigned): + bu_vls_printf(&gedp->ged_result_str, "%llu", gedp->ged_wdbp->dbip); + break; + case sizeof(long unsigned): + bu_vls_printf(&gedp->ged_result_str, "%lu", gedp->ged_wdbp->dbip); + break; + default: + bu_vls_printf(&gedp->ged_result_str, "%u", gedp->ged_wdbp->dbip); + break; + } #endif return BRLCAD_OK; Modified: brlcad/trunk/src/libged/dir2ae.c =================================================================== --- brlcad/trunk/src/libged/dir2ae.c 2008-08-22 04:30:32 UTC (rev 32503) +++ brlcad/trunk/src/libged/dir2ae.c 2008-08-22 04:30:51 UTC (rev 32504) @@ -40,6 +40,7 @@ static const char *usage = "[-i] x y z"; GED_CHECK_DATABASE_OPEN(gedp, BRLCAD_ERROR); + GED_CHECK_ARGC_GT_0(gedp, argc, BRLCAD_ERROR); /* initialize result */ bu_vls_trunc(&gedp->ged_result_str, 0); Modified: brlcad/trunk/src/libged/draw.c =================================================================== --- brlcad/trunk/src/libged/draw.c 2008-08-22 04:30:32 UTC (rev 32503) +++ brlcad/trunk/src/libged/draw.c 2008-08-22 04:30:51 UTC (rev 32504) @@ -1068,6 +1068,7 @@ GED_CHECK_DATABASE_OPEN(gedp, BRLCAD_ERROR); GED_CHECK_DRAWABLE(gedp, BRLCAD_ERROR); + GED_CHECK_ARGC_GT_0(gedp, argc, BRLCAD_ERROR); /* initialize result */ bu_vls_trunc(&gedp->ged_result_str, 0); Modified: brlcad/trunk/src/libged/dump.c =================================================================== --- brlcad/trunk/src/libged/dump.c 2008-08-22 04:30:32 UTC (rev 32503) +++ brlcad/trunk/src/libged/dump.c 2008-08-22 04:30:51 UTC (rev 32504) @@ -39,6 +39,7 @@ static const char *usage = "file.g"; GED_CHECK_DATABASE_OPEN(gedp, BRLCAD_ERROR); + GED_CHECK_ARGC_GT_0(gedp, argc, BRLCAD_ERROR); /* initialize result */ bu_vls_trunc(&gedp->ged_result_str, 0); Modified: brlcad/trunk/src/libged/dup.c =================================================================== --- brlcad/trunk/src/libged/dup.c 2008-08-22 04:30:32 UTC (rev 32503) +++ brlcad/trunk/src/libged/dup.c 2008-08-22 04:30:51 UTC (rev 32504) @@ -61,18 +61,13 @@ static const char *usage = "file.g prefix"; GED_CHECK_DATABASE_OPEN(gedp, BRLCAD_ERROR); + GED_CHECK_ARGC_GT_0(gedp, argc, BRLCAD_ERROR); /* initialize result */ bu_vls_trunc(&gedp->ged_result_str, 0); gedp->ged_result = GED_RESULT_NULL; gedp->ged_result_flags = 0; - /* invalid command name */ - if (argc < 1) { - bu_vls_printf(&gedp->ged_result_str, "Error: command name not provided"); - return BRLCAD_ERROR; - } - /* must be wanting help */ if (argc == 1) { gedp->ged_result_flags |= GED_RESULT_FLAGS_HELP_BIT; @@ -80,7 +75,7 @@ return BRLCAD_OK; } - if (3 < argc) { + if (argc > 3) { bu_vls_printf(&gedp->ged_result_str, "Usage: %s %s", argv[0], usage); return BRLCAD_ERROR; } Modified: brlcad/trunk/src/libged/edcodes.c =================================================================== --- brlcad/trunk/src/libged/edcodes.c 2008-08-22 04:30:32 UTC (rev 32503) +++ brlcad/trunk/src/libged/edcodes.c 2008-08-22 04:30:51 UTC (rev 32504) @@ -55,6 +55,7 @@ GED_CHECK_DATABASE_OPEN(gedp, BRLCAD_ERROR); GED_CHECK_READ_ONLY(gedp, BRLCAD_ERROR); + GED_CHECK_ARGC_GT_0(gedp, argc, BRLCAD_ERROR); /* initialize result */ bu_vls_trunc(&gedp->ged_result_str, 0); Modified: brlcad/trunk/src/libged/edcomb.c =================================================================== --- brlcad/trunk/src/libged/edcomb.c 2008-08-22 04:30:32 UTC (rev 32503) +++ brlcad/trunk/src/libged/edcomb.c 2008-08-22 04:30:51 UTC (rev 32504) @@ -37,18 +37,13 @@ GED_CHECK_DATABASE_OPEN(gedp, BRLCAD_ERROR); GED_CHECK_READ_ONLY(gedp, BRLCAD_ERROR); + GED_CHECK_ARGC_GT_0(gedp, argc, BRLCAD_ERROR); /* initialize result */ bu_vls_trunc(&gedp->ged_result_str, 0); gedp->ged_result = GED_RESULT_NULL; gedp->ged_result_flags = 0; - /* invalid command name */ - if (argc < 1) { - bu_vls_printf(&gedp->ged_result_str, "Error: command name not provided"); - return BRLCAD_ERROR; - } - /* must be wanting help */ if (argc == 1) { gedp->ged_result_flags |= GED_RESULT_FLAGS_HELP_BIT; Modified: brlcad/trunk/src/libged/edmater.c =================================================================== --- brlcad/trunk/src/libged/edmater.c 2008-08-22 04:30:32 UTC (rev 32503) +++ brlcad/trunk/src/libged/edmater.c 2008-08-22 04:30:51 UTC (rev 32504) @@ -40,6 +40,7 @@ GED_CHECK_DATABASE_OPEN(gedp, BRLCAD_ERROR); GED_CHECK_READ_ONLY(gedp, BRLCAD_ERROR); + GED_CHECK_ARGC_GT_0(gedp, argc, BRLCAD_ERROR); /* must be wanting help */ if (argc == 1) { Modified: brlcad/trunk/src/libged/erase.c =================================================================== --- brlcad/trunk/src/libged/erase.c 2008-08-22 04:30:32 UTC (rev 32503) +++ brlcad/trunk/src/libged/erase.c 2008-08-22 04:30:51 UTC (rev 32504) @@ -48,18 +48,13 @@ GED_CHECK_DATABASE_OPEN(gedp, BRLCAD_ERROR); GED_CHECK_DRAWABLE(gedp, BRLCAD_ERROR); + GED_CHECK_ARGC_GT_0(gedp, argc, BRLCAD_ERROR); /* initialize result */ bu_vls_trunc(&gedp->ged_result_str, 0); gedp->ged_result = GED_RESULT_NULL; gedp->ged_result_flags = 0; - /* invalid command name */ - if (argc < 1) { - bu_vls_printf(&gedp->ged_result_str, "Error: command name not provided"); - return BRLCAD_ERROR; - } - /* must be wanting help */ if (argc == 1) { gedp->ged_result_flags |= GED_RESULT_FLAGS_HELP_BIT; Modified: brlcad/trunk/src/libged/erase_all.c =================================================================== --- brlcad/trunk/src/libged/erase_all.c 2008-08-22 04:30:32 UTC (rev 32503) +++ brlcad/trunk/src/libged/erase_all.c 2008-08-22 04:30:51 UTC (rev 32504) @@ -48,18 +48,13 @@ GED_CHECK_DATABASE_OPEN(gedp, BRLCAD_ERROR); GED_CHECK_DRAWABLE(gedp, BRLCAD_ERROR); + GED_CHECK_ARGC_GT_0(gedp, argc, BRLCAD_ERROR); /* initialize result */ bu_vls_trunc(&gedp->ged_result_str, 0); gedp->ged_result = GED_RESULT_NULL; gedp->ged_result_flags = 0; - /* invalid command name */ - if (argc < 1) { - bu_vls_printf(&gedp->ged_result_str, "Error: command name not provided"); - return BRLCAD_ERROR; - } - /* must be wanting help */ if (argc == 1) { gedp->ged_result_flags |= GED_RESULT_FLAGS_HELP_BIT; Modified: brlcad/trunk/src/libged/expand.c =================================================================== --- brlcad/trunk/src/libged/expand.c 2008-08-22 04:30:32 UTC (rev 32503) +++ brlcad/trunk/src/libged/expand.c 2008-08-22 04:30:51 UTC (rev 32504) @@ -45,18 +45,13 @@ static const char *usage = "expression"; GED_CHECK_DATABASE_OPEN(gedp, BRLCAD_ERROR); + GED_CHECK_ARGC_GT_0(gedp, argc, BRLCAD_ERROR); /* initialize result */ bu_vls_trunc(&gedp->ged_result_str, 0); gedp->ged_result = GED_RESULT_NULL; gedp->ged_result_flags = 0; - /* invalid command name */ - if (argc < 1) { - bu_vls_printf(&gedp->ged_result_str, "Error: command name not provided"); - return BRLCAD_ERROR; - } - /* must be wanting help */ if (argc == 1) { gedp->ged_result_flags |= GED_RESULT_FLAGS_HELP_BIT; Modified: brlcad/trunk/src/libged/eye.c =================================================================== --- brlcad/trunk/src/libged/eye.c 2008-08-22 04:30:32 UTC (rev 32503) +++ brlcad/trunk/src/libged/eye.c 2008-08-22 04:30:51 UTC (rev 32504) @@ -41,6 +41,7 @@ GED_CHECK_DATABASE_OPEN(gedp, BRLCAD_ERROR); GED_CHECK_VIEW(gedp, BRLCAD_ERROR); + GED_CHECK_ARGC_GT_0(gedp, argc, BRLCAD_ERROR); /* initialize result */ bu_vls_trunc(&gedp->ged_result_str, 0); Modified: brlcad/trunk/src/libged/eye_pos.c =================================================================== --- brlcad/trunk/src/libged/eye_pos.c 2008-08-22 04:30:32 UTC (rev 32503) +++ brlcad/trunk/src/libged/eye_pos.c 2008-08-22 04:30:51 UTC (rev 32504) @@ -39,6 +39,7 @@ GED_CHECK_DATABASE_OPEN(gedp, BRLCAD_ERROR); GED_CHECK_VIEW(gedp, BRLCAD_ERROR); + GED_CHECK_ARGC_GT_0(gedp, argc, BRLCAD_ERROR); /* initialize result */ bu_vls_trunc(&gedp->ged_result_str, 0); Modified: brlcad/trunk/src/libged/facetize.c =================================================================== --- brlcad/trunk/src/libged/facetize.c 2008-08-22 04:30:32 UTC (rev 32503) +++ brlcad/trunk/src/libged/facetize.c 2008-08-22 04:30:51 UTC (rev 32504) @@ -55,18 +55,13 @@ GED_CHECK_DATABASE_OPEN(gedp, BRLCAD_ERROR); GED_CHECK_READ_ONLY(gedp, BRLCAD_ERROR); + GED_CHECK_ARGC_GT_0(gedp, argc, BRLCAD_ERROR); /* initialize result */ bu_vls_trunc(&gedp->ged_result_str, 0); gedp->ged_result = GED_RESULT_NULL; gedp->ged_result_flags = 0; - /* invalid command name */ - if (argc < 1) { - bu_vls_printf(&gedp->ged_result_str, "Error: command name not provided"); - return BRLCAD_ERROR; - } - /* must be wanting help */ if (argc == 1) { gedp->ged_result_flags |= GED_RESULT_FLAGS_HELP_BIT; Modified: brlcad/trunk/src/libged/find.c =================================================================== --- brlcad/trunk/src/libged/find.c 2008-08-22 04:30:32 UTC (rev 32503) +++ brlcad/trunk/src/libged/find.c 2008-08-22 04:30:51 UTC (rev 32504) @@ -51,18 +51,13 @@ static const char *usage = "<objects>"; GED_CHECK_DATABASE_OPEN(gedp, BRLCAD_ERROR); + GED_CHECK_ARGC_GT_0(gedp, argc, BRLCAD_ERROR); /* initialize result */ bu_vls_trunc(&gedp->ged_result_str, 0); gedp->ged_result = GED_RESULT_NULL; gedp->ged_result_flags = 0; - /* invalid command name */ - if (argc < 1) { - bu_vls_printf(&gedp->ged_result_str, "Error: command name not provided"); - return BRLCAD_ERROR; - } - /* must be wanting help */ if (argc == 1) { gedp->ged_result_flags |= GED_RESULT_FLAGS_HELP_BIT; Modified: brlcad/trunk/src/libged/form.c =================================================================== --- brlcad/trunk/src/libged/form.c 2008-08-22 04:30:32 UTC (rev 32503) +++ brlcad/trunk/src/libged/form.c 2008-08-22 04:30:51 UTC (rev 32504) @@ -39,6 +39,7 @@ static const char *usage = "type"; GED_CHECK_DATABASE_OPEN(gedp, BRLCAD_ERROR); + GED_CHECK_ARGC_GT_0(gedp, argc, BRLCAD_ERROR); /* initialize result */ bu_vls_trunc(&gedp->ged_result_str, 0); Modified: brlcad/trunk/src/libged/fracture.c =================================================================== --- brlcad/trunk/src/libged/fracture.c 2008-08-22 04:30:32 UTC (rev 32503) +++ brlcad/trunk/src/libged/fracture.c 2008-08-22 04:30:51 UTC (rev 32504) @@ -54,18 +54,13 @@ GED_CHECK_DATABASE_OPEN(gedp, BRLCAD_ERROR); GED_CHECK_READ_ONLY(gedp, BRLCAD_ERROR); + GED_CHECK_ARGC_GT_0(gedp, argc, BRLCAD_ERROR); /* initialize result */ bu_vls_trunc(&gedp->ged_result_str, 0); gedp->ged_result = GED_RESULT_NULL; gedp->ged_result_flags = 0; - /* invalid command name */ - if (argc < 1) { - bu_vls_printf(&gedp->ged_result_str, "Error: command name not provided"); - return BRLCAD_ERROR; - } - /* must be wanting help */ if (argc == 1) { gedp->ged_result_flags |= GED_RESULT_FLAGS_HELP_BIT; Modified: brlcad/trunk/src/libged/get.c =================================================================== --- brlcad/trunk/src/libged/get.c 2008-08-22 04:30:32 UTC (rev 32503) +++ brlcad/trunk/src/libged/get.c 2008-08-22 04:30:51 UTC (rev 32504) @@ -40,18 +40,13 @@ static const char *usage = "object ?attr?"; GED_CHECK_DATABASE_OPEN(gedp, BRLCAD_ERROR); + GED_CHECK_ARGC_GT_0(gedp, argc, BRLCAD_ERROR); /* initialize result */ bu_vls_trunc(&gedp->ged_result_str, 0); gedp->ged_result = GED_RESULT_NULL; gedp->ged_result_flags = 0; - /* invalid command name */ - if (argc < 1) { - bu_vls_printf(&gedp->ged_result_str, "Error: command name not provided"); - return BRLCAD_ERROR; - } - /* must be wanting help */ if (argc == 1) { gedp->ged_result_flags |= GED_RESULT_FLAGS_HELP_BIT; Modified: brlcad/trunk/src/libged/get_autoview.c =================================================================== --- brlcad/trunk/src/libged/get_autoview.c 2008-08-22 04:30:32 UTC (rev 32503) +++ brlcad/trunk/src/libged/get_autoview.c 2008-08-22 04:30:51 UTC (rev 32504) @@ -47,6 +47,7 @@ GED_CHECK_DATABASE_OPEN(gedp, BRLCAD_ERROR); GED_CHECK_DRAWABLE(gedp, BRLCAD_ERROR); + GED_CHECK_ARGC_GT_0(gedp, argc, BRLCAD_ERROR); /* initialize result */ bu_vls_trunc(&gedp->ged_result_str, 0); Modified: brlcad/trunk/src/libged/get_eyemodel.c =================================================================== --- brlcad/trunk/src/libged/get_eyemodel.c 2008-08-22 04:30:32 UTC (rev 32503) +++ brlcad/trunk/src/libged/get_eyemodel.c 2008-08-22 04:30:51 UTC (rev 32504) @@ -42,6 +42,7 @@ GED_CHECK_DATABASE_OPEN(gedp, BRLCAD_ERROR); GED_CHECK_DRAWABLE(gedp, BRLCAD_ERROR); GED_CHECK_VIEW(gedp, BRLCAD_ERROR); + GED_CHECK_ARGC_GT_0(gedp, argc, BRLCAD_ERROR); /* initialize result */ bu_vls_trunc(&gedp->ged_result_str, 0); Modified: brlcad/trunk/src/libged/get_type.c =================================================================== --- brlcad/trunk/src/libged/get_type.c 2008-08-22 04:30:32 UTC (rev 32503) +++ brlcad/trunk/src/libged/get_type.c 2008-08-22 04:30:51 UTC (rev 32504) @@ -37,18 +37,13 @@ static const char *usage = "object"; GED_CHECK_DATABASE_OPEN(gedp, BRLCAD_ERROR); + GED_CHECK_ARGC_GT_0(gedp, argc, BRLCAD_ERROR); /* initialize result */ bu_vls_trunc(&gedp->ged_result_str, 0); gedp->ged_result = GED_RESULT_NULL; gedp->ged_result_flags = 0; - /* invalid command name */ - if (argc < 1) { - bu_vls_printf(&gedp->ged_result_str, "Error: command name not provided"); - return BRLCAD_ERROR; - } - /* must be wanting help */ if (argc == 1) { gedp->ged_result_flags |= GED_RESULT_FLAGS_HELP_BIT; Modified: brlcad/trunk/src/libged/group.c =================================================================== --- brlcad/trunk/src/libged/group.c 2008-08-22 04:30:32 UTC (rev 32503) +++ brlcad/trunk/src/libged/group.c 2008-08-22 04:30:51 UTC (rev 32504) @@ -41,18 +41,13 @@ GED_CHECK_DATABASE_OPEN(gedp, BRLCAD_ERROR); GED_CHECK_READ_ONLY(gedp, BRLCAD_ERROR); + GED_CHECK_ARGC_GT_0(gedp, argc, BRLCAD_ERROR); /* initialize result */ bu_vls_trunc(&gedp->ged_result_str, 0); gedp->ged_result = GED_RESULT_NULL; gedp->ged_result_flags = 0; - /* invalid command name */ - if (argc < 1) { - bu_vls_printf(&gedp->ged_result_str, "Error: command name not provided"); - return BRLCAD_ERROR; - } - /* must be wanting help */ if (argc == 1) { gedp->ged_result_flags |= GED_RESULT_FLAGS_HELP_BIT; Modified: brlcad/trunk/src/libged/hide.c =================================================================== --- brlcad/trunk/src/libged/hide.c 2008-08-22 04:30:32 UTC (rev 32503) +++ brlcad/trunk/src/libged/hide.c 2008-08-22 04:30:51 UTC (rev 32504) @@ -44,18 +44,13 @@ GED_CHECK_DATABASE_OPEN(gedp, BRLCAD_ERROR); GED_CHECK_READ_ONLY(gedp, BRLCAD_ERROR); + GED_CHECK_ARGC_GT_0(gedp, argc, BRLCAD_ERROR); /* initialize result */ bu_vls_trunc(&gedp->ged_result_str, 0); gedp->ged_result = GED_RESULT_NULL; gedp->ged_result_flags = 0; - /* invalid command name */ - if (argc < 1) { - bu_vls_printf(&gedp->ged_result_str, "Error: command name not provided"); - return BRLCAD_ERROR; - } - /* must be wanting help */ if (argc == 1) { gedp->ged_result_flags |= GED_RESULT_FLAGS_HELP_BIT; Modified: brlcad/trunk/src/libged/how.c =================================================================== --- brlcad/trunk/src/libged/how.c 2008-08-22 04:30:32 UTC (rev 32503) +++ brlcad/trunk/src/libged/how.c 2008-08-22 04:30:51 UTC (rev 32504) @@ -52,18 +52,13 @@ GED_CHECK_DATABASE_OPEN(gedp, BRLCAD_ERROR); GED_CHECK_DRAWABLE(gedp, BRLCAD_ERROR); + GED_CHECK_ARGC_GT_0(gedp, argc, BRLCAD_ERROR); /* initialize result */ bu_vls_trunc(&gedp->ged_result_str, 0); gedp->ged_result = GED_RESULT_NULL; gedp->ged_result_flags = 0; - /* invalid command name */ - if (argc < 1) { - bu_vls_printf(&gedp->ged_result_str, "Error: command name not provided"); - return BRLCAD_ERROR; - } - /* must be wanting help */ if (argc == 1) { gedp->ged_result_flags |= GED_RESULT_FLAGS_HELP_BIT; Modified: brlcad/trunk/src/libged/illum.c =================================================================== --- brlcad/trunk/src/libged/illum.c 2008-08-22 04:30:32 UTC (rev 32503) +++ brlcad/trunk/src/libged/illum.c 2008-08-22 04:30:51 UTC (rev 32504) @@ -44,6 +44,7 @@ GED_CHECK_DATABASE_OPEN(gedp, BRLCAD_ERROR); GED_CHECK_DRAWABLE(gedp, BRLCAD_ERROR); + GED_CHECK_ARGC_GT_0(gedp, argc, BRLCAD_ERROR); /* initialize result */ bu_vls_trunc(&gedp->ged_result_str, 0); Modified: brlcad/trunk/src/libged/importFg4Section.c =================================================================== --- brlcad/trunk/src/libged/importFg4Section.c 2008-08-22 04:30:32 UTC (rev 32503) +++ brlcad/trunk/src/libged/importFg4Section.c 2008-08-22 04:30:51 UTC (rev 32504) @@ -534,6 +534,7 @@ GED_CHECK_DATABASE_OPEN(gedp, BRLCAD_ERROR); GED_CHECK_READ_ONLY(gedp, BRLCAD_ERROR); + GED_CHECK_ARGC_GT_0(gedp, argc, BRLCAD_ERROR); /* initialize result */ bu_vls_trunc(&gedp->ged_result_str, 0); Modified: brlcad/trunk/src/libged/instance.c =================================================================== --- brlcad/trunk/src/libged/instance.c 2008-08-22 04:30:32 UTC (rev 32503) +++ brlcad/trunk/src/libged/instance.c 2008-08-22 04:30:51 UTC (rev 32504) @@ -41,18 +41,13 @@ GED_CHECK_DATABASE_OPEN(gedp, BRLCAD_ERROR); GED_CHECK_READ_ONLY(gedp, BRLCAD_ERROR); + GED_CHECK_ARGC_GT_0(gedp, argc, BRLCAD_ERROR); /* initialize result */ bu_vls_trunc(&gedp->ged_result_str, 0); gedp->ged_result = GED_RESULT_NULL; gedp->ged_result_flags = 0; - /* invalid command name */ - if (argc < 1) { - bu_vls_printf(&gedp->ged_result_str, "Error: command name not provided"); - return BRLCAD_ERROR; - } - /* must be wanting help */ if (argc == 1) { gedp->ged_result_flags |= GED_RESULT_FLAGS_HELP_BIT; Modified: brlcad/trunk/src/libged/isize.c =================================================================== --- brlcad/trunk/src/libged/isize.c 2008-08-22 04:30:32 UTC (rev 32503) +++ brlcad/trunk/src/libged/isize.c 2008-08-22 04:30:51 UTC (rev 32504) @@ -37,6 +37,7 @@ { GED_CHECK_DATABASE_OPEN(gedp, BRLCAD_ERROR); GED_CHECK_VIEW(gedp, BRLCAD_ERROR); + GED_CHECK_ARGC_GT_0(gedp, argc, BRLCAD_ERROR); /* initialize result */ bu_vls_trunc(&gedp->ged_result_str, 0); Modified: brlcad/trunk/src/libged/item.c =================================================================== --- brlcad/trunk/src/libged/item.c 2008-08-22 04:30:32 UTC (rev 32503) +++ brlcad/trunk/src/libged/item.c 2008-08-22 04:30:51 UTC (rev 32504) @@ -39,18 +39,13 @@ GED_CHECK_DATABASE_OPEN(gedp, BRLCAD_ERROR); GED_CHECK_READ_ONLY(gedp, BRLCAD_ERROR); + GED_CHECK_ARGC_GT_0(gedp, argc, BRLCAD_ERROR); /* initialize result */ bu_vls_trunc(&gedp->ged_result_str, 0); gedp->ged_result = GED_RESULT_NULL; gedp->ged_result_flags = 0; - /* invalid command name */ - if (argc < 1) { - bu_vls_printf(&gedp->ged_result_str, "Error: command name not provided"); - return BRLCAD_ERROR; - } - /* must be wanting help */ if (argc == 1) { gedp->ged_result_flags |= GED_RESULT_FLAGS_HELP_BIT; Modified: brlcad/trunk/src/libged/keep.c =================================================================== --- brlcad/trunk/src/libged/keep.c 2008-08-22 04:30:32 UTC (rev 32503) +++ brlcad/trunk/src/libged/keep.c 2008-08-22 04:30:51 UTC (rev 32504) @@ -54,18 +54,13 @@ static const char *usage = "file object(s)"; GED_CHECK_DATABASE_OPEN(gedp, BRLCAD_ERROR); + GED_CHECK_ARGC_GT_0(gedp, argc, BRLCAD_ERROR); /* initialize result */ bu_vls_trunc(&gedp->ged_result_str, 0); gedp->ged_result = GED_RESULT_NULL; gedp->ged_result_flags = 0; - /* invalid command name */ - if (argc < 1) { - bu_vls_printf(&gedp->ged_result_str, "Error: command name not provided"); - return BRLCAD_ERROR; - } - /* must be wanting help */ if (argc == 1) { gedp->ged_result_flags |= GED_RESULT_FLAGS_HELP_BIT; Modified: brlcad/trunk/src/libged/keypoint.c =================================================================== --- brlcad/trunk/src/libged/keypoint.c 2008-08-22 04:30:32 UTC (rev 32503) +++ brlcad/trunk/src/libged/keypoint.c 2008-08-22 04:30:51 UTC (rev 32504) @@ -40,6 +40,7 @@ GED_CHECK_DATABASE_OPEN(gedp, BRLCAD_ERROR); GED_CHECK_VIEW(gedp, BRLCAD_ERROR); + GED_CHECK_ARGC_GT_0(gedp, argc, BRLCAD_ERROR); /* initialize result */ bu_vls_trunc(&gedp->ged_result_str, 0); Modified: brlcad/trunk/src/libged/kill.c =================================================================== --- brlcad/trunk/src/libged/kill.c 2008-08-22 04:30:32 UTC (rev 32503) +++ brlcad/trunk/src/libged/kill.c 2008-08-22 04:30:51 UTC (rev 32504) @@ -42,18 +42,13 @@ GED_CHECK_DATABASE_OPEN(gedp, BRLCAD_ERROR); GED_CHECK_READ_ONLY(gedp, BRLCAD_ERROR); + GED_CHECK_ARGC_GT_0(gedp, argc, BRLCAD_ERROR); /* initialize result */ bu_vls_trunc(&gedp->ged_result_str, 0); gedp->ged_result = GED_RESULT_NULL; gedp->ged_result_flags = 0; - /* invalid command name */ - if (argc < 1) { - bu_vls_printf(&gedp->ged_result_str, "Error: command name not provided"); - return BRLCAD_ERROR; - } - /* must be wanting help */ if (argc == 1) { gedp->ged_result_flags |= GED_RESULT_FLAGS_HELP_BIT; Modified: brlcad/trunk/src/libged/killall.c =================================================================== --- brlcad/trunk/src/libged/killall.c 2008-08-22 04:30:32 UTC (rev 32503) +++ brlcad/trunk/src/libged/killall.c 2008-08-22 04:30:51 UTC (rev 32504) @@ -39,18 +39,13 @@ GED_CHECK_DATABASE_OPEN(gedp, BRLCAD_ERROR); GED_CHECK_READ_ONLY(gedp, BRLCAD_ERROR); + GED_CHECK_ARGC_GT_0(gedp, argc, BRLCAD_ERROR); /* initialize result */ bu_vls_trunc(&gedp->ged_result_str, 0); gedp->ged_result = GED_RESULT_NULL; gedp->ged_result_flags = 0; - /* invalid command name */ - if (argc < 1) { - bu_vls_printf(&gedp->ged_result_str, "Error: command name not provided"); - return BRLCAD_ERROR; - } - /* must be wanting help */ if (argc == 1) { gedp->ged_result_flags |= GED_RESULT_FLAGS_HELP_BIT; Modified: brlcad/trunk/src/libged/killrefs.c =================================================================== --- brlcad/trunk/src/libged/killrefs.c 2008-08-22 04:30:32 UTC (rev 32503) +++ brlcad/trunk/src/libged/killrefs.c 2008-08-22 04:30:51 UTC (rev 32504) @@ -43,18 +43,13 @@ GED_CHECK_DATABASE_OPEN(gedp, BRLCAD_ERROR); GED_CHECK_READ_ONLY(gedp, BRLCAD_ERROR); + GED_CHECK_ARGC_GT_0(gedp, argc, BRLCAD_ERROR); /* initialize result */ bu_vls_trunc(&gedp->ged_result_str, 0); gedp->ged_result = GED_RESULT_NULL; gedp->ged_result_flags = 0; - /* invalid command name */ - if (argc < 1) { - bu_vls_printf(&gedp->ged_result_str, "Error: command name not provided"); - return BRLCAD_ERROR; - } - /* must be wanting help */ if (argc == 1) { gedp->ged_result_flags |= GED_RESULT_FLAGS_HELP_BIT; Modified: brlcad/trunk/src/libged/killtree.c =================================================================== --- brlcad/trunk/src/libged/killtree.c 2008-08-22 04:30:32 UTC (rev 32503) +++ brlcad/trunk/src/libged/killtree.c 2008-08-22 04:30:51 UTC (rev 32504) @@ -53,18 +53,13 @@ GED_CHECK_DATABASE_OPEN(gedp, BRLCAD_ERROR); GED_CHECK_READ_ONLY(gedp, BRLCAD_ERROR); + GED_CHECK_ARGC_GT_0(gedp, argc, BRLCAD_ERROR); /* initialize result */ bu_vls_trunc(&gedp->ged_result_str, 0); gedp->ged_result = GED_RESULT_NULL; gedp->ged_result_flags = 0; - /* invalid command name */ - if (argc < 1) { - bu_vls_printf(&gedp->ged_result_str, "Error: command name not provided"); - return BRLCAD_ERROR; - } - /* must be wanting help */ if (argc == 1) { gedp->ged_result_flags |= GED_RESULT_FLAGS_HELP_BIT; @@ -109,7 +104,7 @@ } if (gktd.killrefs && gktd.ac > 1) { - (void)ged_killrefs(gedp, gktd.ac, gktd.av); + (void)ged_killrefs(gedp, gktd.ac, (const char **)gktd.av); for (i=1; i<gktd.ac; i++) { bu_vls_printf(&gedp->ged_result_str, "Freeing %s\n", gktd.av[i]); Modified: brlcad/trunk/src/libged/label.c =================================================================== --- brlcad/trunk/src/libged/label.c 2008-08-22 04:30:32 UTC (rev 32503) +++ brlcad/trunk/src/libged/label.c 2008-08-22 04:30:51 UTC (rev 32504) @@ -39,6 +39,7 @@ GED_CHECK_DATABASE_OPEN(gedp, BRLCAD_ERROR); GED_CHECK_DRAWABLE(gedp, BRLCAD_ERROR); + GED_CHECK_ARGC_GT_0(gedp, argc, BRLCAD_ERROR); /* initialize result */ bu_vls_trunc(&gedp->ged_result_str, 0); Modified: brlcad/trunk/src/libged/list.c =================================================================== --- brlcad/trunk/src/libged/list.c 2008-08-22 04:30:32 UTC (rev 32503) +++ brlcad/trunk/src/libged/list.c 2008-08-22 04:30:51 UTC (rev 32504) @@ -45,18 +45,13 @@ static const char *usage = "[-r] <objects>"; GED_CHECK_DATABASE_OPEN(gedp, BRLCAD_ERROR); + GED_CHECK_ARGC_GT_0(gedp, argc, BRLCAD_ERROR); /* initialize result */ bu_vls_trunc(&gedp->ged_result_str, 0); gedp->ged_result = GED_RESULT_NULL; gedp->ged_result_flags = 0; - /* invalid command name */ - if (argc < 1) { - bu_vls_printf(&gedp->ged_result_str, "Error: command name not provided"); - return BRLCAD_ERROR; - } - if (argc < 2 || MAXARGS < argc) { bu_vls_printf(&gedp->ged_result_str, "Usage: %s %s", argv[0], usage); return BRLCAD_ERROR; Modified: brlcad/trunk/src/libged/loadview.c =================================================================== --- brlcad/trunk/src/libged/loadview.c 2008-08-22 04:30:32 UTC (rev 32503) +++ brlcad/trunk/src/libged/loadview.c 2008-08-22 04:30:51 UTC (rev 32504) @@ -113,18 +113,13 @@ GED_CHECK_DATABASE_OPEN(gedp, BRLCAD_ERROR); GED_CHECK_VIEW(gedp, BRLCAD_ERROR); + GED_CHECK_ARGC_GT_0(gedp, argc, BRLCAD_ERROR); /* initialize result */ bu_vls_trunc(&gedp->ged_result_str, 0); gedp->ged_result = GED_RESULT_NULL; gedp->ged_result_flags = 0; - /* invalid command name */ - if (argc < 1) { - bu_vls_printf(&gedp->ged_result_str, "Error: command name not provided"); - return BRLCAD_ERROR; - } - /* must be wanting help */ if (argc == 1) { gedp->ged_result_flags |= GED_RESULT_FLAGS_HELP_BIT; @@ -216,7 +211,7 @@ editArgv[0] = "draw"; editArgv[1] = objects; editArgv[2] = (char *)NULL; - if (ged_draw(gedp, 2, editArgv) != BRLCAD_OK) { + if (ged_draw(gedp, 2, (const char **)editArgv) != BRLCAD_OK) { bu_vls_printf(&gedp->ged_result_str, "Unable to load object: %s\n", objects); } Modified: brlcad/trunk/src/libged/log.c =================================================================== --- brlcad/trunk/src/libged/log.c 2008-08-22 04:30:32 UTC (rev 32503) +++ brlcad/trunk/src/libged/log.c 2008-08-22 04:30:51 UTC (rev 32504) @@ -52,6 +52,7 @@ GED_CHECK_DATABASE_OPEN(gedp, BRLCAD_ERROR); GED_CHECK_READ_ONLY(gedp, BRLCAD_ERROR); + GED_CHECK_ARGC_GT_0(gedp, argc, BRLCAD_ERROR); /* initialize result */ bu_vls_trunc(&gedp->ged_result_str, 0); Modified: brlcad/trunk/src/libged/lookat.c =================================================================== --- brlcad/trunk/src/libged/lookat.c 2008-08-22 04:30:32 UTC (rev 32503) +++ brlcad/trunk/src/libged/lookat.c 2008-08-22 04:30:51 UTC (rev 32504) @@ -45,6 +45,7 @@ GED_CHECK_DATABASE_OPEN(gedp, BRLCAD_ERROR); GED_CHECK_VIEW(gedp, BRLCAD_ERROR); + GED_CHECK_ARGC_GT_0(gedp, argc, BRLCAD_ERROR); /* initialize result */ bu_vls_trunc(&gedp->ged_result_str, 0); Modified: brlcad/trunk/src/libged/ls.c =================================================================== --- brlcad/trunk/src/libged/ls.c 2008-08-22 04:30:32 UTC (rev 32503) +++ brlcad/trunk/src/libged/ls.c 2008-08-22 04:30:51 UTC (rev 32504) @@ -61,18 +61,13 @@ static const char *usage = "[-A name/value pairs] OR [-acrslop] object(s)"; GED_CHECK_DATABASE_OPEN(gedp, BRLCAD_ERROR); + GED_CHECK_ARGC_GT_0(gedp, argc, BRLCAD_ERROR); /* initialize result */ bu_vls_trunc(&gedp->ged_result_str, 0); gedp->ged_result = GED_RESULT_NULL; gedp->ged_result_flags = 0; - /* invalid command name */ - if (argc < 1) { - bu_vls_printf(&gedp->ged_result_str, "Error: command name not provided"); - return BRLCAD_ERROR; - } - if (MAXARGS < argc) { bu_vls_printf(&gedp->ged_result_str, "Usage: %s %s", argv[0], usage); return BRLCAD_ERROR; Modified: brlcad/trunk/src/libged/lt.c =================================================================== --- brlcad/trunk/src/libged/lt.c 2008-08-22 04:30:32 UTC (rev 32503) +++ brlcad/trunk/src/libged/lt.c 2008-08-22 04:30:51 UTC (rev 32504) @@ -42,6 +42,7 @@ static const char *usage = "object"; GED_CHECK_DATABASE_OPEN(gedp, BRLCAD_ERROR); + GED_CHECK_ARGC_GT_0(gedp, argc, BRLCAD_ERROR); /* initialize result */ bu_vls_trunc(&gedp->ged_result_str, 0); Modified: brlcad/trunk/src/libged/m2v_point.c =================================================================== --- brlcad/trunk/src/libged/m2v_point.c 2008-08-22 04:30:32 UTC (rev 32503) +++ brlcad/trunk/src/libged/m2v_point.c 2008-08-22 04:30:51 UTC (rev 32504) @@ -41,6 +41,7 @@ GED_CHECK_DATABASE_OPEN(gedp, BRLCAD_ERROR); GED_CHECK_VIEW(gedp, BRLCAD_ERROR); + GED_CHECK_ARGC_GT_0(gedp, argc, BRLCAD_ERROR); /* initialize result */ bu_vls_trunc(&gedp->ged_result_str, 0); Modified: brlcad/trunk/src/libged/make.c =================================================================== --- brlcad/trunk/src/libged/make.c 2008-08-22 04:30:32 UTC (rev 32503) +++ brlcad/trunk/src/libged/make.c 2008-08-22 04:30:51 UTC (rev 32504) @@ -69,6 +69,7 @@ GED_CHECK_DATABASE_OPEN(gedp, BRLCAD_ERROR); GED_CHECK_READ_ONLY(gedp, BRLCAD_ERROR); + GED_CHECK_ARGC_GT_0(gedp, argc, BRLCAD_ERROR); /* initialize result */ bu_vls_trunc(&gedp->ged_result_str, 0); Modified: brlcad/trunk/src/libged/make_bb.c =================================================================== --- brlcad/trunk/src/libged/make_bb.c 2008-08-22 04:30:32 UTC (rev 32503) +++ brlcad/trunk/src/libged/make_bb.c 2008-08-22 04:30:51 UTC (rev 32504) @@ -46,18 +46,13 @@ GED_CHECK_DATABASE_OPEN(gedp, BRLCAD_ERROR); GED_CHECK_READ_ONLY(gedp, BRLCAD_ERROR); + GED_CHECK_ARGC_GT_0(gedp, argc, BRLCAD_ERROR); /* initialize result */ bu_vls_trunc(&gedp->ged_result_str, 0); gedp->ged_result = GED_RESULT_NULL; gedp->ged_result_flags = 0; - /* invalid command name */ - if (argc < 1) { - bu_vls_printf(&gedp->ged_result_str, "Error: command name not provided"); - return BRLCAD_ERROR; - } - /* must be wanting help */ if (argc == 1) { gedp->ged_result_flags |= GED_RESULT_FLAGS_HELP_BIT; Modified: brlcad/trunk/src/libged/make_name.c =================================================================== --- brlcad/trunk/src/libged/make_name.c 2008-08-22 04:30:32 UTC (rev 32503) +++ brlcad/trunk/src/libged/make_name.c 2008-08-22 04:30:51 UTC (rev 32504) @@ -38,6 +38,7 @@ GED_CHECK_DATABASE_OPEN(gedp, BRLCAD_ERROR); GED_CHECK_READ_ONLY(gedp, BRLCAD_ERROR); + GED_CHECK_ARGC_GT_0(gedp, argc, BRLCAD_ERROR); /* initialize result */ bu_vls_trunc(&gedp->ged_result_str, 0); Modified: brlcad/trunk/src/libged/match.c =================================================================== --- brlcad/trunk/src/libged/match.c 2008-08-22 04:30:32 UTC (rev 32503) +++ brlcad/trunk/src/libged/match.c 2008-08-22 04:30:51 UTC (rev 32504) @@ -37,18 +37,13 @@ static const char *usage = "expression"; GED_CHECK_DATABASE_OPEN(gedp, BRLCAD_ERROR); + GED_CHECK_ARGC_GT_0(gedp, argc, BRLCAD_ERROR); /* initialize result */ bu_vls_trunc(&gedp->ged_result_str, 0); gedp->ged_result = GED_RESULT_NULL; gedp->ged_result_flags = 0; - /* invalid command name */ - if (argc < 1) { - bu_vls_printf(&gedp->ged_result_str, "Error: command name not provided"); - return BRLCAD_ERROR; - } - /* must be wanting help */ if (argc == 1) { gedp->ged_result_flags |= GED_RESULT_FLAGS_HELP_BIT; Modified: brlcad/trunk/src/libged/mater.c =================================================================== --- brlcad/trunk/src/libged/mater.c 2008-08-22 04:30:32 UTC (rev 32503) +++ brlcad/trunk/src/libged/mater.c 2008-08-22 04:30:51 UTC (rev 32504) @@ -39,6 +39,7 @@ GED_CHECK_DATABASE_OPEN(gedp, BRLCAD_ERROR); GED_CHECK_READ_ONLY(gedp, BRLCAD_ERROR); + GED_CHECK_ARGC_GT_0(gedp, argc, BRLCAD_ERROR); /* initialize result */ bu_vls_trunc(&gedp->ged_result_str, 0); Modified: brlcad/trunk/src/libged/mirror.c =================================================================== --- brlcad/trunk/src/libged/mirror.c 2008-08-22 04:30:32 UTC (rev 32503) +++ brlcad/trunk/src/libged/mirror.c 2008-08-22 04:30:51 UTC (rev 32504) @@ -45,18 +45,13 @@ GED_CHECK_DATABASE_OPEN(gedp, BRLCAD_ERROR); GED_CHECK_READ_ONLY(gedp, BRLCAD_ERROR); + GED_CHECK_ARGC_GT_0(gedp, argc, BRLCAD_ERROR); /* initialize result */ bu_vls_trunc(&gedp->ged_result_str, 0); gedp->ged_result = GED_RESULT_NULL; gedp->ged_result_flags = 0; - /* invalid command name */ - if (argc < 1) { - bu_vls_printf(&gedp->ged_result_str, "Error: command name not provided"); - return BRLCAD_ERROR; - } - /* must be wanting help */ if (argc == 1) { gedp->ged_result_flags |= GED_RESULT_FLAGS_HELP_BIT; Modified: brlcad/trunk/src/libged/model2view.c =================================================================== --- brlcad/trunk/src/libged/model2view.c 2008-08-22 04:30:32 UTC (rev 32503) +++ brlcad/trunk/src/libged/model2view.c 2008-08-22 04:30:51 UTC (rev 32504) @@ -37,6 +37,7 @@ { GED_CHECK_DATABASE_OPEN(gedp, BRLCAD_ERROR); GED_CHECK_VIEW(gedp, BRLCAD_ERROR); + GED_CHECK_ARGC_GT_0(gedp, argc, BRLCAD_ERROR); /* initialize result */ bu_vls_trunc(&gedp->ged_result_str, 0); Modified: brlcad/trunk/src/libged/move.c =================================================================== --- brlcad/trunk/src/libged/move.c 2008-08-22 04:30:32 UTC (rev 32503) +++ brlcad/trunk/src/libged/move.c 2008-08-22 04:30:51 UTC (rev 32504) @@ -40,6 +40,7 @@ GED_CHECK_DATABASE_OPEN(gedp, BRLCAD_ERROR); GED_CHECK_READ_ONLY(gedp, BRLCAD_ERROR); + GED_CHECK_ARGC_GT_0(gedp, argc, BRLCAD_ERROR); /* initialize result */ bu_vls_trunc(&gedp->ged_result_str, 0); Modified: brlcad/trunk/src/libged/move_all.c =================================================================== --- brlcad/trunk/src/libged/move_all.c 2008-08-22 04:30:32 UTC (rev 32503) +++ brlcad/trunk/src/libged/move_all.c 2008-08-22 04:30:51 UTC (rev 32504) @@ -44,6 +44,7 @@ GED_CHECK_DATABASE_OPEN(gedp, BRLCAD_ERROR); GED_CHECK_READ_ONLY(gedp, BRLCAD_ERROR); + GED_CHECK_ARGC_GT_0(gedp, argc, BRLCAD_ERROR); /* initialize result */ bu_vls_trunc(&gedp->ged_result_str, 0); Modified: brlcad/trunk/src/libged/move_arb_edge.c =================================================================== --- brlcad/trunk/src/libged/move_arb_edge.c 2008-08-22 04:30:32 UTC (rev 32503) +++ brlcad/trunk/src/libged/move_arb_edge.c 2008-08-22 04:30:51 UTC (rev 32504) @@ -47,6 +47,7 @@ GED_CHECK_DATABASE_OPEN(gedp, BRLCAD_ERROR); GED_CHECK_READ_ONLY(gedp, BRLCAD_ERROR); + GED_CHECK_ARGC_GT_0(gedp, argc, BRLCAD_ERROR); /* initialize result */ bu_vls_trunc(&gedp->ged_result_str, 0); Modified: brlcad/trunk/src/libged/move_arb_face.c =================================================================== --- brlcad/trunk/src/libged/move_arb_face.c 2008-08-22 04:30:32 UTC (rev 32503) +++ brlcad/trunk/src/libged/move_arb_face.c 2008-08-22 04:30:51 UTC (rev 32504) @@ -46,6 +46,7 @@ GED_CHECK_DATABASE_OPEN(gedp, BRLCAD_ERROR); GED_CHECK_READ_ONLY(gedp, BRLCAD_ERROR); + GED_CHECK_ARGC_GT_0(gedp, argc, BRLCAD_ERROR); /* initialize result */ bu_vls_trunc(&gedp->ged_result_str, 0); Modified: brlcad/trunk/src/libged/mrot.c =================================================================== --- brlcad/trunk/src/libged/mrot.c 2008-08-22 04:30:32 UTC (rev 32503) +++ brlcad/trunk/src/libged/mrot.c 2008-08-22 04:30:51 UTC (rev 32504) @@ -41,6 +41,7 @@ GED_CHECK_DATABASE_OPEN(gedp, BRLCAD_ERROR); GED_CHECK_VIEW(gedp, BRLCAD_ERROR); + GED_CHECK_ARGC_GT_0(gedp, argc, BRLCAD_ERROR); if (argc != 2 && argc != 4) { bu_vls_printf(&gedp->ged_result_str, "Usage: %s %s", argv[0], usage); Modified: brlcad/trunk/src/libged/nirt.c =================================================================== --- brlcad/trunk/src/libged/nirt.c 2008-08-22 04:30:32 UTC (rev 32503) +++ brlcad/trunk/src/libged/nirt.c 2008-08-22 04:30:51 UTC (rev 32504) @@ -108,18 +108,13 @@ GED_CHECK_DATABASE_OPEN(gedp, BRLCAD_ERROR); GED_CHECK_DRAWABLE(gedp, BRLCAD_ERROR); GED_CHECK_VIEW(gedp, BRLCAD_ERROR); + GED_CHECK_ARGC_GT_0(gedp, argc, BRLCAD_ERROR); /* initialize result */ bu_vls_trunc(&gedp->ged_result_str, 0); gedp->ged_result = GED_RESULT_NULL; gedp->ged_result_flags = 0; - /* invalid command name */ - if (argc < 1) { - bu_vls_printf(&gedp->ged_result_str, "Error: command name not provided"); - return BRLCAD_ERROR; - } - vp = &gedp->ged_gdp->gd_rt_cmd[0]; *vp++ = "nirt"; @@ -588,18 +583,13 @@ GED_CHECK_DATABASE_OPEN(gedp, BRLCAD_ERROR); GED_CHECK_DRAWABLE(gedp, BRLCAD_ERROR); GED_CHECK_VIEW(gedp, BRLCAD_ERROR); + GED_CHECK_ARGC_GT_0(gedp, argc, BRLCAD_ERROR); /* initialize result */ bu_vls_trunc(&gedp->ged_result_str, 0); gedp->ged_result = GED_RESULT_NULL; gedp->ged_result_flags = 0; - /* invalid command n... [truncated message content] |
From: <bo...@us...> - 2008-08-25 14:18:58
|
Revision: 32530 http://brlcad.svn.sourceforge.net/brlcad/?rev=32530&view=rev Author: bob1961 Date: 2008-08-25 14:18:59 +0000 (Mon, 25 Aug 2008) Log Message: ----------- Added call to GED_CHECK_ARGC_GT_0. Modified Paths: -------------- brlcad/trunk/src/libged/get_comb.c brlcad/trunk/src/libged/plot.c brlcad/trunk/src/libged/put_comb.c brlcad/trunk/src/libged/putmat.c brlcad/trunk/src/libged/qvrot.c brlcad/trunk/src/libged/red.c brlcad/trunk/src/libged/rfarb.c brlcad/trunk/src/libged/savekey.c Modified: brlcad/trunk/src/libged/get_comb.c =================================================================== --- brlcad/trunk/src/libged/get_comb.c 2008-08-25 13:34:42 UTC (rev 32529) +++ brlcad/trunk/src/libged/get_comb.c 2008-08-25 14:18:59 UTC (rev 32530) @@ -46,6 +46,7 @@ GED_CHECK_DATABASE_OPEN(gedp, BRLCAD_ERROR); GED_CHECK_READ_ONLY(gedp, BRLCAD_ERROR); + GED_CHECK_ARGC_GT_0(gedp, argc, BRLCAD_ERROR); /* initialize result */ bu_vls_trunc(&gedp->ged_result_str, 0); Modified: brlcad/trunk/src/libged/plot.c =================================================================== --- brlcad/trunk/src/libged/plot.c 2008-08-25 13:34:42 UTC (rev 32529) +++ brlcad/trunk/src/libged/plot.c 2008-08-25 14:18:59 UTC (rev 32530) @@ -59,6 +59,7 @@ GED_CHECK_DATABASE_OPEN(gedp, BRLCAD_ERROR); GED_CHECK_DRAWABLE(gedp, BRLCAD_ERROR); GED_CHECK_VIEW(gedp, BRLCAD_ERROR); + GED_CHECK_ARGC_GT_0(gedp, argc, BRLCAD_ERROR); /* initialize result */ bu_vls_trunc(&gedp->ged_result_str, 0); Modified: brlcad/trunk/src/libged/put_comb.c =================================================================== --- brlcad/trunk/src/libged/put_comb.c 2008-08-25 13:34:42 UTC (rev 32529) +++ brlcad/trunk/src/libged/put_comb.c 2008-08-25 14:18:59 UTC (rev 32530) @@ -56,6 +56,7 @@ GED_CHECK_DATABASE_OPEN(gedp, BRLCAD_ERROR); GED_CHECK_READ_ONLY(gedp, BRLCAD_ERROR); + GED_CHECK_ARGC_GT_0(gedp, argc, BRLCAD_ERROR); /* initialize result */ bu_vls_trunc(&gedp->ged_result_str, 0); Modified: brlcad/trunk/src/libged/putmat.c =================================================================== --- brlcad/trunk/src/libged/putmat.c 2008-08-25 13:34:42 UTC (rev 32529) +++ brlcad/trunk/src/libged/putmat.c 2008-08-25 14:18:59 UTC (rev 32530) @@ -63,6 +63,7 @@ GED_CHECK_DATABASE_OPEN(gedp, BRLCAD_ERROR); GED_CHECK_READ_ONLY(gedp, BRLCAD_ERROR); + GED_CHECK_ARGC_GT_0(gedp, argc, BRLCAD_ERROR); /* initialize result */ bu_vls_trunc(&gedp->ged_result_str, 0); Modified: brlcad/trunk/src/libged/qvrot.c =================================================================== --- brlcad/trunk/src/libged/qvrot.c 2008-08-25 13:34:42 UTC (rev 32529) +++ brlcad/trunk/src/libged/qvrot.c 2008-08-25 14:18:59 UTC (rev 32530) @@ -44,6 +44,7 @@ GED_CHECK_DATABASE_OPEN(gedp, BRLCAD_ERROR); GED_CHECK_VIEW(gedp, BRLCAD_ERROR); + GED_CHECK_ARGC_GT_0(gedp, argc, BRLCAD_ERROR); /* initialize result */ bu_vls_trunc(&gedp->ged_result_str, 0); Modified: brlcad/trunk/src/libged/red.c =================================================================== --- brlcad/trunk/src/libged/red.c 2008-08-25 13:34:42 UTC (rev 32529) +++ brlcad/trunk/src/libged/red.c 2008-08-25 14:18:59 UTC (rev 32530) @@ -53,6 +53,8 @@ static const char *usage = "comb"; GED_CHECK_DATABASE_OPEN(gedp, BRLCAD_ERROR); + GED_CHECK_ARGC_GT_0(gedp, argc, BRLCAD_ERROR); + GED_CHECK_ARGC_GT_0(gedp, argc, BRLCAD_ERROR); /* initialize result */ bu_vls_trunc(&gedp->ged_result_str, 0); Modified: brlcad/trunk/src/libged/rfarb.c =================================================================== --- brlcad/trunk/src/libged/rfarb.c 2008-08-25 13:34:42 UTC (rev 32529) +++ brlcad/trunk/src/libged/rfarb.c 2008-08-25 14:18:59 UTC (rev 32530) @@ -50,6 +50,7 @@ GED_CHECK_DATABASE_OPEN(gedp, BRLCAD_ERROR); GED_CHECK_READ_ONLY(gedp, BRLCAD_ERROR); + GED_CHECK_ARGC_GT_0(gedp, argc, BRLCAD_ERROR); /* initialize result */ bu_vls_trunc(&gedp->ged_result_str, 0); Modified: brlcad/trunk/src/libged/savekey.c =================================================================== --- brlcad/trunk/src/libged/savekey.c 2008-08-25 13:34:42 UTC (rev 32529) +++ brlcad/trunk/src/libged/savekey.c 2008-08-25 14:18:59 UTC (rev 32530) @@ -44,6 +44,7 @@ GED_CHECK_DATABASE_OPEN(gedp, BRLCAD_ERROR); GED_CHECK_VIEW(gedp, BRLCAD_ERROR); + GED_CHECK_ARGC_GT_0(gedp, argc, BRLCAD_ERROR); /* initialize result */ bu_vls_trunc(&gedp->ged_result_str, 0); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bo...@us...> - 2008-08-29 12:58:19
|
Revision: 32562 http://brlcad.svn.sourceforge.net/brlcad/?rev=32562&view=rev Author: bob1961 Date: 2008-08-29 12:58:26 +0000 (Fri, 29 Aug 2008) Log Message: ----------- Include missing header Modified Paths: -------------- brlcad/trunk/src/libged/ged_private.h brlcad/trunk/src/libged/qray.h Modified: brlcad/trunk/src/libged/ged_private.h =================================================================== --- brlcad/trunk/src/libged/ged_private.h 2008-08-29 12:57:17 UTC (rev 32561) +++ brlcad/trunk/src/libged/ged_private.h 2008-08-29 12:58:26 UTC (rev 32562) @@ -30,8 +30,9 @@ #include <time.h> +#include "db.h" +#include "mater.h" #include "ged.h" -#include "db.h" __BEGIN_DECLS Modified: brlcad/trunk/src/libged/qray.h =================================================================== --- brlcad/trunk/src/libged/qray.h 2008-08-29 12:57:17 UTC (rev 32561) +++ brlcad/trunk/src/libged/qray.h 2008-08-29 12:58:26 UTC (rev 32562) @@ -26,6 +26,8 @@ */ /** @} */ +#include "ged.h" + #ifndef SEEN_QRAY_H #define SEEN_QRAY_H This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bo...@us...> - 2008-09-02 10:49:20
|
Revision: 32569 http://brlcad.svn.sourceforge.net/brlcad/?rev=32569&view=rev Author: bob1961 Date: 2008-09-02 10:49:28 +0000 (Tue, 02 Sep 2008) Log Message: ----------- Flesh out libged's rmap function. Modified Paths: -------------- brlcad/trunk/src/libged/ged_private.h brlcad/trunk/src/libged/rmap.c brlcad/trunk/src/libged/which.c Modified: brlcad/trunk/src/libged/ged_private.h =================================================================== --- brlcad/trunk/src/libged/ged_private.h 2008-09-01 02:18:47 UTC (rev 32568) +++ brlcad/trunk/src/libged/ged_private.h 2008-09-02 10:49:28 UTC (rev 32569) @@ -58,6 +58,17 @@ #define GED_SHADED_MODE_ALL 2 #define GED_BOOL_EVAL 3 +struct ged_id_names { + struct bu_list l; + struct bu_vls name; /**< name associated with region id */ +}; + +struct ged_id_to_names { + struct bu_list l; + int id; /**< starting id (i.e. region id or air code) */ + struct ged_id_names headName; /**< head of list of names */ +}; + struct ged_client_data { struct ged *gedp; int wireframe_color_override; @@ -325,6 +336,7 @@ fastf_t sf)); + __END_DECLS #endif /* __GED_PRIVATE_H__ */ Modified: brlcad/trunk/src/libged/rmap.c =================================================================== --- brlcad/trunk/src/libged/rmap.c 2008-09-01 02:18:47 UTC (rev 32568) +++ brlcad/trunk/src/libged/rmap.c 2008-09-02 10:49:28 UTC (rev 32569) @@ -34,6 +34,14 @@ int ged_rmap(struct ged *gedp, int argc, const char *argv[]) { + register int i; + register struct directory *dp; + struct rt_db_internal intern; + struct rt_comb_internal *comb; + struct ged_id_to_names headIdName; + struct ged_id_to_names *itnp; + struct ged_id_names *inp; + GED_CHECK_DATABASE_OPEN(gedp, BRLCAD_ERROR); GED_CHECK_ARGC_GT_0(gedp, argc, BRLCAD_ERROR); @@ -41,17 +49,97 @@ bu_vls_trunc(&gedp->ged_result_str, 0); gedp->ged_result = GED_RESULT_NULL; - /* must be wanting help */ - if (argc == 1) { + if (argc != 1) { bu_vls_printf(&gedp->ged_result_str, "Usage: %s", argv[0]); - return BRLCAD_HELP; + return BRLCAD_ERROR; } - if (MAXARGS < argc) { - bu_vls_printf(&gedp->ged_result_str, "Usage: %s", argv[0]); + if (gedp->ged_wdbp->dbip->dbi_version < 5) { + bu_vls_printf(&gedp->ged_result_str, "%s is not available prior to version 5 of the .g file format\n", argv[0]); return BRLCAD_ERROR; } + BU_LIST_INIT(&headIdName.l); + + /* For all regions not hidden */ + for (i = 0; i < RT_DBNHASH; i++) { + for (dp = gedp->ged_wdbp->dbip->dbi_Head[i]; dp != DIR_NULL; dp = dp->d_forw) { + int found = 0; + + if (!(dp->d_flags & DIR_REGION) || + (dp->d_flags & DIR_HIDDEN)) + continue; + + if (rt_db_get_internal(&intern, + dp, + gedp->ged_wdbp->dbip, + (fastf_t *)NULL, + &rt_uniresource) < 0) { + bu_vls_printf(&gedp->ged_result_str, "%s: Database read error, aborting", argv[0]); + return BRLCAD_ERROR; + } + + comb = (struct rt_comb_internal *)intern.idb_ptr; + /* check to see if the region id or air code matches one in our list */ + for (BU_LIST_FOR(itnp, ged_id_to_names, &headIdName.l)) { + if ((comb->region_id == itnp->id) || + (comb->aircode != 0 && -comb->aircode == itnp->id)) { + /* add region name to our name list for this region */ + BU_GETSTRUCT(inp, ged_id_names); + bu_vls_init(&inp->name); + bu_vls_strcpy(&inp->name, dp->d_namep); + BU_LIST_INSERT(&itnp->headName.l, &inp->l); + found = 1; + break; + } + } + + if (!found) { + /* create new id_to_names node */ + BU_GETSTRUCT(itnp, ged_id_to_names); + if (0 < comb->region_id) + itnp->id = comb->region_id; + else + itnp->id = -comb->aircode; + BU_LIST_INSERT(&headIdName.l, &itnp->l); + BU_LIST_INIT(&itnp->headName.l); + + /* add region name to our name list for this region */ + BU_GETSTRUCT(inp, ged_id_names); + bu_vls_init(&inp->name); + bu_vls_strcpy(&inp->name, dp->d_namep); + BU_LIST_INSERT(&itnp->headName.l, &inp->l); + } + +#if USE_RT_COMB_IFREE + rt_comb_ifree(&intern, &rt_uniresource); +#else + rt_db_free_internal(&intern, &rt_uniresource); +#endif + } + } + + /* place data in the result string */ + while (BU_LIST_WHILE(itnp, ged_id_to_names, &headIdName.l)) { + + /* add this id to the list */ + bu_vls_printf(&gedp->ged_result_str, "%d {", itnp->id); + + /* start sublist of names associated with this id */ + while (BU_LIST_WHILE(inp, ged_id_names, &itnp->headName.l)) { + /* add the this name to this sublist */ + bu_vls_printf(&gedp->ged_result_str, " %s", bu_vls_addr(&inp->name)); + + BU_LIST_DEQUEUE(&inp->l); + bu_vls_free(&inp->name); + bu_free((genptr_t)inp, "ged_rmap: inp"); + } + bu_vls_printf(&gedp->ged_result_str, " } ", itnp->id); + + BU_LIST_DEQUEUE(&itnp->l); + bu_free((genptr_t)itnp, "ged_rmap: itnp"); + } + return BRLCAD_OK; } Modified: brlcad/trunk/src/libged/which.c =================================================================== --- brlcad/trunk/src/libged/which.c 2008-09-01 02:18:47 UTC (rev 32568) +++ brlcad/trunk/src/libged/which.c 2008-09-02 10:49:28 UTC (rev 32569) @@ -31,17 +31,6 @@ #include "cmd.h" #include "ged_private.h" -struct ged_id_names { - struct bu_list l; - struct bu_vls name; /**< name associated with region id */ -}; - -struct ged_id_to_names { - struct bu_list l; - int id; /**< starting id (i.e. region id or air code) */ - struct ged_id_names headName; /**< head of list of names */ -}; - int ged_which(struct ged *gedp, int argc, const char *argv[]) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sta...@us...> - 2008-09-03 03:26:25
|
Revision: 32570 http://brlcad.svn.sourceforge.net/brlcad/?rev=32570&view=rev Author: starseeker Date: 2008-09-03 03:26:32 +0000 (Wed, 03 Sep 2008) Log Message: ----------- Beginnings of work on the new find command - intention is to have (insofar as it makes sense) the full power of the standard Unix style find command available in BRL-CAD. Eventually this will replace the existing find.c file, but as it is nowhere near ready for primetime keep it elsewhere for now. DO NOT ADD to makefiles. At this stage the effort is to get very basic functionality working, then build from there. If substituted in correctly this version can see objects in the database but is not intelligent about printing paths that identify different instances of the objects - much better print logic will be needed and it may require some BRL-CAD specific additions to the PLAN structure to allow carrying path strings down the db_functree call. The '*' wildcard must be escaped with '\' or it will cause a crash - this should be fixed with better sanity checking. The TCL shell is probably expanding the wildcard before processing - can this be avoided for this command? The upshot is no significant functionality yet, but indications are promising. Added Paths: ----------- brlcad/trunk/src/libged/nfind.c brlcad/trunk/src/libged/nfind.h Added: brlcad/trunk/src/libged/nfind.c =================================================================== --- brlcad/trunk/src/libged/nfind.c (rev 0) +++ brlcad/trunk/src/libged/nfind.c 2008-09-03 03:26:32 UTC (rev 32570) @@ -0,0 +1,731 @@ +/* F I N D . C + * BRL-CAD + * + * Copyright (c) 2008 United States Government as represented by + * the U.S. Army Research Laboratory. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * version 2.1 as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this file; see the file named COPYING for more + * information. + * + * Includes code from OpenBSD's find command: + * + * Copyright (c) 1990, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ +/** @file find.c + * + * The find command. + * + */ + +#include "common.h" + +#include <string.h> +#include <stdlib.h> + +#include "bio.h" +#include "cmd.h" +#include "ged_private.h" + +#include "find.h" + +int typecompare(const void *, const void *); + +/* NB: the following table must be sorted lexically. */ +static OPTION options[] = { + { "!", N_NOT, c_not, O_ZERO }, + { "(", N_OPENPAREN, c_openparen, O_ZERO }, + { ")", N_CLOSEPAREN, c_closeparen, O_ZERO }, + { "-name", N_NAME, c_name, O_ARGV }, + { "-o", N_OR, c_or, O_ZERO }, + { "-print", N_PRINT, c_print, O_ZERO }, + { "-print0", N_PRINT0, c_print0, O_ZERO }, +}; + +static PLAN * +palloc(enum ntype t, int (*f)(PLAN *, struct directory *)) +{ + PLAN *new; + + if ((new = bu_calloc(1, sizeof(PLAN), "Allocate PLAN structure"))) { + new->type = t; + new->eval = f; + return (new); + } + err(1, NULL); + /* NOTREACHED */ +} + +/* + * ( expression ) functions -- + * + * True if expression is true. + */ +int +f_expr(PLAN *plan, struct directory *entry) +{ + PLAN *p; + int state; + + for (p = plan->p_data[0]; + p && (state = (p->eval)(p, entry)); p = p->next); + return (state); +} + + +/* + * N_OPENPAREN and N_CLOSEPAREN nodes are temporary place markers. They are + * eliminated during phase 2 of find_formplan() --- the '(' node is converted + * to a N_EXPR node containing the expression and the ')' node is discarded. + */ +PLAN * +c_openparen(char *ignore, char ***ignored, int unused) +{ + return (palloc(N_OPENPAREN, (int (*)(PLAN *, struct directory *))-1)); +} + +PLAN * +c_closeparen(char *ignore, char ***ignored, int unused) +{ + return (palloc(N_CLOSEPAREN, (int (*)(PLAN *, struct directory *))-1)); +} + + +/* + * ! expression functions -- + * + * Negation of a primary; the unary NOT operator. + */ +int +f_not(PLAN *plan, struct directory *entry) +{ + PLAN *p; + int state; + + for (p = plan->p_data[0]; + p && (state = (p->eval)(p, entry)); p = p->next); + return (!state); +} + +PLAN * +c_not(char *ignore, char ***ignored, int unused) +{ + return (palloc(N_NOT, f_not)); +} + +/* + * expression -o expression functions -- + * + * Alternation of primaries; the OR operator. The second expression is + * not evaluated if the first expression is true. + */ +int +f_or(PLAN *plan, struct directory *entry) +{ + PLAN *p; + int state; + + for (p = plan->p_data[0]; + p && (state = (p->eval)(p, entry)); p = p->next); + + if (state) + return (1); + + for (p = plan->p_data[1]; + p && (state = (p->eval)(p, entry)); p = p->next); + return (state); +} + +PLAN * +c_or(char *ignore, char ***ignored, int unused) +{ + return (palloc(N_OR, f_or)); +} + + +/* + * -name functions -- + * + * True if the basename of the filename being examined + * matches pattern using Pattern Matching Notation S3.14 + */ +int +f_name(PLAN *plan, struct directory *entry) +{ + return (!fnmatch(plan->c_data, entry->d_namep, 0)); +} + +PLAN * +c_name(char *pattern, char ***ignored, int unused) +{ + PLAN *new; + + new = palloc(N_NAME, f_name); + new->c_data = pattern; + return (new); +} + + +/* + * -print functions -- + * + * Always true, causes the current pathame to be written to + * standard output. + */ +int +f_print(PLAN *plan, struct directory *entry) +{ + bu_log("%s\n", entry->d_namep); + isoutput = 0; + return(1); +} + +/* ARGSUSED */ +int +f_print0(PLAN *plan, struct directory *entry) +{ + (void)fputs(entry->d_namep, stdout); + (void)fputc('\0', stdout); + return(1); +} + +PLAN * +c_print(char *ignore, char ***ignored, int unused) +{ + isoutput = 1; + + return(palloc(N_PRINT, f_print)); +} + +PLAN * +c_print0(char *ignore, char ***ignored, int unused) +{ + isoutput = 1; + + return(palloc(N_PRINT0, f_print0)); +} + + + + +/* + * find_create -- + * create a node corresponding to a command line argument. + * + * TODO: + * add create/process function pointers to node, so we can skip + * this switch stuff. + */ +PLAN * +find_create(char ***argvp) +{ + OPTION *p; + PLAN *new; + char **argv; + + argv = *argvp; + + if ((p = option(*argv)) == NULL) + errx(1, "%s: unknown option", *argv); + ++argv; + if (p->flags & (O_ARGV|O_ARGVP) && !*argv) + errx(1, "%s: requires additional arguments", *--argv); + + switch(p->flags) { + case O_NONE: + new = NULL; + break; + case O_ZERO: + new = (p->create)(NULL, NULL, 0); + break; + case O_ARGV: + new = (p->create)(*argv++, NULL, 0); + break; + case O_ARGVP: + new = (p->create)(NULL, &argv, p->token == N_OK); + break; + default: + return NULL; + } + *argvp = argv; + return (new); +} + +OPTION * +option(char *name) +{ + OPTION tmp; + + tmp.name = name; + return ((OPTION *)bsearch(&tmp, options, + sizeof(options)/sizeof(OPTION), sizeof(OPTION), typecompare)); +} + +int +typecompare(const void *a, const void *b) +{ + return (strcmp(((OPTION *)a)->name, ((OPTION *)b)->name)); +} + + + + +/* + * yanknode -- + * destructively removes the top from the plan + */ +static PLAN * +yanknode(PLAN **planp) /* pointer to top of plan (modified) */ +{ + PLAN *node; /* top node removed from the plan */ + + if ((node = (*planp)) == NULL) + return (NULL); + (*planp) = (*planp)->next; + node->next = NULL; + return (node); +} + +/* + * yankexpr -- + * Removes one expression from the plan. This is used mainly by + * paren_squish. In comments below, an expression is either a + * simple node or a N_EXPR node containing a list of simple nodes. + */ +static PLAN * +yankexpr(PLAN **planp) /* pointer to top of plan (modified) */ +{ + PLAN *next; /* temp node holding subexpression results */ + PLAN *node; /* pointer to returned node or expression */ + PLAN *tail; /* pointer to tail of subplan */ + PLAN *subplan; /* pointer to head of ( ) expression */ + extern int f_expr(PLAN *, struct directory *); + + /* first pull the top node from the plan */ + if ((node = yanknode(planp)) == NULL) + return (NULL); + + /* + * If the node is an '(' then we recursively slurp up expressions + * until we find its associated ')'. If it's a closing paren we + * just return it and unwind our recursion; all other nodes are + * complete expressions, so just return them. + */ + if (node->type == N_OPENPAREN) + for (tail = subplan = NULL;;) { + if ((next = yankexpr(planp)) == NULL) + errx(1, "(: missing closing ')'"); + /* + * If we find a closing ')' we store the collected + * subplan in our '(' node and convert the node to + * a N_EXPR. The ')' we found is ignored. Otherwise, + * we just continue to add whatever we get to our + * subplan. + */ + if (next->type == N_CLOSEPAREN) { + if (subplan == NULL) + errx(1, "(): empty inner expression"); + node->p_data[0] = subplan; + node->type = N_EXPR; + node->eval = f_expr; + break; + } else { + if (subplan == NULL) + tail = subplan = next; + else { + tail->next = next; + tail = next; + } + tail->next = NULL; + } + } + return (node); +} + + +/* + * paren_squish -- + * replaces "parentheisized" plans in our search plan with "expr" nodes. + */ +PLAN * +paren_squish(PLAN *plan) /* plan with ( ) nodes */ +{ + PLAN *expr; /* pointer to next expression */ + PLAN *tail; /* pointer to tail of result plan */ + PLAN *result; /* pointer to head of result plan */ + + result = tail = NULL; + + /* + * the basic idea is to have yankexpr do all our work and just + * collect it's results together. + */ + while ((expr = yankexpr(&plan)) != NULL) { + /* + * if we find an unclaimed ')' it means there is a missing + * '(' someplace. + */ + if (expr->type == N_CLOSEPAREN) + errx(1, "): no beginning '('"); + + /* add the expression to our result plan */ + if (result == NULL) + tail = result = expr; + else { + tail->next = expr; + tail = expr; + } + tail->next = NULL; + } + return (result); +} + +/* + * not_squish -- + * compresses "!" expressions in our search plan. + */ +PLAN * +not_squish(PLAN *plan) /* plan to process */ +{ + PLAN *next; /* next node being processed */ + PLAN *node; /* temporary node used in N_NOT processing */ + PLAN *tail; /* pointer to tail of result plan */ + PLAN *result; /* pointer to head of result plan */ + + tail = result = next = NULL; + + while ((next = yanknode(&plan)) != NULL) { + /* + * if we encounter a ( expression ) then look for nots in + * the expr subplan. + */ + if (next->type == N_EXPR) + next->p_data[0] = not_squish(next->p_data[0]); + + /* + * if we encounter a not, then snag the next node and place + * it in the not's subplan. As an optimization we compress + * several not's to zero or one not. + */ + if (next->type == N_NOT) { + int notlevel = 1; + + node = yanknode(&plan); + while (node != NULL && node->type == N_NOT) { + ++notlevel; + node = yanknode(&plan); + } + if (node == NULL) + errx(1, "!: no following expression"); + if (node->type == N_OR) + errx(1, "!: nothing between ! and -o"); + if (node->type == N_EXPR) + node = not_squish(node); + if (notlevel % 2 != 1) + next = node; + else + next->p_data[0] = node; + } + + /* add the node to our result plan */ + if (result == NULL) + tail = result = next; + else { + tail->next = next; + tail = next; + } + tail->next = NULL; + } + return (result); +} + + +/* + * or_squish -- + * compresses -o expressions in our search plan. + */ +PLAN * +or_squish(PLAN *plan) /* plan with ors to be squished */ +{ + PLAN *next; /* next node being processed */ + PLAN *tail; /* pointer to tail of result plan */ + PLAN *result; /* pointer to head of result plan */ + + tail = result = next = NULL; + + while ((next = yanknode(&plan)) != NULL) { + /* + * if we encounter a ( expression ) then look for or's in + * the expr subplan. + */ + if (next->type == N_EXPR) + next->p_data[0] = or_squish(next->p_data[0]); + + /* if we encounter a not then look for not's in the subplan */ + if (next->type == N_NOT) + next->p_data[0] = or_squish(next->p_data[0]); + + /* + * if we encounter an or, then place our collected plan in the + * or's first subplan and then recursively collect the + * remaining stuff into the second subplan and return the or. + */ + if (next->type == N_OR) { + if (result == NULL) + errx(1, "-o: no expression before -o"); + next->p_data[0] = result; + next->p_data[1] = or_squish(plan); + if (next->p_data[1] == NULL) + errx(1, "-o: no expression after -o"); + return (next); + } + + /* add the node to our result plan */ + if (result == NULL) + tail = result = next; + else { + tail->next = next; + tail = next; + } + tail->next = NULL; + } + return (result); +} + + + + +/* + * find_formplan -- + * process the command line and create a "plan" corresponding to the + * command arguments. + */ +PLAN * +find_formplan(char **argv) +{ + PLAN *plan, *tail, *new; + + /* + * for each argument in the command line, determine what kind of node + * it is, create the appropriate node type and add the new plan node + * to the end of the existing plan. The resulting plan is a linked + * list of plan nodes. For example, the string: + * + * % find . -name foo -newer bar -print + * + * results in the plan: + * + * [-name foo]--> [-newer bar]--> [-print] + * + * in this diagram, `[-name foo]' represents the plan node generated + * by c_name() with an argument of foo and `-->' represents the + * plan->next pointer. + */ + for (plan = tail = NULL; *argv;) { + if (!(new = find_create(&argv))) + continue; + if (plan == NULL) + tail = plan = new; + else { + tail->next = new; + tail = new; + } + } + + /* + * if the user didn't specify one of -print, -ok or -exec, then -print + * is assumed so we bracket the current expression with parens, if + * necessary, and add a -print node on the end. + */ + if (!isoutput) { + if (plan == NULL) { + new = c_print(NULL, NULL, 0); + tail = plan = new; + } else { + new = c_openparen(NULL, NULL, 0); + new->next = plan; + plan = new; + new = c_closeparen(NULL, NULL, 0); + tail->next = new; + tail = new; + new = c_print(NULL, NULL, 0); + tail->next = new; + tail = new; + } + } + + /* + * the command line has been completely processed into a search plan + * except for the (, ), !, and -o operators. Rearrange the plan so + * that the portions of the plan which are affected by the operators + * are moved into operator nodes themselves. For example: + * + * [!]--> [-name foo]--> [-print] + * + * becomes + * + * [! [-name foo] ]--> [-print] + * + * and + * + * [(]--> [-depth]--> [-name foo]--> [)]--> [-print] + * + * becomes + * + * [expr [-depth]-->[-name foo] ]--> [-print] + * + * operators are handled in order of precedence. + */ + + plan = paren_squish(plan); /* ()'s */ + /*plan = not_squish(plan);*/ /* !'s */ + /*plan = or_squish(plan);*/ /* -o's */ + return (plan); +} + +void +find_execute_plans(struct db_i *dbip, struct directory *dp, genptr_t inputplan) { + PLAN *p; + PLAN *plan = (PLAN *)inputplan; + for (p = plan; p && (p->eval)(p, dp); p = p->next) + ; + +} + +void +find_execute(PLAN *plan, /* search plan */ + char *pathname, /* array of pathnames to traverse */ + struct rt_wdb *wdbp) +{ + struct directory *dp; + int i; + if (strcmp(pathname, "/") != 0) { + dp = db_lookup(wdbp->dbip, pathname, LOOKUP_NOISY); + db_functree(wdbp->dbip, dp, find_execute_plans, find_execute_plans, wdbp->wdb_resp, plan); + } else { + for (i = 0; i < RT_DBNHASH; i++) { + for (dp = wdbp->dbip->dbi_Head[i]; dp != DIR_NULL; dp = dp->d_forw) { + if (dp->d_nref == 0 && !(dp->d_flags & DIR_HIDDEN) && (dp->d_addr != RT_DIR_PHONY_ADDR)) { + db_functree(wdbp->dbip, dp, find_execute_plans, find_execute_plans, wdbp->wdb_resp, plan); + } + } + } + } +} + + +static void +ged_find_ref(struct db_i *dbip, + struct rt_comb_internal *comb, + union tree *comb_leaf, + genptr_t object, + genptr_t comb_name_ptr, + genptr_t user_ptr3) +{ + char *obj_name; + char *comb_name; + struct ged *gedp = (struct ged *)user_ptr3; + + RT_CK_TREE(comb_leaf); + + obj_name = (char *)object; + if (strcmp(comb_leaf->tr_l.tl_name, obj_name)) + return; + + comb_name = (char *)comb_name_ptr; + + bu_vls_printf(&gedp->ged_result_str, "%s", comb_name); +} + +int isoutput; + +int +ged_find(struct ged *gedp, int argc, char *argv[]) +{ + register int i, k; + register struct directory *dp; + struct rt_db_internal intern; + register struct rt_comb_internal *comb=(struct rt_comb_internal *)NULL; + int c; + int aflag = 0; + static const char *usage = "<objects>"; + struct ged_find_ref *gfref; + + GED_CHECK_DATABASE_OPEN(gedp, BRLCAD_ERROR); + GED_CHECK_ARGC_GT_0(gedp, argc, BRLCAD_ERROR); + bu_vls_trunc(&gedp->ged_result_str, 0); + gedp->ged_result = GED_RESULT_NULL; + + + find_execute(find_formplan(argv), "/", gedp); + + return BRLCAD_OK; +} + +int +wdb_find_cmd2(struct rt_wdb *wdbp, + Tcl_Interp *interp, + int argc, + char *argv[]) +{ + register int i, k; + register struct directory *dp; + struct rt_db_internal intern; + register struct rt_comb_internal *comb=(struct rt_comb_internal *)NULL; + struct bu_vls vls; + int aflag = 0; /* look at all objects */ + char *defaultdir = "/"; + isoutput = 0; + if (!(argv[1][0] == '-')) { + find_execute(find_formplan(&argv[2]), argv[1], wdbp); + } else { + find_execute(find_formplan(&argv[1]), defaultdir, wdbp); + } + return TCL_OK; +} + + + +/* + * Local Variables: + * tab-width: 8 + * mode: C + * indent-tabs-mode: t + * c-file-style: "stroustrup" + * End: + * ex: shiftwidth=4 tabstop=8 + */ Property changes on: brlcad/trunk/src/libged/nfind.c ___________________________________________________________________ Added: svn:mime-type + text/plain Added: svn:eol-style + native Added: brlcad/trunk/src/libged/nfind.h =================================================================== --- brlcad/trunk/src/libged/nfind.h (rev 0) +++ brlcad/trunk/src/libged/nfind.h 2008-09-03 03:26:32 UTC (rev 32570) @@ -0,0 +1,156 @@ +/* F I N D . H + * BRL-CAD + * + * Copyright (c) 2008 United States Government as represented by + * the U.S. Army Research Laboratory. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * version 2.1 as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this file; see the file named COPYING for more + * information. + * + * Includes code from OpenBSD's find command: + * + * Copyright (c) 1990, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Cimarron D. Taylor of the University of California, Berkeley. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + */ + + +#include <sys/cdefs.h> + +/* node type */ +enum ntype { + N_AND = 1, /* must start > 0 */ + N_CLOSEPAREN, N_DEPTH, N_EMPTY, N_EXEC, N_EXECDIR, N_EXPR, + N_FLAGS, N_INAME, N_LS, N_MAXDEPTH, + N_MINDEPTH, N_NAME, N_NOT, N_OK, N_OPENPAREN, N_OR, N_PATH, + N_PRINT, N_PRINT0, N_PRUNE, N_TYPE +}; + + +/* node definition */ +typedef struct _plandata { + struct _plandata *next; /* next node */ + int (*eval)(struct _plandata *, struct directory *); + /* node evaluation function */ +#define F_EQUAL 1 /* [acm]time inum links size */ +#define F_LESSTHAN 2 +#define F_GREATER 3 +#define F_NEEDOK 1 /* exec ok */ +#define F_MTFLAG 1 /* fstype */ +#define F_MTTYPE 2 +#define F_ATLEAST 1 /* perm */ + int flags; /* private flags */ + enum ntype type; /* plan node type */ + union { + gid_t _g_data; /* gid */ + struct { + u_int _f_flags; + u_int _f_mask; + } fl; + struct _plandata *_p_data[2]; /* PLAN trees */ + struct _ex { + char **_e_argv; /* argv array */ + char **_e_orig; /* original strings */ + int *_e_len; /* allocated length */ + } ex; + char *_a_data[2]; /* array of char pointers */ + char *_c_data; /* char pointer */ + int _max_data; /* tree depth */ + int _min_data; /* tree depth */ + } p_un; +} PLAN; +#define a_data p_un._a_data +#define c_data p_un._c_data +#define fl_flags p_un.fl._f_flags +#define fl_mask p_un.fl._f_mask +#define g_data p_un._g_data +#define max_data p_un._max_data +#define min_data p_un._min_data +#define p_data p_un._p_data +#define e_argv p_un.ex._e_argv +#define e_orig p_un.ex._e_orig +#define e_len p_un.ex._e_len + +typedef struct _option { + char *name; /* option name */ + enum ntype token; /* token type */ + PLAN *(*create)(char *, char ***, int); /* create function */ +#define O_NONE 0x01 /* no call required */ +#define O_ZERO 0x02 /* pass: nothing */ +#define O_ARGV 0x04 /* pass: argv, increment argv */ +#define O_ARGVP 0x08 /* pass: *argv, N_OK || N_EXEC || N_EXECDIR */ + int flags; +} OPTION; + + +void brace_subst(char *, char **, char *, int); +PLAN *find_create(char ***); +void find_execute(PLAN *, char *, struct rt_wdb *); +PLAN *find_formplan(char **); +PLAN *not_squish(PLAN *); +OPTION *option(char *); +PLAN *or_squish(PLAN *); +PLAN *paren_squish(PLAN *); +struct stat; +void printlong(char *, char *, struct stat *); +int queryuser(char **); +void show_path(int); + +PLAN *c_depth(char *, char ***, int); +PLAN *c_empty(char *, char ***, int); +PLAN *c_exec(char *, char ***, int); +PLAN *c_execdir(char *, char ***, int); +PLAN *c_flags(char *, char ***, int); +PLAN *c_iname(char *, char ***, int); +PLAN *c_ls(char *, char ***, int); +PLAN *c_maxdepth(char *, char ***, int); +PLAN *c_mindepth(char *, char ***, int); +PLAN *c_name(char *, char ***, int); +PLAN *c_path(char *, char ***, int); +PLAN *c_print(char *, char ***, int); +PLAN *c_print0(char *, char ***, int); +PLAN *c_prune(char *, char ***, int); +PLAN *c_type(char *, char ***, int); +PLAN *c_openparen(char *, char ***, int); +PLAN *c_closeparen(char *, char ***, int); +PLAN *c_not(char *, char ***, int); +PLAN *c_or(char *, char ***, int); + +extern int isdepth, isoutput; Property changes on: brlcad/trunk/src/libged/nfind.h ___________________________________________________________________ Added: svn:mime-type + text/plain Added: svn:eol-style + native This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sta...@us...> - 2008-09-05 04:01:47
|
Revision: 32575 http://brlcad.svn.sourceforge.net/brlcad/?rev=32575&view=rev Author: starseeker Date: 2008-09-05 04:01:56 +0000 (Fri, 05 Sep 2008) Log Message: ----------- Update the find routines to use arguments to work on the plans, and return integers to allow error mechanisms to do their thing. MGED doesn't crash any more when an unescaped * is expanded by TCL. Modified Paths: -------------- brlcad/trunk/src/libged/nfind.c brlcad/trunk/src/libged/nfind.h Modified: brlcad/trunk/src/libged/nfind.c =================================================================== --- brlcad/trunk/src/libged/nfind.c 2008-09-05 01:08:43 UTC (rev 32574) +++ brlcad/trunk/src/libged/nfind.c 2008-09-05 04:01:56 UTC (rev 32575) @@ -86,7 +86,7 @@ new->eval = f; return (new); } - err(1, NULL); + bu_exit(1, NULL); /* NOTREACHED */ } @@ -112,16 +112,18 @@ * eliminated during phase 2 of find_formplan() --- the '(' node is converted * to a N_EXPR node containing the expression and the ')' node is discarded. */ -PLAN * -c_openparen(char *ignore, char ***ignored, int unused) +int +c_openparen(char *ignore, char ***ignored, int unused, PLAN **resultplan) { - return (palloc(N_OPENPAREN, (int (*)(PLAN *, struct db_full_path *))-1)); + (*resultplan) = (palloc(N_OPENPAREN, (int (*)(PLAN *, struct db_full_path *))-1)); + return BRLCAD_OK; } -PLAN * -c_closeparen(char *ignore, char ***ignored, int unused) +int +c_closeparen(char *ignore, char ***ignored, int unused, PLAN **resultplan) { - return (palloc(N_CLOSEPAREN, (int (*)(PLAN *, struct db_full_path *))-1)); + (*resultplan) = (palloc(N_CLOSEPAREN, (int (*)(PLAN *, struct db_full_path *))-1)); + return BRLCAD_OK; } @@ -141,10 +143,11 @@ return (!state); } -PLAN * -c_not(char *ignore, char ***ignored, int unused) +int +c_not(char *ignore, char ***ignored, int unused, PLAN **resultplan) { - return (palloc(N_NOT, f_not)); + (*resultplan) = (palloc(N_NOT, f_not)); + return BRLCAD_OK; } /* @@ -170,10 +173,11 @@ return (state); } -PLAN * -c_or(char *ignore, char ***ignored, int unused) +int +c_or(char *ignore, char ***ignored, int unused, PLAN **resultplan) { - return (palloc(N_OR, f_or)); + (*resultplan) = (palloc(N_OR, f_or)); + return BRLCAD_OK; } @@ -189,14 +193,15 @@ return (!fnmatch(plan->c_data, DB_FULL_PATH_CUR_DIR(entry)->d_namep, 0)); } -PLAN * -c_name(char *pattern, char ***ignored, int unused) +int +c_name(char *pattern, char ***ignored, int unused, PLAN **resultplan) { PLAN *new; new = palloc(N_NAME, f_name); new->c_data = pattern; - return (new); + (*resultplan) = new; + return BRLCAD_OK; } @@ -223,20 +228,22 @@ return(1); } -PLAN * -c_print(char *ignore, char ***ignored, int unused) +int +c_print(char *ignore, char ***ignored, int unused, PLAN **resultplan) { isoutput = 1; - - return(palloc(N_PRINT, f_print)); + + (*resultplan) = palloc(N_PRINT, f_print); + return BRLCAD_OK; } -PLAN * -c_print0(char *ignore, char ***ignored, int unused) +int +c_print0(char *ignore, char ***ignored, int unused, PLAN **resultplan) { isoutput = 1; - return(palloc(N_PRINT0, f_print0)); + (*resultplan) = palloc(N_PRINT0, f_print0); + return BRLCAD_OK; } @@ -250,8 +257,8 @@ * add create/process function pointers to node, so we can skip * this switch stuff. */ -PLAN * -find_create(char ***argvp) +int +find_create(char ***argvp, PLAN **resultplan) { OPTION *p; PLAN *new; @@ -259,30 +266,34 @@ argv = *argvp; - if ((p = option(*argv)) == NULL) - errx(1, "%s: unknown option", *argv); + if ((p = option(*argv)) == NULL) { + bu_log("%s: unknown option passed to find_create\n", *argv); + return BRLCAD_ERROR; + } ++argv; - if (p->flags & (O_ARGV|O_ARGVP) && !*argv) - errx(1, "%s: requires additional arguments", *--argv); - + if (p->flags & (O_ARGV|O_ARGVP) && !*argv) { + bu_log("%s: requires additional arguments\n", *--argv); + return BRLCAD_ERROR; + } switch(p->flags) { case O_NONE: new = NULL; break; case O_ZERO: - new = (p->create)(NULL, NULL, 0); + (p->create)(NULL, NULL, 0, &new); break; case O_ARGV: - new = (p->create)(*argv++, NULL, 0); + (p->create)(*argv++, NULL, 0, &new); break; case O_ARGVP: - new = (p->create)(NULL, &argv, p->token == N_OK); + (p->create)(NULL, &argv, p->token == N_OK, &new); break; default: - return NULL; + return BRLCAD_OK; } *argvp = argv; - return (new); + (*resultplan) = new; + return BRLCAD_OK; } OPTION * @@ -326,8 +337,8 @@ * paren_squish. In comments below, an expression is either a * simple node or a N_EXPR node containing a list of simple nodes. */ -static PLAN * -yankexpr(PLAN **planp) /* pointer to top of plan (modified) */ +int +yankexpr(PLAN **planp, PLAN **resultplan) /* pointer to top of plan (modified) */ { PLAN *next; /* temp node holding subexpression results */ PLAN *node; /* pointer to returned node or expression */ @@ -336,9 +347,10 @@ extern int f_expr(PLAN *, struct db_full_path *); /* first pull the top node from the plan */ - if ((node = yanknode(planp)) == NULL) - return (NULL); - + if ((node = yanknode(planp)) == NULL) { + (*resultplan) = NULL; + return BRLCAD_OK; + } /* * If the node is an '(' then we recursively slurp up expressions * until we find its associated ')'. If it's a closing paren we @@ -347,8 +359,11 @@ */ if (node->type == N_OPENPAREN) for (tail = subplan = NULL;;) { - if ((next = yankexpr(planp)) == NULL) - errx(1, "(: missing closing ')'"); + yankexpr(planp, &next); + if (next == NULL) { + bu_log("(: missing closing ')'\n"); + return BRLCAD_ERROR; + } /* * If we find a closing ')' we store the collected * subplan in our '(' node and convert the node to @@ -358,7 +373,7 @@ */ if (next->type == N_CLOSEPAREN) { if (subplan == NULL) - errx(1, "(): empty inner expression"); + bu_exit(1, "(): empty inner expression"); node->p_data[0] = subplan; node->type = N_EXPR; node->eval = f_expr; @@ -373,7 +388,8 @@ tail->next = NULL; } } - return (node); + (*resultplan) = node; + return BRLCAD_OK; } @@ -381,8 +397,8 @@ * paren_squish -- * replaces "parentheisized" plans in our search plan with "expr" nodes. */ -PLAN * -paren_squish(PLAN *plan) /* plan with ( ) nodes */ +int +paren_squish(PLAN *plan, PLAN **resultplan) /* plan with ( ) nodes */ { PLAN *expr; /* pointer to next expression */ PLAN *tail; /* pointer to tail of result plan */ @@ -394,13 +410,14 @@ * the basic idea is to have yankexpr do all our work and just * collect it's results together. */ - while ((expr = yankexpr(&plan)) != NULL) { + if (yankexpr(&plan, &expr) != BRLCAD_OK) return BRLCAD_ERROR; + while (expr != NULL) { /* * if we find an unclaimed ')' it means there is a missing * '(' someplace. */ if (expr->type == N_CLOSEPAREN) - errx(1, "): no beginning '('"); + bu_exit(1, "): no beginning '('"); /* add the expression to our result plan */ if (result == NULL) @@ -410,16 +427,18 @@ tail = expr; } tail->next = NULL; + if (yankexpr(&plan, &expr) != BRLCAD_OK) return BRLCAD_ERROR; } - return (result); + (*resultplan) = result; + return BRLCAD_OK; } /* * not_squish -- * compresses "!" expressions in our search plan. */ -PLAN * -not_squish(PLAN *plan) /* plan to process */ +int +not_squish(PLAN *plan, PLAN **resultplan) /* plan to process */ { PLAN *next; /* next node being processed */ PLAN *node; /* temporary node used in N_NOT processing */ @@ -434,7 +453,7 @@ * the expr subplan. */ if (next->type == N_EXPR) - next->p_data[0] = not_squish(next->p_data[0]); + not_squish(next->p_data[0], &(next->p_data[0])); /* * if we encounter a not, then snag the next node and place @@ -450,11 +469,11 @@ node = yanknode(&plan); } if (node == NULL) - errx(1, "!: no following expression"); + bu_exit(1, "!: no following expression"); if (node->type == N_OR) - errx(1, "!: nothing between ! and -o"); + bu_exit(1, "!: nothing between ! and -o"); if (node->type == N_EXPR) - node = not_squish(node); + not_squish(node, &node); if (notlevel % 2 != 1) next = node; else @@ -470,7 +489,8 @@ } tail->next = NULL; } - return (result); + (*resultplan) = result; + return BRLCAD_OK; } @@ -478,8 +498,8 @@ * or_squish -- * compresses -o expressions in our search plan. */ -PLAN * -or_squish(PLAN *plan) /* plan with ors to be squished */ +int +or_squish(PLAN *plan, PLAN **resultplan) /* plan with ors to be squished */ { PLAN *next; /* next node being processed */ PLAN *tail; /* pointer to tail of result plan */ @@ -493,11 +513,11 @@ * the expr subplan. */ if (next->type == N_EXPR) - next->p_data[0] = or_squish(next->p_data[0]); + or_squish(next->p_data[0], &(next->p_data[0])); /* if we encounter a not then look for not's in the subplan */ if (next->type == N_NOT) - next->p_data[0] = or_squish(next->p_data[0]); + or_squish(next->p_data[0], &(next->p_data[0])); /* * if we encounter an or, then place our collected plan in the @@ -506,12 +526,13 @@ */ if (next->type == N_OR) { if (result == NULL) - errx(1, "-o: no expression before -o"); + bu_exit(1, "-o: no expression before -o"); next->p_data[0] = result; - next->p_data[1] = or_squish(plan); + or_squish(plan, &(next->p_data[1])); if (next->p_data[1] == NULL) - errx(1, "-o: no expression after -o"); - return (next); + bu_exit(1, "-o: no expression after -o"); + (*resultplan) = next; + return BRLCAD_OK; } /* add the node to our result plan */ @@ -523,7 +544,8 @@ } tail->next = NULL; } - return (result); + (*resultplan) = result; + return BRLCAD_OK; } @@ -534,8 +556,8 @@ * process the command line and create a "plan" corresponding to the * command arguments. */ -PLAN * -find_formplan(char **argv) +int +find_formplan(char **argv, PLAN **resultplan) { PLAN *plan, *tail, *new; @@ -556,7 +578,8 @@ * plan->next pointer. */ for (plan = tail = NULL; *argv;) { - if (!(new = find_create(&argv))) + if (find_create(&argv, &new) != BRLCAD_OK) return BRLCAD_ERROR; + if (!(new)) continue; if (plan == NULL) tail = plan = new; @@ -573,16 +596,16 @@ */ if (!isoutput) { if (plan == NULL) { - new = c_print(NULL, NULL, 0); + c_print(NULL, NULL, 0, &new); tail = plan = new; } else { - new = c_openparen(NULL, NULL, 0); + c_openparen(NULL, NULL, 0, &new); new->next = plan; plan = new; - new = c_closeparen(NULL, NULL, 0); + c_closeparen(NULL, NULL, 0, &new); tail->next = new; tail = new; - new = c_print(NULL, NULL, 0); + c_print(NULL, NULL, 0, &new); tail->next = new; tail = new; } @@ -611,10 +634,11 @@ * operators are handled in order of precedence. */ - plan = paren_squish(plan); /* ()'s */ + paren_squish(plan, &plan); /* ()'s */ /*plan = not_squish(plan);*/ /* !'s */ /*plan = or_squish(plan);*/ /* -o's */ - return (plan); + (*resultplan) = plan; + return BRLCAD_OK; } void @@ -651,13 +675,20 @@ register struct rt_comb_internal *comb=(struct rt_comb_internal *)NULL; struct bu_vls vls; int aflag = 0; /* look at all objects */ + PLAN *dbplan; struct db_full_path dfp; + db_full_path_init(&dfp); db_update_nref(wdbp->dbip, &rt_uniresource); if (!(argv[1][0] == '-') && (strcmp(argv[1],"/") != 0)) { db_string_to_path(&dfp, wdbp->dbip, argv[1]); isoutput = 0; - find_execute(find_formplan(&argv[2]), &dfp, wdbp); + if (find_formplan(&argv[2], &dbplan) != BRLCAD_OK) { + Tcl_AppendResult(interp, "Failed to build find plan.\n", (char *)NULL); + return TCL_ERROR; + } else { + find_execute(dbplan, &dfp, wdbp); + } } else { for (i = 0; i < RT_DBNHASH; i++) { for (dp = wdbp->dbip->dbi_Head[i]; dp != DIR_NULL; dp = dp->d_forw) { @@ -665,9 +696,19 @@ db_string_to_path(&dfp, wdbp->dbip, dp->d_namep); isoutput = 0; if (argv[1][0] == '-') { - find_execute(find_formplan(&argv[1]), &dfp, wdbp); + if (find_formplan(&argv[1], &dbplan) != BRLCAD_OK) { + Tcl_AppendResult(interp, "Failed to build find plan.\n", (char *)NULL); + return TCL_ERROR; + } else { + find_execute(dbplan, &dfp, wdbp); + } } else { - find_execute(find_formplan(&argv[2]), &dfp, wdbp); + if (find_formplan(&argv[2], &dbplan) != BRLCAD_OK) { + Tcl_AppendResult(interp, "Failed to build find plan.\n", (char *)NULL); + return TCL_ERROR; + } else { + find_execute(dbplan, &dfp, wdbp); + } } } } Modified: brlcad/trunk/src/libged/nfind.h =================================================================== --- brlcad/trunk/src/libged/nfind.h 2008-09-05 01:08:43 UTC (rev 32574) +++ brlcad/trunk/src/libged/nfind.h 2008-09-05 04:01:56 UTC (rev 32575) @@ -111,7 +111,7 @@ typedef struct _option { char *name; /* option name */ enum ntype token; /* token type */ - PLAN *(*create)(char *, char ***, int); /* create function */ + int (*create)(char *, char ***, int, PLAN **); /* create function */ #define O_NONE 0x01 /* no call required */ #define O_ZERO 0x02 /* pass: nothing */ #define O_ARGV 0x04 /* pass: argv, increment argv */ @@ -121,13 +121,13 @@ void brace_subst(char *, char **, char *, int); -PLAN *find_create(char ***); +int find_create(char ***, PLAN **); void find_execute(PLAN *, struct db_full_path *, struct rt_wdb *); -PLAN *find_formplan(char **); -PLAN *not_squish(PLAN *); +int find_formplan(char **, PLAN **); +int not_squish(PLAN *, PLAN **); OPTION *option(char *); -PLAN *or_squish(PLAN *); -PLAN *paren_squish(PLAN *); +int or_squish(PLAN *, PLAN **); +int paren_squish(PLAN *, PLAN **); struct stat; void printlong(char *, char *, struct stat *); int queryuser(char **); @@ -142,15 +142,15 @@ PLAN *c_ls(char *, char ***, int); PLAN *c_maxdepth(char *, char ***, int); PLAN *c_mindepth(char *, char ***, int); -PLAN *c_name(char *, char ***, int); +int c_name(char *, char ***, int, PLAN **); PLAN *c_path(char *, char ***, int); -PLAN *c_print(char *, char ***, int); -PLAN *c_print0(char *, char ***, int); +int c_print(char *, char ***, int, PLAN **); +int c_print0(char *, char ***, int, PLAN **); PLAN *c_prune(char *, char ***, int); PLAN *c_type(char *, char ***, int); -PLAN *c_openparen(char *, char ***, int); -PLAN *c_closeparen(char *, char ***, int); -PLAN *c_not(char *, char ***, int); -PLAN *c_or(char *, char ***, int); +int c_openparen(char *, char ***, int, PLAN **); +int c_closeparen(char *, char ***, int, PLAN **); +int c_not(char *, char ***, int, PLAN **); +int c_or(char *, char ***, int, PLAN **); extern int isdepth, isoutput; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sta...@us...> - 2008-09-05 21:40:22
|
Revision: 32582 http://brlcad.svn.sourceforge.net/brlcad/?rev=32582&view=rev Author: starseeker Date: 2008-09-05 21:40:32 +0000 (Fri, 05 Sep 2008) Log Message: ----------- Add the ability to use nfind with attributes, e.g. nfind -attr rgb=255/255/255 -attr oshader=glass to find all the objects with colorless glass as a shader. Modified Paths: -------------- brlcad/trunk/src/libged/nfind.c brlcad/trunk/src/libged/nfind.h Modified: brlcad/trunk/src/libged/nfind.c =================================================================== --- brlcad/trunk/src/libged/nfind.c 2008-09-05 19:57:13 UTC (rev 32581) +++ brlcad/trunk/src/libged/nfind.c 2008-09-05 21:40:32 UTC (rev 32582) @@ -1,4 +1,4 @@ -/* F I N D . C +/* N F I N D . C * BRL-CAD * * Copyright (c) 2008 United States Government as represented by @@ -46,9 +46,9 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ -/** @file find.c +/** @file nfind.c * - * The find command. + * The nfind command. * */ @@ -70,14 +70,15 @@ { "!", N_NOT, c_not, O_ZERO }, { "(", N_OPENPAREN, c_openparen, O_ZERO }, { ")", N_CLOSEPAREN, c_closeparen, O_ZERO }, + { "-attr", N_ATTR, c_attr, O_ARGV }, { "-name", N_NAME, c_name, O_ARGV }, - { "-o", N_OR, c_or, O_ZERO }, - { "-print", N_PRINT, c_print, O_ZERO }, - { "-print0", N_PRINT0, c_print0, O_ZERO }, + { "-o", N_OR, c_or, O_ZERO }, + { "-print", N_PRINT, c_print, O_ZERO }, + { "-print0", N_PRINT0, c_print0, O_ZERO }, }; static PLAN * -palloc(enum ntype t, int (*f)(PLAN *, struct db_full_path *)) +palloc(enum ntype t, int (*f)(PLAN *, struct db_full_path *, struct db_i *)) { PLAN *new; @@ -96,13 +97,13 @@ * True if expression is true. */ int -f_expr(PLAN *plan, struct db_full_path *entry) +f_expr(PLAN *plan, struct db_full_path *entry, struct db_i *dbip) { PLAN *p; int state; for (p = plan->p_data[0]; - p && (state = (p->eval)(p, entry)); p = p->next); + p && (state = (p->eval)(p, entry, dbip)); p = p->next); return (state); } @@ -115,14 +116,14 @@ int c_openparen(char *ignore, char ***ignored, int unused, PLAN **resultplan) { - (*resultplan) = (palloc(N_OPENPAREN, (int (*)(PLAN *, struct db_full_path *))-1)); + (*resultplan) = (palloc(N_OPENPAREN, (int (*)(PLAN *, struct db_full_path *, struct db_i *))-1)); return BRLCAD_OK; } int c_closeparen(char *ignore, char ***ignored, int unused, PLAN **resultplan) { - (*resultplan) = (palloc(N_CLOSEPAREN, (int (*)(PLAN *, struct db_full_path *))-1)); + (*resultplan) = (palloc(N_CLOSEPAREN, (int (*)(PLAN *, struct db_full_path *, struct db_i *))-1)); return BRLCAD_OK; } @@ -133,13 +134,13 @@ * Negation of a primary; the unary NOT operator. */ int -f_not(PLAN *plan, struct db_full_path *entry) +f_not(PLAN *plan, struct db_full_path *entry, struct db_i *dbip) { PLAN *p; int state; for (p = plan->p_data[0]; - p && (state = (p->eval)(p, entry)); p = p->next); + p && (state = (p->eval)(p, entry, dbip)); p = p->next); return (!state); } @@ -157,19 +158,19 @@ * not evaluated if the first expression is true. */ int -f_or(PLAN *plan, struct db_full_path *entry) +f_or(PLAN *plan, struct db_full_path *entry, struct db_i *dbip) { PLAN *p; int state; for (p = plan->p_data[0]; - p && (state = (p->eval)(p, entry)); p = p->next); + p && (state = (p->eval)(p, entry, dbip)); p = p->next); if (state) return (1); for (p = plan->p_data[1]; - p && (state = (p->eval)(p, entry)); p = p->next); + p && (state = (p->eval)(p, entry, dbip)); p = p->next); return (state); } @@ -188,7 +189,7 @@ * matches pattern using Pattern Matching Notation S3.14 */ int -f_name(PLAN *plan, struct db_full_path *entry) +f_name(PLAN *plan, struct db_full_path *entry, struct db_i *dbip) { return (!fnmatch(plan->c_data, DB_FULL_PATH_CUR_DIR(entry)->d_namep, 0)); } @@ -204,7 +205,90 @@ return BRLCAD_OK; } +/* + * -attr functions -- + * + * True if the database object being examined has the attribute + * supplied to the attr option + */ +int +f_attr(PLAN *plan, struct db_full_path *entry, struct db_i *dbip) +{ + struct bu_vls attribname; + struct bu_vls value; + struct bu_attribute_value_set avs; + struct bu_attribute_value_pair *avpp; + int equalpos = 0; + int checkval = 0; + int i; + bu_vls_init(&attribname); + bu_vls_init(&value); + + + /* Check for unescaped equal sign - if present, the + * attribute must not only be present but have the + * value indicated. Escaping is done with the "/" + * character. + */ + while ((equalpos < strlen(plan->attr_data)) && (plan->attr_data[equalpos] != '=')) { + if ((plan->attr_data[equalpos] == '/') && (plan->attr_data[equalpos + 1] == '=')) {equalpos++;} + equalpos++; + } + + if (equalpos == strlen(plan->attr_data)){ + bu_vls_strcpy(&attribname, plan->attr_data); + } else { + checkval = 1; + bu_vls_strncpy(&attribname, plan->attr_data, equalpos); + bu_vls_strncpy(&value, &(plan->attr_data[equalpos+1]), strlen(plan->attr_data) - equalpos - 1); + } + + /* Get attributes for object and check all of + * them to see if there is a match to the requested + * attribute. If a value is supplied, check the + * value of any matches to the attribute name before + * returning success. + */ + + bu_avs_init_empty(&avs); + db5_get_attributes( dbip, &avs, DB_FULL_PATH_CUR_DIR(entry)); + avpp = avs.avp; + for (i = 0; i < avs.count; i++, avpp++) { + if (!fnmatch(avpp->name, bu_vls_addr(&attribname), 0)) { + if ( checkval == 1 ) { + if (!fnmatch(avpp->value, bu_vls_addr(&value), 0)) { + bu_avs_free( &avs); + bu_vls_free( &attribname); + bu_vls_free( &value); + return (1); + } + } else { + bu_avs_free( &avs); + bu_vls_free( &attribname); + bu_vls_free( &value); + return (1); + } + } + } + bu_avs_free( &avs); + bu_vls_free( &attribname); + bu_vls_free( &value); + return (0); +} + +int +c_attr(char *pattern, char ***ignored, int unused, PLAN **resultplan) +{ + PLAN *new; + + new = palloc(N_ATTR, f_attr); + new->attr_data = pattern; + (*resultplan) = new; + return BRLCAD_OK; +} + + /* * -print functions -- * @@ -212,7 +296,7 @@ * standard output. */ int -f_print(PLAN *plan, struct db_full_path *entry) +f_print(PLAN *plan, struct db_full_path *entry, struct db_i *dbip) { bu_log("%s\n", db_path_to_string(entry)); isoutput = 0; @@ -221,7 +305,7 @@ /* ARGSUSED */ int -f_print0(PLAN *plan, struct db_full_path *entry) +f_print0(PLAN *plan, struct db_full_path *entry, struct db_i *dbip) { (void)fputs(db_path_to_string(entry), stdout); (void)fputc('\0', stdout); @@ -344,7 +428,7 @@ PLAN *node; /* pointer to returned node or expression */ PLAN *tail; /* pointer to tail of subplan */ PLAN *subplan; /* pointer to head of ( ) expression */ - extern int f_expr(PLAN *, struct db_full_path *); + extern int f_expr(PLAN *, struct db_full_path *, struct db_i *); int error_return = BRLCAD_OK; /* first pull the top node from the plan */ @@ -652,7 +736,7 @@ find_execute_plans(struct db_i *dbip, struct db_full_path *dfp, genptr_t inputplan) { PLAN *p; PLAN *plan = (PLAN *)inputplan; - for (p = plan; p && (p->eval)(p, dfp); p = p->next) + for (p = plan; p && (p->eval)(p, dfp, dbip); p = p->next) ; } Modified: brlcad/trunk/src/libged/nfind.h =================================================================== --- brlcad/trunk/src/libged/nfind.h 2008-09-05 19:57:13 UTC (rev 32581) +++ brlcad/trunk/src/libged/nfind.h 2008-09-05 21:40:32 UTC (rev 32582) @@ -1,4 +1,4 @@ -/* F I N D . H +/* N F I N D . H * BRL-CAD * * Copyright (c) 2008 United States Government as represented by @@ -57,6 +57,7 @@ /* node type */ enum ntype { N_AND = 1, /* must start > 0 */ + N_ATTR, N_CLOSEPAREN, N_DEPTH, N_EMPTY, N_EXEC, N_EXECDIR, N_EXPR, N_FLAGS, N_INAME, N_LS, N_MAXDEPTH, N_MINDEPTH, N_NAME, N_NOT, N_OK, N_OPENPAREN, N_OR, N_PATH, @@ -67,7 +68,7 @@ /* node definition */ typedef struct _plandata { struct _plandata *next; /* next node */ - int (*eval)(struct _plandata *, struct db_full_path *); + int (*eval)(struct _plandata *, struct db_full_path *, struct db_i *dbip); /* node evaluation function */ #define F_EQUAL 1 /* [acm]time inum links size */ #define F_LESSTHAN 2 @@ -92,12 +93,14 @@ } ex; char *_a_data[2]; /* array of char pointers */ char *_c_data; /* char pointer */ + char *_attr_data; /* char pointer */ int _max_data; /* tree depth */ int _min_data; /* tree depth */ } p_un; } PLAN; #define a_data p_un._a_data #define c_data p_un._c_data +#define attr_data p_un._attr_data #define fl_flags p_un.fl._f_flags #define fl_mask p_un.fl._f_mask #define g_data p_un._g_data @@ -133,6 +136,7 @@ int queryuser(char **); void show_path(int); +int c_attr(char *, char ***, int, PLAN **); PLAN *c_depth(char *, char ***, int); PLAN *c_empty(char *, char ***, int); PLAN *c_exec(char *, char ***, int); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sta...@us...> - 2008-09-06 04:51:18
|
Revision: 32584 http://brlcad.svn.sourceforge.net/brlcad/?rev=32584&view=rev Author: starseeker Date: 2008-09-06 04:51:28 +0000 (Sat, 06 Sep 2008) Log Message: ----------- add nattr option - a simple reversal of the attr option, but useful for (say) finding all objects with attributes that do NOT have the region attr set: nfind -nattr region -attr \* Modified Paths: -------------- brlcad/trunk/src/libged/nfind.c brlcad/trunk/src/libged/nfind.h Modified: brlcad/trunk/src/libged/nfind.c =================================================================== --- brlcad/trunk/src/libged/nfind.c 2008-09-06 02:36:48 UTC (rev 32583) +++ brlcad/trunk/src/libged/nfind.c 2008-09-06 04:51:28 UTC (rev 32584) @@ -72,6 +72,7 @@ { ")", N_CLOSEPAREN, c_closeparen, O_ZERO }, { "-attr", N_ATTR, c_attr, O_ARGV }, { "-name", N_NAME, c_name, O_ARGV }, + { "-nattr", N_NATTR, c_nattr, O_ARGV }, { "-o", N_OR, c_or, O_ZERO }, { "-print", N_PRINT, c_print, O_ZERO }, { "-print0", N_PRINT0, c_print0, O_ZERO }, @@ -288,7 +289,92 @@ return BRLCAD_OK; } +/* + * -nattr functions -- + * + * True if the database object being examined does not have + * the attribute supplied to the nattr option + */ +int +f_nattr(PLAN *plan, struct db_full_path *entry, struct db_i *dbip) +{ + struct bu_vls attribname; + struct bu_vls value; + struct bu_attribute_value_set avs; + struct bu_attribute_value_pair *avpp; + int equalpos = 0; + int checkval = 0; + int i; + bu_vls_init(&attribname); + bu_vls_init(&value); + + + /* Check for unescaped equal sign - if present, the + * attribute may be present but must not have the + * value indicated. Escaping is done with the "/" + * character. + */ + while ((equalpos < strlen(plan->nattr_data)) && (plan->nattr_data[equalpos] != '=')) { + if ((plan->nattr_data[equalpos] == '/') && (plan->nattr_data[equalpos + 1] == '=')) {equalpos++;} + equalpos++; + } + + if (equalpos == strlen(plan->nattr_data)){ + bu_vls_strcpy(&attribname, plan->nattr_data); + } else { + checkval = 1; + bu_vls_strncpy(&attribname, plan->nattr_data, equalpos); + bu_vls_strncpy(&value, &(plan->nattr_data[equalpos+1]), strlen(plan->nattr_data) - equalpos - 1); + } + + /* Get attributes for object and check all of + * them to see if there is not a match to the requested + * attribute. If a value is supplied, check the + * value of any matches to the attribute name before + * returning failure. + */ + + bu_avs_init_empty(&avs); + db5_get_attributes( dbip, &avs, DB_FULL_PATH_CUR_DIR(entry)); + avpp = avs.avp; + for (i = 0; i < avs.count; i++, avpp++) { + if (!fnmatch(bu_vls_addr(&attribname), avpp->name, 0)) { + if ( checkval == 1 ) { + if (!fnmatch(bu_vls_addr(&value), avpp->value, 0)) { + bu_avs_free( &avs); + bu_vls_free( &attribname); + bu_vls_free( &value); + return (0); + } + } else { + bu_avs_free( &avs); + bu_vls_free( &attribname); + bu_vls_free( &value); + return (0); + } + } + } + bu_avs_free( &avs); + bu_vls_free( &attribname); + bu_vls_free( &value); + return (1); +} + +int +c_nattr(char *pattern, char ***ignored, int unused, PLAN **resultplan) +{ + PLAN *new; + + new = palloc(N_ATTR, f_nattr); + new->nattr_data = pattern; + (*resultplan) = new; + return BRLCAD_OK; +} + + + + /* * -print functions -- * Modified: brlcad/trunk/src/libged/nfind.h =================================================================== --- brlcad/trunk/src/libged/nfind.h 2008-09-06 02:36:48 UTC (rev 32583) +++ brlcad/trunk/src/libged/nfind.h 2008-09-06 04:51:28 UTC (rev 32584) @@ -60,7 +60,7 @@ N_ATTR, N_CLOSEPAREN, N_DEPTH, N_EMPTY, N_EXEC, N_EXECDIR, N_EXPR, N_FLAGS, N_INAME, N_LS, N_MAXDEPTH, - N_MINDEPTH, N_NAME, N_NOT, N_OK, N_OPENPAREN, N_OR, N_PATH, + N_MINDEPTH, N_NAME, N_NATTR, N_NOT, N_OK, N_OPENPAREN, N_OR, N_PATH, N_PRINT, N_PRINT0, N_PRUNE, N_TYPE }; @@ -94,6 +94,7 @@ char *_a_data[2]; /* array of char pointers */ char *_c_data; /* char pointer */ char *_attr_data; /* char pointer */ + char *_nattr_data; /* char pointer */ int _max_data; /* tree depth */ int _min_data; /* tree depth */ } p_un; @@ -101,6 +102,7 @@ #define a_data p_un._a_data #define c_data p_un._c_data #define attr_data p_un._attr_data +#define nattr_data p_un._nattr_data #define fl_flags p_un.fl._f_flags #define fl_mask p_un.fl._f_mask #define g_data p_un._g_data @@ -147,6 +149,7 @@ PLAN *c_maxdepth(char *, char ***, int); PLAN *c_mindepth(char *, char ***, int); int c_name(char *, char ***, int, PLAN **); +int c_nattr(char *, char ***, int, PLAN **); PLAN *c_path(char *, char ***, int); int c_print(char *, char ***, int, PLAN **); int c_print0(char *, char ***, int, PLAN **); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sta...@us...> - 2008-09-06 06:12:50
|
Revision: 32587 http://brlcad.svn.sourceforge.net/brlcad/?rev=32587&view=rev Author: starseeker Date: 2008-09-06 06:13:00 +0000 (Sat, 06 Sep 2008) Log Message: ----------- Add stdattr option which takes 0 or 1 and sorts based on whether attributes are standard - 1 returns objects with one or more standard attributes and no non-standard, 0 returns objects with one or more non-standard. Between the zero setting for this option and the attr option it should now be possible to achieve the effects desired in feature request 1177374. Modified Paths: -------------- brlcad/trunk/src/libged/nfind.c brlcad/trunk/src/libged/nfind.h Modified: brlcad/trunk/src/libged/nfind.c =================================================================== --- brlcad/trunk/src/libged/nfind.c 2008-09-06 05:45:44 UTC (rev 32586) +++ brlcad/trunk/src/libged/nfind.c 2008-09-06 06:13:00 UTC (rev 32587) @@ -76,6 +76,7 @@ { "-o", N_OR, c_or, O_ZERO }, { "-print", N_PRINT, c_print, O_ZERO }, { "-print0", N_PRINT0, c_print0, O_ZERO }, + { "-stdattr", N_STDATTR, c_stdattr, O_ARGV }, }; static PLAN * @@ -372,9 +373,72 @@ return BRLCAD_OK; } +/* + * -stdattr function -- + * + * Report based on the presence or absence of the + * "standard" attributes - supply a "1" argument and + * objects with ONLY "standard" attribute flags + * and NO non-standard flags are + * reported - supply a "0" and only objects with + * one or more non-standard flags are reported. + */ +int +f_stdattr(PLAN *plan, struct db_full_path *entry, struct db_i *dbip) +{ + struct bu_attribute_value_set avs; + struct bu_attribute_value_pair *avpp; + int i; + int found_nonstd_attr = 0; + int found_attr = 0; + /* Get attributes for object and check all of + * them to see if there is not a match to the + * standard attributes. If any is found return + * failure, otherwise success. + */ + + bu_avs_init_empty(&avs); + db5_get_attributes( dbip, &avs, DB_FULL_PATH_CUR_DIR(entry)); + avpp = avs.avp; + for (i = 0; i < avs.count; i++, avpp++) { + found_attr = 1; + if (strcmp(avpp->name, "region") != 0 && + strcmp(avpp->name, "region_id") != 0 && + strcmp(avpp->name, "material_id") != 0 && + strcmp(avpp->name, "los") != 0 && + strcmp(avpp->name, "aircode") != 0 && + strcmp(avpp->name, "oshader") != 0 && + strcmp(avpp->name, "rgb") != 0){ + + found_nonstd_attr = 1; + } + } + bu_avs_free( &avs); + + if (plan->stdflag && found_nonstd_attr) return 0; + if (plan->stdflag && !found_nonstd_attr && found_attr) return 1; + if (!(plan->stdflag) && found_nonstd_attr) return 1; + if (!(plan->stdflag) && !found_nonstd_attr) return 0; + return 0; +} + +int +c_stdattr(char *pattern, char ***ignored, int unused, PLAN **resultplan) +{ + PLAN *new; + + new = palloc(N_STDATTR, f_stdattr); + new->stdflag = atoi(pattern); + (*resultplan) = new; + return BRLCAD_OK; +} + + + + /* * -print functions -- * Modified: brlcad/trunk/src/libged/nfind.h =================================================================== --- brlcad/trunk/src/libged/nfind.h 2008-09-06 05:45:44 UTC (rev 32586) +++ brlcad/trunk/src/libged/nfind.h 2008-09-06 06:13:00 UTC (rev 32587) @@ -61,7 +61,7 @@ N_CLOSEPAREN, N_DEPTH, N_EMPTY, N_EXEC, N_EXECDIR, N_EXPR, N_FLAGS, N_INAME, N_LS, N_MAXDEPTH, N_MINDEPTH, N_NAME, N_NATTR, N_NOT, N_OK, N_OPENPAREN, N_OR, N_PATH, - N_PRINT, N_PRINT0, N_PRUNE, N_TYPE + N_PRINT, N_PRINT0, N_PRUNE, N_STDATTR, N_TYPE }; @@ -95,6 +95,7 @@ char *_c_data; /* char pointer */ char *_attr_data; /* char pointer */ char *_nattr_data; /* char pointer */ + int _stdflag; /* t/f flag for std reporting */ int _max_data; /* tree depth */ int _min_data; /* tree depth */ } p_un; @@ -112,6 +113,7 @@ #define e_argv p_un.ex._e_argv #define e_orig p_un.ex._e_orig #define e_len p_un.ex._e_len +#define stdflag p_un._stdflag typedef struct _option { char *name; /* option name */ @@ -150,6 +152,7 @@ PLAN *c_mindepth(char *, char ***, int); int c_name(char *, char ***, int, PLAN **); int c_nattr(char *, char ***, int, PLAN **); +int c_stdattr(char *, char ***, int, PLAN **); PLAN *c_path(char *, char ***, int); int c_print(char *, char ***, int, PLAN **); int c_print0(char *, char ***, int, PLAN **); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sta...@us...> - 2008-09-06 18:31:28
|
Revision: 32588 http://brlcad.svn.sourceforge.net/brlcad/?rev=32588&view=rev Author: starseeker Date: 2008-09-06 18:31:39 +0000 (Sat, 06 Sep 2008) Log Message: ----------- Tweak behavior of stdattr option - add -1 option that will print a table of ALL nonstandard attr,value pairs at the expense of ignoring other find options. Modified Paths: -------------- brlcad/trunk/src/libged/nfind.c brlcad/trunk/src/libged/nfind.h Modified: brlcad/trunk/src/libged/nfind.c =================================================================== --- brlcad/trunk/src/libged/nfind.c 2008-09-06 06:13:00 UTC (rev 32587) +++ brlcad/trunk/src/libged/nfind.c 2008-09-06 18:31:39 UTC (rev 32588) @@ -379,9 +379,14 @@ * Report based on the presence or absence of the * "standard" attributes - supply a "1" argument and * objects with ONLY "standard" attribute flags - * and NO non-standard flags are - * reported - supply a "0" and only objects with + * and NO non-standard flags are reported. + * Supply a "0" and only objects with * one or more non-standard flags are reported. + * stdattr also accepts a "-1" value which enables a + * special purpose table reporting of all non standard + * attributes and disables normal find behavior - e.g. + * a stdattr -1 option will cause find to not match any + * other options. */ int f_stdattr(PLAN *plan, struct db_full_path *entry, struct db_i *dbip) @@ -403,25 +408,32 @@ avpp = avs.avp; for (i = 0; i < avs.count; i++, avpp++) { found_attr = 1; - if (strcmp(avpp->name, "region") != 0 && - strcmp(avpp->name, "region_id") != 0 && + if (strcmp(avpp->name, "GIFTmater") != 0 && + strcmp(avpp->name, "aircode") != 0 && + strcmp(avpp->name, "inherit") != 0 && + strcmp(avpp->name, "los") != 0 && strcmp(avpp->name, "material_id") != 0 && - strcmp(avpp->name, "los") != 0 && - strcmp(avpp->name, "aircode") != 0 && strcmp(avpp->name, "oshader") != 0 && + strcmp(avpp->name, "region") != 0 && + strcmp(avpp->name, "region_id") != 0 && strcmp(avpp->name, "rgb") != 0){ - found_nonstd_attr = 1; + found_nonstd_attr = 1; + if ((plan->stdflag == -1) && !(printed_attr_header) ) { + bu_log("Object\t\tAttribute\t\tValue\n"); + printed_attr_header = 1; + } + if (plan->stdflag == -1) bu_log("%s\t\t%s\t\t%s\n",DB_FULL_PATH_CUR_DIR(entry)->d_namep, avpp->name, avpp->value); } } bu_avs_free( &avs); - if (plan->stdflag && found_nonstd_attr) return 0; - if (plan->stdflag && !found_nonstd_attr && found_attr) return 1; - if (!(plan->stdflag) && found_nonstd_attr) return 1; - if (!(plan->stdflag) && !found_nonstd_attr) return 0; - + if ((plan->stdflag == 1) && found_nonstd_attr) return 0; + if ((plan->stdflag == 1) && !found_nonstd_attr && found_attr) return 1; + if ((plan->stdflag == 0) && !found_nonstd_attr) return 0; + if ((plan->stdflag == 0) && found_nonstd_attr) return 1; + if (plan->stdflag == -1) return 0; return 0; } @@ -903,7 +915,8 @@ int isoutput; - +int printed_attr_header; + int wdb_nfind_cmd(struct rt_wdb *wdbp, Tcl_Interp *interp, @@ -918,7 +931,8 @@ int aflag = 0; /* look at all objects */ PLAN *dbplan; struct db_full_path dfp; - + + printed_attr_header = 0; if (argc < 3) { Tcl_AppendResult(interp, "nfind [path] [expressions...]\n", (char *)NULL); } else { Modified: brlcad/trunk/src/libged/nfind.h =================================================================== --- brlcad/trunk/src/libged/nfind.h 2008-09-06 06:13:00 UTC (rev 32587) +++ brlcad/trunk/src/libged/nfind.h 2008-09-06 18:31:39 UTC (rev 32588) @@ -163,4 +163,4 @@ int c_not(char *, char ***, int, PLAN **); int c_or(char *, char ***, int, PLAN **); -extern int isdepth, isoutput; +extern int isdepth, isoutput, printed_attr_header; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sta...@us...> - 2008-09-07 02:54:26
|
Revision: 32594 http://brlcad.svn.sourceforge.net/brlcad/?rev=32594&view=rev Author: starseeker Date: 2008-09-07 02:54:36 +0000 (Sun, 07 Sep 2008) Log Message: ----------- Revert nattr and stdattr commands - the former should be handled with not and the latter needs a bit of rethinking. Modified Paths: -------------- brlcad/trunk/src/libged/nfind.c brlcad/trunk/src/libged/nfind.h Modified: brlcad/trunk/src/libged/nfind.c =================================================================== --- brlcad/trunk/src/libged/nfind.c 2008-09-07 00:03:07 UTC (rev 32593) +++ brlcad/trunk/src/libged/nfind.c 2008-09-07 02:54:36 UTC (rev 32594) @@ -72,11 +72,9 @@ { ")", N_CLOSEPAREN, c_closeparen, O_ZERO }, { "-attr", N_ATTR, c_attr, O_ARGV }, { "-name", N_NAME, c_name, O_ARGV }, - { "-nattr", N_NATTR, c_nattr, O_ARGV }, { "-o", N_OR, c_or, O_ZERO }, { "-print", N_PRINT, c_print, O_ZERO }, { "-print0", N_PRINT0, c_print0, O_ZERO }, - { "-stdattr", N_STDATTR, c_stdattr, O_ARGV }, }; static PLAN * @@ -290,168 +288,8 @@ return BRLCAD_OK; } -/* - * -nattr functions -- - * - * True if the database object being examined does not have - * the attribute supplied to the nattr option - */ -int -f_nattr(PLAN *plan, struct db_full_path *entry, struct db_i *dbip) -{ - struct bu_vls attribname; - struct bu_vls value; - struct bu_attribute_value_set avs; - struct bu_attribute_value_pair *avpp; - int equalpos = 0; - int checkval = 0; - int i; - bu_vls_init(&attribname); - bu_vls_init(&value); - - - /* Check for unescaped equal sign - if present, the - * attribute may be present but must not have the - * value indicated. Escaping is done with the "/" - * character. - */ - while ((equalpos < strlen(plan->nattr_data)) && (plan->nattr_data[equalpos] != '=')) { - if ((plan->nattr_data[equalpos] == '/') && (plan->nattr_data[equalpos + 1] == '=')) {equalpos++;} - equalpos++; - } - - if (equalpos == strlen(plan->nattr_data)){ - bu_vls_strcpy(&attribname, plan->nattr_data); - } else { - checkval = 1; - bu_vls_strncpy(&attribname, plan->nattr_data, equalpos); - bu_vls_strncpy(&value, &(plan->nattr_data[equalpos+1]), strlen(plan->nattr_data) - equalpos - 1); - } - - /* Get attributes for object and check all of - * them to see if there is not a match to the requested - * attribute. If a value is supplied, check the - * value of any matches to the attribute name before - * returning failure. - */ - - bu_avs_init_empty(&avs); - db5_get_attributes( dbip, &avs, DB_FULL_PATH_CUR_DIR(entry)); - avpp = avs.avp; - for (i = 0; i < avs.count; i++, avpp++) { - if (!fnmatch(bu_vls_addr(&attribname), avpp->name, 0)) { - if ( checkval == 1 ) { - if (!fnmatch(bu_vls_addr(&value), avpp->value, 0)) { - bu_avs_free( &avs); - bu_vls_free( &attribname); - bu_vls_free( &value); - return (0); - } - } else { - bu_avs_free( &avs); - bu_vls_free( &attribname); - bu_vls_free( &value); - return (0); - } - } - } - bu_avs_free( &avs); - bu_vls_free( &attribname); - bu_vls_free( &value); - return (1); -} - -int -c_nattr(char *pattern, char ***ignored, int unused, PLAN **resultplan) -{ - PLAN *new; - - new = palloc(N_ATTR, f_nattr); - new->nattr_data = pattern; - (*resultplan) = new; - return BRLCAD_OK; -} - /* - * -stdattr function -- - * - * Report based on the presence or absence of the - * "standard" attributes - supply a "1" argument and - * objects with ONLY "standard" attribute flags - * and NO non-standard flags are reported. - * Supply a "0" and only objects with - * one or more non-standard flags are reported. - * stdattr also accepts a "-1" value which enables a - * special purpose table reporting of all non standard - * attributes and disables normal find behavior - e.g. - * a stdattr -1 option will cause find to not match any - * other options. - */ -int -f_stdattr(PLAN *plan, struct db_full_path *entry, struct db_i *dbip) -{ - struct bu_attribute_value_set avs; - struct bu_attribute_value_pair *avpp; - int i; - int found_nonstd_attr = 0; - int found_attr = 0; - - /* Get attributes for object and check all of - * them to see if there is not a match to the - * standard attributes. If any is found return - * failure, otherwise success. - */ - - bu_avs_init_empty(&avs); - db5_get_attributes( dbip, &avs, DB_FULL_PATH_CUR_DIR(entry)); - avpp = avs.avp; - for (i = 0; i < avs.count; i++, avpp++) { - found_attr = 1; - if (strcmp(avpp->name, "GIFTmater") != 0 && - strcmp(avpp->name, "aircode") != 0 && - strcmp(avpp->name, "inherit") != 0 && - strcmp(avpp->name, "los") != 0 && - strcmp(avpp->name, "material_id") != 0 && - strcmp(avpp->name, "oshader") != 0 && - strcmp(avpp->name, "region") != 0 && - strcmp(avpp->name, "region_id") != 0 && - strcmp(avpp->name, "rgb") != 0){ - - found_nonstd_attr = 1; - if ((plan->stdflag == -1) && !(printed_attr_header) ) { - bu_log("Object\t\tAttribute\t\tValue\n"); - printed_attr_header = 1; - } - if (plan->stdflag == -1) bu_log("%s\t\t%s\t\t%s\n",DB_FULL_PATH_CUR_DIR(entry)->d_namep, avpp->name, avpp->value); - } - } - - bu_avs_free( &avs); - - if ((plan->stdflag == 1) && found_nonstd_attr) return 0; - if ((plan->stdflag == 1) && !found_nonstd_attr && found_attr) return 1; - if ((plan->stdflag == 0) && !found_nonstd_attr) return 0; - if ((plan->stdflag == 0) && found_nonstd_attr) return 1; - if (plan->stdflag == -1) return 0; - return 0; -} - -int -c_stdattr(char *pattern, char ***ignored, int unused, PLAN **resultplan) -{ - PLAN *new; - - new = palloc(N_STDATTR, f_stdattr); - new->stdflag = atoi(pattern); - (*resultplan) = new; - return BRLCAD_OK; -} - - - - -/* * -print functions -- * * Always true, causes the current pathame to be written to @@ -915,8 +753,7 @@ int isoutput; -int printed_attr_header; - + int wdb_nfind_cmd(struct rt_wdb *wdbp, Tcl_Interp *interp, @@ -931,8 +768,7 @@ int aflag = 0; /* look at all objects */ PLAN *dbplan; struct db_full_path dfp; - - printed_attr_header = 0; + if (argc < 3) { Tcl_AppendResult(interp, "nfind [path] [expressions...]\n", (char *)NULL); } else { Modified: brlcad/trunk/src/libged/nfind.h =================================================================== --- brlcad/trunk/src/libged/nfind.h 2008-09-07 00:03:07 UTC (rev 32593) +++ brlcad/trunk/src/libged/nfind.h 2008-09-07 02:54:36 UTC (rev 32594) @@ -60,8 +60,8 @@ N_ATTR, N_CLOSEPAREN, N_DEPTH, N_EMPTY, N_EXEC, N_EXECDIR, N_EXPR, N_FLAGS, N_INAME, N_LS, N_MAXDEPTH, - N_MINDEPTH, N_NAME, N_NATTR, N_NOT, N_OK, N_OPENPAREN, N_OR, N_PATH, - N_PRINT, N_PRINT0, N_PRUNE, N_STDATTR, N_TYPE + N_MINDEPTH, N_NAME, N_NOT, N_OK, N_OPENPAREN, N_OR, N_PATH, + N_PRINT, N_PRINT0, N_PRUNE, N_TYPE }; @@ -94,8 +94,6 @@ char *_a_data[2]; /* array of char pointers */ char *_c_data; /* char pointer */ char *_attr_data; /* char pointer */ - char *_nattr_data; /* char pointer */ - int _stdflag; /* t/f flag for std reporting */ int _max_data; /* tree depth */ int _min_data; /* tree depth */ } p_un; @@ -103,7 +101,6 @@ #define a_data p_un._a_data #define c_data p_un._c_data #define attr_data p_un._attr_data -#define nattr_data p_un._nattr_data #define fl_flags p_un.fl._f_flags #define fl_mask p_un.fl._f_mask #define g_data p_un._g_data @@ -113,7 +110,6 @@ #define e_argv p_un.ex._e_argv #define e_orig p_un.ex._e_orig #define e_len p_un.ex._e_len -#define stdflag p_un._stdflag typedef struct _option { char *name; /* option name */ @@ -151,8 +147,6 @@ PLAN *c_maxdepth(char *, char ***, int); PLAN *c_mindepth(char *, char ***, int); int c_name(char *, char ***, int, PLAN **); -int c_nattr(char *, char ***, int, PLAN **); -int c_stdattr(char *, char ***, int, PLAN **); PLAN *c_path(char *, char ***, int); int c_print(char *, char ***, int, PLAN **); int c_print0(char *, char ***, int, PLAN **); @@ -163,4 +157,4 @@ int c_not(char *, char ***, int, PLAN **); int c_or(char *, char ***, int, PLAN **); -extern int isdepth, isoutput, printed_attr_header; +extern int isdepth, isoutput; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sta...@us...> - 2008-09-08 18:43:38
|
Revision: 32602 http://brlcad.svn.sourceforge.net/brlcad/?rev=32602&view=rev Author: starseeker Date: 2008-09-08 18:43:46 +0000 (Mon, 08 Sep 2008) Log Message: ----------- Add ability to use '.' to do a 'flat' search of objects, as opposed to following the tree. In essence, this finds object rather than uses of objects - s.s instead of c1.c/s.s and c2.c/s.s Modified Paths: -------------- brlcad/trunk/src/libged/nfind.c brlcad/trunk/src/libged/nfind.h Modified: brlcad/trunk/src/libged/nfind.c =================================================================== --- brlcad/trunk/src/libged/nfind.c 2008-09-08 17:57:31 UTC (rev 32601) +++ brlcad/trunk/src/libged/nfind.c 2008-09-08 18:43:46 UTC (rev 32602) @@ -883,11 +883,30 @@ void find_execute(PLAN *plan, /* search plan */ struct db_full_path *pathname, /* array of pathnames to traverse */ - struct rt_wdb *wdbp) + struct rt_wdb *wdbp, + int execute_style) { struct directory *dp; + struct db_full_path fullname; int i; - db_fullpath_traverse(wdbp->dbip, pathname, find_execute_plans, find_execute_plans, wdbp->wdb_resp, plan); + db_full_path_init(&fullname); + switch (execute_style) { + case 0: + db_fullpath_traverse(wdbp->dbip, pathname, find_execute_plans, find_execute_plans, wdbp->wdb_resp, plan); + break; + case 1: + for (i = 0; i < RT_DBNHASH; i++) { + for (dp = wdbp->dbip->dbi_Head[i]; dp != DIR_NULL; dp = dp->d_forw) { + db_string_to_path(&fullname, wdbp->dbip, dp->d_namep); + find_execute_plans(wdbp->dbip, &fullname, plan); + } + } + break; + default: + db_fullpath_traverse(wdbp->dbip, pathname, find_execute_plans, find_execute_plans, wdbp->wdb_resp, plan); + break; + } + db_free_full_path(&fullname); } @@ -915,16 +934,25 @@ db_update_nref(wdbp->dbip, &rt_uniresource); - if ( !( (argv[1][0] == '-') || (argv[1][0] == '!') || (argv[1][0] == '(') )&& (strcmp(argv[1],"/") != 0)) { - db_string_to_path(&dfp, wdbp->dbip, argv[1]); + if ( !( (argv[1][0] == '-') || (argv[1][0] == '!') || (argv[1][0] == '(') ) && (strcmp(argv[1],"/") != 0) && (strcmp(argv[1],".") != 0) ) { + db_string_to_path(&dfp, wdbp->dbip, argv[1]); isoutput = 0; if (find_formplan(&argv[2], &dbplan) != BRLCAD_OK) { Tcl_AppendResult(interp, "Failed to build find plan.\n", (char *)NULL); return TCL_ERROR; } else { - find_execute(dbplan, &dfp, wdbp); + find_execute(dbplan, &dfp, wdbp, 0); } } else { + if (strcmp(argv[1],".") == 0) { + isoutput = 0; + if (find_formplan(&argv[2], &dbplan) != BRLCAD_OK) { + Tcl_AppendResult(interp, "Failed to build find plan.\n", (char *)NULL); + return TCL_ERROR; + } else { + find_execute(dbplan, NULL, wdbp, 1); + } + } else { for (i = 0; i < RT_DBNHASH; i++) { for (dp = wdbp->dbip->dbi_Head[i]; dp != DIR_NULL; dp = dp->d_forw) { if (dp->d_nref == 0 && !(dp->d_flags & DIR_HIDDEN) && (dp->d_addr != RT_DIR_PHONY_ADDR)) { @@ -935,19 +963,20 @@ Tcl_AppendResult(interp, "Failed to build find plan.\n", (char *)NULL); return TCL_ERROR; } else { - find_execute(dbplan, &dfp, wdbp); + find_execute(dbplan, &dfp, wdbp, 0); } } else { if (find_formplan(&argv[2], &dbplan) != BRLCAD_OK) { Tcl_AppendResult(interp, "Failed to build find plan.\n", (char *)NULL); return TCL_ERROR; } else { - find_execute(dbplan, &dfp, wdbp); + find_execute(dbplan, &dfp, wdbp, 0); } } } } } + } } db_free_full_path(&dfp); } Modified: brlcad/trunk/src/libged/nfind.h =================================================================== --- brlcad/trunk/src/libged/nfind.h 2008-09-08 17:57:31 UTC (rev 32601) +++ brlcad/trunk/src/libged/nfind.h 2008-09-08 18:43:46 UTC (rev 32602) @@ -125,7 +125,7 @@ void brace_subst(char *, char **, char *, int); int find_create(char ***, PLAN **); -void find_execute(PLAN *, struct db_full_path *, struct rt_wdb *); +void find_execute(PLAN *, struct db_full_path *, struct rt_wdb *, int); int find_formplan(char **, PLAN **); int not_squish(PLAN *, PLAN **); OPTION *option(char *); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sta...@us...> - 2008-09-08 18:55:42
|
Revision: 32603 http://brlcad.svn.sourceforge.net/brlcad/?rev=32603&view=rev Author: starseeker Date: 2008-09-08 18:55:51 +0000 (Mon, 08 Sep 2008) Log Message: ----------- Add stdattr back in. This time it takes no options and tests that an object has only standard attributes. A ! on this option will return objects without standard attributes (including no attributes) - adding an -attr \* to the equation results in all objects with one or more nonstandard attributes. Modified Paths: -------------- brlcad/trunk/src/libged/nfind.c brlcad/trunk/src/libged/nfind.h Modified: brlcad/trunk/src/libged/nfind.c =================================================================== --- brlcad/trunk/src/libged/nfind.c 2008-09-08 18:43:46 UTC (rev 32602) +++ brlcad/trunk/src/libged/nfind.c 2008-09-08 18:55:51 UTC (rev 32603) @@ -204,6 +204,7 @@ { "-o", N_OR, c_or, O_ZERO }, { "-print", N_PRINT, c_print, O_ZERO }, { "-print0", N_PRINT0, c_print0, O_ZERO }, + { "-stdattr", N_STDATTR, c_stdattr, O_ZERO }, }; static PLAN * @@ -418,6 +419,66 @@ } +/* + * -stdattr function -- + * + * Search based on the presence of the + * "standard" attributes - matches when there + * are ONLY "standard" attributes + * associated with an object. + */ + int + f_stdattr(PLAN *plan, struct db_full_path *entry, struct db_i *dbip) + { + struct bu_attribute_value_set avs; + struct bu_attribute_value_pair *avpp; + int i; + int found_nonstd_attr = 0; + int found_attr = 0; + + /* Get attributes for object and check all of + * them to see if there is not a match to the + * standard attributes. If any is found return + * failure, otherwise success. + */ + + bu_avs_init_empty(&avs); + db5_get_attributes( dbip, &avs, DB_FULL_PATH_CUR_DIR(entry)); + avpp = avs.avp; + for (i = 0; i < avs.count; i++, avpp++) { + found_attr = 1; + if (strcmp(avpp->name, "GIFTmater") != 0 && + strcmp(avpp->name, "aircode") != 0 && + strcmp(avpp->name, "inherit") != 0 && + strcmp(avpp->name, "los") != 0 && + strcmp(avpp->name, "material_id") != 0 && + strcmp(avpp->name, "oshader") != 0 && + strcmp(avpp->name, "region") != 0 && + strcmp(avpp->name, "region_id") != 0 && + strcmp(avpp->name, "rgb") != 0){ + + found_nonstd_attr = 1; + } + } + + bu_avs_free( &avs); + + if (!found_nonstd_attr && found_attr) return 1; + return 0; + } + + int + c_stdattr(char *pattern, char ***ignored, int unused, PLAN **resultplan) + { + PLAN *new; + + new = palloc(N_STDATTR, f_stdattr); + (*resultplan) = new; + return BRLCAD_OK; + } + + + /* * -print functions -- * Modified: brlcad/trunk/src/libged/nfind.h =================================================================== --- brlcad/trunk/src/libged/nfind.h 2008-09-08 18:43:46 UTC (rev 32602) +++ brlcad/trunk/src/libged/nfind.h 2008-09-08 18:55:51 UTC (rev 32603) @@ -61,7 +61,7 @@ N_CLOSEPAREN, N_DEPTH, N_EMPTY, N_EXEC, N_EXECDIR, N_EXPR, N_FLAGS, N_INAME, N_LS, N_MAXDEPTH, N_MINDEPTH, N_NAME, N_NOT, N_OK, N_OPENPAREN, N_OR, N_PATH, - N_PRINT, N_PRINT0, N_PRUNE, N_TYPE + N_PRINT, N_PRINT0, N_PRUNE, N_STDATTR, N_TYPE }; @@ -151,6 +151,7 @@ int c_print(char *, char ***, int, PLAN **); int c_print0(char *, char ***, int, PLAN **); PLAN *c_prune(char *, char ***, int); +int c_stdattr(char *, char ***, int, PLAN **); PLAN *c_type(char *, char ***, int); int c_openparen(char *, char ***, int, PLAN **); int c_closeparen(char *, char ***, int, PLAN **); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sta...@us...> - 2008-09-08 20:22:13
|
Revision: 32604 http://brlcad.svn.sourceforge.net/brlcad/?rev=32604&view=rev Author: starseeker Date: 2008-09-08 20:22:23 +0000 (Mon, 08 Sep 2008) Log Message: ----------- Add -type option to search by primitive type, and also comb and region. Modified Paths: -------------- brlcad/trunk/src/libged/nfind.c brlcad/trunk/src/libged/nfind.h Modified: brlcad/trunk/src/libged/nfind.c =================================================================== --- brlcad/trunk/src/libged/nfind.c 2008-09-08 18:55:51 UTC (rev 32603) +++ brlcad/trunk/src/libged/nfind.c 2008-09-08 20:22:23 UTC (rev 32604) @@ -71,15 +71,15 @@ */ void db_fullpath_traverse_subtree(union tree *tp, - void (*traverse_func) ( struct db_i *, struct db_full_path *, - void (*) (struct db_i *, struct db_full_path *, genptr_t), - void (*) (struct db_i *, struct db_full_path *, genptr_t), + void (*traverse_func) ( struct rt_wdb *, struct db_full_path *, + void (*) (struct rt_wdb *, struct db_full_path *, genptr_t), + void (*) (struct rt_wdb *, struct db_full_path *, genptr_t), struct resource *, genptr_t), - struct db_i *dbip, + struct rt_wdb *wdbp, struct db_full_path *dfp, - void (*comb_func) (struct db_i *, struct db_full_path *, genptr_t), - void (*leaf_func) (struct db_i *, struct db_full_path *, genptr_t), + void (*comb_func) (struct rt_wdb *, struct db_full_path *, genptr_t), + void (*leaf_func) (struct rt_wdb *, struct db_full_path *, genptr_t), struct resource *resp, genptr_t client_data) { @@ -89,18 +89,18 @@ return; RT_CK_FULL_PATH( dfp ); - RT_CHECK_DBI( dbip ); + RT_CHECK_DBI( wdbp->dbip ); RT_CK_TREE( tp ); RT_CK_RESOURCE( resp ); switch ( tp->tr_op ) { case OP_DB_LEAF: - if ( (dp=db_lookup( dbip, tp->tr_l.tl_name, LOOKUP_NOISY )) == DIR_NULL ) { + if ( (dp=db_lookup( wdbp->dbip, tp->tr_l.tl_name, LOOKUP_NOISY )) == DIR_NULL ) { return; } else { db_add_node_to_full_path( dfp, dp); - traverse_func( dbip, dfp, comb_func, leaf_func, resp, client_data ); + traverse_func( wdbp, dfp, comb_func, leaf_func, resp, client_data ); DB_FULL_PATH_POP(dfp); break; } @@ -108,8 +108,8 @@ case OP_INTERSECT: case OP_SUBTRACT: case OP_XOR: - db_fullpath_traverse_subtree( tp->tr_b.tb_left, traverse_func, dbip, dfp, comb_func, leaf_func, resp, client_data ); - db_fullpath_traverse_subtree( tp->tr_b.tb_right, traverse_func, dbip, dfp, comb_func, leaf_func, resp, client_data ); + db_fullpath_traverse_subtree( tp->tr_b.tb_left, traverse_func, wdbp, dfp, comb_func, leaf_func, resp, client_data ); + db_fullpath_traverse_subtree( tp->tr_b.tb_right, traverse_func, wdbp, dfp, comb_func, leaf_func, resp, client_data ); break; default: bu_log( "db_functree_subtree: unrecognized operator %d\n", tp->tr_op ); @@ -130,41 +130,41 @@ * use db_full_path structures instead of directory structures. */ void -db_fullpath_traverse( struct db_i *dbip, +db_fullpath_traverse( struct rt_wdb *wdbp, struct db_full_path *dfp, - void (*comb_func) (struct db_i *, struct db_full_path *, genptr_t), - void (*leaf_func) (struct db_i *, struct db_full_path *, genptr_t), + void (*comb_func) (struct rt_wdb *, struct db_full_path *, genptr_t), + void (*leaf_func) (struct rt_wdb *, struct db_full_path *, genptr_t), struct resource *resp, genptr_t client_data ) { struct directory *dp; register int i; RT_CK_FULL_PATH(dfp); - RT_CK_DBI(dbip); + RT_CK_DBI(wdbp->dbip); dp = DB_FULL_PATH_CUR_DIR(dfp); if ( dp->d_flags & DIR_COMB ) { /* entering region */ if ( comb_func ) - comb_func( dbip, dfp, client_data ); - if ( dbip->dbi_version < 5 ) { + comb_func( wdbp, dfp, client_data ); + if ( wdbp->dbip->dbi_version < 5 ) { register union record *rp; register struct directory *mdp; /* * Load the combination into local record buffer * This is in external v4 format. */ - if ( (rp = db_getmrec( dbip, dp )) == (union record *)0 ) + if ( (rp = db_getmrec( wdbp->dbip, dp )) == (union record *)0 ) return; /* recurse */ for ( i=1; i < dp->d_len; i++ ) { - if ( (mdp = db_lookup( dbip, rp[i].M.m_instname, + if ( (mdp = db_lookup( wdbp->dbip, rp[i].M.m_instname, LOOKUP_NOISY )) == DIR_NULL ) { continue; } else { db_add_node_to_full_path(dfp, mdp); - db_fullpath_traverse(dbip, dfp, comb_func, leaf_func, resp, client_data); + db_fullpath_traverse(wdbp, dfp, comb_func, leaf_func, resp, client_data); DB_FULL_PATH_POP(dfp); } } @@ -174,12 +174,12 @@ struct rt_comb_internal *comb; struct directory *ndp; - if ( rt_db_get_internal5( &in, dp, dbip, NULL, resp ) < 0 ) + if ( rt_db_get_internal5( &in, dp, wdbp->dbip, NULL, resp ) < 0 ) return; comb = (struct rt_comb_internal *)in.idb_ptr; - db_fullpath_traverse_subtree( comb->tree, db_fullpath_traverse, dbip, dfp, comb_func, leaf_func, resp, client_data ); + db_fullpath_traverse_subtree( comb->tree, db_fullpath_traverse, wdbp, dfp, comb_func, leaf_func, resp, client_data ); rt_db_free_internal( &in, resp ); } @@ -187,7 +187,7 @@ if ( dp->d_flags & DIR_SOLID || dp->d_major_type & DB5_MAJORTYPE_BINARY_MASK ) { /* at leaf */ if ( leaf_func ) - leaf_func( dbip, dfp, client_data ); + leaf_func( wdbp, dfp, client_data ); } } @@ -205,10 +205,11 @@ { "-print", N_PRINT, c_print, O_ZERO }, { "-print0", N_PRINT0, c_print0, O_ZERO }, { "-stdattr", N_STDATTR, c_stdattr, O_ZERO }, + { "-type", N_TYPE, c_type, O_ARGV }, }; static PLAN * -palloc(enum ntype t, int (*f)(PLAN *, struct db_full_path *, struct db_i *)) +palloc(enum ntype t, int (*f)(PLAN *, struct db_full_path *, struct rt_wdb *)) { PLAN *new; @@ -227,13 +228,13 @@ * True if expression is true. */ int -f_expr(PLAN *plan, struct db_full_path *entry, struct db_i *dbip) +f_expr(PLAN *plan, struct db_full_path *entry, struct rt_wdb *wdbp) { PLAN *p; int state; for (p = plan->p_data[0]; - p && (state = (p->eval)(p, entry, dbip)); p = p->next); + p && (state = (p->eval)(p, entry, wdbp)); p = p->next); return (state); } @@ -246,14 +247,14 @@ int c_openparen(char *ignore, char ***ignored, int unused, PLAN **resultplan) { - (*resultplan) = (palloc(N_OPENPAREN, (int (*)(PLAN *, struct db_full_path *, struct db_i *))-1)); + (*resultplan) = (palloc(N_OPENPAREN, (int (*)(PLAN *, struct db_full_path *, struct rt_wdb *))-1)); return BRLCAD_OK; } int c_closeparen(char *ignore, char ***ignored, int unused, PLAN **resultplan) { - (*resultplan) = (palloc(N_CLOSEPAREN, (int (*)(PLAN *, struct db_full_path *, struct db_i *))-1)); + (*resultplan) = (palloc(N_CLOSEPAREN, (int (*)(PLAN *, struct db_full_path *, struct rt_wdb *))-1)); return BRLCAD_OK; } @@ -264,13 +265,13 @@ * Negation of a primary; the unary NOT operator. */ int -f_not(PLAN *plan, struct db_full_path *entry, struct db_i *dbip) +f_not(PLAN *plan, struct db_full_path *entry, struct rt_wdb *wdbp) { PLAN *p; int state; for (p = plan->p_data[0]; - p && (state = (p->eval)(p, entry, dbip)); p = p->next); + p && (state = (p->eval)(p, entry, wdbp)); p = p->next); return (!state); } @@ -288,19 +289,19 @@ * not evaluated if the first expression is true. */ int -f_or(PLAN *plan, struct db_full_path *entry, struct db_i *dbip) +f_or(PLAN *plan, struct db_full_path *entry, struct rt_wdb *wdbp) { PLAN *p; int state; for (p = plan->p_data[0]; - p && (state = (p->eval)(p, entry, dbip)); p = p->next); + p && (state = (p->eval)(p, entry, wdbp)); p = p->next); if (state) return (1); for (p = plan->p_data[1]; - p && (state = (p->eval)(p, entry, dbip)); p = p->next); + p && (state = (p->eval)(p, entry, wdbp)); p = p->next); return (state); } @@ -319,7 +320,7 @@ * matches pattern using Pattern Matching Notation S3.14 */ int -f_name(PLAN *plan, struct db_full_path *entry, struct db_i *dbip) +f_name(PLAN *plan, struct db_full_path *entry, struct rt_wdb *wdbp) { return (!fnmatch(plan->c_data, DB_FULL_PATH_CUR_DIR(entry)->d_namep, 0)); } @@ -342,7 +343,7 @@ * supplied to the attr option */ int -f_attr(PLAN *plan, struct db_full_path *entry, struct db_i *dbip) +f_attr(PLAN *plan, struct db_full_path *entry, struct rt_wdb *wdbp) { struct bu_vls attribname; struct bu_vls value; @@ -382,7 +383,7 @@ */ bu_avs_init_empty(&avs); - db5_get_attributes( dbip, &avs, DB_FULL_PATH_CUR_DIR(entry)); + db5_get_attributes( wdbp->dbip, &avs, DB_FULL_PATH_CUR_DIR(entry)); avpp = avs.avp; for (i = 0; i < avs.count; i++, avpp++) { if (!fnmatch(bu_vls_addr(&attribname), avpp->name, 0)) { @@ -428,7 +429,7 @@ * associated with an object. */ int - f_stdattr(PLAN *plan, struct db_full_path *entry, struct db_i *dbip) + f_stdattr(PLAN *plan, struct db_full_path *entry, struct rt_wdb *wdbp) { struct bu_attribute_value_set avs; struct bu_attribute_value_pair *avpp; @@ -443,7 +444,7 @@ */ bu_avs_init_empty(&avs); - db5_get_attributes( dbip, &avs, DB_FULL_PATH_CUR_DIR(entry)); + db5_get_attributes( wdbp->dbip, &avs, DB_FULL_PATH_CUR_DIR(entry)); avpp = avs.avp; for (i = 0; i < avs.count; i++, avpp++) { found_attr = 1; @@ -477,8 +478,175 @@ return BRLCAD_OK; } +/* + * -type function -- + * + * Search based on the type of the object - primitives are matched + * based on their primitive type (tor, tgc, arb4, etc.) and combinations + * are matched based on whether they are a combination or region. + */ + int + f_type(PLAN *plan, struct db_full_path *entry, struct rt_wdb *wdbp) + { + struct rt_db_internal intern; + int type_match = 0; + int type; + rt_db_get_internal(&intern, DB_FULL_PATH_CUR_DIR(entry), wdbp->dbip, (fastf_t *)NULL, &rt_uniresource); + if(intern.idb_major_type != DB5_MAJORTYPE_BRLCAD) return 0; + + /* Eventually this whole switch statement needs to go away + * in favor of a function to query the primitive's short name + * and use that for the comparison - will be MUCH shorter and + * simpler. + */ + switch (intern.idb_minor_type) { + case DB5_MINORTYPE_BRLCAD_TOR: + type_match = (!fnmatch(plan->type_data, "tor", 0)); + break; + case DB5_MINORTYPE_BRLCAD_TGC: + type_match = (!fnmatch(plan->type_data, "tgc", 0)); + break; + case DB5_MINORTYPE_BRLCAD_ELL: + type_match = (!fnmatch(plan->type_data, "ell", 0)); + break; + case DB5_MINORTYPE_BRLCAD_ARB8: + type = rt_arb_std_type(&intern, &wdbp->wdb_tol); + + switch (type) { + case 4: + type_match = (!fnmatch(plan->type_data, "arb4", 0)); + break; + case 5: + type_match = (!fnmatch(plan->type_data, "arb5", 0)); + break; + case 6: + type_match = (!fnmatch(plan->type_data, "arb6", 0)); + break; + case 7: + type_match = (!fnmatch(plan->type_data, "arb7", 0)); + break; + case 8: + type_match = (!fnmatch(plan->type_data, "arb8", 0)); + break; + default: + type_match = (!fnmatch(plan->type_data, "invalid", 0)); + break; + } + + break; + case DB5_MINORTYPE_BRLCAD_ARS: + type_match = (!fnmatch(plan->type_data, "ars", 0)); + break; + case DB5_MINORTYPE_BRLCAD_HALF: + type_match = (!fnmatch(plan->type_data, "half", 0)); + break; + case DB5_MINORTYPE_BRLCAD_REC: + type_match = (!fnmatch(plan->type_data, "rec", 0)); + break; + case DB5_MINORTYPE_BRLCAD_POLY: + type_match = (!fnmatch(plan->type_data, "poly", 0)); + break; + case DB5_MINORTYPE_BRLCAD_BSPLINE: + type_match = (!fnmatch(plan->type_data, "spline", 0)); + break; + case DB5_MINORTYPE_BRLCAD_SPH: + type_match = (!fnmatch(plan->type_data, "sph", 0)); + break; + case DB5_MINORTYPE_BRLCAD_NMG: + type_match = (!fnmatch(plan->type_data, "nmg", 0)); + break; + case DB5_MINORTYPE_BRLCAD_EBM: + type_match = (!fnmatch(plan->type_data, "ebm", 0)); + break; + case DB5_MINORTYPE_BRLCAD_VOL: + type_match = (!fnmatch(plan->type_data, "vol", 0)); + break; + case DB5_MINORTYPE_BRLCAD_ARBN: + type_match = (!fnmatch(plan->type_data, "arbn", 0)); + break; + case DB5_MINORTYPE_BRLCAD_PIPE: + type_match = (!fnmatch(plan->type_data, "pipe", 0)); + break; + case DB5_MINORTYPE_BRLCAD_PARTICLE: + type_match = (!fnmatch(plan->type_data, "part", 0)); + break; + case DB5_MINORTYPE_BRLCAD_RPC: + type_match = (!fnmatch(plan->type_data, "rpc", 0)); + break; + case DB5_MINORTYPE_BRLCAD_RHC: + type_match = (!fnmatch(plan->type_data, "rhc", 0)); + break; + case DB5_MINORTYPE_BRLCAD_EPA: + type_match = (!fnmatch(plan->type_data, "epa", 0)); + break; + case DB5_MINORTYPE_BRLCAD_EHY: + type_match = (!fnmatch(plan->type_data, "ehy", 0)); + break; + case DB5_MINORTYPE_BRLCAD_ETO: + type_match = (!fnmatch(plan->type_data, "eto", 0)); + break; + case DB5_MINORTYPE_BRLCAD_GRIP: + type_match = (!fnmatch(plan->type_data, "grip", 0)); + break; + case DB5_MINORTYPE_BRLCAD_JOINT: + type_match = (!fnmatch(plan->type_data, "joint", 0)); + break; + case DB5_MINORTYPE_BRLCAD_HF: + type_match = (!fnmatch(plan->type_data, "hf", 0)); + break; + case DB5_MINORTYPE_BRLCAD_DSP: + type_match = (!fnmatch(plan->type_data, "dsp", 0)); + break; + case DB5_MINORTYPE_BRLCAD_SKETCH: + type_match = (!fnmatch(plan->type_data, "sketch", 0)); + break; + case DB5_MINORTYPE_BRLCAD_EXTRUDE: + type_match = (!fnmatch(plan->type_data, "extrude", 0)); + break; + case DB5_MINORTYPE_BRLCAD_SUBMODEL: + type_match = (!fnmatch(plan->type_data, "submodel", 0)); + break; + case DB5_MINORTYPE_BRLCAD_CLINE: + type_match = (!fnmatch(plan->type_data, "cline", 0)); + break; + case DB5_MINORTYPE_BRLCAD_BOT: + type_match = (!fnmatch(plan->type_data, "bot", 0)); + break; + case DB5_MINORTYPE_BRLCAD_COMBINATION: + if (DB_FULL_PATH_CUR_DIR(entry)->d_flags & DIR_REGION) { + if ((!fnmatch(plan->type_data, "r", 0)) || (!fnmatch(plan->type_data, "region", 0))) { + type_match = 1; + } + } else { + if ((!fnmatch(plan->type_data, "comb", 0)) || (!fnmatch(plan->type_data, "combination", 0))) { + type_match = 1; + } + } + break; + default: + type_match = (!fnmatch(plan->type_data, "other", 0)); + break; + } + + rt_db_free_internal(&intern, &rt_uniresource); + return (type_match); + } + + int + c_type(char *pattern, char ***ignored, int unused, PLAN **resultplan) + { + PLAN *new; + + new = palloc(N_TYPE, f_type); + new->type_data = pattern; + (*resultplan) = new; + return BRLCAD_OK; + } + + + /* * -print functions -- * @@ -486,7 +654,7 @@ * standard output. */ int -f_print(PLAN *plan, struct db_full_path *entry, struct db_i *dbip) +f_print(PLAN *plan, struct db_full_path *entry, struct rt_wdb *wdbp) { bu_log("%s\n", db_path_to_string(entry)); isoutput = 0; @@ -495,7 +663,7 @@ /* ARGSUSED */ int -f_print0(PLAN *plan, struct db_full_path *entry, struct db_i *dbip) +f_print0(PLAN *plan, struct db_full_path *entry, struct rt_wdb *wdbp) { (void)fputs(db_path_to_string(entry), stdout); (void)fputc('\0', stdout); @@ -618,7 +786,7 @@ PLAN *node; /* pointer to returned node or expression */ PLAN *tail; /* pointer to tail of subplan */ PLAN *subplan; /* pointer to head of ( ) expression */ - extern int f_expr(PLAN *, struct db_full_path *, struct db_i *); + extern int f_expr(PLAN *, struct db_full_path *, struct rt_wdb *); int error_return = BRLCAD_OK; /* first pull the top node from the plan */ @@ -933,10 +1101,10 @@ } void -find_execute_plans(struct db_i *dbip, struct db_full_path *dfp, genptr_t inputplan) { +find_execute_plans(struct rt_wdb *wdbp, struct db_full_path *dfp, genptr_t inputplan) { PLAN *p; PLAN *plan = (PLAN *)inputplan; - for (p = plan; p && (p->eval)(p, dfp, dbip); p = p->next) + for (p = plan; p && (p->eval)(p, dfp, wdbp); p = p->next) ; } @@ -953,18 +1121,20 @@ db_full_path_init(&fullname); switch (execute_style) { case 0: - db_fullpath_traverse(wdbp->dbip, pathname, find_execute_plans, find_execute_plans, wdbp->wdb_resp, plan); + db_fullpath_traverse(wdbp, pathname, find_execute_plans, find_execute_plans, wdbp->wdb_resp, plan); break; case 1: for (i = 0; i < RT_DBNHASH; i++) { for (dp = wdbp->dbip->dbi_Head[i]; dp != DIR_NULL; dp = dp->d_forw) { - db_string_to_path(&fullname, wdbp->dbip, dp->d_namep); - find_execute_plans(wdbp->dbip, &fullname, plan); + if (!(dp->d_flags & DIR_HIDDEN) && (dp->d_addr != RT_DIR_PHONY_ADDR)) { + db_string_to_path(&fullname, wdbp->dbip, dp->d_namep); + find_execute_plans(wdbp, &fullname, plan); + } } } break; default: - db_fullpath_traverse(wdbp->dbip, pathname, find_execute_plans, find_execute_plans, wdbp->wdb_resp, plan); + db_fullpath_traverse(wdbp, pathname, find_execute_plans, find_execute_plans, wdbp->wdb_resp, plan); break; } db_free_full_path(&fullname); Modified: brlcad/trunk/src/libged/nfind.h =================================================================== --- brlcad/trunk/src/libged/nfind.h 2008-09-08 18:55:51 UTC (rev 32603) +++ brlcad/trunk/src/libged/nfind.h 2008-09-08 20:22:23 UTC (rev 32604) @@ -68,7 +68,7 @@ /* node definition */ typedef struct _plandata { struct _plandata *next; /* next node */ - int (*eval)(struct _plandata *, struct db_full_path *, struct db_i *dbip); + int (*eval)(struct _plandata *, struct db_full_path *, struct rt_wdb *wdbp); /* node evaluation function */ #define F_EQUAL 1 /* [acm]time inum links size */ #define F_LESSTHAN 2 @@ -94,6 +94,7 @@ char *_a_data[2]; /* array of char pointers */ char *_c_data; /* char pointer */ char *_attr_data; /* char pointer */ + char *_type_data; int _max_data; /* tree depth */ int _min_data; /* tree depth */ } p_un; @@ -107,6 +108,7 @@ #define max_data p_un._max_data #define min_data p_un._min_data #define p_data p_un._p_data +#define type_data p_un._type_data #define e_argv p_un.ex._e_argv #define e_orig p_un.ex._e_orig #define e_len p_un.ex._e_len @@ -152,7 +154,7 @@ int c_print0(char *, char ***, int, PLAN **); PLAN *c_prune(char *, char ***, int); int c_stdattr(char *, char ***, int, PLAN **); -PLAN *c_type(char *, char ***, int); +int c_type(char *, char ***, int, PLAN **); int c_openparen(char *, char ***, int, PLAN **); int c_closeparen(char *, char ***, int, PLAN **); int c_not(char *, char ***, int, PLAN **); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sta...@us...> - 2008-09-08 20:25:05
|
Revision: 32605 http://brlcad.svn.sourceforge.net/brlcad/?rev=32605&view=rev Author: starseeker Date: 2008-09-08 20:25:15 +0000 (Mon, 08 Sep 2008) Log Message: ----------- move nfind.c and nfind.h to search.c and search.h Modified Paths: -------------- brlcad/trunk/src/libged/Makefile.am Added Paths: ----------- brlcad/trunk/src/libged/search.c brlcad/trunk/src/libged/search.h Removed Paths: ------------- brlcad/trunk/src/libged/nfind.c brlcad/trunk/src/libged/nfind.h Modified: brlcad/trunk/src/libged/Makefile.am =================================================================== --- brlcad/trunk/src/libged/Makefile.am 2008-09-08 20:22:23 UTC (rev 32604) +++ brlcad/trunk/src/libged/Makefile.am 2008-09-08 20:25:15 UTC (rev 32605) @@ -104,7 +104,6 @@ move_arb_edge.c \ move_arb_face.c \ mrot.c \ - nfind.c \ nirt.c \ nmg_collapse.c \ nmg_simplify.c \ @@ -152,6 +151,7 @@ savekey.c \ saveview.c \ scale.c \ + search.c \ set_output_script.c \ set_transparency.c \ set_uplotOutputMode.c \ @@ -207,7 +207,7 @@ ${TCL_CPPFLAGS} -DNEW_TOPS_BEHAVIOR noinst_HEADERS = \ - nfind.h \ + search.h \ ged_private.h \ qray.h Deleted: brlcad/trunk/src/libged/nfind.c =================================================================== --- brlcad/trunk/src/libged/nfind.c 2008-09-08 20:22:23 UTC (rev 32604) +++ brlcad/trunk/src/libged/nfind.c 2008-09-08 20:25:15 UTC (rev 32605) @@ -1,1227 +0,0 @@ -/* S E A R C H . C - * BRL-CAD - * - * Copyright (c) 2008 United States Government as represented by - * the U.S. Army Research Laboratory. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public License - * version 2.1 as published by the Free Software Foundation. - * - * This library is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this file; see the file named COPYING for more - * information. - * - * Includes code from OpenBSD's find command: - * - * Copyright (c) 1990, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ -/** @file search.c - * - * The search command. - * - */ - -#include "common.h" - -#include <string.h> -#include <stdlib.h> - -#include "bio.h" -#include "cmd.h" -#include "ged_private.h" - -#include "nfind.h" - -/* - * D B _ F U L L P A T H _ T R A V E R S E _ S U B T R E E - * - * A generic traversal function maintaining awareness of - * the full path to a given object. - */ -void -db_fullpath_traverse_subtree(union tree *tp, - void (*traverse_func) ( struct rt_wdb *, struct db_full_path *, - void (*) (struct rt_wdb *, struct db_full_path *, genptr_t), - void (*) (struct rt_wdb *, struct db_full_path *, genptr_t), - struct resource *, - genptr_t), - struct rt_wdb *wdbp, - struct db_full_path *dfp, - void (*comb_func) (struct rt_wdb *, struct db_full_path *, genptr_t), - void (*leaf_func) (struct rt_wdb *, struct db_full_path *, genptr_t), - struct resource *resp, - genptr_t client_data) -{ - struct directory *dp; - - if ( !tp ) - return; - - RT_CK_FULL_PATH( dfp ); - RT_CHECK_DBI( wdbp->dbip ); - RT_CK_TREE( tp ); - RT_CK_RESOURCE( resp ); - - switch ( tp->tr_op ) { - - case OP_DB_LEAF: - if ( (dp=db_lookup( wdbp->dbip, tp->tr_l.tl_name, LOOKUP_NOISY )) == DIR_NULL ) { - return; - } else { - db_add_node_to_full_path( dfp, dp); - traverse_func( wdbp, dfp, comb_func, leaf_func, resp, client_data ); - DB_FULL_PATH_POP(dfp); - break; - } - case OP_UNION: - case OP_INTERSECT: - case OP_SUBTRACT: - case OP_XOR: - db_fullpath_traverse_subtree( tp->tr_b.tb_left, traverse_func, wdbp, dfp, comb_func, leaf_func, resp, client_data ); - db_fullpath_traverse_subtree( tp->tr_b.tb_right, traverse_func, wdbp, dfp, comb_func, leaf_func, resp, client_data ); - break; - default: - bu_log( "db_functree_subtree: unrecognized operator %d\n", tp->tr_op ); - bu_bomb( "db_functree_subtree: unrecognized operator\n" ); - } -} - -/* - * D B _ F U L L P A T H _ T R A V E R S E - * - * This subroutine is called for a no-frills tree-walk, - * with the provided subroutines being called when entering and - * exiting combinations and at leaf (solid) nodes. - * - * This routine is recursive, so no variables may be declared static. - * - * Unlike db_preorder_traverse, this routine and its subroutines - * use db_full_path structures instead of directory structures. - */ -void -db_fullpath_traverse( struct rt_wdb *wdbp, - struct db_full_path *dfp, - void (*comb_func) (struct rt_wdb *, struct db_full_path *, genptr_t), - void (*leaf_func) (struct rt_wdb *, struct db_full_path *, genptr_t), - struct resource *resp, - genptr_t client_data ) -{ - struct directory *dp; - register int i; - RT_CK_FULL_PATH(dfp); - RT_CK_DBI(wdbp->dbip); - - dp = DB_FULL_PATH_CUR_DIR(dfp); - - if ( dp->d_flags & DIR_COMB ) { - /* entering region */ - if ( comb_func ) - comb_func( wdbp, dfp, client_data ); - if ( wdbp->dbip->dbi_version < 5 ) { - register union record *rp; - register struct directory *mdp; - /* - * Load the combination into local record buffer - * This is in external v4 format. - */ - if ( (rp = db_getmrec( wdbp->dbip, dp )) == (union record *)0 ) - return; - /* recurse */ - for ( i=1; i < dp->d_len; i++ ) { - if ( (mdp = db_lookup( wdbp->dbip, rp[i].M.m_instname, - LOOKUP_NOISY )) == DIR_NULL ) { - continue; - } else { - db_add_node_to_full_path(dfp, mdp); - db_fullpath_traverse(wdbp, dfp, comb_func, leaf_func, resp, client_data); - DB_FULL_PATH_POP(dfp); - } - } - bu_free( (char *)rp, "db_preorder_traverse[]" ); - } else { - struct rt_db_internal in; - struct rt_comb_internal *comb; - struct directory *ndp; - - if ( rt_db_get_internal5( &in, dp, wdbp->dbip, NULL, resp ) < 0 ) - return; - - comb = (struct rt_comb_internal *)in.idb_ptr; - - db_fullpath_traverse_subtree( comb->tree, db_fullpath_traverse, wdbp, dfp, comb_func, leaf_func, resp, client_data ); - - rt_db_free_internal( &in, resp ); - } - } - if ( dp->d_flags & DIR_SOLID || dp->d_major_type & DB5_MAJORTYPE_BINARY_MASK ) { - /* at leaf */ - if ( leaf_func ) - leaf_func( wdbp, dfp, client_data ); - } -} - - -int typecompare(const void *, const void *); - -/* NB: the following table must be sorted lexically. */ -static OPTION options[] = { - { "!", N_NOT, c_not, O_ZERO }, - { "(", N_OPENPAREN, c_openparen, O_ZERO }, - { ")", N_CLOSEPAREN, c_closeparen, O_ZERO }, - { "-attr", N_ATTR, c_attr, O_ARGV }, - { "-name", N_NAME, c_name, O_ARGV }, - { "-o", N_OR, c_or, O_ZERO }, - { "-print", N_PRINT, c_print, O_ZERO }, - { "-print0", N_PRINT0, c_print0, O_ZERO }, - { "-stdattr", N_STDATTR, c_stdattr, O_ZERO }, - { "-type", N_TYPE, c_type, O_ARGV }, -}; - -static PLAN * -palloc(enum ntype t, int (*f)(PLAN *, struct db_full_path *, struct rt_wdb *)) -{ - PLAN *new; - - if ((new = bu_calloc(1, sizeof(PLAN), "Allocate PLAN structure"))) { - new->type = t; - new->eval = f; - return (new); - } - bu_exit(1, NULL); - /* NOTREACHED */ -} - -/* - * ( expression ) functions -- - * - * True if expression is true. - */ -int -f_expr(PLAN *plan, struct db_full_path *entry, struct rt_wdb *wdbp) -{ - PLAN *p; - int state; - - for (p = plan->p_data[0]; - p && (state = (p->eval)(p, entry, wdbp)); p = p->next); - return (state); -} - - -/* - * N_OPENPAREN and N_CLOSEPAREN nodes are temporary place markers. They are - * eliminated during phase 2 of find_formplan() --- the '(' node is converted - * to a N_EXPR node containing the expression and the ')' node is discarded. - */ -int -c_openparen(char *ignore, char ***ignored, int unused, PLAN **resultplan) -{ - (*resultplan) = (palloc(N_OPENPAREN, (int (*)(PLAN *, struct db_full_path *, struct rt_wdb *))-1)); - return BRLCAD_OK; -} - -int -c_closeparen(char *ignore, char ***ignored, int unused, PLAN **resultplan) -{ - (*resultplan) = (palloc(N_CLOSEPAREN, (int (*)(PLAN *, struct db_full_path *, struct rt_wdb *))-1)); - return BRLCAD_OK; -} - - -/* - * ! expression functions -- - * - * Negation of a primary; the unary NOT operator. - */ -int -f_not(PLAN *plan, struct db_full_path *entry, struct rt_wdb *wdbp) -{ - PLAN *p; - int state; - - for (p = plan->p_data[0]; - p && (state = (p->eval)(p, entry, wdbp)); p = p->next); - return (!state); -} - -int -c_not(char *ignore, char ***ignored, int unused, PLAN **resultplan) -{ - (*resultplan) = (palloc(N_NOT, f_not)); - return BRLCAD_OK; -} - -/* - * expression -o expression functions -- - * - * Alternation of primaries; the OR operator. The second expression is - * not evaluated if the first expression is true. - */ -int -f_or(PLAN *plan, struct db_full_path *entry, struct rt_wdb *wdbp) -{ - PLAN *p; - int state; - - for (p = plan->p_data[0]; - p && (state = (p->eval)(p, entry, wdbp)); p = p->next); - - if (state) - return (1); - - for (p = plan->p_data[1]; - p && (state = (p->eval)(p, entry, wdbp)); p = p->next); - return (state); -} - -int -c_or(char *ignore, char ***ignored, int unused, PLAN **resultplan) -{ - (*resultplan) = (palloc(N_OR, f_or)); - return BRLCAD_OK; -} - - -/* - * -name functions -- - * - * True if the basename of the filename being examined - * matches pattern using Pattern Matching Notation S3.14 - */ -int -f_name(PLAN *plan, struct db_full_path *entry, struct rt_wdb *wdbp) -{ - return (!fnmatch(plan->c_data, DB_FULL_PATH_CUR_DIR(entry)->d_namep, 0)); -} - -int -c_name(char *pattern, char ***ignored, int unused, PLAN **resultplan) -{ - PLAN *new; - - new = palloc(N_NAME, f_name); - new->c_data = pattern; - (*resultplan) = new; - return BRLCAD_OK; -} - -/* - * -attr functions -- - * - * True if the database object being examined has the attribute - * supplied to the attr option - */ -int -f_attr(PLAN *plan, struct db_full_path *entry, struct rt_wdb *wdbp) -{ - struct bu_vls attribname; - struct bu_vls value; - struct bu_attribute_value_set avs; - struct bu_attribute_value_pair *avpp; - int equalpos = 0; - int checkval = 0; - int i; - bu_vls_init(&attribname); - bu_vls_init(&value); - - - /* Check for unescaped equal sign - if present, the - * attribute must not only be present but have the - * value indicated. Escaping is done with the "/" - * character. - */ - - while ((equalpos < strlen(plan->attr_data)) && (plan->attr_data[equalpos] != '=')) { - if ((plan->attr_data[equalpos] == '/') && (plan->attr_data[equalpos + 1] == '=')) {equalpos++;} - equalpos++; - } - - if (equalpos == strlen(plan->attr_data)){ - bu_vls_strcpy(&attribname, plan->attr_data); - } else { - checkval = 1; - bu_vls_strncpy(&attribname, plan->attr_data, equalpos); - bu_vls_strncpy(&value, &(plan->attr_data[equalpos+1]), strlen(plan->attr_data) - equalpos - 1); - } - - /* Get attributes for object and check all of - * them to see if there is a match to the requested - * attribute. If a value is supplied, check the - * value of any matches to the attribute name before - * returning success. - */ - - bu_avs_init_empty(&avs); - db5_get_attributes( wdbp->dbip, &avs, DB_FULL_PATH_CUR_DIR(entry)); - avpp = avs.avp; - for (i = 0; i < avs.count; i++, avpp++) { - if (!fnmatch(bu_vls_addr(&attribname), avpp->name, 0)) { - if ( checkval == 1 ) { - if (!fnmatch(bu_vls_addr(&value), avpp->value, 0)) { - bu_avs_free( &avs); - bu_vls_free( &attribname); - bu_vls_free( &value); - return (1); - } - } else { - bu_avs_free( &avs); - bu_vls_free( &attribname); - bu_vls_free( &value); - return (1); - } - } - } - bu_avs_free( &avs); - bu_vls_free( &attribname); - bu_vls_free( &value); - return (0); -} - -int -c_attr(char *pattern, char ***ignored, int unused, PLAN **resultplan) -{ - PLAN *new; - - new = palloc(N_ATTR, f_attr); - new->attr_data = pattern; - (*resultplan) = new; - return BRLCAD_OK; -} - - -/* - * -stdattr function -- - * - * Search based on the presence of the - * "standard" attributes - matches when there - * are ONLY "standard" attributes - * associated with an object. - */ - int - f_stdattr(PLAN *plan, struct db_full_path *entry, struct rt_wdb *wdbp) - { - struct bu_attribute_value_set avs; - struct bu_attribute_value_pair *avpp; - int i; - int found_nonstd_attr = 0; - int found_attr = 0; - - /* Get attributes for object and check all of - * them to see if there is not a match to the - * standard attributes. If any is found return - * failure, otherwise success. - */ - - bu_avs_init_empty(&avs); - db5_get_attributes( wdbp->dbip, &avs, DB_FULL_PATH_CUR_DIR(entry)); - avpp = avs.avp; - for (i = 0; i < avs.count; i++, avpp++) { - found_attr = 1; - if (strcmp(avpp->name, "GIFTmater") != 0 && - strcmp(avpp->name, "aircode") != 0 && - strcmp(avpp->name, "inherit") != 0 && - strcmp(avpp->name, "los") != 0 && - strcmp(avpp->name, "material_id") != 0 && - strcmp(avpp->name, "oshader") != 0 && - strcmp(avpp->name, "region") != 0 && - strcmp(avpp->name, "region_id") != 0 && - strcmp(avpp->name, "rgb") != 0){ - - found_nonstd_attr = 1; - } - } - - bu_avs_free( &avs); - - if (!found_nonstd_attr && found_attr) return 1; - return 0; - } - - int - c_stdattr(char *pattern, char ***ignored, int unused, PLAN **resultplan) - { - PLAN *new; - - new = palloc(N_STDATTR, f_stdattr); - (*resultplan) = new; - return BRLCAD_OK; - } - -/* - * -type function -- - * - * Search based on the type of the object - primitives are matched - * based on their primitive type (tor, tgc, arb4, etc.) and combinations - * are matched based on whether they are a combination or region. - */ - int - f_type(PLAN *plan, struct db_full_path *entry, struct rt_wdb *wdbp) - { - struct rt_db_internal intern; - int type_match = 0; - int type; - - rt_db_get_internal(&intern, DB_FULL_PATH_CUR_DIR(entry), wdbp->dbip, (fastf_t *)NULL, &rt_uniresource); - - if(intern.idb_major_type != DB5_MAJORTYPE_BRLCAD) return 0; - - /* Eventually this whole switch statement needs to go away - * in favor of a function to query the primitive's short name - * and use that for the comparison - will be MUCH shorter and - * simpler. - */ - switch (intern.idb_minor_type) { - case DB5_MINORTYPE_BRLCAD_TOR: - type_match = (!fnmatch(plan->type_data, "tor", 0)); - break; - case DB5_MINORTYPE_BRLCAD_TGC: - type_match = (!fnmatch(plan->type_data, "tgc", 0)); - break; - case DB5_MINORTYPE_BRLCAD_ELL: - type_match = (!fnmatch(plan->type_data, "ell", 0)); - break; - case DB5_MINORTYPE_BRLCAD_ARB8: - type = rt_arb_std_type(&intern, &wdbp->wdb_tol); - - switch (type) { - case 4: - type_match = (!fnmatch(plan->type_data, "arb4", 0)); - break; - case 5: - type_match = (!fnmatch(plan->type_data, "arb5", 0)); - break; - case 6: - type_match = (!fnmatch(plan->type_data, "arb6", 0)); - break; - case 7: - type_match = (!fnmatch(plan->type_data, "arb7", 0)); - break; - case 8: - type_match = (!fnmatch(plan->type_data, "arb8", 0)); - break; - default: - type_match = (!fnmatch(plan->type_data, "invalid", 0)); - break; - } - - break; - case DB5_MINORTYPE_BRLCAD_ARS: - type_match = (!fnmatch(plan->type_data, "ars", 0)); - break; - case DB5_MINORTYPE_BRLCAD_HALF: - type_match = (!fnmatch(plan->type_data, "half", 0)); - break; - case DB5_MINORTYPE_BRLCAD_REC: - type_match = (!fnmatch(plan->type_data, "rec", 0)); - break; - case DB5_MINORTYPE_BRLCAD_POLY: - type_match = (!fnmatch(plan->type_data, "poly", 0)); - break; - case DB5_MINORTYPE_BRLCAD_BSPLINE: - type_match = (!fnmatch(plan->type_data, "spline", 0)); - break; - case DB5_MINORTYPE_BRLCAD_SPH: - type_match = (!fnmatch(plan->type_data, "sph", 0)); - break; - case DB5_MINORTYPE_BRLCAD_NMG: - type_match = (!fnmatch(plan->type_data, "nmg", 0)); - break; - case DB5_MINORTYPE_BRLCAD_EBM: - type_match = (!fnmatch(plan->type_data, "ebm", 0)); - break; - case DB5_MINORTYPE_BRLCAD_VOL: - type_match = (!fnmatch(plan->type_data, "vol", 0)); - break; - case DB5_MINORTYPE_BRLCAD_ARBN: - type_match = (!fnmatch(plan->type_data, "arbn", 0)); - break; - case DB5_MINORTYPE_BRLCAD_PIPE: - type_match = (!fnmatch(plan->type_data, "pipe", 0)); - break; - case DB5_MINORTYPE_BRLCAD_PARTICLE: - type_match = (!fnmatch(plan->type_data, "part", 0)); - break; - case DB5_MINORTYPE_BRLCAD_RPC: - type_match = (!fnmatch(plan->type_data, "rpc", 0)); - break; - case DB5_MINORTYPE_BRLCAD_RHC: - type_match = (!fnmatch(plan->type_data, "rhc", 0)); - break; - case DB5_MINORTYPE_BRLCAD_EPA: - type_match = (!fnmatch(plan->type_data, "epa", 0)); - break; - case DB5_MINORTYPE_BRLCAD_EHY: - type_match = (!fnmatch(plan->type_data, "ehy", 0)); - break; - case DB5_MINORTYPE_BRLCAD_ETO: - type_match = (!fnmatch(plan->type_data, "eto", 0)); - break; - case DB5_MINORTYPE_BRLCAD_GRIP: - type_match = (!fnmatch(plan->type_data, "grip", 0)); - break; - case DB5_MINORTYPE_BRLCAD_JOINT: - type_match = (!fnmatch(plan->type_data, "joint", 0)); - break; - case DB5_MINORTYPE_BRLCAD_HF: - type_match = (!fnmatch(plan->type_data, "hf", 0)); - break; - case DB5_MINORTYPE_BRLCAD_DSP: - type_match = (!fnmatch(plan->type_data, "dsp", 0)); - break; - case DB5_MINORTYPE_BRLCAD_SKETCH: - type_match = (!fnmatch(plan->type_data, "sketch", 0)); - break; - case DB5_MINORTYPE_BRLCAD_EXTRUDE: - type_match = (!fnmatch(plan->type_data, "extrude", 0)); - break; - case DB5_MINORTYPE_BRLCAD_SUBMODEL: - type_match = (!fnmatch(plan->type_data, "submodel", 0)); - break; - case DB5_MINORTYPE_BRLCAD_CLINE: - type_match = (!fnmatch(plan->type_data, "cline", 0)); - break; - case DB5_MINORTYPE_BRLCAD_BOT: - type_match = (!fnmatch(plan->type_data, "bot", 0)); - break; - case DB5_MINORTYPE_BRLCAD_COMBINATION: - if (DB_FULL_PATH_CUR_DIR(entry)->d_flags & DIR_REGION) { - if ((!fnmatch(plan->type_data, "r", 0)) || (!fnmatch(plan->type_data, "region", 0))) { - type_match = 1; - } - } else { - if ((!fnmatch(plan->type_data, "comb", 0)) || (!fnmatch(plan->type_data, "combination", 0))) { - type_match = 1; - } - } - break; - default: - type_match = (!fnmatch(plan->type_data, "other", 0)); - break; - } - - rt_db_free_internal(&intern, &rt_uniresource); - return (type_match); - } - - int - c_type(char *pattern, char ***ignored, int unused, PLAN **resultplan) - { - PLAN *new; - - new = palloc(N_TYPE, f_type); - new->type_data = pattern; - (*resultplan) = new; - return BRLCAD_OK; - } - - - -/* - * -print functions -- - * - * Always true, causes the current pathame to be written to - * standard output. - */ -int -f_print(PLAN *plan, struct db_full_path *entry, struct rt_wdb *wdbp) -{ - bu_log("%s\n", db_path_to_string(entry)); - isoutput = 0; - return(1); -} - -/* ARGSUSED */ -int -f_print0(PLAN *plan, struct db_full_path *entry, struct rt_wdb *wdbp) -{ - (void)fputs(db_path_to_string(entry), stdout); - (void)fputc('\0', stdout); - return(1); -} - -int -c_print(char *ignore, char ***ignored, int unused, PLAN **resultplan) -{ - isoutput = 1; - - (*resultplan) = palloc(N_PRINT, f_print); - return BRLCAD_OK; -} - -int -c_print0(char *ignore, char ***ignored, int unused, PLAN **resultplan) -{ - isoutput = 1; - - (*resultplan) = palloc(N_PRINT0, f_print0); - return BRLCAD_OK; -} - - - - -/* - * find_create -- - * create a node corresponding to a command line argument. - * - * TODO: - * add create/process function pointers to node, so we can skip - * this switch stuff. - */ -int -find_create(char ***argvp, PLAN **resultplan) -{ - OPTION *p; - PLAN *new; - char **argv; - - argv = *argvp; - - if ((p = option(*argv)) == NULL) { - bu_log("%s: unknown option passed to find_create\n", *argv); - return BRLCAD_ERROR; - } - ++argv; - if (p->flags & (O_ARGV|O_ARGVP) && !*argv) { - bu_log("%s: requires additional arguments\n", *--argv); - return BRLCAD_ERROR; - } - switch(p->flags) { - case O_NONE: - new = NULL; - break; - case O_ZERO: - (p->create)(NULL, NULL, 0, &new); - break; - case O_ARGV: - (p->create)(*argv++, NULL, 0, &new); - break; - case O_ARGVP: - (p->create)(NULL, &argv, p->token == N_OK, &new); - break; - default: - return BRLCAD_OK; - } - *argvp = argv; - (*resultplan) = new; - return BRLCAD_OK; -} - -OPTION * -option(char *name) -{ - OPTION tmp; - - tmp.name = name; - return ((OPTION *)bsearch(&tmp, options, - sizeof(options)/sizeof(OPTION), sizeof(OPTION), typecompare)); -} - -int -typecompare(const void *a, const void *b) -{ - return (strcmp(((OPTION *)a)->name, ((OPTION *)b)->name)); -} - - - - -/* - * yanknode -- - * destructively removes the top from the plan - */ -static PLAN * -yanknode(PLAN **planp) /* pointer to top of plan (modified) */ -{ - PLAN *node; /* top node removed from the plan */ - - if ((node = (*planp)) == NULL) - return (NULL); - (*planp) = (*planp)->next; - node->next = NULL; - return (node); -} - -/* - * yankexpr -- - * Removes one expression from the plan. This is used mainly by - * paren_squish. In comments below, an expression is either a - * simple node or a N_EXPR node containing a list of simple nodes. - */ -int -yankexpr(PLAN **planp, PLAN **resultplan) /* pointer to top of plan (modified) */ -{ - PLAN *next; /* temp node holding subexpression results */ - PLAN *node; /* pointer to returned node or expression */ - PLAN *tail; /* pointer to tail of subplan */ - PLAN *subplan; /* pointer to head of ( ) expression */ - extern int f_expr(PLAN *, struct db_full_path *, struct rt_wdb *); - int error_return = BRLCAD_OK; - - /* first pull the top node from the plan */ - if ((node = yanknode(planp)) == NULL) { - (*resultplan) = NULL; - return BRLCAD_OK; - } - /* - * If the node is an '(' then we recursively slurp up expressions - * until we find its associated ')'. If it's a closing paren we - * just return it and unwind our recursion; all other nodes are - * complete expressions, so just return them. - */ - if (node->type == N_OPENPAREN) - for (tail = subplan = NULL;;) { - if ((error_return = yankexpr(planp, &next)) != BRLCAD_OK) return BRLCAD_ERROR; - if (next == NULL) { - bu_log("(: missing closing ')'\n"); - return BRLCAD_ERROR; - } - /* - * If we find a closing ')' we store the collected - * subplan in our '(' node and convert the node to - * a N_EXPR. The ')' we found is ignored. Otherwise, - * we just continue to add whatever we get to our - * subplan. - */ - if (next->type == N_CLOSEPAREN) { - if (subplan == NULL) { - bu_log("(): empty inner expression"); - return BRLCAD_ERROR; - } - node->p_data[0] = subplan; - node->type = N_EXPR; - node->eval = f_expr; - break; - } else { - if (subplan == NULL) - tail = subplan = next; - else { - tail->next = next; - tail = next; - } - tail->next = NULL; - } - } - (*resultplan) = node; - if (!(error_return == BRLCAD_OK)) { - return BRLCAD_ERROR; - } else { - return BRLCAD_OK; - } -} - - -/* - * paren_squish -- - * replaces "parentheisized" plans in our search plan with "expr" nodes. - */ -int -paren_squish(PLAN *plan, PLAN **resultplan) /* plan with ( ) nodes */ -{ - PLAN *expr; /* pointer to next expression */ - PLAN *tail; /* pointer to tail of result plan */ - PLAN *result; /* pointer to head of result plan */ - - result = tail = NULL; - - /* - * the basic idea is to have yankexpr do all our work and just - * collect it's results together. - */ - if (yankexpr(&plan, &expr) != BRLCAD_OK) return BRLCAD_ERROR; - while (expr != NULL) { - /* - * if we find an unclaimed ')' it means there is a missing - * '(' someplace. - */ - if (expr->type == N_CLOSEPAREN) { - bu_log("): no beginning '('"); - return BRLCAD_ERROR; - } - - /* add the expression to our result plan */ - if (result == NULL) - tail = result = expr; - else { - tail->next = expr; - tail = expr; - } - tail->next = NULL; - if (yankexpr(&plan, &expr) != BRLCAD_OK) return BRLCAD_ERROR; - } - (*resultplan) = result; - return BRLCAD_OK; -} - -/* - * not_squish -- - * compresses "!" expressions in our search plan. - */ -int -not_squish(PLAN *plan, PLAN **resultplan) /* plan to process */ -{ - PLAN *next; /* next node being processed */ - PLAN *node; /* temporary node used in N_NOT processing */ - PLAN *tail; /* pointer to tail of result plan */ - PLAN *result; /* pointer to head of result plan */ - - tail = result = next = NULL; - - while ((next = yanknode(&plan)) != NULL) { - /* - * if we encounter a ( expression ) then look for nots in - * the expr subplan. - */ - if (next->type == N_EXPR) - if (not_squish(next->p_data[0], &(next->p_data[0])) != BRLCAD_OK) return BRLCAD_ERROR; - - /* - * if we encounter a not, then snag the next node and place - * it in the not's subplan. As an optimization we compress - * several not's to zero or one not. - */ - if (next->type == N_NOT) { - int notlevel = 1; - - node = yanknode(&plan); - while (node != NULL && node->type == N_NOT) { - ++notlevel; - node = yanknode(&plan); - } - if (node == NULL) { - bu_log("!: no following expression"); - return BRLCAD_ERROR; - } - if (node->type == N_OR) { - bu_log("!: nothing between ! and -o"); - return BRLCAD_ERROR; - } - if (node->type == N_EXPR) - if (not_squish(node, &node) != BRLCAD_OK) return BRLCAD_ERROR; - if (notlevel % 2 != 1) - next = node; - else - next->p_data[0] = node; - } - - /* add the node to our result plan */ - if (result == NULL) - tail = result = next; - else { - tail->next = next; - tail = next; - } - tail->next = NULL; - } - (*resultplan) = result; - return BRLCAD_OK; -} - - -/* - * or_squish -- - * compresses -o expressions in our search plan. - */ -int -or_squish(PLAN *plan, PLAN **resultplan) /* plan with ors to be squished */ -{ - PLAN *next; /* next node being processed */ - PLAN *tail; /* pointer to tail of result plan */ - PLAN *result; /* pointer to head of result plan */ - - tail = result = next = NULL; - - while ((next = yanknode(&plan)) != NULL) { - /* - * if we encounter a ( expression ) then look for or's in - * the expr subplan. - */ - if (next->type == N_EXPR) - if(or_squish(next->p_data[0], &(next->p_data[0])) != BRLCAD_OK) return BRLCAD_ERROR; - - /* if we encounter a not then look for not's in the subplan */ - if (next->type == N_NOT) - if(or_squish(next->p_data[0], &(next->p_data[0])) != BRLCAD_OK) return BRLCAD_ERROR; - - /* - * if we encounter an or, then place our collected plan in the - * or's first subplan and then recursively collect the - * remaining stuff into the second subplan and return the or. - */ - if (next->type == N_OR) { - if (result == NULL) { - bu_log("-o: no expression before -o"); - return BRLCAD_ERROR; - } - next->p_data[0] = result; - if(or_squish(plan, &(next->p_data[1])) != BRLCAD_OK) return BRLCAD_ERROR; - if (next->p_data[1] == NULL) { - bu_log("-o: no expression after -o"); - return BRLCAD_ERROR; - } - (*resultplan) = next; - return BRLCAD_OK; - } - - /* add the node to our result plan */ - if (result == NULL) - tail = result = next; - else { - tail->next = next; - tail = next; - } - tail->next = NULL; - } - (*resultplan) = result; - return BRLCAD_OK; -} - - - - -/* - * find_formplan -- - * process the command line and create a "plan" corresponding to the - * command arguments. - */ -int -find_formplan(char **argv, PLAN **resultplan) -{ - PLAN *plan, *tail, *new; - - /* - * for each argument in the command line, determine what kind of node - * it is, create the appropriate node type and add the new plan node - * to the end of the existing plan. The resulting plan is a linked - * list of plan nodes. For example, the string: - * - * % find . -name foo -newer bar -print - * - * results in the plan: - * - * [-name foo]--> [-newer bar]--> [-print] - * - * in this diagram, `[-name foo]' represents the plan node generated - * by c_name() with an argument of foo and `-->' represents the - * plan->next pointer. - */ - for (plan = tail = NULL; *argv;) { - if (find_create(&argv, &new) != BRLCAD_OK) return BRLCAD_ERROR; - if (!(new)) - continue; - if (plan == NULL) - tail = plan = new; - else { - tail->next = new; - tail = new; - } - } - - /* - * if the user didn't specify one of -print, -ok or -exec, then -print - * is assumed so we bracket the current expression with parens, if - * necessary, and add a -print node on the end. - */ - if (!isoutput) { - if (plan == NULL) { - c_print(NULL, NULL, 0, &new); - tail = plan = new; - } else { - c_openparen(NULL, NULL, 0, &new); - new->next = plan; - plan = new; - c_closeparen(NULL, NULL, 0, &new); - tail->next = new; - tail = new; - c_print(NULL, NULL, 0, &new); - tail->next = new; - tail = new; - } - } - - /* - * the command line has been completely processed into a search plan - * except for the (, ), !, and -o operators. Rearrange the plan so - * that the portions of the plan which are affected by the operators - * are moved into operator nodes themselves. For example: - * - * [!]--> [-name foo]--> [-print] - * - * becomes - * - * [! [-name foo] ]--> [-print] - * - * and - * - * [(]--> [-depth]--> [-name foo]--> [)]--> [-print] - * - * becomes - * - * [expr [-depth]-->[-name foo] ]--> [-print] - * - * operators are handled in order of precedence. - */ - - if(paren_squish(plan, &plan) != BRLCAD_OK) return BRLCAD_ERROR; /* ()'s */ - if(not_squish(plan, &plan) != BRLCAD_OK) return BRLCAD_ERROR; /* !'s */ - if(or_squish(plan, &plan) != BRLCAD_OK) return BRLCAD_ERROR; /* -o's */ - (*resultplan) = plan; - return BRLCAD_OK; -} - -void -find_execute_plans(struct rt_wdb *wdbp, struct db_full_path *dfp, genptr_t inputplan) { - PLAN *p; - PLAN *plan = (PLAN *)inputplan; - for (p = plan; p && (p->eval)(p, dfp, wdbp); p = p->next) - ; - -} - -void -find_execute(PLAN *plan, /* search plan */ - struct db_full_path *pathname, /* array of pathnames to traverse */ - struct rt_wdb *wdbp, - int execute_style) -{ - struct directory *dp; - struct db_full_path fullname; - int i; - db_full_path_init(&fullname); - switch (execute_style) { - case 0: - db_fullpath_traverse(wdbp, pathname, find_execute_plans, find_execute_plans, wdbp->wdb_resp, plan); - break; - case 1: - for (i = 0; i < RT_DBNHASH; i++) { - for (dp = wdbp->dbip->dbi_Head[i]; dp != DIR_NULL; dp = dp->d_forw) { - if (!(dp->d_flags & DIR_HIDDEN) && (dp->d_addr != RT_DIR_PHONY_ADDR)) { - db_string_to_path(&fullname, wdbp->dbip, dp->d_namep); - find_execute_plans(wdbp, &fullname, plan); - } - } - } - break; - default: - db_fullpath_traverse(wdbp, pathname, find_execute_plans, find_execute_plans, wdbp->wdb_resp, plan); - break; - } - db_free_full_path(&fullname); -} - - -int isoutput; - -int -wdb_search_cmd(struct rt_wdb *wdbp, - Tcl_Interp *interp, - int argc, - char *argv[]) -{ - register int i, k; - register struct directory *dp; - struct rt_db_internal intern; - register struct rt_comb_internal *comb=(struct rt_comb_internal *)NULL; - struct bu_vls vls; - int aflag = 0; /* look at all objects */ - PLAN *dbplan; - struct db_full_path dfp; - - if (argc < 2) { - Tcl_AppendResult(interp, "search [path] [expressions...]\n", (char *)NULL); - } else { - db_full_path_init(&dfp); - db_update_nref(wdbp->dbip, &rt_uniresource); - - - if ( !( (argv[1][0] == '-') || (argv[1][0] == '!') || (argv[1][0] == '(') ) && (strcmp(argv[1],"/") != 0) && (strcmp(argv[1],".") != 0) ) { - db_string_to_path(&dfp, wdbp->dbip, argv[1]); - isoutput = 0; - if (find_formplan(&argv[2], &dbplan) != BRLCAD_OK) { - Tcl_AppendResult(interp, "Failed to build find plan.\n", (char *)NULL); - return TCL_ERROR; - } else { - find_execute(dbplan, &dfp, wdbp, 0); - } - } else { - if (strcmp(argv[1],".") == 0) { - isoutput = 0; - if (find_formplan(&argv[2], &dbplan) != BRLCAD_OK) { - Tcl_AppendResult(interp, "Failed to build find plan.\n", (char *)NULL); - return TCL_ERROR; - } else { - find_execute(dbplan, NULL, wdbp, 1); - } - } else { - for (i = 0; i < RT_DBNHASH; i++) { - for (dp = wdbp->dbip->dbi_Head[i]; dp != DIR_NULL; dp = dp->d_forw) { - if (dp->d_nref == 0 && !(dp->d_flags & DIR_HIDDEN) && (dp->d_addr != RT_DIR_PHONY_ADDR)) { - db_string_to_path(&dfp, wdbp->dbip, dp->d_namep); - isoutput = 0; - if ( (argv[1][0] == '-') || (argv[1][0] == '!') || (argv[1][0] == '(') ) { - if (find_formplan(&argv[1], &dbplan) != BRLCAD_OK) { - Tcl_AppendResult(interp, "Failed to build find plan.\n", (char *)NULL); - return TCL_ERROR; - } else { - find_execute(dbplan, &dfp, wdbp, 0); - } - } else { - if (find_formplan(&argv[2], &dbplan) != BRLCAD_OK) { - Tcl_AppendResult(interp, "Failed to build find plan.\n", (char *)NULL); - return TCL_ERROR; - } else { - find_execute(dbplan, &dfp, wdbp, 0); - } - } - } - } - } - } - } - db_free_full_path(&dfp); - } - return TCL_OK; -} - - - -/* - * Local Variables: - * tab-width: 8 - * mode: C - * indent-tabs-mode: t - * c-file-style: "stroustrup" - * End: - * ex: shiftwidth=4 tabstop=8 - */ Deleted: brlcad/trunk/src/libged/nfind.h =================================================================== --- brlcad/trunk/src/libged/nfind.h 2008-09-08 20:22:23 UTC (rev 32604) +++ brlcad/trunk/src/libged/nfind.h 2008-09-08 20:25:15 UTC (rev 32605) @@ -1,163 +0,0 @@ -/* N F I N D . H - * BRL-CAD - * - * Copyright (c) 2008 United States Government as represented by - * the U.S. Army Research Laboratory. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public License - * version 2.1 as published by the Free Software Foundation. - * - * This library is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this file; see the file named COPYING for more - * information. - * - * Includes code from OpenBSD's find command: - * - * Copyright (c) 1990, 1993 - * The Regents of the University of California. All rights reserved. - * - * This code is derived from software contributed to Berkeley by - * Cimarron D. Taylor of the University of California, Berkeley. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - */ - - -#include <sys/cdefs.h> - -/* node type */ -enum ntype { - N_AND = 1, /* must start > 0 */ - N_ATTR, - N_CLOSEPAREN, N_DEPTH, N_EMPTY, N_EXEC, N_EXECDIR, N_EXPR, - N_FLAGS, N_INAME, N_LS, N_MAXDEPTH, - N_MINDEPTH, N_NAME, N_NOT, N_OK, N_OPENPAREN, N_OR, N_PATH, - N_PRINT, N_PRINT0, N_PRUNE, N_STDATTR, N_TYPE -}; - - -/* node definition */ -typedef struct _plandata { - struct _plandata *next; /* next node */ - int (*eval)(struct _plandata *, struct db_full_path *, struct rt_wdb *wdbp); - /* node evaluation function */ -#define F_EQUAL 1 /* [acm]time inum links size */ -#define F_LESSTHAN 2 -#define F_GREATER 3 -#define F_NEEDOK 1 /* exec ok */ -#define F_MTFLAG 1 /* fstype */ -#define F_MTTYPE 2 -#define F_ATLEAST 1 /* perm */ - int flags; /* private flags */ - enum ntype type; /* plan node type */ - union { - gid_t _g_data; /* gid */ - struct { - u_int _f_flags; - u_int _f_mask; - } fl; - struct _plandata *_p_data[2]; /* PLAN trees */ - struct _ex { - char **_e_argv; /* argv array */ - char **_e_orig; /* original strings */ - int *_e_len; /* allocated length */ - } ex; - char *_a_data[2]; /* array of char pointers */ - char *_c_data; /* char pointer */ - char *_attr_data; /* char pointer */ - char *_type_data; - int _max_data; /* tree depth */ - int _min_data; /* tree depth */ - } p_un; -} PLAN; -#define a_data p_un._a_data -#define c_data p_un._c_data -#define attr_data p_un._attr_data -#define fl_flags p_un.fl._f_flags -#define fl_mask p_un.fl._f_mask -#define g_data p_un._g_data -#define max_data p_un._max_data -#define min_data p_un._min_data -#define p_data p_un._p_data -#define type_data p_un._type_data -#define e_argv p_un.ex._e_argv -#define e_orig p_un.ex._e_orig -#define e_len p_un.ex._e_len - -typedef struct _option { - char *name; /* option name */ - enum ntype token; /* token type */ - int (*create)(char *, char ***, int, PLAN **); /* create function */ -#define O_NONE 0x01 /* no call required */ -#define O_ZERO 0x02 /* pass: nothing */ -#define O_ARGV 0x04 /* pass: argv, increment argv */ -#define O_ARGVP 0x08 /* pass: *argv, N_OK || N_EXEC || N_EXECDIR */ - int flags; -} OPTION; - - -void brace_subst(char *, char **, char *, int); -int find_create(char ***, PLAN **); -void find_execute(PLAN *, struct db_full_path *, struct rt_wdb *, int); -int find_formplan(char **, PLAN **); -int not_squish(PLAN *, PLAN **); -OPTION *option(char *); -int or_squish(PLAN *, PLAN **); -int paren_squish(PLAN *, PLAN **); -struct stat; -void printlong(char *, char *, struct stat *); -int queryuser(char **); -void show_path(int); - -int c_attr(char *, char ***, int, PLAN **); -PLAN *c_depth(char *, char ***, int); -PLAN *c_empty(char *, char ***, int); -PLAN *c_exec(char *, char ***, int); -PLAN *c_execdir(char *, char ***, int); -PLAN *c_flags(char *, char ***, int); -PLAN *c_iname(char *, char ***, int); -PLAN *c_ls(char *, char ***, int); -PLAN *c_maxdepth(char *, char ***, int); -PLAN *c_mindepth(char *, char ***, int); -int c_name(char *, char ***, int, PLAN **); -PLAN *c_path(char *, char ***, int); -int c_print(char *, char ***, int, PLAN **); -int c_print0(char *, char ***, int, PLAN **); -PLAN *c_prune(char *, char ***, int); -int c_stdattr(char *, char ***, int, PLAN **); -int c_type(char *, char ***, int, PLAN **); -int c_openparen(char *, char ***, int, PLAN **); -int c_closeparen(char *, char ***, int, PLAN **); -int c_not(char *, char ***, int, PLAN **); -int c_or(char *, char ***, int, PLAN **); - -extern int isdepth, isoutput; Added: brlcad/trunk/src/libged/search.c =================================================================== --- brlcad/trunk/src/libged/search.c (rev 0) +++ brlcad/trunk/src/libged/search.c 2008-09-08 20:25:15 UTC (rev 32605) @@ -0,0 +1,1227 @@ +/* S E A R C H . C + * BRL-CAD + * + * Copyright (c) 2008 United States Government as represented by + * the U.S. Army Research Laboratory. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * version 2.1 as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this file; see the file named COPYING for more + * information. + * + * Includes code from OpenBSD's find command: + * + * Copyright (c) 1990, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ +/** @file search.c + * + * The search command. + * + */ + +#include "common.h" + +#include <string.h> +#include <stdlib.h> + +#include "bio.h" +#include "cmd.h" +#include "ged_private.h" + +#include "search.h" + +/* + * D B _ F U L L P A T H _ T R A V E R S E _ S U B T R E E + * + * A generic traversal function maintaining awareness of + * the full path to a given object. + */ +void +db_fullpath_traverse_subtree(union tree *tp, + void (*traverse_func) ( struct rt_wdb *, struct db_full_path *, + void (*) (struct rt_wdb *, struct db_full_path *, genptr_t), + void (*) (struct rt_wdb *, struct db_full_path *, genptr_t), + struct resource *, + genptr_t), + struct rt_wdb *wdbp, + struct db_full_path *dfp, + void (*comb_func) (struct rt_wdb *, struct db_full_path *, genptr_t), + void (*leaf_func) (struct rt_wdb *, struct db_full_path *, genptr_t), + struct resource *resp, + genptr_t client_data) +{ + struct directory *dp; + + if ( !tp ) + return; + + RT_CK_FULL_PATH( dfp ); + RT_CHECK_DBI( wdbp->dbip ); + RT_CK_TREE( tp ); + RT_CK_RESOURCE( resp ); + + switch ( tp->tr_op ) { + + case OP_DB_LEAF: + if ( (dp=db_lookup( wdbp->dbip, tp->tr_l.tl_name, LOOKUP_NOISY )) == DIR_NULL ) { + return; + } else { + db_add_node_to_full_path( dfp, dp); + traverse_func( wdbp, dfp, comb_func, leaf_func, resp, client_data ); + DB_FULL_PATH_POP(dfp); + break; + } + case OP_UNION: + case OP_INTERSECT: + case OP_SUBTRACT: + case OP_XOR: + db_fullpath_traverse_subtree( tp->tr_b.tb_left, traverse_func, wdbp, dfp, comb_func, leaf_func, resp, client_data ); + db_fullpath_traverse_subtree( tp->tr_b.tb_right, traverse_func, wdbp, dfp, comb_func, leaf_func, resp, client_data ); + break; + default: + bu_log( "db_functree_subtree: unrecognized operator %d\n", tp->tr_op ); + bu_bomb( "db_functree_subtree: unrecognized operator\n" ); + } +} + +/* + * D B _ F U L L P A T H _ T R A V E R S E + * + * This subroutine is called for a no-frills tree-walk, + * with the provided subroutines being called when entering and + * exiting combinations and at leaf (solid) nodes. + * + * This routine is recursive, so no variables may be declared static. + * + * Unlike db_preorder_traverse, this routine and its subroutines + * use db_full_path structures instead of directory structures. + */ +void +db_fullpath_traverse( struct rt_wdb *wdbp, + struct db_full_path *dfp, + void (*comb_func) (struct rt_wdb *, struct db_full_path *, genptr_t), + void (*leaf_func) (struct rt_wdb *, struct db_full_path *, genptr_t), + struct resource *resp, + genptr_t client_data ) +{ + struct directory *dp; + register int i; + RT_CK_FULL_PATH(dfp); + RT_CK_DBI(wdbp->dbip); + + dp = DB_FULL_PATH_CUR_DIR(dfp); + + if ( dp->d_flags & DIR_COMB ) { + /* entering region */ + if ( comb_func ) + comb_func( wdbp, dfp, client_data ); + if ( wdbp->dbip->dbi_version < 5 ) { + register union record *rp; + register struct directory *mdp; + /* + * Load the combination into local record buffer + * This is in external v4 format. + */ + if ( (rp = db_getmrec( wdbp->dbip, dp )) == (union record *)0 ) + return; + /* recurse */ + for ( i=1; i < dp->d_len; i++ ) { + if ( (mdp = db_lookup( wdbp->dbip, rp[i].M.m_instname, + LOOKUP_NOISY )) == DIR_NULL ) { + continue; + } else { + db_add_node_to_full_path(dfp, mdp); + db_fullpath_traverse(wdbp, dfp, comb_func, leaf_func, resp, client_data); + DB_FULL_PATH_POP(dfp); + } + } + bu_free( (char *)rp, "db_preorder_traverse[]" ); + } else { + struct rt_db_internal in; + struct rt_comb_internal *comb; + struct directory *ndp; + + if ( rt_db_get_internal5( &in, dp, wdbp->dbip, NULL, resp ) < 0 ) + return; + + comb = (struct rt_comb_internal *)in.idb_ptr; + + db_fullpath_traverse_subtree( comb->tree, db_fullpath_traverse, wdbp, dfp, comb_func, leaf_func, resp, client_data ); + + rt_db_free_internal( &in, resp ); + } + } + if ( dp->d_flags & DIR_SOLID || dp->d_major_type & DB5_MAJORTYPE_BINARY_MASK ) { + /* at leaf */ + if ( leaf_func ) + leaf_func( wdbp, dfp, client_data ); + } +} + + +int typecompare(const void *, const void *); + +/* NB: the following table must be sorted lexically. */ +static OPTION options[] = { + { "!", N_NOT, c_not, O_ZERO }, + { "(", N_OPENPAREN, c_openparen, O_ZERO }, + { ")", N_CLOSEPAREN, c_closeparen, O_ZERO }, + { "-attr", N_ATTR, c_attr, O_ARGV }, + { "-name", N_NAME, c_name, O_ARGV }, + { "-o", N_OR, c_or, O_ZERO }, + { "-print", N_PRINT, c_print, O_ZERO }, + { "-print0", N_PRINT0, c_print0, O_ZERO }, + { "-stdattr", N_STDATTR, c_stdattr, O_ZERO }, + { "-type", N_TYPE, c_type, O_ARGV }, +}; + +static PLAN * +palloc(enum ntype t, int (*f)(PLAN *, struct db_full_path *, struct rt_wdb *)) +{ + PLAN *new; + + if ((new = bu_calloc(1, sizeof(PLAN), "Allocate PLAN structure"))) { + new->type = t; + new->eval = f; + return (new); + } + bu_exit(1, NULL); + /* NOTREACHED */ +} + +/* + * ( expression ) functions -- + * + * True if expression is true. + */ +int +f_expr(PLAN *plan, struct db_full_path *entry, struct rt_wdb *wdbp) +{ + PLAN *p; + int state; + + for (p = plan->p_data[0]; + p && (state = (p->eval)(p, entry, wdbp)); p = p->next); + return (state); +} + + +/* + * N_OPENPAREN and N_CLOSEPAREN nodes are temporary place markers. They are + * eliminated during phase 2 of find_formplan() --- the '(' node is converted + * to a N_EXPR node containing the expression and the ')' node is discarded. + */ +int +c_openparen(char *ignore, char ***ignored, int unused, PLAN **resultplan) +{ + (*resultplan) = (palloc(N_OPENPAREN, (int (*)(PLAN *, struct db_full_path *, struct rt_wdb *))-1)); + return BRLCAD_OK; +} + +int +c_closeparen(char *ignore, char ***ignored, int unused, PLAN **resultplan) +{ + (*resultplan) = (palloc(N_CLOSEPAREN, (int (*)(PLAN *, struct db_full_path *, struct rt_wdb *))-1)); + return BRLCAD_OK; +} + + +/* + * ! expression functions -- + * + * Negation of a primary; the unary NOT operator. + */ +int +f_not(PLAN *plan, struct db_full_path *entry, struct rt_wdb *wdbp) +{ + PLAN *p; + int state; + + for (p = plan->p_data[0]; + p && (state = (p->eval)(p, entry, wdbp)); p = p->next); + return (!state); +} + +int +c_not(char *ignore, char ***ignored, int unused, PLAN **resultplan) +{ + (*resultplan) = (palloc(N_NOT, f_not)); + return BRLCAD_OK; +} + +/* + * expression -o expression functions -- + * + * Alternation of primaries; the OR operator. The second expression is + * not evaluated if the first expression is true. + */ +int +f_or(PLAN *plan, struct db_full_path *entry, struct rt_wdb *wdbp) +{ + PLAN *p; + int state; + + for (p = plan->p_data[0]; + p && (state = (p->eval)(p, entry, wdbp)); p = p->next); + + if (state) + return (1); + + for (p = plan->p_data[1]; + p && (state = (p->eval)(p, entry, wdbp)); p = p->next); + return (state); +} + +int +c_or(char *ignore, char ***ignored, int unused, PLAN **resultplan) +{ + (*resultplan) = (palloc(N_OR, f_or)); + return BRLCAD_OK; +} + + +/* + * -name functions -- + * + * True if the basename of the filename being examined + * matches pattern using Pattern Matching Notation S3.14 + */ +int +f_name(PLAN *plan, struct db_full_path *entry, struct rt_wdb *wdbp) +{ + return (!fnmatch(plan->c_data, DB_FULL_PATH_CUR_DIR(entry)->d_namep, 0)); +} + +int +c_name(char *pattern, char ***ignored, int unused, PLAN **resultplan) +{ + PLAN *new; + + new = palloc(N_NAME, f_name); + new->c_data = pattern; + (*resultplan) = new; + return BRLCAD_OK; +} + +/* + * -attr functions -- + * + * True if the database object being examined has the attribute + * supplied to the attr option + */ +int +f_attr(PLAN *plan, struct db_full_path *entry, struct rt_wdb *wdbp) +{ + struct bu_vls attribname; + struct bu_vls value; + struct bu_attribute_value_set avs; + struct bu_attribute_value_pair *avpp; + int equalpos = 0; + int checkval = 0; + int i; + bu_vls_init(&attribname); + bu_vls_init(&value); + + + /* Check for unescaped equal sign - if present, the + * attribute must not only be present but have the + * value indicated. Escaping is done with the "/" + * character. + */ + + while ((equalpos < strlen(plan->attr_data)) && (plan->attr_data[equalpos] != '=')) { + if ((plan->attr_data[equalpos] == '/') && (plan->attr_data[equalpos + 1] == '=')) {equalpos++;} + equalpos++; + } + + if (equalpos == strlen(plan->attr_data)){ + bu_vls_strcpy(&attribname, plan->attr_data); + } else { + checkval = 1; + bu_vls_strncpy(&attribname, plan->attr_data, equalpos); + bu_vls_strncpy(&value, &(plan->attr_data[equalpos+1]), strlen(plan->attr_data) - equalpos - 1); + } + + /* Get attributes for object and check all of + * them to see if there is a match to the requested + * attribute. If a value is supplied, check the + * value of any matches to the attribute name before + * returning success. + */ + + bu_avs_init_empty(&avs); + db5_get_attributes( wdbp->dbip, &avs, DB_FULL_PATH_CUR_DIR(entry)); + avpp = avs.avp; + for (i = 0; i < avs.count; i++, avpp++) { + if (!fnmatch(bu_vls_addr(&attribname), avpp->name, 0)) { + if ( checkval == 1 ) { + if (!fnmatch(bu_vls_addr(&value), avpp->value, 0)) { + bu_avs_free( &avs); + bu_vls_free( &attribname); + bu_vls_free( &value); + return (1); + } + } else { + bu_avs_free( &avs); + bu_vls_free( &attribname); + bu_vls_free( &value); + return (1); + } + } + } + bu_avs_free( &avs); + bu_vls_free( &attribname); + bu_vls_free( &value); + return (0); +} + +int +c_attr(char *pattern, char ***ignored, int unused, PLAN **resultplan) +{ + PLAN *new; + + new = palloc(N_ATTR, f_attr); + new->attr_data = pattern; + (*resultplan) = new; + return BRLCAD_OK; +} + + +/* + * -stdattr function -- + * + * Search based on the presence of the + * "... [truncated message content] |
From: <bo...@us...> - 2008-09-10 20:33:26
|
Revision: 32627 http://brlcad.svn.sourceforge.net/brlcad/?rev=32627&view=rev Author: bob1961 Date: 2008-09-10 20:33:36 +0000 (Wed, 10 Sep 2008) Log Message: ----------- Changed include order for windows. Fixed a few typos. Modified Paths: -------------- brlcad/trunk/src/libged/search.c brlcad/trunk/src/libged/search.h Modified: brlcad/trunk/src/libged/search.c =================================================================== --- brlcad/trunk/src/libged/search.c 2008-09-10 20:05:53 UTC (rev 32626) +++ brlcad/trunk/src/libged/search.c 2008-09-10 20:33:36 UTC (rev 32627) @@ -89,15 +89,16 @@ */ #include "common.h" + #include <string.h> #include <stdlib.h> +#include <time.h> +#include <regex.h> +#include "bio.h" -#include "bio.h" #include "cmd.h" #include "ged_private.h" -#include <regex.h> - #include "search.h" /* @@ -714,11 +715,11 @@ break; case DB5_MINORTYPE_BRLCAD_COMBINATION: if (DB_FULL_PATH_CUR_DIR(entry)->d_flags & DIR_REGION) { - if ((!bu_fnmatch(plan->type_data, "r", 0)) || (!fnmatch(plan->type_data, "region", 0))) { + if ((!bu_fnmatch(plan->type_data, "r", 0)) || (!bu_fnmatch(plan->type_data, "region", 0))) { type_match = 1; } } else { - if ((!bu_fnmatch(plan->type_data, "comb", 0)) || (!fnmatch(plan->type_data, "combination", 0))) { + if ((!bu_fnmatch(plan->type_data, "comb", 0)) || (!bu_fnmatch(plan->type_data, "combination", 0))) { type_match = 1; } } Modified: brlcad/trunk/src/libged/search.h =================================================================== --- brlcad/trunk/src/libged/search.h 2008-09-10 20:05:53 UTC (rev 32626) +++ brlcad/trunk/src/libged/search.h 2008-09-10 20:33:36 UTC (rev 32627) @@ -51,8 +51,6 @@ * */ -#include <sys/cdefs.h> - /* node type */ enum ntype { N_AND = 1, /* must start > 0 */ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sta...@us...> - 2008-09-11 20:24:48
|
Revision: 32639 http://brlcad.svn.sourceforge.net/brlcad/?rev=32639&view=rev Author: starseeker Date: 2008-09-11 20:24:56 +0000 (Thu, 11 Sep 2008) Log Message: ----------- ws, indent, header fixes Modified Paths: -------------- brlcad/trunk/src/libged/search.c brlcad/trunk/src/libged/search.h Modified: brlcad/trunk/src/libged/search.c =================================================================== --- brlcad/trunk/src/libged/search.c 2008-09-11 19:41:34 UTC (rev 32638) +++ brlcad/trunk/src/libged/search.c 2008-09-11 20:24:56 UTC (rev 32639) @@ -1,7 +1,7 @@ -/* S E A R C H . C +/* S E A R C H . C * BRL-CAD * - * Copyright (c) 2008 United States Government as represented by + * Copyright (c) 1990-2008 United States Government as represented by * the U.S. Army Research Laboratory. * * This library is free software; you can redistribute it and/or @@ -16,11 +16,15 @@ * You should have received a copy of the GNU Lesser General Public * License along with this file; see the file named COPYING for more * information. + */ +/** @file search.c * - * Includes code from OpenBSD's and NetBSD's find commands: + * Brief description * - * OpenBSD: - * + */ + +/* OpenBSD: + * * Copyright (c) 1990, 1993 * The Regents of the University of California. All rights reserved. * @@ -49,13 +53,13 @@ * SUCH DAMAGE. * * NetBSD: - * + * * Copyright (c) 1990, 1993, 1994 * The Regents of the University of California. All rights reserved. - * + * * This code is derived from software contributed to Berkeley by * Cimarron D. Taylor of the University of California, Berkeley. - * + * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: @@ -67,7 +71,7 @@ * 3. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. - * + * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE @@ -78,15 +82,8 @@ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * + * SUCH DAMAGE. */ -/** @file search.c - * - * The search command. - * - */ #include "common.h" @@ -109,17 +106,17 @@ */ void db_fullpath_traverse_subtree(union tree *tp, - void (*traverse_func) ( struct rt_wdb *, struct db_full_path *, - void (*) (struct rt_wdb *, struct db_full_path *, genptr_t), - void (*) (struct rt_wdb *, struct db_full_path *, genptr_t), - struct resource *, - genptr_t), - struct rt_wdb *wdbp, - struct db_full_path *dfp, - void (*comb_func) (struct rt_wdb *, struct db_full_path *, genptr_t), - void (*leaf_func) (struct rt_wdb *, struct db_full_path *, genptr_t), - struct resource *resp, - genptr_t client_data) + void (*traverse_func) ( struct rt_wdb *, struct db_full_path *, + void (*) (struct rt_wdb *, struct db_full_path *, genptr_t), + void (*) (struct rt_wdb *, struct db_full_path *, genptr_t), + struct resource *, + genptr_t), + struct rt_wdb *wdbp, + struct db_full_path *dfp, + void (*comb_func) (struct rt_wdb *, struct db_full_path *, genptr_t), + void (*leaf_func) (struct rt_wdb *, struct db_full_path *, genptr_t), + struct resource *resp, + genptr_t client_data) { struct directory *dp; @@ -135,20 +132,20 @@ case OP_DB_LEAF: if ( (dp=db_lookup( wdbp->dbip, tp->tr_l.tl_name, LOOKUP_NOISY )) == DIR_NULL ) { - return; - } else { - db_add_node_to_full_path( dfp, dp); - traverse_func( wdbp, dfp, comb_func, leaf_func, resp, client_data ); - DB_FULL_PATH_POP(dfp); - break; - } + return; + } else { + db_add_node_to_full_path( dfp, dp); + traverse_func( wdbp, dfp, comb_func, leaf_func, resp, client_data ); + DB_FULL_PATH_POP(dfp); + break; + } case OP_UNION: case OP_INTERSECT: case OP_SUBTRACT: case OP_XOR: - db_fullpath_traverse_subtree( tp->tr_b.tb_left, traverse_func, wdbp, dfp, comb_func, leaf_func, resp, client_data ); - db_fullpath_traverse_subtree( tp->tr_b.tb_right, traverse_func, wdbp, dfp, comb_func, leaf_func, resp, client_data ); - break; + db_fullpath_traverse_subtree( tp->tr_b.tb_left, traverse_func, wdbp, dfp, comb_func, leaf_func, resp, client_data ); + db_fullpath_traverse_subtree( tp->tr_b.tb_right, traverse_func, wdbp, dfp, comb_func, leaf_func, resp, client_data ); + break; default: bu_log( "db_functree_subtree: unrecognized operator %d\n", tp->tr_op ); bu_bomb( "db_functree_subtree: unrecognized operator\n" ); @@ -169,64 +166,64 @@ */ void db_fullpath_traverse( struct rt_wdb *wdbp, - struct db_full_path *dfp, - void (*comb_func) (struct rt_wdb *, struct db_full_path *, genptr_t), - void (*leaf_func) (struct rt_wdb *, struct db_full_path *, genptr_t), - struct resource *resp, - genptr_t client_data ) + struct db_full_path *dfp, + void (*comb_func) (struct rt_wdb *, struct db_full_path *, genptr_t), + void (*leaf_func) (struct rt_wdb *, struct db_full_path *, genptr_t), + struct resource *resp, + genptr_t client_data ) { - struct directory *dp; + struct directory *dp; register int i; RT_CK_FULL_PATH(dfp); RT_CK_DBI(wdbp->dbip); - dp = DB_FULL_PATH_CUR_DIR(dfp); + dp = DB_FULL_PATH_CUR_DIR(dfp); - if ( dp->d_flags & DIR_COMB ) { - /* entering region */ - if ( comb_func ) - comb_func( wdbp, dfp, client_data ); - if ( wdbp->dbip->dbi_version < 5 ) { - register union record *rp; - register struct directory *mdp; - /* - * Load the combination into local record buffer - * This is in external v4 format. - */ - if ( (rp = db_getmrec( wdbp->dbip, dp )) == (union record *)0 ) - return; - /* recurse */ - for ( i=1; i < dp->d_len; i++ ) { - if ( (mdp = db_lookup( wdbp->dbip, rp[i].M.m_instname, - LOOKUP_NOISY )) == DIR_NULL ) { - continue; - } else { - db_add_node_to_full_path(dfp, mdp); - db_fullpath_traverse(wdbp, dfp, comb_func, leaf_func, resp, client_data); - DB_FULL_PATH_POP(dfp); - } - } - bu_free( (char *)rp, "db_preorder_traverse[]" ); + if ( dp->d_flags & DIR_COMB ) { + /* entering region */ + if ( comb_func ) + comb_func( wdbp, dfp, client_data ); + if ( wdbp->dbip->dbi_version < 5 ) { + register union record *rp; + register struct directory *mdp; + /* + * Load the combination into local record buffer + * This is in external v4 format. + */ + if ( (rp = db_getmrec( wdbp->dbip, dp )) == (union record *)0 ) + return; + /* recurse */ + for ( i=1; i < dp->d_len; i++ ) { + if ( (mdp = db_lookup( wdbp->dbip, rp[i].M.m_instname, + LOOKUP_NOISY )) == DIR_NULL ) { + continue; } else { - struct rt_db_internal in; - struct rt_comb_internal *comb; - struct directory *ndp; + db_add_node_to_full_path(dfp, mdp); + db_fullpath_traverse(wdbp, dfp, comb_func, leaf_func, resp, client_data); + DB_FULL_PATH_POP(dfp); + } + } + bu_free( (char *)rp, "db_preorder_traverse[]" ); + } else { + struct rt_db_internal in; + struct rt_comb_internal *comb; + struct directory *ndp; - if ( rt_db_get_internal5( &in, dp, wdbp->dbip, NULL, resp ) < 0 ) - return; + if ( rt_db_get_internal5( &in, dp, wdbp->dbip, NULL, resp ) < 0 ) + return; - comb = (struct rt_comb_internal *)in.idb_ptr; + comb = (struct rt_comb_internal *)in.idb_ptr; - db_fullpath_traverse_subtree( comb->tree, db_fullpath_traverse, wdbp, dfp, comb_func, leaf_func, resp, client_data ); + db_fullpath_traverse_subtree( comb->tree, db_fullpath_traverse, wdbp, dfp, comb_func, leaf_func, resp, client_data ); - rt_db_free_internal( &in, resp ); - } + rt_db_free_internal( &in, resp ); } - if ( dp->d_flags & DIR_SOLID || dp->d_major_type & DB5_MAJORTYPE_BINARY_MASK ) { - /* at leaf */ - if ( leaf_func ) - leaf_func( wdbp, dfp, client_data ); } + if ( dp->d_flags & DIR_SOLID || dp->d_major_type & DB5_MAJORTYPE_BINARY_MASK ) { + /* at leaf */ + if ( leaf_func ) + leaf_func( wdbp, dfp, client_data ); + } } @@ -234,36 +231,36 @@ /* NB: the following table must be sorted lexically. */ static OPTION options[] = { - { "!", N_NOT, c_not, O_ZERO }, - { "(", N_OPENPAREN, c_openparen, O_ZERO }, - { ")", N_CLOSEPAREN, c_closeparen, O_ZERO }, - { "-a", N_AND, NULL, O_NONE }, - { "-and", N_AND, NULL, O_NONE }, - { "-attr", N_ATTR, c_attr, O_ARGV }, - { "-iregex", N_IREGEX, c_iregex, O_ARGV }, - { "-name", N_NAME, c_name, O_ARGV }, - { "-not", N_NOT, c_not, O_ZERO }, - { "-o", N_OR, c_or, O_ZERO }, - { "-or", N_OR, c_or, O_ZERO }, - { "-print", N_PRINT, c_print, O_ZERO }, - { "-print0", N_PRINT0, c_print0, O_ZERO }, - { "-regex", N_REGEX, c_regex, O_ARGV }, - { "-stdattr", N_STDATTR, c_stdattr, O_ZERO }, - { "-type", N_TYPE, c_type, O_ARGV }, + { "!", N_NOT, c_not, O_ZERO }, + { "(", N_OPENPAREN, c_openparen, O_ZERO }, + { ")", N_CLOSEPAREN, c_closeparen, O_ZERO }, + { "-a", N_AND, NULL, O_NONE }, + { "-and", N_AND, NULL, O_NONE }, + { "-attr", N_ATTR, c_attr, O_ARGV }, + { "-iregex", N_IREGEX, c_iregex, O_ARGV }, + { "-name", N_NAME, c_name, O_ARGV }, + { "-not", N_NOT, c_not, O_ZERO }, + { "-o", N_OR, c_or, O_ZERO }, + { "-or", N_OR, c_or, O_ZERO }, + { "-print", N_PRINT, c_print, O_ZERO }, + { "-print0", N_PRINT0, c_print0, O_ZERO }, + { "-regex", N_REGEX, c_regex, O_ARGV }, + { "-stdattr", N_STDATTR, c_stdattr, O_ZERO }, + { "-type", N_TYPE, c_type, O_ARGV }, }; static PLAN * palloc(enum ntype t, int (*f)(PLAN *, struct db_full_path *, struct rt_wdb *)) { - PLAN *new; + PLAN *new; - if ((new = bu_calloc(1, sizeof(PLAN), "Allocate PLAN structure"))) { - new->type = t; - new->eval = f; - return (new); - } - bu_exit(1, NULL); - /* NOTREACHED */ + if ((new = bu_calloc(1, sizeof(PLAN), "Allocate PLAN structure"))) { + new->type = t; + new->eval = f; + return (new); + } + bu_exit(1, NULL); + /* NOTREACHED */ } /* @@ -274,12 +271,12 @@ int f_expr(PLAN *plan, struct db_full_path *entry, struct rt_wdb *wdbp) { - PLAN *p; - int state; + PLAN *p; + int state; - for (p = plan->p_data[0]; - p && (state = (p->eval)(p, entry, wdbp)); p = p->next); - return (state); + for (p = plan->p_data[0]; + p && (state = (p->eval)(p, entry, wdbp)); p = p->next); + return (state); } @@ -291,15 +288,15 @@ int c_openparen(char *ignore, char ***ignored, int unused, PLAN **resultplan) { - (*resultplan) = (palloc(N_OPENPAREN, (int (*)(PLAN *, struct db_full_path *, struct rt_wdb *))-1)); - return BRLCAD_OK; + (*resultplan) = (palloc(N_OPENPAREN, (int (*)(PLAN *, struct db_full_path *, struct rt_wdb *))-1)); + return BRLCAD_OK; } - + int c_closeparen(char *ignore, char ***ignored, int unused, PLAN **resultplan) { - (*resultplan) = (palloc(N_CLOSEPAREN, (int (*)(PLAN *, struct db_full_path *, struct rt_wdb *))-1)); - return BRLCAD_OK; + (*resultplan) = (palloc(N_CLOSEPAREN, (int (*)(PLAN *, struct db_full_path *, struct rt_wdb *))-1)); + return BRLCAD_OK; } @@ -311,21 +308,21 @@ int f_not(PLAN *plan, struct db_full_path *entry, struct rt_wdb *wdbp) { - PLAN *p; - int state; + PLAN *p; + int state; - for (p = plan->p_data[0]; - p && (state = (p->eval)(p, entry, wdbp)); p = p->next); - return (!state); + for (p = plan->p_data[0]; + p && (state = (p->eval)(p, entry, wdbp)); p = p->next); + return (!state); } - + int c_not(char *ignore, char ***ignored, int unused, PLAN **resultplan) { - (*resultplan) = (palloc(N_NOT, f_not)); - return BRLCAD_OK; + (*resultplan) = (palloc(N_NOT, f_not)); + return BRLCAD_OK; } - + /* * expression -o expression functions -- * @@ -335,25 +332,25 @@ int f_or(PLAN *plan, struct db_full_path *entry, struct rt_wdb *wdbp) { - PLAN *p; - int state; + PLAN *p; + int state; - for (p = plan->p_data[0]; - p && (state = (p->eval)(p, entry, wdbp)); p = p->next); + for (p = plan->p_data[0]; + p && (state = (p->eval)(p, entry, wdbp)); p = p->next); - if (state) - return (1); + if (state) + return (1); - for (p = plan->p_data[1]; - p && (state = (p->eval)(p, entry, wdbp)); p = p->next); - return (state); + for (p = plan->p_data[1]; + p && (state = (p->eval)(p, entry, wdbp)); p = p->next); + return (state); } -int +int c_or(char *ignore, char ***ignored, int unused, PLAN **resultplan) { - (*resultplan) = (palloc(N_OR, f_or)); - return BRLCAD_OK; + (*resultplan) = (palloc(N_OR, f_or)); + return BRLCAD_OK; } @@ -366,22 +363,21 @@ int f_name(PLAN *plan, struct db_full_path *entry, struct rt_wdb *wdbp) { - return (!bu_fnmatch(plan->c_data, DB_FULL_PATH_CUR_DIR(entry)->d_namep, 0)); + return (!bu_fnmatch(plan->c_data, DB_FULL_PATH_CUR_DIR(entry)->d_namep, 0)); } int c_name(char *pattern, char ***ignored, int unused, PLAN **resultplan) { - PLAN *new; + PLAN *new; - new = palloc(N_NAME, f_name); - new->c_data = pattern; - (*resultplan) = new; - return BRLCAD_OK; + new = palloc(N_NAME, f_name); + new->c_data = pattern; + (*resultplan) = new; + return BRLCAD_OK; } - /* * -regex regexp (and related) functions -- * @@ -392,49 +388,47 @@ int f_regex(PLAN *plan, struct db_full_path *entry, struct rt_wdb *wdbp) { - return (!(regexec(&plan->regexp_data, db_path_to_string(entry), 0, NULL, 0))); + return (!(regexec(&plan->regexp_data, db_path_to_string(entry), 0, NULL, 0))); } int c_regex_common(enum ntype type, char *regexp, int icase, PLAN **resultplan) { - regex_t reg; - PLAN *new; - int rv; - size_t len; - bu_log("Matching extened regular expression: %s\n", regexp); - if (icase = 1 ) { - rv = regcomp(®, regexp, REG_NOSUB|REG_EXTENDED|REG_ICASE); - } else { - rv = regcomp(®, regexp, REG_NOSUB|REG_EXTENDED); - } - if (rv != 0) { - bu_log("Error - regex compile did not succeed: %s\n", regexp); - return BRLCAD_ERROR; - } - new = palloc(type, f_regex); - new->regexp_data = reg; - (*resultplan) = new; - regfree(®); - return BRLCAD_OK; + regex_t reg; + PLAN *new; + int rv; + size_t len; + bu_log("Matching extened regular expression: %s\n", regexp); + if (icase = 1 ) { + rv = regcomp(®, regexp, REG_NOSUB|REG_EXTENDED|REG_ICASE); + } else { + rv = regcomp(®, regexp, REG_NOSUB|REG_EXTENDED); + } + if (rv != 0) { + bu_log("Error - regex compile did not succeed: %s\n", regexp); + return BRLCAD_ERROR; + } + new = palloc(type, f_regex); + new->regexp_data = reg; + (*resultplan) = new; + regfree(®); + return BRLCAD_OK; } int c_regex(char *pattern, char ***ignored, int unused, PLAN **resultplan) { - return (c_regex_common(N_REGEX, pattern, 0, resultplan)); + return (c_regex_common(N_REGEX, pattern, 0, resultplan)); } int c_iregex(char *pattern, char ***ignored, int unused, PLAN **resultplan) { - return (c_regex_common(N_IREGEX, pattern, 1, resultplan)); + return (c_regex_common(N_IREGEX, pattern, 1, resultplan)); } - - /* * -attr functions -- * @@ -444,308 +438,307 @@ int f_attr(PLAN *plan, struct db_full_path *entry, struct rt_wdb *wdbp) { - struct bu_vls attribname; - struct bu_vls value; - struct bu_attribute_value_set avs; - struct bu_attribute_value_pair *avpp; - int equalpos = 0; - int checkval = 0; - int i; - bu_vls_init(&attribname); - bu_vls_init(&value); - - - /* Check for unescaped equal sign - if present, the - * attribute must not only be present but have the - * value indicated. Escaping is done with the "/" - * character. - */ + struct bu_vls attribname; + struct bu_vls value; + struct bu_attribute_value_set avs; + struct bu_attribute_value_pair *avpp; + int equalpos = 0; + int checkval = 0; + int i; + bu_vls_init(&attribname); + bu_vls_init(&value); - while ((equalpos < strlen(plan->attr_data)) && (plan->attr_data[equalpos] != '=')) { - if ((plan->attr_data[equalpos] == '/') && (plan->attr_data[equalpos + 1] == '=')) {equalpos++;} - equalpos++; - } - if (equalpos == strlen(plan->attr_data)){ - bu_vls_strcpy(&attribname, plan->attr_data); - } else { - checkval = 1; - bu_vls_strncpy(&attribname, plan->attr_data, equalpos); - bu_vls_strncpy(&value, &(plan->attr_data[equalpos+1]), strlen(plan->attr_data) - equalpos - 1); - } - - /* Get attributes for object and check all of - * them to see if there is a match to the requested - * attribute. If a value is supplied, check the - * value of any matches to the attribute name before - * returning success. - */ - - bu_avs_init_empty(&avs); - db5_get_attributes( wdbp->dbip, &avs, DB_FULL_PATH_CUR_DIR(entry)); - avpp = avs.avp; - for (i = 0; i < avs.count; i++, avpp++) { - if (!bu_fnmatch(bu_vls_addr(&attribname), avpp->name, 0)) { - if ( checkval == 1 ) { - if (!bu_fnmatch(bu_vls_addr(&value), avpp->value, 0)) { - bu_avs_free( &avs); - bu_vls_free( &attribname); - bu_vls_free( &value); - return (1); - } - } else { + /* Check for unescaped equal sign - if present, the + * attribute must not only be present but have the + * value indicated. Escaping is done with the "/" + * character. + */ + + while ((equalpos < strlen(plan->attr_data)) && (plan->attr_data[equalpos] != '=')) { + if ((plan->attr_data[equalpos] == '/') && (plan->attr_data[equalpos + 1] == '=')) {equalpos++;} + equalpos++; + } + + if (equalpos == strlen(plan->attr_data)){ + bu_vls_strcpy(&attribname, plan->attr_data); + } else { + checkval = 1; + bu_vls_strncpy(&attribname, plan->attr_data, equalpos); + bu_vls_strncpy(&value, &(plan->attr_data[equalpos+1]), strlen(plan->attr_data) - equalpos - 1); + } + + /* Get attributes for object and check all of + * them to see if there is a match to the requested + * attribute. If a value is supplied, check the + * value of any matches to the attribute name before + * returning success. + */ + + bu_avs_init_empty(&avs); + db5_get_attributes( wdbp->dbip, &avs, DB_FULL_PATH_CUR_DIR(entry)); + avpp = avs.avp; + for (i = 0; i < avs.count; i++, avpp++) { + if (!bu_fnmatch(bu_vls_addr(&attribname), avpp->name, 0)) { + if ( checkval == 1 ) { + if (!bu_fnmatch(bu_vls_addr(&value), avpp->value, 0)) { bu_avs_free( &avs); bu_vls_free( &attribname); bu_vls_free( &value); return (1); } + } else { + bu_avs_free( &avs); + bu_vls_free( &attribname); + bu_vls_free( &value); + return (1); } - } - bu_avs_free( &avs); - bu_vls_free( &attribname); - bu_vls_free( &value); - return (0); + } + } + bu_avs_free( &avs); + bu_vls_free( &attribname); + bu_vls_free( &value); + return (0); } int c_attr(char *pattern, char ***ignored, int unused, PLAN **resultplan) { - PLAN *new; + PLAN *new; - new = palloc(N_ATTR, f_attr); - new->attr_data = pattern; - (*resultplan) = new; - return BRLCAD_OK; + new = palloc(N_ATTR, f_attr); + new->attr_data = pattern; + (*resultplan) = new; + return BRLCAD_OK; } -/* - * -stdattr function -- - * - * Search based on the presence of the - * "standard" attributes - matches when there - * are ONLY "standard" attributes - * associated with an object. - */ - int - f_stdattr(PLAN *plan, struct db_full_path *entry, struct rt_wdb *wdbp) - { - struct bu_attribute_value_set avs; - struct bu_attribute_value_pair *avpp; - int i; - int found_nonstd_attr = 0; - int found_attr = 0; - - /* Get attributes for object and check all of - * them to see if there is not a match to the - * standard attributes. If any is found return - * failure, otherwise success. - */ - - bu_avs_init_empty(&avs); - db5_get_attributes( wdbp->dbip, &avs, DB_FULL_PATH_CUR_DIR(entry)); - avpp = avs.avp; - for (i = 0; i < avs.count; i++, avpp++) { - found_attr = 1; - if (strcmp(avpp->name, "GIFTmater") != 0 && - strcmp(avpp->name, "aircode") != 0 && - strcmp(avpp->name, "inherit") != 0 && - strcmp(avpp->name, "los") != 0 && - strcmp(avpp->name, "material_id") != 0 && - strcmp(avpp->name, "oshader") != 0 && - strcmp(avpp->name, "region") != 0 && - strcmp(avpp->name, "region_id") != 0 && - strcmp(avpp->name, "rgb") != 0){ - - found_nonstd_attr = 1; - } - } - - bu_avs_free( &avs); - - if (!found_nonstd_attr && found_attr) return 1; - return 0; - } - - int - c_stdattr(char *pattern, char ***ignored, int unused, PLAN **resultplan) - { - PLAN *new; - - new = palloc(N_STDATTR, f_stdattr); - (*resultplan) = new; - return BRLCAD_OK; - } +/* + * -stdattr function -- + * + * Search based on the presence of the + * "standard" attributes - matches when there + * are ONLY "standard" attributes + * associated with an object. + */ +int +f_stdattr(PLAN *plan, struct db_full_path *entry, struct rt_wdb *wdbp) +{ + struct bu_attribute_value_set avs; + struct bu_attribute_value_pair *avpp; + int i; + int found_nonstd_attr = 0; + int found_attr = 0; -/* - * -type function -- - * - * Search based on the type of the object - primitives are matched - * based on their primitive type (tor, tgc, arb4, etc.) and combinations - * are matched based on whether they are a combination or region. - */ - int - f_type(PLAN *plan, struct db_full_path *entry, struct rt_wdb *wdbp) - { - struct rt_db_internal intern; - int type_match = 0; - int type; + /* Get attributes for object and check all of + * them to see if there is not a match to the + * standard attributes. If any is found return + * failure, otherwise success. + */ - rt_db_get_internal(&intern, DB_FULL_PATH_CUR_DIR(entry), wdbp->dbip, (fastf_t *)NULL, &rt_uniresource); + bu_avs_init_empty(&avs); + db5_get_attributes( wdbp->dbip, &avs, DB_FULL_PATH_CUR_DIR(entry)); + avpp = avs.avp; + for (i = 0; i < avs.count; i++, avpp++) { + found_attr = 1; + if (strcmp(avpp->name, "GIFTmater") != 0 && + strcmp(avpp->name, "aircode") != 0 && + strcmp(avpp->name, "inherit") != 0 && + strcmp(avpp->name, "los") != 0 && + strcmp(avpp->name, "material_id") != 0 && + strcmp(avpp->name, "oshader") != 0 && + strcmp(avpp->name, "region") != 0 && + strcmp(avpp->name, "region_id") != 0 && + strcmp(avpp->name, "rgb") != 0){ - if(intern.idb_major_type != DB5_MAJORTYPE_BRLCAD) return 0; - - /* Eventually this whole switch statement needs to go away - * in favor of a function to query the primitive's short name - * and use that for the comparison - will be MUCH shorter and - * simpler. - */ - switch (intern.idb_minor_type) { - case DB5_MINORTYPE_BRLCAD_TOR: - type_match = (!bu_fnmatch(plan->type_data, "tor", 0)); - break; - case DB5_MINORTYPE_BRLCAD_TGC: - type_match = (!bu_fnmatch(plan->type_data, "tgc", 0)); - break; - case DB5_MINORTYPE_BRLCAD_ELL: - type_match = (!bu_fnmatch(plan->type_data, "ell", 0)); - break; - case DB5_MINORTYPE_BRLCAD_ARB8: - type = rt_arb_std_type(&intern, &wdbp->wdb_tol); + found_nonstd_attr = 1; + } + } - switch (type) { - case 4: - type_match = (!bu_fnmatch(plan->type_data, "arb4", 0)); - break; - case 5: - type_match = (!bu_fnmatch(plan->type_data, "arb5", 0)); - break; - case 6: - type_match = (!bu_fnmatch(plan->type_data, "arb6", 0)); - break; - case 7: - type_match = (!bu_fnmatch(plan->type_data, "arb7", 0)); - break; - case 8: - type_match = (!bu_fnmatch(plan->type_data, "arb8", 0)); - break; - default: - type_match = (!bu_fnmatch(plan->type_data, "invalid", 0)); - break; - } + bu_avs_free( &avs); - break; - case DB5_MINORTYPE_BRLCAD_ARS: - type_match = (!bu_fnmatch(plan->type_data, "ars", 0)); - break; - case DB5_MINORTYPE_BRLCAD_HALF: - type_match = (!bu_fnmatch(plan->type_data, "half", 0)); - break; - case DB5_MINORTYPE_BRLCAD_REC: - type_match = (!bu_fnmatch(plan->type_data, "rec", 0)); - break; - case DB5_MINORTYPE_BRLCAD_POLY: - type_match = (!bu_fnmatch(plan->type_data, "poly", 0)); - break; - case DB5_MINORTYPE_BRLCAD_BSPLINE: - type_match = (!bu_fnmatch(plan->type_data, "spline", 0)); - break; - case DB5_MINORTYPE_BRLCAD_SPH: - type_match = (!bu_fnmatch(plan->type_data, "sph", 0)); - break; - case DB5_MINORTYPE_BRLCAD_NMG: - type_match = (!bu_fnmatch(plan->type_data, "nmg", 0)); - break; - case DB5_MINORTYPE_BRLCAD_EBM: - type_match = (!bu_fnmatch(plan->type_data, "ebm", 0)); - break; - case DB5_MINORTYPE_BRLCAD_VOL: - type_match = (!bu_fnmatch(plan->type_data, "vol", 0)); - break; - case DB5_MINORTYPE_BRLCAD_ARBN: - type_match = (!bu_fnmatch(plan->type_data, "arbn", 0)); - break; - case DB5_MINORTYPE_BRLCAD_PIPE: - type_match = (!bu_fnmatch(plan->type_data, "pipe", 0)); - break; - case DB5_MINORTYPE_BRLCAD_PARTICLE: - type_match = (!bu_fnmatch(plan->type_data, "part", 0)); - break; - case DB5_MINORTYPE_BRLCAD_RPC: - type_match = (!bu_fnmatch(plan->type_data, "rpc", 0)); - break; - case DB5_MINORTYPE_BRLCAD_RHC: - type_match = (!bu_fnmatch(plan->type_data, "rhc", 0)); - break; - case DB5_MINORTYPE_BRLCAD_EPA: - type_match = (!bu_fnmatch(plan->type_data, "epa", 0)); - break; - case DB5_MINORTYPE_BRLCAD_EHY: - type_match = (!bu_fnmatch(plan->type_data, "ehy", 0)); - break; - case DB5_MINORTYPE_BRLCAD_ETO: - type_match = (!bu_fnmatch(plan->type_data, "eto", 0)); - break; - case DB5_MINORTYPE_BRLCAD_GRIP: - type_match = (!bu_fnmatch(plan->type_data, "grip", 0)); - break; - case DB5_MINORTYPE_BRLCAD_JOINT: - type_match = (!bu_fnmatch(plan->type_data, "joint", 0)); - break; - case DB5_MINORTYPE_BRLCAD_HF: - type_match = (!bu_fnmatch(plan->type_data, "hf", 0)); - break; - case DB5_MINORTYPE_BRLCAD_DSP: - type_match = (!bu_fnmatch(plan->type_data, "dsp", 0)); - break; - case DB5_MINORTYPE_BRLCAD_SKETCH: - type_match = (!bu_fnmatch(plan->type_data, "sketch", 0)); - break; - case DB5_MINORTYPE_BRLCAD_EXTRUDE: - type_match = (!bu_fnmatch(plan->type_data, "extrude", 0)); - break; - case DB5_MINORTYPE_BRLCAD_SUBMODEL: - type_match = (!bu_fnmatch(plan->type_data, "submodel", 0)); - break; - case DB5_MINORTYPE_BRLCAD_CLINE: - type_match = (!bu_fnmatch(plan->type_data, "cline", 0)); - break; - case DB5_MINORTYPE_BRLCAD_BOT: - type_match = (!bu_fnmatch(plan->type_data, "bot", 0)); - break; - case DB5_MINORTYPE_BRLCAD_COMBINATION: - if (DB_FULL_PATH_CUR_DIR(entry)->d_flags & DIR_REGION) { - if ((!bu_fnmatch(plan->type_data, "r", 0)) || (!bu_fnmatch(plan->type_data, "region", 0))) { - type_match = 1; - } - } else { - if ((!bu_fnmatch(plan->type_data, "comb", 0)) || (!bu_fnmatch(plan->type_data, "combination", 0))) { - type_match = 1; - } - } - break; - default: - type_match = (!bu_fnmatch(plan->type_data, "other", 0)); - break; + if (!found_nonstd_attr && found_attr) return 1; + return 0; +} + +int +c_stdattr(char *pattern, char ***ignored, int unused, PLAN **resultplan) +{ + PLAN *new; + + new = palloc(N_STDATTR, f_stdattr); + (*resultplan) = new; + return BRLCAD_OK; +} + +/* + * -type function -- + * + * Search based on the type of the object - primitives are matched + * based on their primitive type (tor, tgc, arb4, etc.) and combinations + * are matched based on whether they are a combination or region. + */ +int +f_type(PLAN *plan, struct db_full_path *entry, struct rt_wdb *wdbp) +{ + struct rt_db_internal intern; + int type_match = 0; + int type; + + rt_db_get_internal(&intern, DB_FULL_PATH_CUR_DIR(entry), wdbp->dbip, (fastf_t *)NULL, &rt_uniresource); + + if(intern.idb_major_type != DB5_MAJORTYPE_BRLCAD) return 0; + + /* Eventually this whole switch statement needs to go away + * in favor of a function to query the primitive's short name + * and use that for the comparison - will be MUCH shorter and + * simpler. + */ + switch (intern.idb_minor_type) { + case DB5_MINORTYPE_BRLCAD_TOR: + type_match = (!bu_fnmatch(plan->type_data, "tor", 0)); + break; + case DB5_MINORTYPE_BRLCAD_TGC: + type_match = (!bu_fnmatch(plan->type_data, "tgc", 0)); + break; + case DB5_MINORTYPE_BRLCAD_ELL: + type_match = (!bu_fnmatch(plan->type_data, "ell", 0)); + break; + case DB5_MINORTYPE_BRLCAD_ARB8: + type = rt_arb_std_type(&intern, &wdbp->wdb_tol); + + switch (type) { + case 4: + type_match = (!bu_fnmatch(plan->type_data, "arb4", 0)); + break; + case 5: + type_match = (!bu_fnmatch(plan->type_data, "arb5", 0)); + break; + case 6: + type_match = (!bu_fnmatch(plan->type_data, "arb6", 0)); + break; + case 7: + type_match = (!bu_fnmatch(plan->type_data, "arb7", 0)); + break; + case 8: + type_match = (!bu_fnmatch(plan->type_data, "arb8", 0)); + break; + default: + type_match = (!bu_fnmatch(plan->type_data, "invalid", 0)); + break; + } + + break; + case DB5_MINORTYPE_BRLCAD_ARS: + type_match = (!bu_fnmatch(plan->type_data, "ars", 0)); + break; + case DB5_MINORTYPE_BRLCAD_HALF: + type_match = (!bu_fnmatch(plan->type_data, "half", 0)); + break; + case DB5_MINORTYPE_BRLCAD_REC: + type_match = (!bu_fnmatch(plan->type_data, "rec", 0)); + break; + case DB5_MINORTYPE_BRLCAD_POLY: + type_match = (!bu_fnmatch(plan->type_data, "poly", 0)); + break; + case DB5_MINORTYPE_BRLCAD_BSPLINE: + type_match = (!bu_fnmatch(plan->type_data, "spline", 0)); + break; + case DB5_MINORTYPE_BRLCAD_SPH: + type_match = (!bu_fnmatch(plan->type_data, "sph", 0)); + break; + case DB5_MINORTYPE_BRLCAD_NMG: + type_match = (!bu_fnmatch(plan->type_data, "nmg", 0)); + break; + case DB5_MINORTYPE_BRLCAD_EBM: + type_match = (!bu_fnmatch(plan->type_data, "ebm", 0)); + break; + case DB5_MINORTYPE_BRLCAD_VOL: + type_match = (!bu_fnmatch(plan->type_data, "vol", 0)); + break; + case DB5_MINORTYPE_BRLCAD_ARBN: + type_match = (!bu_fnmatch(plan->type_data, "arbn", 0)); + break; + case DB5_MINORTYPE_BRLCAD_PIPE: + type_match = (!bu_fnmatch(plan->type_data, "pipe", 0)); + break; + case DB5_MINORTYPE_BRLCAD_PARTICLE: + type_match = (!bu_fnmatch(plan->type_data, "part", 0)); + break; + case DB5_MINORTYPE_BRLCAD_RPC: + type_match = (!bu_fnmatch(plan->type_data, "rpc", 0)); + break; + case DB5_MINORTYPE_BRLCAD_RHC: + type_match = (!bu_fnmatch(plan->type_data, "rhc", 0)); + break; + case DB5_MINORTYPE_BRLCAD_EPA: + type_match = (!bu_fnmatch(plan->type_data, "epa", 0)); + break; + case DB5_MINORTYPE_BRLCAD_EHY: + type_match = (!bu_fnmatch(plan->type_data, "ehy", 0)); + break; + case DB5_MINORTYPE_BRLCAD_ETO: + type_match = (!bu_fnmatch(plan->type_data, "eto", 0)); + break; + case DB5_MINORTYPE_BRLCAD_GRIP: + type_match = (!bu_fnmatch(plan->type_data, "grip", 0)); + break; + case DB5_MINORTYPE_BRLCAD_JOINT: + type_match = (!bu_fnmatch(plan->type_data, "joint", 0)); + break; + case DB5_MINORTYPE_BRLCAD_HF: + type_match = (!bu_fnmatch(plan->type_data, "hf", 0)); + break; + case DB5_MINORTYPE_BRLCAD_DSP: + type_match = (!bu_fnmatch(plan->type_data, "dsp", 0)); + break; + case DB5_MINORTYPE_BRLCAD_SKETCH: + type_match = (!bu_fnmatch(plan->type_data, "sketch", 0)); + break; + case DB5_MINORTYPE_BRLCAD_EXTRUDE: + type_match = (!bu_fnmatch(plan->type_data, "extrude", 0)); + break; + case DB5_MINORTYPE_BRLCAD_SUBMODEL: + type_match = (!bu_fnmatch(plan->type_data, "submodel", 0)); + break; + case DB5_MINORTYPE_BRLCAD_CLINE: + type_match = (!bu_fnmatch(plan->type_data, "cline", 0)); + break; + case DB5_MINORTYPE_BRLCAD_BOT: + type_match = (!bu_fnmatch(plan->type_data, "bot", 0)); + break; + case DB5_MINORTYPE_BRLCAD_COMBINATION: + if (DB_FULL_PATH_CUR_DIR(entry)->d_flags & DIR_REGION) { + if ((!bu_fnmatch(plan->type_data, "r", 0)) || (!bu_fnmatch(plan->type_data, "region", 0))) { + type_match = 1; + } + } else { + if ((!bu_fnmatch(plan->type_data, "comb", 0)) || (!bu_fnmatch(plan->type_data, "combination", 0))) { + type_match = 1; + } + } + break; + default: + type_match = (!bu_fnmatch(plan->type_data, "other", 0)); + break; } rt_db_free_internal(&intern, &rt_uniresource); - return (type_match); - } - - int - c_type(char *pattern, char ***ignored, int unused, PLAN **resultplan) - { - PLAN *new; - - new = palloc(N_TYPE, f_type); - new->type_data = pattern; - (*resultplan) = new; - return BRLCAD_OK; - } + return (type_match); +} +int +c_type(char *pattern, char ***ignored, int unused, PLAN **resultplan) +{ + PLAN *new; + new = palloc(N_TYPE, f_type); + new->type_data = pattern; + (*resultplan) = new; + return BRLCAD_OK; +} + /* * -print functions -- * @@ -755,41 +748,39 @@ int f_print(PLAN *plan, struct db_full_path *entry, struct rt_wdb *wdbp) { - bu_log("%s\n", db_path_to_string(entry)); - isoutput = 0; - return(1); + bu_log("%s\n", db_path_to_string(entry)); + isoutput = 0; + return(1); } /* ARGSUSED */ int f_print0(PLAN *plan, struct db_full_path *entry, struct rt_wdb *wdbp) { - (void)fputs(db_path_to_string(entry), stdout); - (void)fputc('\0', stdout); - return(1); + (void)fputs(db_path_to_string(entry), stdout); + (void)fputc('\0', stdout); + return(1); } int c_print(char *ignore, char ***ignored, int unused, PLAN **resultplan) { - isoutput = 1; - - (*resultplan) = palloc(N_PRINT, f_print); - return BRLCAD_OK; + isoutput = 1; + + (*resultplan) = palloc(N_PRINT, f_print); + return BRLCAD_OK; } int c_print0(char *ignore, char ***ignored, int unused, PLAN **resultplan) { - isoutput = 1; + isoutput = 1; - (*resultplan) = palloc(N_PRINT0, f_print0); - return BRLCAD_OK; + (*resultplan) = palloc(N_PRINT0, f_print0); + return BRLCAD_OK; } - - /* * find_create -- * create a node corresponding to a command line argument. @@ -801,75 +792,73 @@ int find_create(char ***argvp, PLAN **resultplan) { - OPTION *p; - PLAN *new; - char **argv; + OPTION *p; + PLAN *new; + char **argv; - argv = *argvp; + argv = *argvp; - if ((p = option(*argv)) == NULL) { - bu_log("%s: unknown option passed to find_create\n", *argv); - return BRLCAD_ERROR; - } - ++argv; - if (p->flags & (O_ARGV|O_ARGVP) && !*argv) { - bu_log("%s: requires additional arguments\n", *--argv); - return BRLCAD_ERROR; - } - switch(p->flags) { - case O_NONE: - new = NULL; - break; - case O_ZERO: - (p->create)(NULL, NULL, 0, &new); - break; - case O_ARGV: - (p->create)(*argv++, NULL, 0, &new); - break; - case O_ARGVP: - (p->create)(NULL, &argv, p->token == N_OK, &new); - break; - default: - return BRLCAD_OK; - } - *argvp = argv; - (*resultplan) = new; - return BRLCAD_OK; + if ((p = option(*argv)) == NULL) { + bu_log("%s: unknown option passed to find_create\n", *argv); + return BRLCAD_ERROR; + } + ++argv; + if (p->flags & (O_ARGV|O_ARGVP) && !*argv) { + bu_log("%s: requires additional arguments\n", *--argv); + return BRLCAD_ERROR; + } + switch(p->flags) { + case O_NONE: + new = NULL; + break; + case O_ZERO: + (p->create)(NULL, NULL, 0, &new); + break; + case O_ARGV: + (p->create)(*argv++, NULL, 0, &new); + break; + case O_ARGVP: + (p->create)(NULL, &argv, p->token == N_OK, &new); + break; + default: + return BRLCAD_OK; + } + *argvp = argv; + (*resultplan) = new; + return BRLCAD_OK; } OPTION * option(char *name) { - OPTION tmp; + OPTION tmp; - tmp.name = name; - return ((OPTION *)bsearch(&tmp, options, - sizeof(options)/sizeof(OPTION), sizeof(OPTION), typecompare)); + tmp.name = name; + return ((OPTION *)bsearch(&tmp, options, + sizeof(options)/sizeof(OPTION), sizeof(OPTION), typecompare)); } int typecompare(const void *a, const void *b) { - return (strcmp(((OPTION *)a)->name, ((OPTION *)b)->name)); + return (strcmp(((OPTION *)a)->name, ((OPTION *)b)->name)); } - - /* - * yanknode -- + * yanknode -- * destructively removes the top from the plan */ static PLAN * yanknode(PLAN **planp) /* pointer to top of plan (modified) */ { - PLAN *node; /* top node removed from the plan */ - - if ((node = (*planp)) == NULL) - return (NULL); - (*planp) = (*planp)->next; - node->next = NULL; - return (node); + PLAN *node; /* top node removed from the plan */ + + if ((node = (*planp)) == NULL) + return (NULL); + (*planp) = (*planp)->next; + node->next = NULL; + return (node); } /* @@ -881,63 +870,63 @@ int yankexpr(PLAN **planp, PLAN **resultplan) /* pointer to top of plan (modified) */ { - PLAN *next; /* temp node holding subexpression results */ - PLAN *node; /* pointer to returned node or expression */ - PLAN *tail; /* pointer to tail of subplan */ - PLAN *subplan; /* pointer to head of ( ) expression */ - extern int f_expr(PLAN *, struct db_full_path *, struct rt_wdb *); - int error_return = BRLCAD_OK; - - /* first pull the top node from the plan */ - if ((node = yanknode(planp)) == NULL) { - (*resultplan) = NULL; - return BRLCAD_OK; - } - /* - * If the node is an '(' then we recursively slurp up expressions - * until we find its associated ')'. If it's a closing paren we - * just return it and unwind our recursion; all other nodes are - * complete expressions, so just return them. - */ - if (node->type == N_OPENPAREN) - for (tail = subplan = NULL;;) { - if ((error_return = yankexpr(planp, &next)) != BRLCAD_OK) return BRLCAD_ERROR; - if (next == NULL) { - bu_log("(: missing closing ')'\n"); - return BRLCAD_ERROR; - } - /* - * If we find a closing ')' we store the collected - * subplan in our '(' node and convert the node to - * a N_EXPR. The ')' we found is ignored. Otherwise, - * we just continue to add whatever we get to our - * subplan. - */ - if (next->type == N_CLOSEPAREN) { - if (subplan == NULL) { - bu_log("(): empty inner expression"); - return BRLCAD_ERROR; - } - node->p_data[0] = subplan; - node->type = N_EXPR; - node->eval = f_expr; - break; - } else { - if (subplan == NULL) - tail = subplan = next; - else { - tail->next = next; - tail = next; - } - tail->next = NULL; - } - } - (*resultplan) = node; - if (!(error_return == BRLCAD_OK)) { - return BRLCAD_ERROR; - } else { - return BRLCAD_OK; + PLAN *next; /* temp node holding subexpression results */ + PLAN *node; /* pointer to returned node or expression */ + PLAN *tail; /* pointer to tail of subplan */ + PLAN *subplan; /* pointer to head of ( ) expression */ + extern int f_expr(PLAN *, struct db_full_path *, struct rt_wdb *); + int error_return = BRLCAD_OK; + + /* first pull the top node from the plan */ + if ((node = yanknode(planp)) == NULL) { + (*resultplan) = NULL; + return BRLCAD_OK; + } + /* + * If the node is an '(' then we recursively slurp up expressions + * until we find its associated ')'. If it's a closing paren we + * just return it and unwind our recursion; all other nodes are + * complete expressions, so just return them. + */ + if (node->type == N_OPENPAREN) + for (tail = subplan = NULL;;) { + if ((error_return = yankexpr(planp, &next)) != BRLCAD_OK) return BRLCAD_ERROR; + if (next == NULL) { + bu_log("(: missing closing ')'\n"); + return BRLCAD_ERROR; + } + /* + * If we find a closing ')' we store the collected + * subplan in our '(' node and convert the node to + * a N_EXPR. The ')' we found is ignored. Otherwise, + * we just continue to add whatever we get to our + * subplan. + */ + if (next->type == N_CLOSEPAREN) { + if (subplan == NULL) { + bu_log("(): empty inner expression"); + return BRLCAD_ERROR; + } + node->p_data[0] = subplan; + node->type = N_EXPR; + node->eval = f_expr; + break; + } else { + if (subplan == NULL) + tail = subplan = next; + else { + tail->next = next; + tail = next; + } + tail->next = NULL; + } } + (*resultplan) = node; + if (!(error_return == BRLCAD_OK)) { + return BRLCAD_ERROR; + } else { + return BRLCAD_OK; + } } @@ -948,41 +937,41 @@ int paren_squish(PLAN *plan, PLAN **resultplan) /* plan with ( ) nodes */ { - PLAN *expr; /* pointer to next expression */ - PLAN *tail; /* pointer to tail of result plan */ - PLAN *result; /* pointer to head of result plan */ + PLAN *expr; /* pointer to next expression */ + PLAN *tail; /* pointer to tail of result plan */ + PLAN *result; /* pointer to head of result plan */ - result = tail = NULL; + result = tail = NULL; - /* - * the basic idea is to have yankexpr do all our work and just - * collect it's results together. - */ - if (yankexpr(&plan, &expr) != BRLCAD_OK) return BRLCAD_ERROR; - while (expr != NULL) { - /* - * if we find an unclaimed ')' it means there is a missing - * '(' someplace. - */ - if (expr->type == N_CLOSEPAREN) { - bu_log("): no beginning '('"); - return BRLCAD_ERROR; - } + /* + * the basic idea is to have yankexpr do all our work and just + * collect it's results together. + */ + if (yankexpr(&plan, &expr) != BRLCAD_OK) return BRLCAD_ERROR; + while (expr != NULL) { + /* + * if we find an unclaimed ')' it means there is a missing + * '(' someplace. + */ + if (expr->type == N_CLOSEPAREN) { + bu_log("): no beginning '('"); + return BRLCAD_ERROR; + } - /* add the expression to our result plan */ - if (result == NULL) - tail = result = expr; - else { - tail->next = expr; - tail = expr; - } - tail->next = NULL; - if (yankexpr(&plan, &expr) != BRLCAD_OK) return BRLCAD_ERROR; - } - (*resultplan) = result; - return BRLCAD_OK; + /* add the expression to our result plan */ + if (result == NULL) + tail = result = expr; + else { + tail->next = expr; + tail = expr; + } + tail->next = NULL; + if (yankexpr(&plan, &expr) != BRLCAD_OK) return BRLCAD_ERROR; + } + (*resultplan) = result; + return BRLCAD_OK; } - + /* * not_squish -- * compresses "!" expressions in our search plan. @@ -990,61 +979,61 @@ int not_squish(PLAN *plan, PLAN **resultplan) /* plan to process */ { - PLAN *next; /* next node being processed */ - PLAN *node; /* temporary node used in N_NOT processing */ - PLAN *tail; /* pointer to tail of result plan */ - PLAN *result; /* pointer to head of result plan */ + PLAN *next; /* next node being processed */ + PLAN *node; /* temporary node used in N_NOT processing */ + PLAN *tail; /* pointer to tail of result plan */ + PLAN *result; /* pointer to head of result plan */ - tail = result = next = NULL; + tail = result = next = NULL; - while ((next = yanknode(&plan)) != NULL) { - /* - * if we encounter a ( expression ) then look for nots in - * the expr subplan. - */ - if (next->type == N_EXPR) - if (not_squish(next->p_data[0], &(next->p_data[0])) != BRLCAD_OK) return BRLCAD_ERROR; + while ((next = yanknode(&plan)) != NULL) { + /* + * if we encounter a ( expression ) then look for nots in + * the expr subplan. + */ + if (next->type == N_EXPR) + if (not_squish(next->p_data[0], &(next->p_data[0])) != BRLCAD_OK) return BRLCAD_ERROR; - /* - * if we encounter a not, then snag the next node and place - * it in the not's subplan. As an optimization we compress - * several not's to zero or one not. - */ - if (next->type == N_NOT) { - int notlevel = 1; + /* + * if we encounter a not, then snag the next node and place + * it in the not's subplan. As an optimization we compress + * several not's to zero or one not. + */ + if (next->type == N_NOT) { + int notlevel = 1; - node = yanknode(&plan); - while (node != NULL && node->type == N_NOT) { - ++notlevel; - node = yanknode(&plan); - } - if (node == NULL) { - bu_log("!: no following expression"); - return BRLCAD_ERROR; - } - if (node->type == N_OR) { - bu_log("!: nothing between ! and -o"); - return BRLCAD_ERROR; - } - if (node->type == N_EXPR) - if (not_squish(node, &node) != BRLCAD_OK) return BRLCAD_ERROR; - if (notlevel % 2 != 1) - next = node; - else - next->p_data[0] = node; - } + node = yanknode(&plan); + while (node != NULL && node->type == N_NOT) { + ++notlevel; + node = yanknode(&plan); + } + if (node == NULL) { + bu_log("!: no following expression"); + return BRLCAD_ERROR; + } + if (node->type == N_OR) { + bu_log("!: nothing between ! and -o"); + return BRLCAD_ERROR; + } + if (node->type == N_EXPR) + if (not_squish(node, &node) != BRLCAD_OK) return BRLCAD_ERROR; + if (notlevel % 2 != 1) + next = node; + else + next->p_data[0] = node; + } - /* add the node to our result plan */ - if (result == NULL) - tail = result = next; - else { - tail->next = next; - tail = next; - } - tail->next = NULL; - } - (*resultplan) = result; - return BRLCAD_OK; + /* add the node to our result plan */ + if (result == NULL) + tail = result = next; + else { + tail->next = next; + tail = next; + } + tail->next = NULL; + } + (*resultplan) = result; + return BRLCAD_OK; } @@ -1055,60 +1044,58 @@ int or_squish(PLAN *plan, PLAN **resultplan) /* plan with ors to be squished */ { - PLAN *next; /* next node being processed */ - PLAN *tail; /* pointer to tail of result plan */ - PLAN *result; /* pointer to head of result plan */ + PLAN *next; /* next node being processed */ + PLAN *tail; /* pointer to tail of result plan */ + PLAN *result; /* pointer to head of result plan */ - tail = result = next = NULL; + tail = result = next = NULL; - while ((next = yanknode(&plan)) != NULL) { - /* - * if we encounter a ( expression ) then look for or's in - * the expr subplan. - */ - if (next->type == N_EXPR) - if(or_squish(next->p_data[0], &(next->p_data[0])) != BRLCAD_OK) return BRLCAD_ERROR; + while ((next = yanknode(&plan)) != NULL) { + /* + * if we encounter a ( expression ) then look for or's in + * the expr subplan. + */ + if (next->type == N_EXPR) + if(or_squish(next->p_data[0], &(next->p_data[0])) != BRLCAD_OK) return BRLCAD_ERROR; - /* if we encounter a not then look for not's in the subplan */ - if (next->type == N_NOT) - if(or_squish(next->p_data[0], &(next->p_data[0])) != BRLCAD_OK) return BRLCAD_ERROR; + /* if we encounter a not then look for not's in the subplan */ + if (next->type == N_NOT) + if(or_squish(next->p_data[0], &(next->p_data[0])) != BRLCAD_OK) return BRLCAD_ERROR; - /* - * if we encounter an or, then place our collected plan in the - * or's first subplan and then recursively collect the - * remaining stuff into the second subplan and return the or. - */ - if (next->type == N_OR) { - if (result == NULL) { - bu_log("-o: no expression before -o"); - return BRLCAD_ERROR; - } - next->p_data[0] = result; - if(or_squish(plan, &(next->p_data[1])) != BRLCAD_OK) return BRLCAD_ERROR; - if (next->p_data[1] == NULL) { - bu_log("-o: no expression after -o"); - return BRLCAD_ERROR; - } - (*resultplan) = next; - return BRLCAD_OK; - } + /* + * if we encounter an or, then place our collected plan in the + * or's first subplan and then recursively collect the + * remaining stuff into the second subplan and return the or. + */ + if (next->type == N_OR) { + if (result == NULL) { + bu_log("-o: no expression before -o"); + return BRLCAD_ERROR; + } + next->p_data[0] = result; + if(or_squish(plan, &(next->p_data[1])) != BRLCAD_OK) return BRLCAD_ERROR; + if (next->p_data[1] == NULL) { + bu_log("-o: no expression after -o"); + return BRLCAD_ERROR; + } + (*resultplan) = next; + return BRLCAD_OK; + } - /* add the node to our result plan */ - if (result == NULL) - tail = result = next; - else { - tail->next = next; - tail = next; - } - tail->next = NULL; - } - (*resultplan) = result; - return BRLCAD_OK; + /* add the node to our result plan */ + if (result == NULL) + tail = result = next; + else { + tail->next = next; + tail = next; + } + tail->next = NULL; + } + (*resultplan) = result; + return BRLCAD_OK; } - - /* * find_formplan -- * process the command line and create a "plan" corresponding to the @@ -1117,136 +1104,136 @@ int find_formplan(char **argv, PLAN **resultplan) { - PLAN *plan, *tail, *new; + PLAN *plan, *tail, *new; - /* - * for each argument in the command line, determine what kind of node - * it is, create the appropriate node type and add the new plan node - * to the end of the existing plan. The resulting plan is a linked - * list of plan nodes. For example, the string: - * - * % find . -name foo -newer bar -print - * - * results in the plan: - * - * [-name foo]--> [-newer bar]--> [-print] - * - * in this diagram, `[-name foo]' represents the plan node generated - * by c_name() with an argument of foo and `-->' represents the - * plan->next pointer. - */ - for (plan = tail = NULL; *argv;) { - if (find_create(&argv, &new) != BRLCAD_OK) return BRLCAD_ERROR; - if (!(new)) - continue; - if (plan == NULL) - tail = plan = new; - else { - tail->next = new; - tail = new; - } - } + /* + * for each argument in the command line, determine what kind of node + * it is, create the appropriate node type and add the new plan node + * to the end of the existing plan. The resulting plan is a linked + * list of plan nodes. For example, the string: + * + * % find . -name foo -newer bar -print + * + * results in the plan: + * + * [-name foo]--> [-newer bar]--> [-print] + * + * in this diagram, `[-name foo]' represents the plan node generated + * by c_name() with an argument of foo and `-->' represents the + * plan->next pointer. + */ + for (plan = tail = NULL; *argv;) { + if (find_create(&argv, &new) != BRLCAD_OK) return BRLCAD_ERROR; + if (!(new)) + continue; + if (plan == NULL) + tail = plan = new; + else { + tail->next = new; + tail = new; + } + } - /* - * if the user didn't specify one of -print, -ok or -exec, then -print - * is assumed so we bracket the current expression with parens, if - * necessary, and add a -print node on the end. - */ - if (!isoutput) { - if (plan == NULL) { - c_print(NULL, NULL, 0, &new); - tail = plan = new; - } else { - c_openparen(NULL, NULL, 0, &new); - new->next = plan; - plan = new; - c_closeparen(NULL, NULL, 0, &new); - tail->next = new; - tail = new; - c_print(NULL, NULL, 0, &new); - tail->next = new; - tail = new; - } - } + /* + * if the user didn't specify one of -print, -ok or -exec, then -print + * is assumed so we bracket the current expression with parens, if + * necessary, and add a -print node on the end. + */ + if (!isoutput) { + if (plan == NULL) { + c_print(NULL, NULL, 0, &new); + tail = plan = new; + } else { + c_openparen(NULL, NULL, 0, &new); + new->next = plan; + plan = new; + c_closeparen(NULL, NULL, 0, &new); + tail->next = new; + tail = new; + c_print(NULL, NULL, 0, &new); + tail->next = new; + tail = new; + } + } - /* - * the command line has been completely processed into a search plan - * except for the (, ), !, and -o operators. Rearrange the plan so - * that the portions of the plan which are affected by the operators - * are moved into operator nodes themselves. For example: - * - * [!]--> [-name foo]--> [-print] - * - * becomes - * - * [! [-name foo] ]--> [-print] - * - * and - * - * [(]--> [-depth]--> [-name foo]--> [)]--> [-print] - * - * becomes - * - * [expr [-depth]-->[-name foo] ]--> [-print] - * - * operators are handled in order of precedence. - */ + /* + * the command line has been completely processed into a search plan + * except for the (, ), !, and -o operators. Rearrange the plan so + * that the portions of the plan which are affected by the operators + * are moved into operator nodes themselves. For example: + * + * [!]--> [-name foo]--> [-print] + * + * becomes + * + * [! [-name foo] ]--> [-print] + * + * and + * + * [(]--> [-depth]--> [-name foo]--> [)]--> [-print] + * + * becomes + * + * [expr [-depth]-->[-name foo] ]--> [-print] + * + * operators are handled in order of precedence. + */ - if(paren_squish(plan, &plan) != BRLCAD_OK) return BRLCAD_ERROR; /* ()'s */ - if(not_squish(plan, &plan) != BRLCAD_OK) return BRLCAD_ERROR; /* !'s */ - if(or_squish(plan, &plan) != BRLCAD_OK) return BRLCAD_ERROR; /* -o's */ - (*resultplan) = plan; - return BRLCAD_OK; + if(paren_squish(plan, &plan) != BRLCAD_OK) return BRLCAD_ERROR; /* ()'s */ + if(not_squish(plan, &plan) != BRLCAD_OK) return BRLCAD_ERROR; /* !'s */ + if(or_squish(plan, &plan) != BRLCAD_OK) return BRLCAD_ERROR; /* -o's */ + (*resultplan) = plan; + return BRLCAD_OK; } void find_execute_plans(struct rt_wdb *wdbp, struct db_full_path *dfp, genptr_t inputplan) { - PLAN *p; - PLAN *plan = (PLAN *)inputplan; - for (p = plan; p && (p->eval)(p, dfp, wdbp); p = p->next) - ; + PLAN *p; + PLAN *plan = (PLAN *)inputplan; + for (p = plan; p && (p->eval)(p, dfp, wdbp); p = p->next) + ; } void find_execute(PLAN *plan, /* search plan */ - struct db_full_path *pathname, /* array of pathnames to traverse */ - struct rt_wdb *wdbp, - int execute_style) + struct db_full_path *pathname, /* array of pathnames to traverse */ + struct rt_wdb *wdbp, + int execute_style) { - struct directory *dp; - struct db_full_path fullname; - int i; - db_full_path_init(&fullname); - switch (execute_style) { - case 0: - db_fullpath_traverse(wdbp, pathname, find_execute_plans, find_execute_plans, wdbp->wdb_resp, plan); - break; - case 1: - for (i = 0; i < RT_DBNHASH; i++) { - for (dp = wdbp->dbip->dbi_Head[i]; dp != DIR_NULL; dp = dp->d_forw) { - if (!(dp->d_flags & DIR_HIDDEN) && (dp->d_addr... [truncated message content] |
From: <br...@us...> - 2008-09-12 14:19:10
|
Revision: 32640 http://brlcad.svn.sourceforge.net/brlcad/?rev=32640&view=rev Author: brlcad Date: 2008-09-12 14:19:21 +0000 (Fri, 12 Sep 2008) Log Message: ----------- starts in 2008 Modified Paths: -------------- brlcad/trunk/src/libged/search.c brlcad/trunk/src/libged/search.h Modified: brlcad/trunk/src/libged/search.c =================================================================== --- brlcad/trunk/src/libged/search.c 2008-09-11 20:24:56 UTC (rev 32639) +++ brlcad/trunk/src/libged/search.c 2008-09-12 14:19:21 UTC (rev 32640) @@ -1,7 +1,7 @@ /* S E A R C H . C * BRL-CAD * - * Copyright (c) 1990-2008 United States Government as represented by + * Copyright (c) 2008 United States Government as represented by * the U.S. Army Research Laboratory. * * This library is free software; you can redistribute it and/or Modified: brlcad/trunk/src/libged/search.h =================================================================== --- brlcad/trunk/src/libged/search.h 2008-09-11 20:24:56 UTC (rev 32639) +++ brlcad/trunk/src/libged/search.h 2008-09-12 14:19:21 UTC (rev 32640) @@ -1,7 +1,7 @@ /* S E A R C H . H * BRL-CAD * - * Copyright (c) 1990-2008 United States Government as represented by + * Copyright (c) 2008 United States Government as represented by * the U.S. Army Research Laboratory. * * This library is free software; you can redistribute it and/or This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sta...@us...> - 2008-09-15 18:16:33
|
Revision: 32645 http://brlcad.svn.sourceforge.net/brlcad/?rev=32645&view=rev Author: starseeker Date: 2008-09-15 18:16:24 +0000 (Mon, 15 Sep 2008) Log Message: ----------- Add maxdepth and mindepth options to search Modified Paths: -------------- brlcad/trunk/src/libged/search.c brlcad/trunk/src/libged/search.h Modified: brlcad/trunk/src/libged/search.c =================================================================== --- brlcad/trunk/src/libged/search.c 2008-09-15 17:07:01 UTC (rev 32644) +++ brlcad/trunk/src/libged/search.c 2008-09-15 18:16:24 UTC (rev 32645) @@ -238,6 +238,8 @@ { "-and", N_AND, NULL, O_NONE }, { "-attr", N_ATTR, c_attr, O_ARGV }, { "-iregex", N_IREGEX, c_iregex, O_ARGV }, + { "-maxdepth", N_MAXDEPTH, c_maxdepth, O_ARGV }, + { "-mindepth", N_MINDEPTH, c_mindepth, O_ARGV }, { "-name", N_NAME, c_name, O_ARGV }, { "-not", N_NOT, c_not, O_ZERO }, { "-o", N_OR, c_or, O_ZERO }, @@ -738,8 +740,75 @@ return BRLCAD_OK; } +/* + * -maxdepth function -- + * + * True if the object being examined is at depth <= the + * supplied depth. + * + */ +int +f_maxdepth(PLAN *plan, struct db_full_path *entry, struct rt_wdb *wdbp) +{ + struct db_full_path depthtest; + int depthcount = -1; + db_full_path_init(&depthtest); + db_dup_full_path(&depthtest,entry); + while (depthtest.fp_len > 0) { + depthcount++; + DB_FULL_PATH_POP(&depthtest); + } + db_free_full_path(&depthtest); + return (depthcount <= plan->max_data); +} +int +c_maxdepth(char *pattern, char ***ignored, int unused, PLAN **resultplan) +{ + PLAN *new; + + new = palloc(N_MAXDEPTH, f_maxdepth); + new->max_data = atoi(pattern); + (*resultplan) = new; + return BRLCAD_OK; +} + /* + * -mindepth function -- + * + * True if the object being examined is at depth >= the + * supplied depth. + * + */ +int +f_mindepth(PLAN *plan, struct db_full_path *entry, struct rt_wdb *wdbp) +{ + struct db_full_path depthtest; + int depthcount = -1; + db_full_path_init(&depthtest); + db_dup_full_path(&depthtest,entry); + while (depthtest.fp_len > 0) { + depthcount++; + DB_FULL_PATH_POP(&depthtest); + } + db_free_full_path(&depthtest); + return (depthcount >= plan->min_data); +} + +int +c_mindepth(char *pattern, char ***ignored, int unused, PLAN **resultplan) +{ + PLAN *new; + + new = palloc(N_MINDEPTH, f_mindepth); + new->min_data = atoi(pattern); + (*resultplan) = new; + return BRLCAD_OK; +} + + + +/* * -print functions -- * * Always true, causes the current pathame to be written to Modified: brlcad/trunk/src/libged/search.h =================================================================== --- brlcad/trunk/src/libged/search.h 2008-09-15 17:07:01 UTC (rev 32644) +++ brlcad/trunk/src/libged/search.h 2008-09-15 18:16:24 UTC (rev 32645) @@ -151,8 +151,8 @@ PLAN *c_flags(char *, char ***, int); PLAN *c_iname(char *, char ***, int); PLAN *c_ls(char *, char ***, int); -PLAN *c_maxdepth(char *, char ***, int); -PLAN *c_mindepth(char *, char ***, int); +int c_maxdepth(char *, char ***, int, PLAN **); +int c_mindepth(char *, char ***, int, PLAN **); int c_name(char *, char ***, int, PLAN **); int c_regex(char *, char ***, int, PLAN **); int c_iregex(char *, char ***, int, PLAN **); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |