Revision: 77101
http://sourceforge.net/p/brlcad/code/77101
Author: starseeker
Date: 2020-09-11 16:04:24 +0000 (Fri, 11 Sep 2020)
Log Message:
-----------
Merge from trunk: r76955 through r76962
Modified Paths:
--------------
brlcad/branches/RELEASE/include/rt/db_io.h
brlcad/branches/RELEASE/src/librt/db5_scan.c
brlcad/branches/RELEASE/src/librt/dir.c
Property Changed:
----------------
brlcad/branches/RELEASE/
brlcad/branches/RELEASE/include/
Index: brlcad/branches/RELEASE
===================================================================
--- brlcad/branches/RELEASE 2020-09-10 15:20:06 UTC (rev 77100)
+++ brlcad/branches/RELEASE 2020-09-11 16:04:24 UTC (rev 77101)
Property changes on: brlcad/branches/RELEASE
___________________________________________________________________
Modified: svn:mergeinfo
## -7,4 +7,4 ##
/brlcad/branches/opencl:65867-66137
/brlcad/branches/osg:62110-62113
/brlcad/branches/prep-cache:68236-68933
-/brlcad/trunk:36844-37285,37571-38764,38777-38845,41559-43155,43159-43908,44241-44324,44326-44385,44710-45373,45377,45379-47342,47370-68122,68125-75207,75325,75375,75377-75378,75387,75470-75472,75477,75492,75495,75549,75565-75566,75656-75661,75672,75675,75678,75729,75811,76641-76768,76771-76954,76963-76967,76975-76991,76994-77096
\ No newline at end of property
+/brlcad/trunk:36844-37285,37571-38764,38777-38845,41559-43155,43159-43908,44241-44324,44326-44385,44710-45373,45377,45379-47342,47370-68122,68125-75207,75325,75375,75377-75378,75387,75470-75472,75477,75492,75495,75549,75565-75566,75656-75661,75672,75675,75678,75729,75811,76641-76768,76771-76967,76975-76991,76994-77096
\ No newline at end of property
Index: brlcad/branches/RELEASE/include
===================================================================
--- brlcad/branches/RELEASE/include 2020-09-10 15:20:06 UTC (rev 77100)
+++ brlcad/branches/RELEASE/include 2020-09-11 16:04:24 UTC (rev 77101)
Property changes on: brlcad/branches/RELEASE/include
___________________________________________________________________
Modified: svn:mergeinfo
## -7,4 +7,4 ##
/brlcad/branches/opencl/include:65867-66137
/brlcad/branches/osg/include:62110-62113
/brlcad/branches/prep-cache/include:68236-68933
-/brlcad/trunk/include:36844-37285,37571-38764,38777-38845,41559-43155,43159-43908,44241-44324,44326-44385,44710-45373,45377,45379-47342,47370-68122,68125-75207,75325,75375,75377-75378,75387,75470-75472,75477,75492,75495,75549,75565-75566,75656-75661,75672,75675,75678,75729,75811,76641-76726,76729-76730,76748-76764,76771-76858,76862-76954,76994-77065,77067-77077
\ No newline at end of property
+/brlcad/trunk/include:36844-37285,37571-38764,38777-38845,41559-43155,43159-43908,44241-44324,44326-44385,44710-45373,45377,45379-47342,47370-68122,68125-75207,75325,75375,75377-75378,75387,75470-75472,75477,75492,75495,75549,75565-75566,75656-75661,75672,75675,75678,75729,75811,76641-76726,76729-76730,76748-76764,76771-76858,76862-76962,76994-77065,77067-77077
\ No newline at end of property
Modified: brlcad/branches/RELEASE/include/rt/db_io.h
===================================================================
--- brlcad/branches/RELEASE/include/rt/db_io.h 2020-09-10 15:20:06 UTC (rev
77100)
+++ brlcad/branches/RELEASE/include/rt/db_io.h 2020-09-11 16:04:24 UTC (rev
77101)
@@ -639,6 +639,7 @@
* -1 failure
*/
RT_EXPORT extern int db_dirbuild(struct db_i *dbip);
+RT_EXPORT extern int db_dirbuild_inmem(struct db_i *dbip, const void *data,
b_off_t data_size);
RT_EXPORT extern struct directory *db5_diradd(struct db_i *dbip,
const struct db5_raw_internal
*rip,
b_off_t laddr,
@@ -657,6 +658,14 @@
b_off_t addr,
void *client_data),
void *client_data);
+RT_EXPORT extern int db5_scan_inmem(struct db_i *dbip,
+ void (*handler)(struct db_i *,
+ const struct
db5_raw_internal *,
+ b_off_t addr,
+ void *client_data),
+ void *client_data,
+ const void *data,
+ b_off_t data_size);
/**
* obtain the database version for a given database instance.
@@ -664,6 +673,7 @@
* presently returns only a 4 or 5 accordingly.
*/
RT_EXPORT extern int db_version(struct db_i *dbip);
+RT_EXPORT extern int db_version_inmem(struct db_i *dbip, const void *data,
b_off_t data_size);
/* db_corrupt.c */
@@ -922,6 +932,7 @@
* Read named MGED db, build toc.
*/
RT_EXPORT extern struct rt_i *rt_dirbuild(const char *filename, char *buf, int
len);
+RT_EXPORT extern struct rt_i *rt_dirbuild_inmem(const void *data, b_off_t
data_size, char *buf, int len);
/* db5_types.c */
Modified: brlcad/branches/RELEASE/src/librt/db5_scan.c
===================================================================
--- brlcad/branches/RELEASE/src/librt/db5_scan.c 2020-09-10 15:20:06 UTC
(rev 77100)
+++ brlcad/branches/RELEASE/src/librt/db5_scan.c 2020-09-11 16:04:24 UTC
(rev 77101)
@@ -110,6 +110,57 @@
}
+int
+db5_scan_inmem(
+ struct db_i *dbip,
+ void (*handler)(struct db_i *,
+ const struct db5_raw_internal *,
+ b_off_t addr, void *client_data),
+ void *client_data,
+ const void *data,
+ b_off_t data_size)
+{
+ unsigned char header[8];
+ struct db5_raw_internal raw;
+ size_t nrec;
+ b_off_t addr;
+ const unsigned char *cp = (const unsigned char *)data;
+
+ RT_CK_DBI(dbip);
+ if (RT_G_DEBUG&RT_DEBUG_DB) bu_log("db5_scan_inmem(%p, %lx)\n",
+ (void *)dbip, (long unsigned int)handler);
+
+ raw.magic = DB5_RAW_INTERNAL_MAGIC;
+ nrec = 0L;
+
+ if (db5_header_is_valid(cp) == 0) {
+ bu_log("db5_scan_inmem ERROR: data is lacking a proper BRL-CAD v5
database header\n");
+ goto fatal;
+ }
+ cp += sizeof(header);
+ addr = (b_off_t)sizeof(header);
+ while (addr < data_size) {
+ const unsigned char *current_data = cp;
+ void *dp_copy;
+ if ((cp = db5_get_raw_internal_ptr(&raw, cp)) == NULL) {
+ goto fatal;
+ }
+ dp_copy = bu_malloc(raw.object_length, "db5_scan_inmem raw dp data");
+ memcpy(dp_copy, current_data, raw.object_length);
+ (*handler)(dbip, &raw, (b_off_t)dp_copy, client_data);
+ nrec++;
+ addr += (b_off_t)raw.object_length;
+ }
+
+ dbip->dbi_nrec = nrec; /* # obj in db, not inc. header */
+ return 0; /* success */
+
+fatal:
+ dbip->dbi_read_only = 1; /* Writing could corrupt it worse */
+ return -1; /* fatal error */
+}
+
+
struct directory *
db_diradd5(
struct db_i *dbip,
@@ -195,10 +246,6 @@
RT_CK_DBI(dbip);
- if (client_data && RT_G_DEBUG&RT_DEBUG_DB) {
- bu_log("WARNING: db5_diradd() received non-NULL client_data\n");
- }
-
bu_vls_strcpy(&local, (const char *)rip->name.ext_buf);
if (db_dircheck(dbip, &local, 0, &headp) < 0) {
bu_vls_free(&local);
@@ -252,6 +299,8 @@
}
if (rip->h_name_hidden)
dp->d_flags |= RT_DIR_HIDDEN;
+ if (client_data && (*((int*)client_data) == 1))
+ dp->d_flags |= RT_DIR_INMEM;
dp->d_len = rip->object_length; /* in bytes */
BU_LIST_INIT(&dp->d_use_hd);
dp->d_animate = NULL;
@@ -417,6 +466,113 @@
int
+db_dirbuild_inmem(struct db_i *dbip, const void *data, b_off_t data_size)
+{
+ int version;
+
+ if (!dbip)
+ return -1;
+
+ RT_CK_DBI(dbip);
+
+ /* First, determine what version database this is */
+ version = db_version_inmem(dbip, data, data_size);
+
+ if (version == 5) {
+ struct directory *dp;
+ struct bu_external ext;
+ struct db5_raw_internal raw;
+ struct bu_attribute_value_set avs;
+ const char *cp;
+ int inmem_flag = 1;
+
+ bu_avs_init_empty(&avs);
+
+ /* File is v5 format */
+ if (db5_scan_inmem(dbip, db5_diradd_handler, &inmem_flag, data,
data_size) < 0) {
+ bu_log("db_dirbuild_inmem(): db5_scan_inmem() failed\n");
+ return -1;
+ }
+
+ /* Need to retrieve _GLOBAL object and obtain title and units */
+ if ((dp = db_lookup(dbip, DB5_GLOBAL_OBJECT_NAME, LOOKUP_NOISY)) ==
RT_DIR_NULL) {
+ bu_log("db_dirbuild_inmem(): improper database, no %s object\n",
+ DB5_GLOBAL_OBJECT_NAME);
+ dbip->dbi_title = bu_strdup(DB5_GLOBAL_OBJECT_NAME);
+ /* Missing _GLOBAL object so create it and set default title and
units */
+ db5_update_ident(dbip, "Untitled BRL-CAD Database", 1.0);
+ return 0; /* not a fatal error, user may have deleted it */
+ }
+
+ BU_EXTERNAL_INIT(&ext);
+
+ if (db_get_external(&ext, dp, dbip) < 0 ||
+ db5_get_raw_internal_ptr(&raw, ext.ext_buf) == NULL) {
+ bu_log("db_dirbuild_inmem(): improper database, unable to read %s
object\n",
+ DB5_GLOBAL_OBJECT_NAME);
+ return -1;
+ }
+
+ if (raw.major_type != DB5_MAJORTYPE_ATTRIBUTE_ONLY) {
+ bu_log("db_dirbuild_inmem(): improper database, %s exists but is
not an attribute-only object\n",
+ DB5_GLOBAL_OBJECT_NAME);
+ dbip->dbi_title = bu_strdup(DB5_GLOBAL_OBJECT_NAME);
+ return 0; /* not a fatal error, need to let user proceed to fix
it */
+ }
+
+ /* Parse out the attributes */
+ if (db5_import_attributes(&avs, &raw.attributes) < 0) {
+ bu_log("db_dirbuild_inmem(): improper database, corrupted
attribute-only %s object\n",
+ DB5_GLOBAL_OBJECT_NAME);
+ bu_free_external(&ext);
+ return -1; /* this is fatal */
+ }
+
+ BU_CK_AVS(&avs);
+
+ /* 1/3: title */
+ if ((cp = bu_avs_get(&avs, "title")) != NULL)
+ dbip->dbi_title = bu_strdup(cp);
+ else
+ dbip->dbi_title = bu_strdup("Untitled BRL-CAD database");
+
+ /* 2/3: units */
+ if ((cp = bu_avs_get(&avs, "units")) != NULL) {
+ double dd;
+ if (sscanf(cp, "%lf", &dd) != 1 || NEAR_ZERO(dd, VUNITIZE_TOL)) {
+ bu_log("db_dirbuild_inmem(): improper database, %s object
attribute 'units'=%s is invalid\n",
+ DB5_GLOBAL_OBJECT_NAME, cp);
+ /* Not fatal, just stick with default value from db_open() */
+ } else {
+ dbip->dbi_local2base = dd;
+ dbip->dbi_base2local = 1/dd;
+ }
+ }
+
+ /* 3/3: color table */
+ if ((cp = bu_avs_get(&avs, "regionid_colortable")) != NULL)
+ /* Import the region-id coloring table */
+ db5_import_color_table((char *)cp);
+
+ bu_avs_free(&avs);
+ bu_free_external(&ext); /* not until after done with avs! */
+
+ return 0; /* ok */
+ } else if (version == 4) {
+ /* things used to be pretty simple with v4 */
+ if (db_scan(dbip, db_diradd4, 1, NULL) < 0)
+ return -1;
+
+ return 0; /* ok */
+ }
+
+ bu_log("ERROR: Cannot build object directory.\n\tData does not seem to be
in BRL-CAD geometry database format.\n");
+
+ return -1;
+}
+
+
+int
db_version(struct db_i *dbip)
{
unsigned char header[8];
@@ -451,6 +607,37 @@
}
+int
+db_version_inmem(struct db_i *dbip, const void *data, b_off_t data_size)
+{
+ const unsigned char* header;
+
+ if (!dbip)
+ return -1;
+
+ RT_CK_DBI(dbip);
+
+ /* already calculated during db_open? */
+ if (dbip->dbi_version != 0)
+ return abs(dbip->dbi_version);
+
+ rewind(dbip->dbi_fp);
+ if (!data || (data_size < 8)) {
+ bu_log("ERROR: data chunk too short to be a BRL-CAD database\n");
+ return -1;
+ }
+
+ header = (const unsigned char *)data;
+
+ if (db5_header_is_valid(header))
+ return 5;
+ else if (header[0] == 'I')
+ return 4;
+
+ return -1;
+}
+
+
/*
* Local Variables:
* mode: C
Modified: brlcad/branches/RELEASE/src/librt/dir.c
===================================================================
--- brlcad/branches/RELEASE/src/librt/dir.c 2020-09-10 15:20:06 UTC (rev
77100)
+++ brlcad/branches/RELEASE/src/librt/dir.c 2020-09-11 16:04:24 UTC (rev
77101)
@@ -72,6 +72,47 @@
}
+/**
+ * Builds an in-memory database directory of the object names read
+ * from an array with the raw data, i.e. a .g database file content.
+ *
+ * Allocate and initialize information for this instance of an RT
+ * model database.
+ *
+ * Returns -
+ * (struct rt_i *) Success
+ * RTI_NULL Fatal Error
+ */
+struct rt_i *
+rt_dirbuild_inmem(const void *data, b_off_t data_size, char *buf, int len)
+{
+ register struct rt_i *rtip;
+ register struct db_i *dbip; /* Database instance ptr */
+
+ if (rt_uniresource.re_magic == 0)
+ rt_init_resource(&rt_uniresource, 0, NULL);
+
+ if ((dbip = db_open_inmem()) == DBI_NULL)
+ return RTI_NULL; /* FAIL */
+ RT_CK_DBI(dbip);
+
+ if ((data != NULL) && (data_size > 0)) {
+ if (db_dirbuild_inmem(dbip, data, data_size) < 0) {
+ db_close(dbip);
+ return RTI_NULL; /* FAIL */
+ }
+ }
+
+ rtip = rt_new_rti(dbip); /* clones dbip */
+ db_close(dbip); /* releases original dbip */
+
+ if (buf != (char *)NULL)
+ bu_strlcpy(buf, dbip->dbi_title, len);
+
+ return rtip; /* OK */
+}
+
+
int
rt_db_get_internal(
struct rt_db_internal *ip,
This was sent by the SourceForge.net collaborative development platform, the
world's largest Open Source development site.
_______________________________________________
BRL-CAD Source Commits mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/brlcad-commits