diff options
author | Quincey Koziol <koziol@hdfgroup.org> | 2012-03-21 15:10:17 (GMT) |
---|---|---|
committer | Quincey Koziol <koziol@hdfgroup.org> | 2012-03-21 15:10:17 (GMT) |
commit | eb89d7b53ab95623ab454186a602e1cafc7391f0 (patch) | |
tree | ceafe458b3011e38853e765352d3c7e59bbecce1 /tools/h5repack/h5repack.c | |
parent | 3e468e6ff65d540a439e99ea568a6bff7add7cea (diff) | |
download | hdf5-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.c | 86 |
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); } } |