diff options
author | Albert Cheng <acheng@hdfgroup.org> | 2010-05-07 20:56:54 (GMT) |
---|---|---|
committer | Albert Cheng <acheng@hdfgroup.org> | 2010-05-07 20:56:54 (GMT) |
commit | 7c16aec7e1e7ba08b8845cf148fdc7935e84a211 (patch) | |
tree | d9583f35d601ce5dc9736f8b90424930a65dd57a /tools/h5dump | |
parent | ae6f5891b5794325ee5702fec0da55bafdce1afe (diff) | |
download | hdf5-7c16aec7e1e7ba08b8845cf148fdc7935e84a211.zip hdf5-7c16aec7e1e7ba08b8845cf148fdc7935e84a211.tar.gz hdf5-7c16aec7e1e7ba08b8845cf148fdc7935e84a211.tar.bz2 |
[svn-r18743] enhancement 1853:
Install packed-bits feature for h5dump.
Allen has installed the feature in the NPOESS feature branch.
I ported it back to the v1.8 branch for v1.8.5 release.
tools/h5dump/testh5dump.sh.in:
Added tests for the packed-bits feature.
tools/h5dump/h5dump.c
tools/h5dump/h5dump.h
Added code to parse and handled the packed-bits request.
tools/lib/h5tools.h
tools/lib/h5tools_str.c
tools/lib/h5tools.c
Added code to print packed-bits.
tools/testfiles/tpackedbits2.ddl
tools/testfiles/tnofilename-with-packed-bits.ddl
tools/testfiles/tpackedbits.ddl
Expected output files for packed-bits feature.
Tested:
h5committested the NPOESS branch.
Tested in the linux VM machine in my Dove.
Diffstat (limited to 'tools/h5dump')
-rw-r--r-- | tools/h5dump/h5dump.c | 165 | ||||
-rw-r--r-- | tools/h5dump/h5dump.h | 5 | ||||
-rw-r--r-- | tools/h5dump/testh5dump.sh.in | 19 |
3 files changed, 187 insertions, 2 deletions
diff --git a/tools/h5dump/h5dump.c b/tools/h5dump/h5dump.c index 0b47cf7..66bef67 100644 --- a/tools/h5dump/h5dump.c +++ b/tools/h5dump/h5dump.c @@ -94,11 +94,24 @@ static int display_fi = FALSE; /*file index */ static int display_ai = TRUE; /*array index */ static int display_escape = FALSE; /*escape non printable characters */ static int display_region = FALSE; /*print region reference data */ +#ifdef H5_HAVE_H5DUMP_PACKED_BITS +static int display_packed_bits = FALSE; /*print 1-byte numbers as packed bits*/ +#endif /* sort parameters */ static H5_index_t sort_by = H5_INDEX_NAME; /*sort_by [creation_order | name] */ static H5_iter_order_t sort_order = H5_ITER_INC; /*sort_order [ascending | descending] */ +#ifdef H5_HAVE_H5DUMP_PACKED_BITS +/* mask list for packed bits */ +static unsigned int packed_mask[8]; /* packed bits are restricted to 1 byte */ + +/* packed bits display parameters */ +static int packed_offset[8]; +static int packed_length[8]; +#define PACKED_BITS_LOOP_MAX 8 +#endif + /** ** Added for XML ** **/ @@ -118,6 +131,9 @@ static int indent; /*how far in to indent the line /* internal functions */ static hid_t h5_fileaccess(void); static void dump_oid(hid_t oid); +#ifdef H5_HAVE_H5DUMP_PACKED_BITS +static void dump_packed_bits(unsigned int packed_index); +#endif static void print_enum(hid_t type); static int xml_name_to_XID(const char *, char *, int , int ); static void init_prefix(char **prfx, size_t prfx_len); @@ -388,7 +404,11 @@ struct handler_t { * parameters. The long-named ones can be partially spelled. When * adding more, make sure that they don't clash with each other. */ +#ifdef H5_HAVE_H5DUMP_PACKED_BITS +static const char *s_opts = "hnpeyBHirVa:c:d:f:g:k:l:t:w:xD:uX:o:b*F:s:S:Aq:z:m:RM:"; +#else static const char *s_opts = "hnpeyBHirVa:c:d:f:g:k:l:t:w:xD:uX:o:b*F:s:S:Aq:z:m:R"; +#endif static struct long_options l_opts[] = { { "help", no_arg, 'h' }, { "hel", no_arg, 'h' }, @@ -501,6 +521,9 @@ static struct long_options l_opts[] = { { "sort_order", require_arg, 'z' }, { "format", require_arg, 'm' }, { "region", no_arg, 'R' }, +#ifdef H5_HAVE_H5DUMP_PACKED_BITS + { "packed-bits", require_arg, 'M' }, +#endif { NULL, 0, '\0' } }; @@ -656,6 +679,10 @@ usage(const char *prog) fprintf(stdout, " -m T, --format=T Set the floating point output format\n"); fprintf(stdout, " -q Q, --sort_by=Q Sort groups and attributes by index Q\n"); fprintf(stdout, " -z Z, --sort_order=Z Sort groups and attributes by order Z\n"); +#ifdef H5_HAVE_H5DUMP_PACKED_BITS + fprintf(stdout, " -M M, --packedbits=M Print packed bits using mask format M for dataset P given\n"); + fprintf(stdout, " in option d. Where M is (offset,length)[,(offset,length)].\n"); +#endif fprintf(stdout, " -R, --region Print dataset pointed by region references\n"); fprintf(stdout, " -x, --xml Output in XML using Schema\n"); fprintf(stdout, " -u, --use-dtd Output in XML using DTD\n"); @@ -695,6 +722,10 @@ usage(const char *prog) fprintf(stdout, " -d (dataset) is used. B is an optional argument, defaults to NATIVE\n"); fprintf(stdout, " Q - is the sort index type. It can be \"creation_order\" or \"name\" (default)\n"); fprintf(stdout, " Z - is the sort order type. It can be \"descending\" or \"ascending\" (default)\n"); +#ifdef H5_HAVE_H5DUMP_PACKED_BITS + fprintf(stdout, " M - is a paired list of integers the first number of which is the offset and the\n"); + fprintf(stdout, " second number is the length of the its being queried\n"); +#endif fprintf(stdout, "\n"); fprintf(stdout, " Examples:\n"); fprintf(stdout, "\n"); @@ -2214,6 +2245,10 @@ dump_dataset(hid_t did, const char *name, struct subset_t *sset) hid_t type, space; unsigned attr_crt_order_flags; hid_t dcpl_id; /* dataset creation property list ID */ +#ifdef H5_HAVE_H5DUMP_PACKED_BITS + int data_loop = 1; + int i; +#endif if ((dcpl_id = H5Dget_create_plist(did)) < 0) @@ -2246,7 +2281,18 @@ dump_dataset(hid_t did, const char *name, struct subset_t *sset) if(display_dcpl) dump_dcpl(dcpl_id, type, did); - if(display_data) + if(display_data) { +#ifdef H5_HAVE_H5DUMP_PACKED_BITS + if(display_packed_bits) + data_loop = packed_output; + for(i=0;i<data_loop;i++) { + if(display_packed_bits) { + dump_packed_bits(i); + packed_counter = packed_mask[i]; + packed_normalize = packed_offset[i]; + } +#endif + switch(H5Tget_class(type)) { case H5T_TIME: indentation(indent + COL); @@ -2269,6 +2315,10 @@ dump_dataset(hid_t did, const char *name, struct subset_t *sset) default: break; } /* end switch */ +#ifdef H5_HAVE_H5DUMP_PACKED_BITS + } +#endif + } indent += COL; @@ -2634,6 +2684,24 @@ dump_oid(hid_t oid) printf("%s %s %d %s\n", OBJID, BEGIN, oid, END); } +#ifdef H5_HAVE_H5DUMP_PACKED_BITS +/*------------------------------------------------------------------------- + * Function: dump_packed_bits + * + * Purpose: Prints the packed bits offset and length + * + * Return: void + * + *------------------------------------------------------------------------- + */ +static void +dump_packed_bits(unsigned int packed_index) +{ + indentation(indent + COL); + printf("%s %s=%d %s=%d\n", PACKED_BITS, PACKED_OFFSET, packed_offset[packed_index], PACKED_LENGTH, packed_length[packed_index]); +} +#endif + /*------------------------------------------------------------------------- * Function: dump_comment * @@ -3518,6 +3586,88 @@ parse_subset_params(char *dset) return s; } +#ifdef H5_HAVE_H5DUMP_PACKED_BITS +/*------------------------------------------------------------------------- + * Function: parse_mask_list + * + * Purpose: Parse a list of comma or space separated integers and fill + * the packed_bits list and counter. The string being passed into this function + * should be at the start of the list you want to parse. + * + * Return: None + * + *------------------------------------------------------------------------- + */ +static void +parse_mask_list(const char *h_list) +{ + const char *ptr; + unsigned int size_count = 0, i = 0, last_digit = 0; + int offset_value = 0, length_value = 0; + + packed_counter = 0; + memset(packed_mask,0,8); + memset(packed_offset,0,8); + memset(packed_length,0,8); + + if (!h_list || !*h_list || *h_list == ';') + return; + + /* count how many integers do we have */ + for (ptr = h_list; ptr && *ptr && *ptr != ';' && *ptr != ']'; ptr++) { + if (isdigit(*ptr)) { + if (!last_digit) + /* the last read character wasn't a digit */ + size_count++; + + last_digit = 1; + } + else { + last_digit = 0; + } + } + + if (size_count == 0) + /* there aren't any integers to read */ + return; + + offset_value = -1; + length_value = -1; + packed_output = 0; + for (ptr = h_list; i < size_count && ptr && *ptr && *ptr != ';' && *ptr != ']'; ptr++) { + if(isdigit(*ptr)) { + i++; + /* we should have an integer now */ + if(offset_value==-1) + offset_value = atoi(ptr); + else + length_value = atoi(ptr); + + while (isdigit(*ptr)) + /* scroll to end of integer */ + ptr++; + } + if(length_value>=0) { + packed_offset[packed_output] = offset_value; + packed_length[packed_output] = length_value; + + packed_mask[packed_output] = 1 << offset_value; + while(length_value>1) { + packed_mask[packed_output] = packed_mask[packed_output] << 1; + packed_mask[packed_output] |= 1 << offset_value; + length_value--; + } + packed_output++; + offset_value = -1; + length_value = -1; + } + } + if(packed_output > PACKED_BITS_LOOP_MAX) + packed_output = PACKED_BITS_LOOP_MAX; + packed_counter = packed_mask[0]; +} +#endif + /*------------------------------------------------------------------------- * Function: handle_datasets * @@ -4098,6 +4248,19 @@ parse_start: } break; +#ifdef H5_HAVE_H5DUMP_PACKED_BITS + case 'M': + if (!last_was_dset) { + error_msg(progname, + "option `-%c' can only be used after --dataset option\n", + opt); + leave(EXIT_FAILURE); + } + parse_mask_list(opt_arg); + display_packed_bits = TRUE; + break; +#endif + /** begin XML parameters **/ case 'x': /* select XML output */ diff --git a/tools/h5dump/h5dump.h b/tools/h5dump/h5dump.h index e16705c..3e34538 100644 --- a/tools/h5dump/h5dump.h +++ b/tools/h5dump/h5dump.h @@ -69,6 +69,11 @@ #define EXTERNAL_FILE "EXTERNAL_FILE" #define FILLVALUE "FILLVALUE" #define FILE_CONTENTS "FILE_CONTENTS" +#ifdef H5_HAVE_H5DUMP_PACKED_BITS +#define PACKED_BITS "PACKED_BITS" +#define PACKED_OFFSET "OFFSET" +#define PACKED_LENGTH "LENGTH" +#endif #define BEGIN "{" #define END "}" diff --git a/tools/h5dump/testh5dump.sh.in b/tools/h5dump/testh5dump.sh.in index a147b45..7776b62 100644 --- a/tools/h5dump/testh5dump.sh.in +++ b/tools/h5dump/testh5dump.sh.in @@ -23,6 +23,9 @@ USE_FILTER_FLETCHER32="@USE_FILTER_FLETCHER32@" USE_FILTER_NBIT="@USE_FILTER_NBIT@" USE_FILTER_SCALEOFFSET="@USE_FILTER_SCALEOFFSET@" +# Determine if H5dump packed bits feature is included +Have_Packed_Bits="@PACKED_BITS@" + TESTNAME=h5dump EXIT_SUCCESS=0 EXIT_FAILURE=1 @@ -329,7 +332,11 @@ TOOLTEST tchar1.ddl -r tchar.h5 # test failure handling # Missing file name -TOOLTEST tnofilename.ddl +if test "$Have_Packed_Bits" = "yes"; then + TOOLTEST tnofilename-with-packed-bits.ddl +else + TOOLTEST tnofilename.ddl +fi # rev. 2004 @@ -512,6 +519,16 @@ TOOLTEST textlinksrc.ddl textlinksrc.h5 TOOLTEST textlinkfar.ddl textlinkfar.h5 +# test for dataset packed bits +if test "$Have_Packed_Bits" = "yes"; then + TOOLTEST tpackedbits.ddl -d /dset1 -M 0,2 tdset.h5 + TOOLTEST tpackedbits2.ddl -d /dset1 -M 0,2,2,1 tdset.h5 +else + SKIP tpackedbits.ddl -d /dset1 -M 0,2 tdset.h5 + SKIP tpackedbits2.ddl -d /dset1 -M 0,2,2,1 tdset.h5 +fi + + if test $nerrors -eq 0 ; then echo "All $TESTNAME tests passed." exit $EXIT_SUCCESS |