summaryrefslogtreecommitdiffstats
path: root/tools/h5repack/h5repack_copy.c
diff options
context:
space:
mode:
Diffstat (limited to 'tools/h5repack/h5repack_copy.c')
-rw-r--r--tools/h5repack/h5repack_copy.c111
1 files changed, 98 insertions, 13 deletions
diff --git a/tools/h5repack/h5repack_copy.c b/tools/h5repack/h5repack_copy.c
index 2afc94b..4d56ae6 100644
--- a/tools/h5repack/h5repack_copy.c
+++ b/tools/h5repack/h5repack_copy.c
@@ -19,6 +19,11 @@
#include "H5private.h"
#include "h5repack.h"
+static int filter_this(const char* name,
+ pack_opt_t *options,
+ pack_info_t *obj); /* info about object to filter */
+
+
/*-------------------------------------------------------------------------
* Function: copy_file
*
@@ -39,7 +44,6 @@ int copy_file(const char* fnamein,
{
hid_t fidin;
hid_t fidout;
- int nobjects=0;
trav_table_t *travt=NULL;
/*-------------------------------------------------------------------------
@@ -161,6 +165,8 @@ int do_copy_file(hid_t fidin,
hsize_t nelmts; /* number of elements in dataset */
int rank; /* rank of dataset */
hsize_t dims[H5S_MAX_RANK];/* dimensions of dataset */
+ hsize_t dsize_in; /* input dataset size before filter */
+ hsize_t dsize_out; /* output dataset size after filter */
int i, j;
/*-------------------------------------------------------------------------
@@ -191,7 +197,7 @@ int do_copy_file(hid_t fidin,
* copy attrs
*-------------------------------------------------------------------------
*/
- if (copy_attr(grp_in,grp_out,options,travt,fidout)<0)
+ if (copy_attr(grp_in,grp_out,options)<0)
goto error;
if (H5Gclose(grp_out)<0)
@@ -239,6 +245,12 @@ int do_copy_file(hid_t fidin,
*/
if ( ! H5Tequal(mtype_id, H5T_STD_REF_OBJ) )
{
+
+ /* the information about the object to be filtered */
+ pack_info_t filt_obj;
+
+ /* get the storage size of the input dataset */
+ dsize_in=H5Dget_storage_size(dset_in);
/*-------------------------------------------------------------------------
* read to memory
@@ -254,21 +266,41 @@ int do_copy_file(hid_t fidin,
goto error;
/*-------------------------------------------------------------------------
+ * apply the filter; check first if the object is to be filtered.
+ * if the filter could not be applied, continue
+ *-------------------------------------------------------------------------
+ */
+ if (filter_this(travt->objs[i].name,options,&filt_obj))
+ {
+ if (apply_filter(dcpl_id,H5Tget_size(mtype_id),options,&filt_obj)<0)
+ continue;
+ }
+
+ /*-------------------------------------------------------------------------
* create/write dataset/close
*-------------------------------------------------------------------------
*/
if ((dset_out=H5Dcreate(fidout,travt->objs[i].name,ftype_id,space_id,dcpl_id))<0)
goto error;
- if (H5Dwrite(dset_out,mtype_id,H5S_ALL,H5S_ALL,H5P_DEFAULT,buf)<0)
- goto error;
+ if (dsize_in) {
+ if (H5Dwrite(dset_out,mtype_id,H5S_ALL,H5S_ALL,H5P_DEFAULT,buf)<0)
+ goto error;
+ }
/*-------------------------------------------------------------------------
* copy attrs
*-------------------------------------------------------------------------
*/
- if (copy_attr(dset_in,dset_out,options,travt,fidout)<0)
+ if (copy_attr(dset_in,dset_out,options)<0)
goto error;
+
+ /*-------------------------------------------------------------------------
+ * store the storage sizes
+ *-------------------------------------------------------------------------
+ */
+ dsize_out=H5Dget_storage_size(dset_out);
+
/*close */
if (H5Dclose(dset_out)<0)
goto error;
@@ -317,7 +349,7 @@ int do_copy_file(hid_t fidin,
* copy attrs
*-------------------------------------------------------------------------
*/
- if (copy_attr(type_in,type_out,options,travt,fidout)<0)
+ if (copy_attr(type_in,type_out,options)<0)
goto error;
if (H5Tclose(type_in)<0)
@@ -372,8 +404,6 @@ int do_copy_file(hid_t fidin,
break;
}
}
-
-
/*-------------------------------------------------------------------------
* the root is a special case, we get an ID for the root group
@@ -389,7 +419,7 @@ int do_copy_file(hid_t fidin,
if ((grp_in = H5Gopen(fidin,"/"))<0)
goto error;
- if (copy_attr(grp_in,grp_out,options,travt,fidout)<0)
+ if (copy_attr(grp_in,grp_out,options)<0)
goto error;
if (H5Gclose(grp_out)<0)
@@ -438,9 +468,7 @@ error:
int copy_attr(hid_t loc_in,
hid_t loc_out,
- pack_opt_t *options,
- trav_table_t *travt,
- hid_t fidout /* for saving references */
+ pack_opt_t *options
)
{
hid_t attr_id; /* attr ID */
@@ -456,7 +484,6 @@ int copy_attr(hid_t loc_in,
char name[255];
int n, j;
unsigned u;
- int have_ref=0;
if ((n = H5Aget_num_attrs(loc_in))<0)
goto error;
@@ -576,3 +603,61 @@ error:
return -1;
}
+
+
+
+/*-------------------------------------------------------------------------
+ * Function: filter_this
+ *
+ * Purpose: find the object name NAME (got from the traverse list)
+ * in the repack options list; assign the filter information OBJ
+ *
+ * Return: 0 not found, 1 found
+ *
+ * Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
+ *
+ * Date: December 19, 2003
+ *
+ *-------------------------------------------------------------------------
+ */
+
+static
+int filter_this(const char* name, /* object name from traverse list */
+ pack_opt_t *options, /* repack options */
+ pack_info_t *obj) /* info about object to filter */
+{
+ char *pdest;
+ int result;
+ int i;
+
+ /* if we are applying to all objects just return true */
+ if (options->all_filter)
+ {
+ /* assign the global filter and chunk info to the OBJ info */
+ obj->filter=options->filter_g;
+ obj->chunk=options->chunk_g;
+ return 1;
+ }
+
+ for ( i=0; i<options->op_tbl->nelems; i++)
+ {
+ if (strcmp(options->op_tbl->objs[i].path,name)==0)
+ {
+ *obj=options->op_tbl->objs[i];
+ return 1;
+ }
+
+ pdest = strstr(name,options->op_tbl->objs[i].path);
+ result = (int)(pdest - name);
+
+ /* found at position 1, meaning without '/' */
+ if( pdest != NULL && result==1 )
+ {
+ *obj=options->op_tbl->objs[i];
+ return 1;
+ }
+ }
+
+ return 0;
+}
+