diff options
Diffstat (limited to 'tools/lib')
-rw-r--r-- | tools/lib/Makefile.in | 2 | ||||
-rw-r--r-- | tools/lib/h5diff_dset.c | 39 | ||||
-rw-r--r-- | tools/lib/h5tools.h | 3 | ||||
-rw-r--r-- | tools/lib/h5tools_filters.c | 144 |
4 files changed, 174 insertions, 14 deletions
diff --git a/tools/lib/Makefile.in b/tools/lib/Makefile.in index a816a0f..070bdcc 100644 --- a/tools/lib/Makefile.in +++ b/tools/lib/Makefile.in @@ -41,7 +41,7 @@ PROGS=$(PUB_PROGS) $(TEST_PROGS) ## Source and object files for the library; do not install ## -LIB_SRC=h5tools.c h5tools_str.c h5tools_utils.c h5diff.c h5diff_array.c h5diff_attr.c h5diff_dset.c h5diff_util.c h5trav.c h5trav_table.c +LIB_SRC=h5tools.c h5tools_str.c h5tools_utils.c h5diff.c h5diff_array.c h5diff_attr.c h5diff_dset.c h5diff_util.c h5trav.c h5trav_table.c h5tools_filters.c LIB_OBJ=$(LIB_SRC:.c=.lo) PUB_LIB= AUX_LIB=$(LIB) diff --git a/tools/lib/h5diff_dset.c b/tools/lib/h5diff_dset.c index 767db68..8cd5b32 100644 --- a/tools/lib/h5diff_dset.c +++ b/tools/lib/h5diff_dset.c @@ -14,6 +14,7 @@ #include "h5diff.h" #include "H5private.h" +#include "h5tools.h" #include <assert.h> /*------------------------------------------------------------------------- @@ -36,9 +37,12 @@ int diff_dataset( hid_t file1_id, const char *obj2_name, diff_opt_t *options ) { - hid_t dset1_id =-1; - hid_t dset2_id =-1; - int gout=0, nfound; + hid_t dset1_id =-1; + hid_t dset2_id =-1; + hid_t dcpl1_id; + hid_t dcpl2_id; + int gout=0, nfound=0; + /* disable error reporting */ H5E_BEGIN_TRY { @@ -64,23 +68,36 @@ int diff_dataset( hid_t file1_id, if (gout) goto out; - nfound=diff_datasetid(dset1_id, + if ((dcpl1_id=H5Dget_create_plist(dset1_id))<0) + goto out; + if ((dcpl2_id=H5Dget_create_plist(dset2_id))<0) + goto out; + +/*------------------------------------------------------------------------- + * check if the dataset creation property list has filters that + * are not registered in the current configuration + * 1) the external filters GZIP and SZIP might not be available + * 2) the internal filters might be turned off + *------------------------------------------------------------------------- + */ + if ((h5tools_canreadf((options->verbose?obj1_name:NULL),dcpl1_id)==1) && + (h5tools_canreadf((options->verbose?obj2_name:NULL),dcpl2_id)==1)) + { + nfound=diff_datasetid(dset1_id, dset2_id, obj1_name, obj2_name, options); - - - + } /*------------------------------------------------------------------------- * close *------------------------------------------------------------------------- */ - out: - /* disable error reporting */ H5E_BEGIN_TRY { + H5Pclose(dcpl1_id); + H5Pclose(dcpl2_id); H5Dclose(dset1_id); H5Dclose(dset2_id); /* enable error reporting */ @@ -377,12 +394,8 @@ out: } H5E_END_TRY; return nfound; - } - - - /*------------------------------------------------------------------------- * Function: diff_can_type * diff --git a/tools/lib/h5tools.h b/tools/lib/h5tools.h index 80349d5..143685f 100644 --- a/tools/lib/h5tools.h +++ b/tools/lib/h5tools.h @@ -479,4 +479,7 @@ extern int h5tools_dump_dset(FILE *stream, const h5dump_t *info, hid_t dset extern int h5tools_dump_mem(FILE *stream, const h5dump_t *info, hid_t obj_id, hid_t type, hid_t space, void *mem, int indentlevel); +extern int h5tools_canreadf(const char* name, + hid_t dcpl_id); + #endif /* H5TOOLS_H__ */ diff --git a/tools/lib/h5tools_filters.c b/tools/lib/h5tools_filters.c new file mode 100644 index 0000000..f02ec83 --- /dev/null +++ b/tools/lib/h5tools_filters.c @@ -0,0 +1,144 @@ + + +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * Copyright by the Board of Trustees of the University of Illinois. * + * All rights reserved. * + * * + * This file is part of HDF5. The full HDF5 copyright notice, including * + * terms governing use, modification, and redistribution, is contained in * + * the files COPYING and Copyright.html. COPYING can be found at the root * + * of the source code distribution tree; Copyright.html can be found at the * + * root level of an installed copy of the electronic HDF5 document set and * + * is linked from the top-level documents page. It can also be found at * + * http://hdf.ncsa.uiuc.edu/HDF5/doc/Copyright.html. If you do not have * + * access to either file, you may request a copy from hdfhelp@ncsa.uiuc.edu. * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +#include "hdf5.h" + +/*------------------------------------------------------------------------- + * print a warning message + *------------------------------------------------------------------------- + */ +static void print_warning(const char *dname, const char *fname) +{ + printf("Warning: dataset <%s> cannot be read, %s filter is not available\n", + dname,fname); +} + +/*------------------------------------------------------------------------- + * Function: h5tools_canreadf + * + * Purpose: check if the dataset creation property list has filters that + * are not registered in the current configuration + * 1) the external filters GZIP and SZIP might not be available + * 2) the internal filters might be turned off + * + * Return: 1, can read, 0, cannot, -1 error + * + * Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu + * + * Date: March 1, 2004 + * + *------------------------------------------------------------------------- + */ +int h5tools_canreadf(const char* name, /* object name, serves also as boolean print */ + hid_t dcpl_id) /* dataset creation property list */ +{ + + int nfilters; /* number of filters */ + H5Z_filter_t filtn; /* filter identification number */ + int i; /* index */ + int have_deflate=0; /* assume initially we do not have filters */ + int have_szip=0; + int have_shuffle=0; + int have_fletcher=0; + +#ifdef H5_HAVE_FILTER_DEFLATE + have_deflate=1; +#endif +#ifdef H5_HAVE_FILTER_SZIP + have_szip=1; +#endif +#ifdef H5_HAVE_FILTER_SHUFFLE + have_shuffle=1; +#endif +#ifdef H5_HAVE_FILTER_FLETCHER32 + have_fletcher=1; +#endif + + /* get information about filters */ + if ((nfilters = H5Pget_nfilters(dcpl_id))<0) + return -1; + + /* if we do not have filters, we can read the dataset safely */ + if (!nfilters) + return 1; + + /* check availability of filters */ + for (i=0; i<nfilters; i++) + { + if ((filtn = H5Pget_filter(dcpl_id,(unsigned)i,0,0,0,0,0))<0) + return -1; + + switch (filtn) + { + default: + break; +/*------------------------------------------------------------------------- + * H5Z_FILTER_DEFLATE 1 , deflation like gzip + *------------------------------------------------------------------------- + */ + case H5Z_FILTER_DEFLATE: + if (!have_deflate) + { + if (name) + print_warning(name,"deflate"); + return 0; + } + break; +/*------------------------------------------------------------------------- + * H5Z_FILTER_SZIP 4 , szip compression + *------------------------------------------------------------------------- + */ + case H5Z_FILTER_SZIP: + if (!have_szip) + { + if (name) + print_warning(name,"SZIP"); + return 0; + } + break; +/*------------------------------------------------------------------------- + * H5Z_FILTER_SHUFFLE 2 , shuffle the data + *------------------------------------------------------------------------- + */ + case H5Z_FILTER_SHUFFLE: + if (!have_szip) + { + if (name) + print_warning(name,"shuffle"); + return 0; + } + break; +/*------------------------------------------------------------------------- + * H5Z_FILTER_FLETCHER32 3 , fletcher32 checksum of EDC + *------------------------------------------------------------------------- + */ + case H5Z_FILTER_FLETCHER32: + if (!have_fletcher) + { + if (name) + print_warning(name,"fletcher32"); + return 0; + } + break; + }/*switch*/ + }/*for*/ + + return 1; +} + + + + |