summaryrefslogtreecommitdiffstats
path: root/tools/lib/h5tools_filters.c
diff options
context:
space:
mode:
authorPedro Vicente Nunes <pvn@hdfgroup.org>2004-03-02 18:12:25 (GMT)
committerPedro Vicente Nunes <pvn@hdfgroup.org>2004-03-02 18:12:25 (GMT)
commit931efcb5ebd4099d18d93e7dcdaf296ea4991d73 (patch)
tree045fa2f9825fae4609e73d39b6831f1efa6a3c43 /tools/lib/h5tools_filters.c
parent77d3875c5b0787d373165f6b7537081b46e0d031 (diff)
downloadhdf5-931efcb5ebd4099d18d93e7dcdaf296ea4991d73.zip
hdf5-931efcb5ebd4099d18d93e7dcdaf296ea4991d73.tar.gz
hdf5-931efcb5ebd4099d18d93e7dcdaf296ea4991d73.tar.bz2
[svn-r8229] Purpose:
1) new function for tools library 2) new test script for h5repack Description: 1) currently all the tools (h5dump, h5diff, etc) do not check if a filter is available for reading some dataset that might have a filter not available on the current configuration (the behaviour of the tools until now was to trigger a library error, saying that the dataset cannot be read due to the lack of the filter) Solution: 1) added a new function h5tools_canreadf that checks if a dataset can be read depending on the availability of filters. this function was added in calls for h5diff and h5repack. instead of triggering the library error, a message is printed, saying that the dataset cannot be read (the print is optional, it is on on verbose mode) 2) added a shell script that tests the commannd line tool behaviour of h5repack the script does a series of runs of h5repack with several options on the same file (this file test4.h5 was added to the testfiles dir). then, it runs the h5diff tool, with the input and output files , in each run. the goal of the test is also to check item 1) . the binary file was saved with filters that might not be available on other configurations Platforms tested: linux (all filters enabled) linux (some filters disabled) solaris (some filters disabled) AIX (some filters disabled) windows (all filters on and off ) Misc. update:
Diffstat (limited to 'tools/lib/h5tools_filters.c')
-rw-r--r--tools/lib/h5tools_filters.c144
1 files changed, 144 insertions, 0 deletions
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;
+}
+
+
+
+