summaryrefslogtreecommitdiffstats
path: root/tools/h5tools.c
diff options
context:
space:
mode:
Diffstat (limited to 'tools/h5tools.c')
-rw-r--r--tools/h5tools.c188
1 files changed, 161 insertions, 27 deletions
diff --git a/tools/h5tools.c b/tools/h5tools.c
index 40cc9f5..226b036 100644
--- a/tools/h5tools.c
+++ b/tools/h5tools.c
@@ -186,6 +186,7 @@ h5dump_str_append(h5dump_str_t *str/*in,out*/, const char *fmt, ...)
str->len += nchars;
break;
}
+
/* Try again with twice as much space */
str->nalloc *= 2;
str->s = realloc(str->s, str->nalloc);
@@ -446,6 +447,112 @@ h5dump_escape(char *s/*in,out*/, size_t size, int escape_spaces)
/*-------------------------------------------------------------------------
+ * Function: h5dump_is_zero
+ *
+ * Purpose: Determines if memory is initialized to all zero bytes.
+ *
+ * Return: TRUE if all bytes are zero; FALSE otherwise
+ *
+ * Programmer: Robb Matzke
+ * Monday, June 7, 1999
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static hbool_t
+h5dump_is_zero(const void *_mem, size_t size)
+{
+ const unsigned char *mem = (const unsigned char*)_mem;
+ while (size-- > 0) {
+ if (mem[size]) return FALSE;
+ }
+ return TRUE;
+}
+
+
+/*-------------------------------------------------------------------------
+ * Function: h5dump_region
+ *
+ * Purpose: Prints information about a dataspace region by appending
+ * the information to the specified string.
+ *
+ * Return: Success: 0
+ *
+ * Failure: NULL
+ *
+ * Programmer: Robb Matzke
+ * Monday, June 7, 1999
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+h5dump_region(hid_t region, h5dump_str_t *str/*in,out*/)
+{
+ hssize_t nblocks, npoints, i;
+ hsize_t *ptdata;
+ int j;
+ int ndims = H5Sget_simple_extent_ndims(region);
+
+ /*
+ * These two functions fail if the region does not have blocks or points,
+ * respectively. They do not currently know how to translate from one to
+ * the other.
+ */
+ H5E_BEGIN_TRY {
+ nblocks = H5Sget_select_hyper_nblocks(region);
+ npoints = H5Sget_select_elem_npoints(region);
+ } H5E_END_TRY;
+ h5dump_str_append(str, "{");
+
+ /* Print block information */
+ if (nblocks>0) {
+ ptdata = malloc(nblocks*ndims*2*sizeof(ptdata[0]));
+ H5Sget_select_hyper_blocklist(region, 0, nblocks, ptdata);
+ for (i=0; i<nblocks; i++) {
+ h5dump_str_append(str, "%sBlk%lu: ",
+ i?","OPTIONAL_LINE_BREAK" ":"",
+ (unsigned long)i);
+
+ /* Start coordinates and opposite corner */
+ for (j=0; j<ndims; j++) {
+ h5dump_str_append(str, "%s%lu", j?",":"(",
+ (unsigned long)(ptdata[i*2*ndims+j]));
+ }
+ for (j=0; j<ndims; j++) {
+ h5dump_str_append(str, "%s%lu", j?",":")-(",
+ (unsigned long)(ptdata[i*2*ndims+j+ndims]));
+ }
+ h5dump_str_append(str, ")");
+ }
+ free(ptdata);
+ }
+
+ /* Print point information */
+ if (npoints>0) {
+ ptdata = malloc(npoints*ndims*sizeof(ptdata[0]));
+ H5Sget_select_elem_pointlist(region, 0, npoints, ptdata);
+ for (i=0; i<npoints; i++) {
+ h5dump_str_append(str, "%sPt%lu: ",
+ i?","OPTIONAL_LINE_BREAK" ":"",
+ (unsigned long)i);
+ for (j=0; j<ndims; j++) {
+ h5dump_str_append(str, "%s%lu", j?",":"(",
+ (unsigned long)(ptdata[i*ndims+j]));
+ }
+ h5dump_str_append(str, ")");
+ }
+ free(ptdata);
+ }
+
+ h5dump_str_append(str, "}");
+ return 0;
+}
+
+
+/*-------------------------------------------------------------------------
* Function: h5dump_sprint
*
* Purpose: Renders the value pointed to by VP of type TYPE into variable
@@ -477,10 +584,11 @@ h5dump_sprint(h5dump_str_t *str/*in,out*/, const h5dump_t *info,
{
size_t i, n, offset, size, dims[H5S_MAX_RANK], nelmts, start;
char *name, quote='\0';
- hid_t memb;
- int nmembs, j, k, ndims;
+ hid_t memb, obj, region;
+ int nmembs, j, k, ndims, otype;
static char fmt_llong[8], fmt_ullong[8];
H5T_str_t pad;
+ H5G_stat_t sb;
int repeat_threshold; /*-1 means any amount of repeat allowed*/
if ((programtype == UNKNOWN) || (programtype == H5LS)) {
@@ -746,35 +854,61 @@ h5dump_sprint(h5dump_str_t *str/*in,out*/, const h5dump_t *info,
} else if (H5Tequal(type, H5T_STD_REF_DSETREG)) {
/*
* Dataset region reference -- show the type and OID of the referenced
- *object, but we are unable to show the region yet because there isn't
- *enough support in the data space layer. - rpm 19990604
+ * object, but we are unable to show the region yet because there
+ * isn't enough support in the data space layer. - rpm 19990604
*/
- int otype = H5Rget_object_type(container, vp);
- hid_t obj = H5Rdereference(container, H5R_DATASET_REGION, vp);
- switch (otype) {
- case H5G_GROUP:
- h5dump_str_append(str, "GRP-");
- H5Gclose(obj);
- break;
- case H5G_DATASET:
- h5dump_str_append(str, "DSET-");
+ if (h5dump_is_zero(vp, H5Tget_size(type))) {
+ h5dump_str_append(str, "NULL");
+ } else {
+ obj = H5Rdereference(container, H5R_DATASET_REGION, vp);
+ region = H5Rget_region(container, H5R_DATASET_REGION, vp);
+ H5Gget_objinfo(obj, ".", FALSE, &sb);
+ h5dump_str_append(str, "DSET-%lu:%lu:%lu:%lu-",
+ sb.fileno[1], sb.fileno[0],
+ sb.objno[1], sb.objno[0]);
+ h5dump_region(region, str);
+ H5Sclose(region);
H5Dclose(obj);
- break;
- case H5G_TYPE:
- h5dump_str_append(str, "TYPE-");
- H5Tclose(obj);
- break;
- default:
- h5dump_str_append(str, "%u-", otype);
- /* unable to close `obj' since we don't know the type */
- break;
}
-
-
- /* OID */
+
+ } else if (H5Tequal(type, H5T_STD_REF_OBJ)) {
+ /*
+ * Object references -- show the type and OID of the referenced
+ * object.
+ */
+ if (h5dump_is_zero(vp, H5Tget_size(type))) {
+ h5dump_str_append(str, "NULL");
+ } else {
+ otype = H5Rget_object_type(container, vp);
+ obj = H5Rdereference(container, H5R_OBJECT, vp);
+ H5Gget_objinfo(obj, ".", FALSE, &sb);
+
+ /* Print object type and close object */
+ switch (otype) {
+ case H5G_GROUP:
+ h5dump_str_append(str, "GRP");
+ H5Gclose(obj);
+ break;
+ case H5G_DATASET:
+ h5dump_str_append(str, "DSET");
+ H5Dclose(obj);
+ break;
+ case H5G_TYPE:
+ h5dump_str_append(str, "TYPE");
+ H5Tclose(obj);
+ break;
+ default:
+ h5dump_str_append(str, "%u-", otype);
+ /* unable to close `obj' since we don't know the type */
+ break;
+ }
- /* SPACE */
-
+ /* Print OID */
+ h5dump_str_append(str, "-%lu:%lu:%lu:%lu",
+ sb.fileno[1], sb.fileno[0],
+ sb.objno[1], sb.objno[0]);
+ }
+
} else {
h5dump_str_append(str, "0x");
n = H5Tget_size(type);