summaryrefslogtreecommitdiffstats
path: root/tools/h5repack/h5repack.c
diff options
context:
space:
mode:
authorQuincey Koziol <koziol@hdfgroup.org>2012-03-21 15:10:17 (GMT)
committerQuincey Koziol <koziol@hdfgroup.org>2012-03-21 15:10:17 (GMT)
commiteb89d7b53ab95623ab454186a602e1cafc7391f0 (patch)
treeceafe458b3011e38853e765352d3c7e59bbecce1 /tools/h5repack/h5repack.c
parent3e468e6ff65d540a439e99ea568a6bff7add7cea (diff)
downloadhdf5-eb89d7b53ab95623ab454186a602e1cafc7391f0.zip
hdf5-eb89d7b53ab95623ab454186a602e1cafc7391f0.tar.gz
hdf5-eb89d7b53ab95623ab454186a602e1cafc7391f0.tar.bz2
[svn-r22105] Description:
Bring r20557:22085 from trunk to this branch, also fixing some other issues/failures in the branch simultaneously. The h5repack tests are still failing, but Neil will be checking into those, so the branch can be fully functional again. Tested on: Mac OSX/64 10.7.3 (amazon) w/debug
Diffstat (limited to 'tools/h5repack/h5repack.c')
-rw-r--r--tools/h5repack/h5repack.c86
1 files changed, 55 insertions, 31 deletions
diff --git a/tools/h5repack/h5repack.c b/tools/h5repack/h5repack.c
index 1e7e0ed..05160d8 100644
--- a/tools/h5repack/h5repack.c
+++ b/tools/h5repack/h5repack.c
@@ -91,7 +91,7 @@ h5repack_init(pack_opt_t *options, int verbose, int latest,
H5F_file_space_type_t strategy, hsize_t threshold)
{
int k, n;
- memset(options,0,sizeof(pack_opt_t));
+ HDmemset(options,0,sizeof(pack_opt_t));
options->min_comp = 1024;
options->verbose = verbose;
options->latest = latest;
@@ -110,7 +110,7 @@ h5repack_init(pack_opt_t *options, int verbose, int latest,
return (options_table_init(&(options->op_tbl)));
}
-
+
/*-------------------------------------------------------------------------
* Function: h5repack_end
*
@@ -124,7 +124,7 @@ int h5repack_end (pack_opt_t *options)
return options_table_free(options->op_tbl);
}
-
+
/*-------------------------------------------------------------------------
* Function: h5repack_addfilter
*
@@ -159,7 +159,7 @@ int h5repack_addfilter(const char* str,
if(options->n_filter_g > H5_REPACK_MAX_NFILTERS)
{
error_msg("maximum number of filters exceeded for <%s>\n", str);
- free(obj_list);
+ HDfree(obj_list);
return -1;
}
@@ -168,11 +168,11 @@ int h5repack_addfilter(const char* str,
else
options_add_filter(obj_list, n_objs, filter, options->op_tbl);
- free(obj_list);
+ HDfree(obj_list);
return 0;
}
-
+
/*-------------------------------------------------------------------------
* Function: h5repack_addlayout
*
@@ -234,13 +234,13 @@ int h5repack_addlayout(const char* str,
&pack,
options->op_tbl);
- free(obj_list);
+ HDfree(obj_list);
return 0;
}
-/* Note: The below copy_named_datatype(), named_datatype_free(), copy_attr()
- * were located in h5repack_copy.c as static prior to bugfix1726.
- * Made shared functions as copy_attr() was needed in h5repack_refs.c.
+/* Note: The below copy_named_datatype(), named_datatype_free(), copy_attr()
+ * were located in h5repack_copy.c as static prior to bugfix1726.
+ * Made shared functions as copy_attr() was needed in h5repack_refs.c.
* However copy_attr() may be obsoleted when H5Acopy is available and put back
* others to static in h5repack_copy.c.
*/
@@ -271,21 +271,21 @@ hid_t copy_named_datatype(hid_t type_in, hid_t fidout, named_dt_t **named_dt_hea
if(H5Oget_info(type_in, &oinfo) < 0)
goto error;
- if(*named_dt_head_p)
+ if(*named_dt_head_p)
{
/* Stack already exists, search for the datatype */
while(dt && dt->addr_in != oinfo.addr)
dt = dt->next;
dt_ret = dt;
- }
- else
+ }
+ else
{
/* Create the stack */
size_t i;
for(i=0; i<travt->nobjs; i++)
- if(travt->objs[i].type == H5TRAV_TYPE_NAMED_DATATYPE)
+ if(travt->objs[i].type == H5TRAV_TYPE_NAMED_DATATYPE)
{
/* Push onto the stack */
if(NULL == (dt = (named_dt_t *) HDmalloc(sizeof(named_dt_t))))
@@ -298,7 +298,7 @@ hid_t copy_named_datatype(hid_t type_in, hid_t fidout, named_dt_t **named_dt_hea
dt->id_out = -1;
/* Check if this type is the one requested */
- if(oinfo.addr == dt->addr_in)
+ if(oinfo.addr == dt->addr_in)
{
HDassert(!dt_ret);
dt_ret = dt;
@@ -308,7 +308,7 @@ hid_t copy_named_datatype(hid_t type_in, hid_t fidout, named_dt_t **named_dt_hea
/* Handle the case that the requested datatype was not found. This is
* possible if the datatype was committed anonymously in the input file. */
- if(!dt_ret)
+ if(!dt_ret)
{
/* Push the new datatype onto the stack */
if(NULL == (dt_ret = (named_dt_t *) HDmalloc(sizeof(named_dt_t))))
@@ -323,7 +323,7 @@ hid_t copy_named_datatype(hid_t type_in, hid_t fidout, named_dt_t **named_dt_hea
/* If the requested datatype does not yet exist in the output file, copy it
* anonymously */
- if(dt_ret->id_out < 0)
+ if(dt_ret->id_out < 0)
{
if (options->use_native==1)
dt_ret->id_out = h5tools_get_native_type(type_in);
@@ -365,7 +365,7 @@ int named_datatype_free(named_dt_t **named_dt_head_p, int ignore_err)
{
named_dt_t *dt = *named_dt_head_p;
- while(dt)
+ while(dt)
{
/* Pop the datatype off the stack and free it */
if(H5Tclose(dt->id_out) < 0 && !ignore_err)
@@ -418,6 +418,8 @@ int copy_attr(hid_t loc_in,
H5O_info_t oinfo; /* object info */
int j;
unsigned u;
+ hbool_t is_ref=0;
+ H5T_class_t type_class = -1;
if(H5Oget_info(loc_in, &oinfo) < 0)
goto error;
@@ -451,7 +453,7 @@ int copy_attr(hid_t loc_in,
/* Copy named dt */
if((wtype_id = copy_named_datatype(ftype_id, fidout, named_dt_head_p,
- travt, options)) < 0)
+ travt, options)) < 0)
{
H5Fclose(fidout);
goto error;
@@ -484,15 +486,37 @@ int copy_attr(hid_t loc_in,
goto error;
/*-------------------------------------------------------------------------
- * object references are a special case
- * we cannot just copy the buffers, but instead we recreate the reference
- * this is done on a second sweep of the file that just copies
- * the referenced objects
+ * object references are a special case. We cannot just copy the buffers,
+ * but instead we recreate the reference.
+ * This is done on a second sweep of the file that just copies the referenced
+ * objects at copy_refs_attr()
*-------------------------------------------------------------------------
*/
+ type_class = H5Tget_class(wtype_id);
+ is_ref = (type_class == H5T_REFERENCE);
+ if (type_class == H5T_VLEN ||type_class == H5T_ARRAY ) {
+ hid_t base_type = -1;
+ base_type = H5Tget_super(ftype_id);
+ is_ref = (is_ref || (H5Tget_class(base_type)==H5T_REFERENCE));
+ H5Tclose(base_type);
+ }
- if(H5T_REFERENCE == H5Tget_class(wtype_id)) {
- ;
+ if (type_class == H5T_COMPOUND) {
+ int nmembers = H5Tget_nmembers(wtype_id) ;
+ for (j=0; j<nmembers; j++) {
+ hid_t mtid = H5Tget_member_type( wtype_id, j );
+ H5T_class_t mtclass = H5Tget_class(mtid);
+ H5Tclose(mtid);
+
+ if (mtclass==H5T_REFERENCE) {
+ is_ref = 1;
+ break;
+ }
+ } /* for (j=0; i<nmembers; j++) */
+ } /* if (type_class == H5T_COMPOUND) */
+
+ if(is_ref) {
+ ; /* handled by copy_refs_attr() */
}
else {
/*-------------------------------------------------------------------------
@@ -522,9 +546,9 @@ int copy_attr(hid_t loc_in,
if(H5Aclose(attr_out) < 0)
goto error;
- /* Check if we have VL data in the attribute's datatype that must
+ /* Check if we have VL data and string in the attribute's datatype that must
* be reclaimed */
- if(TRUE == H5Tdetect_class(wtype_id, H5T_VLEN))
+ if (TRUE == h5tools_detect_vlen(wtype_id))
H5Dvlen_reclaim(wtype_id, space_id, H5P_DEFAULT, buf);
HDfree(buf);
buf = NULL;
@@ -554,13 +578,13 @@ int copy_attr(hid_t loc_in,
error:
H5E_BEGIN_TRY {
if(buf) {
- /* Check if we have VL data in the attribute's datatype that must
+ /* Check if we have VL data and string in the attribute's datatype that must
* be reclaimed */
- if(TRUE == H5Tdetect_class(wtype_id, H5T_VLEN))
+ if (TRUE == h5tools_detect_vlen(wtype_id))
H5Dvlen_reclaim(wtype_id, space_id, H5P_DEFAULT, buf);
/* Free buf */
- free(buf);
+ HDfree(buf);
} /* end if */
H5Tclose(ftype_id);
@@ -980,7 +1004,7 @@ static const char* get_sfilter(H5Z_filter_t filtn)
return "SOFF";
else {
error_msg("input error in filter type\n");
- exit(EXIT_FAILURE);
+ HDexit(EXIT_FAILURE);
}
}