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

Reply via email to