diff options
-rw-r--r-- | tools/h5dump/h5dump.c | 172 | ||||
-rw-r--r-- | tools/h5dump/h5dumpgentest.c | 17 | ||||
-rwxr-xr-x | tools/h5dump/testh5dump.sh | 2 |
3 files changed, 124 insertions, 67 deletions
diff --git a/tools/h5dump/h5dump.c b/tools/h5dump/h5dump.c index f39c47a..ed7b713 100644 --- a/tools/h5dump/h5dump.c +++ b/tools/h5dump/h5dump.c @@ -1025,20 +1025,22 @@ dump_dataspace(hid_t space) hsize_t size[H5DUMP_MAX_RANK]; hsize_t maxsize[H5DUMP_MAX_RANK]; int ndims = H5Sget_simple_extent_dims(space, size, maxsize); + H5S_class_t space_type = H5Sget_simple_extent_type(space); int i; indentation(indent + COL); printf("%s ", dump_header_format->dataspacebegin); - if (H5Sis_simple(space)) { - if (ndims == 0) { + switch (space_type) { + case H5S_SCALAR: /* scalar dataspace */ HDfprintf(stdout, "%s %s", - dump_header_format->dataspacedescriptionbegin, SCALAR); - } else { + dump_header_format->dataspacedescriptionbegin, S_SCALAR); + break; + case H5S_SIMPLE: /* simple dataspace */ HDfprintf(stdout, "%s %s { %s %Hu", - dump_header_format->dataspacedescriptionbegin, SIMPLE, + dump_header_format->dataspacedescriptionbegin, S_SIMPLE, dump_header_format->dataspacedimbegin, size[0]); for (i = 1; i < ndims; i++) @@ -1061,9 +1063,19 @@ dump_dataspace(hid_t space) HDfprintf(stdout, ", %Hu", maxsize[i]); printf(" %s }", dump_header_format->dataspacedimend); - } - } else { - printf("%s not yet implemented %s\n", BEGIN, END); + + break; + case H5S_NULL: + /* nulldataspace */ + HDfprintf(stdout, "%s %s", + dump_header_format->dataspacedescriptionbegin, S_NULL); + break; + case H5S_COMPLEX: + printf("%s not yet implemented %s\n", BEGIN, END); + break; + case H5S_NO_CLASS: + default: + printf("%s unknown dataspace %s\n", BEGIN, END); } end_obj(dump_header_format->dataspaceend, @@ -1866,6 +1878,7 @@ dump_data(hid_t obj_id, int obj_data, struct subset_t *sset) int status = -1; void *buf; hid_t space, type, p_type; + H5S_class_t space_type; int ndims, i; hsize_t size[64], nelmts = 1, alloc_size; int depth; @@ -1934,28 +1947,33 @@ dump_data(hid_t obj_id, int obj_data, struct subset_t *sset) H5Tclose(f_type); } else { /* need to call h5tools_dump_mem for the attribute data */ - type = H5Aget_type(obj_id); - p_type = H5Tget_native_type(type,H5T_DIR_DEFAULT); space = H5Aget_space(obj_id); - ndims = H5Sget_simple_extent_dims(space, size, NULL); + space_type = H5Sget_simple_extent_type(space); + if(space_type == H5S_NULL || space_type == H5S_NO_CLASS || space_type == H5S_COMPLEX) { + status = SUCCEED; + } else { + type = H5Aget_type(obj_id); + p_type = H5Tget_native_type(type,H5T_DIR_DEFAULT); + ndims = H5Sget_simple_extent_dims(space, size, NULL); - for (i = 0; i < ndims; i++) - nelmts *= size[i]; + for (i = 0; i < ndims; i++) + nelmts *= size[i]; - alloc_size = nelmts * MAX(H5Tget_size(type), H5Tget_size(p_type)); - assert(alloc_size == (hsize_t)((size_t)alloc_size)); /*check for overflow*/ - - buf = malloc((size_t)alloc_size); - assert(buf); + alloc_size = nelmts * MAX(H5Tget_size(type), H5Tget_size(p_type)); + assert(alloc_size == (hsize_t)((size_t)alloc_size)); /*check for overflow*/ + + buf = malloc((size_t)alloc_size); + assert(buf); - if (H5Aread(obj_id, p_type, buf) >= 0) - status = h5tools_dump_mem(stdout, outputformat, obj_id, p_type, - space, buf, depth); - - free(buf); - H5Tclose(p_type); + if (H5Aread(obj_id, p_type, buf) >= 0) + status = h5tools_dump_mem(stdout, outputformat, obj_id, p_type, + space, buf, depth); + + free(buf); + H5Tclose(p_type); + H5Tclose(type); + } H5Sclose(space); - H5Tclose(type); } if (status == FAIL) { @@ -4108,17 +4126,20 @@ xml_dump_dataspace(hid_t space) hsize_t maxsize[H5DUMP_MAX_RANK]; int ndims = H5Sget_simple_extent_dims(space, size, maxsize); + H5S_class_t space_type = H5Sget_simple_extent_type(space); int i; indentation(indent + COL); printf("<%sDataspace>\n", xmlnsprefix); - if (H5Sis_simple(space)) { - indentation(indent + COL + COL); + indentation(indent + COL + COL); - if (ndims == 0) { + switch (space_type) { + case H5S_SCALAR: /* scalar dataspace (just a tag, no XML attrs. defined */ printf("<%sScalarDataspace />\n",xmlnsprefix); - } else { + + break; + case H5S_SIMPLE: /* simple dataspace */ /* <hdf5:SimpleDataspace Ndims="nd"> */ printf("<%sSimpleDataspace Ndims=\"%d\">\n",xmlnsprefix, ndims); @@ -4142,14 +4163,24 @@ xml_dump_dataspace(hid_t space) } indentation(indent + COL + COL); printf("</%sSimpleDataspace>\n", xmlnsprefix ); - } - } else { - printf("<!-- not yet implemented -->\n"); - } + + break; + case H5S_NULL: + /* null dataspace (just a tag, no XML attrs. defined */ + printf("<%sNullDataspace />\n",xmlnsprefix); + break; + case H5S_COMPLEX: + printf("<!-- not yet implemented -->\n"); + + break; + case H5S_NO_CLASS: + default: + printf("<!-- unknown dataspace -->\n"); + } + indentation(indent + COL); printf("</%sDataspace>\n", xmlnsprefix); - } /*------------------------------------------------------------------------- @@ -4174,6 +4205,7 @@ xml_dump_data(hid_t obj_id, int obj_data, struct subset_t UNUSED * sset) int status = -1; void *buf; hid_t space, type, p_type; + H5S_class_t space_type; int ndims, i; hsize_t size[64], nelmts = 1; int depth; @@ -4207,48 +4239,56 @@ xml_dump_data(hid_t obj_id, int obj_data, struct subset_t UNUSED * sset) } else { /* Attribute data */ type = H5Aget_type(obj_id); + space = H5Aget_space(obj_id); + space_type = H5Sget_simple_extent_type(space); - if (H5Tget_class(type) == H5T_REFERENCE) { - /* references are done differently than - the standard output: - XML dumps a path to the object - referenced. - */ - status = xml_print_refs(obj_id, ATTRIBUTE_DATA); - H5Tclose(type); - } else if (H5Tget_class(type) == H5T_STRING) { - status = xml_print_strs(obj_id, ATTRIBUTE_DATA); - } else { - /* all other data */ - p_type = H5Tget_native_type(type,H5T_DIR_DEFAULT); - H5Tclose(type); - - space = H5Aget_space(obj_id); + if(space_type == H5S_NULL || space_type == H5S_NO_CLASS || space_type == H5S_COMPLEX) { + status = 2; + } else { + if (H5Tget_class(type) == H5T_REFERENCE) { + /* references are done differently than + the standard output: + XML dumps a path to the object + referenced. + */ + status = xml_print_refs(obj_id, ATTRIBUTE_DATA); + H5Tclose(type); + } else if (H5Tget_class(type) == H5T_STRING) { + status = xml_print_strs(obj_id, ATTRIBUTE_DATA); + } else { + /* all other data */ + p_type = H5Tget_native_type(type,H5T_DIR_DEFAULT); + H5Tclose(type); - ndims = H5Sget_simple_extent_dims(space, size, NULL); + ndims = H5Sget_simple_extent_dims(space, size, NULL); - for (i = 0; i < ndims; i++) - nelmts *= size[i]; + for (i = 0; i < ndims; i++) + nelmts *= size[i]; - buf = - malloc((size_t)(nelmts * MAX(H5Tget_size(type), H5Tget_size(p_type)))); - assert(buf); + buf = + malloc((size_t)(nelmts * MAX(H5Tget_size(type), H5Tget_size(p_type)))); + assert(buf); - if (H5Aread(obj_id, p_type, buf) >= 0) - status = h5tools_dump_mem(stdout, outputformat, obj_id, - p_type, space, buf, depth); + if (H5Aread(obj_id, p_type, buf) >= 0) + status = h5tools_dump_mem(stdout, outputformat, obj_id, + p_type, space, buf, depth); - free(buf); - H5Tclose(p_type); - H5Sclose(space); - H5Tclose(type); - } + free(buf); + H5Tclose(p_type); + H5Sclose(space); + H5Tclose(type); + } + } } if (status == FAIL) { - indentation(indent + COL); + indentation(indent + COL + COL); printf("Unable to print data.\n"); status = 1; + } else if (status == 2) { /* special value for H5S_NULL */ + indentation(indent + COL + COL); + printf("<%sNoData/>\n",xmlnsprefix); + status = 1; } indentation(indent + COL); @@ -5411,7 +5451,7 @@ xml_dump_dataset(hid_t did, const char *name, struct subset_t UNUSED * sset) /* no data written */ indentation(indent); printf("<%sData>\n",xmlnsprefix); - indentation(indent); + indentation(indent + COL); printf("<%sNoData/>\n",xmlnsprefix); indentation(indent); printf("</%sData>\n",xmlnsprefix); diff --git a/tools/h5dump/h5dumpgentest.c b/tools/h5dump/h5dumpgentest.c index 8eb50e1..b3c55a6 100644 --- a/tools/h5dump/h5dumpgentest.c +++ b/tools/h5dump/h5dumpgentest.c @@ -201,6 +201,7 @@ static void gent_dataset(void) hsize_t dims[2]; int dset1[10][20]; double dset2[30][20]; + int dset3 = 10; int i, j; fid = H5Fcreate(FILE2, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); @@ -231,6 +232,15 @@ static void gent_dataset(void) H5Sclose(space); H5Dclose(dataset); + + /* dset3 - null space */ + space = H5Screate(H5S_NULL); + dataset = H5Dcreate(fid, "/dset3", H5T_STD_I32BE, space, H5P_DEFAULT); + /* nothing should be written */ + H5Dwrite(dataset, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, &dset3); + + H5Sclose(space); + H5Dclose(dataset); H5Fclose(fid); } @@ -338,6 +348,13 @@ static void gent_attribute(void) H5Tset_size(type, 17); attr = H5Acreate (root, "attr5", type, space, H5P_DEFAULT); H5Awrite(attr, type, string); + H5Sclose(space); + H5Aclose(attr); + + /* attribute 6 - null dataspace */ + space = H5Screate(H5S_NULL); + attr = H5Acreate (root, "attr6", H5T_NATIVE_UINT, space, H5P_DEFAULT); + H5Awrite(attr, H5T_NATIVE_INT, &point); /* Nothing can be written */ H5Tclose(type); H5Sclose(space); diff --git a/tools/h5dump/testh5dump.sh b/tools/h5dump/testh5dump.sh index c0b5165..598c32c 100755 --- a/tools/h5dump/testh5dump.sh +++ b/tools/h5dump/testh5dump.sh @@ -92,7 +92,7 @@ TOOLTEST tgroup-2.ddl --group=/g2 --group / -g /y tgroup.h5 # test for displaying simple space datasets TOOLTEST tdset-1.ddl tdset.h5 # test for displaying selected datasets -TOOLTEST tdset-2.ddl -H -d dset1 -d /dset2 --dataset=dset3 tdset.h5 +TOOLTEST tdset-2.ddl -H -d dset1 -d /dset2 -d dset3 --dataset=dset4 tdset.h5 # test for displaying attributes TOOLTEST tattr-1.ddl tattr.h5 |