diff options
author | Bill Wendling <wendling@ncsa.uiuc.edu> | 2001-03-15 19:31:40 (GMT) |
---|---|---|
committer | Bill Wendling <wendling@ncsa.uiuc.edu> | 2001-03-15 19:31:40 (GMT) |
commit | 39142ffed0831778bbbff2308feb8b30751d90b8 (patch) | |
tree | b3e054fc782b01f6176e006d340aeae0fd549ed2 | |
parent | 3ad27d3fac1979b7a5ee89313225cb08763aa9d8 (diff) | |
download | hdf5-39142ffed0831778bbbff2308feb8b30751d90b8.zip hdf5-39142ffed0831778bbbff2308feb8b30751d90b8.tar.gz hdf5-39142ffed0831778bbbff2308feb8b30751d90b8.tar.bz2 |
[svn-r3648] Purpose:
Feature Add
Description:
This is the first (alpha) version of h5tools which does subsetting
according to the subsetting document. There's still some niceties
which need to be worked out, but this is the ground work.
Platforms tested:
Linux
-rw-r--r-- | tools/lib/h5tools.c | 53 |
1 files changed, 34 insertions, 19 deletions
diff --git a/tools/lib/h5tools.c b/tools/lib/h5tools.c index 67a0fc6..c76cdf4 100644 --- a/tools/lib/h5tools.c +++ b/tools/lib/h5tools.c @@ -198,7 +198,7 @@ h5tools_fopen(const char *fname, char *drivername, size_t drivername_size) } /* Save the driver name */ - if (drivername && drivername_size){ + if (drivername && drivername_size) { if (fid >= 0) { strncpy(drivername, driver[drivernum].name, drivername_size); drivername[drivername_size - 1] = '\0'; @@ -380,7 +380,7 @@ h5tools_dump_simple_data(FILE *stream, const h5dump_t *info, hid_t container, h5tools_str_reset(&buffer); h5tools_str_sprint(&buffer, info, container, type, mem + i * size, ctx); - if (i + 1 < nelmts || 0 == (flags & END_OF_DATA)) + if (i + 1 < nelmts || (flags & END_OF_DATA) == 0) h5tools_str_append(&buffer, "%s", OPT(info->elmt_suf1, ",")); s = h5tools_str_fmt(&buffer, 0, "%s"); @@ -517,8 +517,7 @@ h5tools_dump_simple_subset(FILE *stream, const h5dump_t *info, hid_t dset, herr_t ret; /*the value to return */ hid_t f_space; /*file data space */ hsize_t elmtno, i; /*counters */ - int carry; /*counter carry value */ - hssize_t zero[8]; /*vector of zeros */ + hssize_t zero = 0; /*vector of zeros */ unsigned int flags; /*buffer extent flags */ hsize_t total_size[H5S_MAX_RANK];/*total size of dataset*/ @@ -534,11 +533,6 @@ h5tools_dump_simple_subset(FILE *stream, const h5dump_t *info, hid_t dset, unsigned char *sm_buf = NULL; /*buffer for raw data */ hid_t sm_space; /*stripmine data space */ - /* Hyperslab info */ - hssize_t hs_offset[H5S_MAX_RANK];/*starting offset */ - hsize_t hs_size[H5S_MAX_RANK]; /*size this pass */ - hsize_t hs_nelmts; /*elements in request */ - ret = FAIL; /* be pessimistic */ f_space = H5Dget_space(dset); @@ -567,12 +561,10 @@ h5tools_dump_simple_subset(FILE *stream, const h5dump_t *info, hid_t dset, ctx.size_last_dim = total_size[ctx.ndims - 1]; /* calculate the potential number of elements we're going to print */ - p_nelmts = 1; + H5Sselect_hyperslab(f_space, H5S_SELECT_SET, sset->start, sset->stride, + sset->count, sset->block); + p_nelmts = H5Sget_select_npoints(f_space); - if (ctx.ndims > 0) - for (i = 0; i < (hsize_t)ctx.ndims; i++) - p_nelmts *= total_size[i]; - if (p_nelmts == 0) { /* nothing to print */ ret = SUCCEED; @@ -593,13 +585,36 @@ h5tools_dump_simple_subset(FILE *stream, const h5dump_t *info, hid_t dset, } assert(sm_nbytes == (hsize_t)((size_t)sm_nbytes)); /*check for overflow*/ - sm_buf = malloc((size_t)sm_nbytes); - sm_nelmts = sm_nbytes / p_type_nbytes; + sm_buf = malloc((size_t)p_nelmts * p_type_nbytes); + sm_nelmts = p_nelmts; sm_space = H5Screate_simple(1, &sm_nelmts, NULL); - /* the stripmine loop */ - memset(hs_offset, 0, sizeof hs_offset); - memset(zero, 0, sizeof zero); + H5Sselect_hyperslab(sm_space, H5S_SELECT_SET, &zero, NULL, &sm_nelmts, NULL); + + /* Read the data */ + if (H5Dread(dset, p_type, sm_space, f_space, H5P_DEFAULT, sm_buf) < 0) { + H5Sclose(f_space); + H5Sclose(sm_space); + free(sm_buf); + return FAIL; + } + + /* Print the data */ + flags = START_OF_DATA | END_OF_DATA; + + for (i = 0; i < (hsize_t)ctx.ndims; i++) { + ctx.p_max_idx[i] = ctx.p_min_idx[i] + MIN(total_size[i], sm_size[i]); + } + + h5tools_dump_simple_data(stream, info, dset, &ctx, flags, sm_nelmts, + p_type, sm_buf); + + /* Terminate the output */ + if (ctx.cur_column) { + fputs(OPT(info->line_suf, ""), stream); + putc('\n', stream); + fputs(OPT(info->line_sep, ""), stream); + } ret = SUCCEED; |