Revision: 72426 http://sourceforge.net/p/brlcad/code/72426 Author: starseeker Date: 2019-02-12 14:55:21 +0000 (Tue, 12 Feb 2019) Log Message: ----------- Allow for error count based error handling of density file parsing.
Modified Paths: -------------- brlcad/trunk/include/analyze.h brlcad/trunk/src/libanalyze/api.c brlcad/trunk/src/libanalyze/density.cxx brlcad/trunk/src/libanalyze/tests/density.cxx brlcad/trunk/src/libged/ged_util.c brlcad/trunk/src/libged/gqa.c brlcad/trunk/src/libged/mater.cxx brlcad/trunk/src/rt/viewweight.c Modified: brlcad/trunk/include/analyze.h =================================================================== --- brlcad/trunk/include/analyze.h 2019-02-12 06:59:06 UTC (rev 72425) +++ brlcad/trunk/include/analyze.h 2019-02-12 14:55:21 UTC (rev 72426) @@ -169,8 +169,13 @@ /* Accepts a buffer, typically read from a .density file. Expects units of g/cm^3. * (TODO - Ugh - need to come up with a way to define the units in the file so we aren't - * tied to that forever...) */ -ANALYZE_EXPORT extern int analyze_densities_load(struct analyze_densities *a, const char *buff, struct bu_vls *msgs); + * tied to that forever...) + * + * Returns the number of valid density entries loaded. The optional ecnt variable, if + * supplied, will count the number of lines where the parser failed to recognize either + * a commented line or a valid density. Calling codes may then decide if they want to + * accept the partial result or fail hard based on the ecnt. */ +ANALYZE_EXPORT extern int analyze_densities_load(struct analyze_densities *a, const char *buff, struct bu_vls *msgs, int *ecnt); /* Creates a .density buffer from a, writing units of g/cm^3. Returns length of buff * (TODO - Ugh - need to come up with a way to define the units so we aren't Modified: brlcad/trunk/src/libanalyze/api.c =================================================================== --- brlcad/trunk/src/libanalyze/api.c 2019-02-12 06:59:06 UTC (rev 72425) +++ brlcad/trunk/src/libanalyze/api.c 2019-02-12 14:55:21 UTC (rev 72426) @@ -489,6 +489,7 @@ struct bu_mapped_file *dfile = NULL; char *buf = NULL; int ret = 0; + int ecnt = 0; if (!bu_file_exists(name, NULL)) { bu_log("Could not find density file - %s\n", name); @@ -505,9 +506,9 @@ (void)analyze_densities_create(&(state->densities)); - ret = analyze_densities_load(state->densities, buf, &msgs); + ret = analyze_densities_load(state->densities, buf, &msgs, &ecnt); - if (bu_vls_strlen(&msgs)) { + if (ecnt && bu_vls_strlen(&msgs)) { bu_log("Problem reading densities file:\n%s\n", bu_vls_cstr(&msgs)); } bu_vls_free(&msgs); @@ -531,6 +532,7 @@ struct rt_db_internal intern; struct rt_binunif_internal *bu; int ret; + int ecnt = 0; char *buf; dp = db_lookup(rtip->rti_dbip, "_DENSITIES", LOOKUP_QUIET); @@ -556,9 +558,9 @@ buf = (char *)bu_calloc(bu->count+1, sizeof(char), "density buffer"); memcpy(buf, bu->u.int8, bu->count); - ret = analyze_densities_load(state->densities, buf, &msgs); + ret = analyze_densities_load(state->densities, buf, &msgs, &ecnt); - if (bu_vls_strlen(&msgs)) { + if (ecnt && bu_vls_strlen(&msgs)) { bu_log("Problem reading densities file:\n%s\n", bu_vls_cstr(&msgs)); } bu_vls_free(&msgs); Modified: brlcad/trunk/src/libanalyze/density.cxx =================================================================== --- brlcad/trunk/src/libanalyze/density.cxx 2019-02-12 06:59:06 UTC (rev 72425) +++ brlcad/trunk/src/libanalyze/density.cxx 2019-02-12 14:55:21 UTC (rev 72426) @@ -217,6 +217,12 @@ while (*p && (*p == '\t' || *p == ' ' || *p == '\n')) p++; } + /* If the whole thing was a comment or empty, return 0 */ + if (!name && material_id == -1 && density < 0) { + return 0; + } + + /* Whatever we saw, if it wasn't a valid definition bail now */ if (!name || material_id == -1 || density < 0) { return -1; @@ -235,11 +241,11 @@ bu_free(name, "free name copy"); bu_free(buf, "free buf copy"); - return 0; + return 1; } extern "C" int -analyze_densities_load(struct analyze_densities *a, const char *buff, struct bu_vls *msgs) +analyze_densities_load(struct analyze_densities *a, const char *buff, struct bu_vls *msgs, int *ecnt) { if (!a || !a->i || !buff) return 0; std::string dbuff(buff); @@ -249,10 +255,14 @@ while (std::getline(ss, line)) { struct bu_vls lmsg = BU_VLS_INIT_ZERO; int ret = parse_densities_line(a, line.c_str(), line.length(), &lmsg); + if (!ret) continue; if (ret < 0) { if (msgs && bu_vls_strlen(&lmsg)) { bu_vls_printf(msgs, "%s", bu_vls_cstr(&lmsg)); } + if (ecnt) { + (*ecnt)++; + } } else { dcnt++; } Modified: brlcad/trunk/src/libanalyze/tests/density.cxx =================================================================== --- brlcad/trunk/src/libanalyze/tests/density.cxx 2019-02-12 06:59:06 UTC (rev 72425) +++ brlcad/trunk/src/libanalyze/tests/density.cxx 2019-02-12 14:55:21 UTC (rev 72426) @@ -153,11 +153,11 @@ bu_log("Error - empty database returned a density on id lookup??\n"); goto analyze_density_fail; } - if (analyze_densities_load(a, NULL, &msgs) != 0) { + if (analyze_densities_load(a, NULL, &msgs, NULL) != 0) { bu_log("Error - loading NULL buffer returned a non-zero density count??\nMsg: %s", bu_vls_cstr(&msgs)); goto analyze_density_fail; } - if (analyze_densities_load(a, "", &msgs) != 0) { + if (analyze_densities_load(a, "", &msgs, NULL) != 0) { bu_log("Error - loading empty buffer returned a non-zero density count??Msg: %s\n", bu_vls_cstr(&msgs)); goto analyze_density_fail; } @@ -177,6 +177,8 @@ if (BU_STR_EQUAL(argv[1], "std")) { + int ecnt = 0; + std::set<long int> valid_ids = {0, 2, 15, 4, 31}; analyze_densities_create(&a); @@ -267,11 +269,16 @@ } /* Test loading from buffers */ - long int sb_cnt = analyze_densities_load(a, simple_buff, &msgs); + ecnt = 0; + long int sb_cnt = analyze_densities_load(a, simple_buff, &msgs, &ecnt); if (!sb_cnt) { bu_log("Error - could not find id in simple test buffer: %s\n", bu_vls_cstr(&msgs)); goto analyze_density_fail; } + if (ecnt) { + bu_log("Error - invalid line found parsing simple test buffer: %s\n", bu_vls_cstr(&msgs)); + goto analyze_density_fail; + } if (sb_cnt != 1) { bu_log("Error - found %ld ids in test buffer, but expected 1\n", sb_cnt); goto analyze_density_fail; @@ -280,7 +287,8 @@ analyze_densities_clear(a); analyze_densities_init(a); - long int tb_cnt = analyze_densities_load(a, test_buff, &msgs); + ecnt = 0; + long int tb_cnt = analyze_densities_load(a, test_buff, &msgs, &ecnt); if (!tb_cnt) { bu_log("Error - could not find ids in test buffer: %s\n", bu_vls_cstr(&msgs)); goto analyze_density_fail; @@ -289,6 +297,10 @@ bu_log("Error - found %ld ids in test buffer, but expected 10\n", tb_cnt); goto analyze_density_fail; } + if (ecnt != 2) { + bu_log("Error - found %d lines with parsing errors in test buffer, but expected 2:\n%s\n", ecnt, bu_vls_cstr(&msgs)); + goto analyze_density_fail; + } /* Test writing out a buffer */ char *tbuff_out; Modified: brlcad/trunk/src/libged/ged_util.c =================================================================== --- brlcad/trunk/src/libged/ged_util.c 2019-02-12 06:59:06 UTC (rev 72425) +++ brlcad/trunk/src/libged/ged_util.c 2019-02-12 14:55:21 UTC (rev 72426) @@ -31,8 +31,11 @@ #include <stdlib.h> #include <string.h> +#include "bu/app.h" +#include "bu/path.h" #include "bu/sort.h" #include "bu/str.h" +#include "bu/vls.h" #include "ged.h" #include "./ged_private.h" @@ -329,12 +332,13 @@ * !0 on failure */ static int -_ged_densities_from_file(struct ged *gedp, char *name, int fault_tolerant) +_ged_densities_from_file(struct ged *gedp, const char *name, int fault_tolerant) { struct bu_mapped_file *dfile = NULL; struct bu_vls msgs = BU_VLS_INIT_ZERO; char *buf = NULL; int ret = 0; + int ecnt = 0; if (!bu_file_exists(name, NULL)) { bu_vls_printf(gedp->ged_result_str, "Could not find density file - %s\n", name); @@ -359,12 +363,10 @@ (void)analyze_densities_create(&(gedp->gd_densities)); - ret = analyze_densities_load(gedp->gd_densities, buf, &msgs); + ret = analyze_densities_load(gedp->gd_densities, buf, &msgs, &ecnt); - if (!fault_tolerant && ret <= 0) { - if (bu_vls_strlen(&msgs)) { - bu_vls_printf(gedp->ged_result_str, "Problem reading densities file %s:\n%s\n", name, bu_vls_cstr(&msgs)); - } + if (!fault_tolerant && ecnt > 0) { + bu_vls_printf(gedp->ged_result_str, "Problem reading densities file %s:\n%s\n", name, bu_vls_cstr(&msgs)); if (gedp->gd_densities) { analyze_densities_destroy(gedp->gd_densities); } @@ -391,8 +393,10 @@ * !0 on failure */ int -_ged_read_densities(struct ged *gedp, char *filename, int fault_tolerant) +_ged_read_densities(struct ged *gedp, const char *filename, int fault_tolerant) { + struct bu_vls d_path_dir = BU_VLS_INIT_ZERO; + if (gedp == GED_NULL || gedp->ged_wdbp == RT_WDB_NULL) { return GED_ERROR; } @@ -406,6 +410,7 @@ * the database itself. */ if (gedp->ged_wdbp->dbip != DBI_NULL) { int ret = 0; + int ecnt = 0; struct bu_vls msgs = BU_VLS_INIT_ZERO; struct directory *dp; struct rt_db_internal intern; @@ -413,62 +418,84 @@ char *buf; dp = db_lookup(gedp->ged_wdbp->dbip, "_DENSITIES", LOOKUP_QUIET); - if (dp == (struct directory *)NULL) { - bu_vls_printf(_ged_current_gedp->ged_result_str, "No \"_DENSITIES\" density table object in database."); - bu_vls_printf(_ged_current_gedp->ged_result_str, " If you do not have density data you can still get adjacent air, bounding box, exposed air, gaps, volume or overlaps by using the -Aa, -Ab, -Ae, -Ag, -Av, or -Ao options respectively.\n"); - return GED_ERROR; - } - if (rt_db_get_internal(&intern, dp, gedp->ged_wdbp->dbip, NULL, &rt_uniresource) < 0) { - bu_vls_printf(_ged_current_gedp->ged_result_str, "could not import %s\n", dp->d_namep); - return GED_ERROR; - } + if (dp != (struct directory *)NULL) { - if ((intern.idb_major_type & DB5_MAJORTYPE_BINARY_MASK) == 0) - return GED_ERROR; + if (rt_db_get_internal(&intern, dp, gedp->ged_wdbp->dbip, NULL, &rt_uniresource) < 0) { + bu_vls_printf(_ged_current_gedp->ged_result_str, "could not import %s\n", dp->d_namep); + return GED_ERROR; + } - bu = (struct rt_binunif_internal *)intern.idb_ptr; + if ((intern.idb_major_type & DB5_MAJORTYPE_BINARY_MASK) == 0) + return GED_ERROR; - RT_CHECK_BINUNIF (bu); + bu = (struct rt_binunif_internal *)intern.idb_ptr; + RT_CHECK_BINUNIF (bu); - if (gedp->gd_densities) { - analyze_densities_destroy(gedp->gd_densities); - } - if (gedp->gd_densities_source) { - bu_free(gedp->gd_densities_source, "free densities source string"); - } + if (gedp->gd_densities) { + analyze_densities_destroy(gedp->gd_densities); + } - (void)analyze_densities_create(&gedp->gd_densities); + if (gedp->gd_densities_source) { + bu_free(gedp->gd_densities_source, "free densities source string"); + } - buf = (char *)bu_malloc(bu->count+1, "density buffer"); - memcpy(buf, bu->u.int8, bu->count); + (void)analyze_densities_create(&gedp->gd_densities); - ret = analyze_densities_load(gedp->gd_densities, buf, &msgs); + buf = (char *)bu_malloc(bu->count+1, "density buffer"); + memcpy(buf, bu->u.int8, bu->count); - if (!fault_tolerant && ret <= 0) { - if (bu_vls_strlen(&msgs)) { + ret = analyze_densities_load(gedp->gd_densities, buf, &msgs, &ecnt); + + if (!fault_tolerant && ecnt > 0) { bu_vls_printf(gedp->ged_result_str, "Problem reading densities from .g file:\n%s\n", bu_vls_cstr(&msgs)); + if (gedp->gd_densities) { + analyze_densities_destroy(gedp->gd_densities); + } + bu_vls_free(&msgs); + return GED_ERROR; } - if (gedp->gd_densities) { - analyze_densities_destroy(gedp->gd_densities); + + bu_vls_free(&msgs); + bu_free((void *)buf, "density buffer"); + + if (ret > 0) { + gedp->gd_densities_source = bu_strdup(gedp->ged_wdbp->dbip->dbi_filename); } - bu_vls_free(&msgs); - return GED_ERROR; + + return (ret == 0) ? GED_ERROR : GED_OK; } + } - bu_vls_free(&msgs); - bu_free((void *)buf, "density buffer"); + /* If we don't have an explicitly specified file and the database doesn't have any information, see if we + * have .density files in either the current database directory or HOME. */ - if (ret > 0) { - gedp->gd_densities_source = bu_strdup(gedp->ged_wdbp->dbip->dbi_filename); + /* Try .g path first */ + if (bu_path_component(&d_path_dir, gedp->ged_wdbp->dbip->dbi_filename, BU_PATH_DIRNAME)) { + + bu_vls_printf(&d_path_dir, "/.density"); + + if (bu_file_exists(bu_vls_cstr(&d_path_dir), NULL)) { + int ret = _ged_densities_from_file(gedp, bu_vls_cstr(&d_path_dir), fault_tolerant); + bu_vls_free(&d_path_dir); + return ret; } + } - return (ret == 0) ? GED_ERROR : GED_OK; + /* Try HOME */ + if (bu_dir(NULL, 0, BU_DIR_HOME, NULL)) { + + bu_vls_sprintf(&d_path_dir, "%s/.density", bu_dir(NULL, 0, BU_DIR_HOME, NULL)); + + if (bu_file_exists(bu_vls_cstr(&d_path_dir), NULL)) { + int ret = _ged_densities_from_file(gedp, bu_vls_cstr(&d_path_dir), fault_tolerant); + bu_vls_free(&d_path_dir); + return ret; + } } - /* TODO - fall back on current dir and HOME dir .density files, if neither of the above work. */ return GED_ERROR; Modified: brlcad/trunk/src/libged/gqa.c =================================================================== --- brlcad/trunk/src/libged/gqa.c 2019-02-12 06:59:06 UTC (rev 72425) +++ brlcad/trunk/src/libged/gqa.c 2019-02-12 14:55:21 UTC (rev 72426) @@ -771,7 +771,7 @@ (void)analyze_densities_create(&densities); - ret = analyze_densities_load(densities, buf, &msgs); + ret = analyze_densities_load(densities, buf, &msgs, NULL); if (bu_vls_strlen(&msgs)) { bu_vls_printf(_ged_current_gedp->ged_result_str, "Problem reading densities file:\n%s\n", bu_vls_cstr(&msgs)); @@ -822,7 +822,7 @@ buf = (char *)bu_malloc(bu->count+1, "density buffer"); memcpy(buf, bu->u.int8, bu->count); - ret = analyze_densities_load(densities, buf, &msgs); + ret = analyze_densities_load(densities, buf, &msgs, NULL); if (bu_vls_strlen(&msgs)) { bu_vls_printf(_ged_current_gedp->ged_result_str, "Problem reading densities file:\n%s\n", bu_vls_cstr(&msgs)); Modified: brlcad/trunk/src/libged/mater.cxx =================================================================== --- brlcad/trunk/src/libged/mater.cxx 2019-02-12 06:59:06 UTC (rev 72425) +++ brlcad/trunk/src/libged/mater.cxx 2019-02-12 14:55:21 UTC (rev 72426) @@ -354,8 +354,13 @@ dbuff = (char *)(dfile->buf); struct bu_vls pbuff_msgs = BU_VLS_INIT_ZERO; - if (analyze_densities_load(densities, dbuff, &pbuff_msgs) == 0) { - bu_vls_printf(gedp->ged_result_str, "could not parse density file %s: %s", argv[1], bu_vls_cstr(&pbuff_msgs)); + int ecnt = 0; + if (analyze_densities_load(densities, dbuff, &pbuff_msgs, &ecnt) == 0) { + if (ecnt > 0) { + bu_vls_printf(gedp->ged_result_str, "problem parsing density file %s: %s", argv[1], bu_vls_cstr(&pbuff_msgs)); + } else { + bu_vls_printf(gedp->ged_result_str, "no density definitions found in file %s: %s", argv[1], bu_vls_cstr(&pbuff_msgs)); + } bu_close_mapped_file(dfile); bu_vls_free(&pbuff_msgs); return GED_ERROR; Modified: brlcad/trunk/src/rt/viewweight.c =================================================================== --- brlcad/trunk/src/rt/viewweight.c 2019-02-12 06:59:06 UTC (rev 72425) +++ brlcad/trunk/src/rt/viewweight.c 2019-02-12 14:55:21 UTC (rev 72426) @@ -218,7 +218,7 @@ /* Read in density */ - if (analyze_densities_load(density, dbuff, &pbuff_msgs) == 0) { + if (analyze_densities_load(density, dbuff, &pbuff_msgs, NULL) == 0) { bu_log("Unable to parse density file \"%s\":%s\n", bu_vls_cstr(densityfile), bu_vls_cstr(&pbuff_msgs)); bu_close_mapped_file(dfile); goto view_init_rtweight_fail; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. _______________________________________________ BRL-CAD Source Commits mailing list brlcad-commits@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/brlcad-commits