#define H5O_FRIEND
#include "H5Pmodule.h"
#include "H5private.h"
#include "H5Eprivate.h"
#include "H5Iprivate.h"
#include "H5MMprivate.h"
#include "H5Opkg.h"
#include "H5Ppkg.h"
#include "H5PLprivate.h"
#include "H5Zprivate.h"
#define H5O_CRT_ATTR_MAX_COMPACT_SIZE sizeof(unsigned)
#define H5O_CRT_ATTR_MAX_COMPACT_ENC H5P__encode_unsigned
#define H5O_CRT_ATTR_MAX_COMPACT_DEC H5P__decode_unsigned
#define H5O_CRT_ATTR_MIN_DENSE_SIZE sizeof(unsigned)
#define H5O_CRT_ATTR_MIN_DENSE_ENC H5P__encode_unsigned
#define H5O_CRT_ATTR_MIN_DENSE_DEC H5P__decode_unsigned
#define H5O_CRT_OHDR_FLAGS_SIZE sizeof(uint8_t)
#define H5O_CRT_OHDR_FLAGS_ENC H5P__encode_uint8_t
#define H5O_CRT_OHDR_FLAGS_DEC H5P__decode_uint8_t
#define H5O_CRT_PIPELINE_SIZE sizeof(H5O_pline_t)
#define H5O_CRT_PIPELINE_SET H5P__ocrt_pipeline_set
#define H5O_CRT_PIPELINE_GET H5P__ocrt_pipeline_get
#define H5O_CRT_PIPELINE_ENC H5P__ocrt_pipeline_enc
#define H5O_CRT_PIPELINE_DEC H5P__ocrt_pipeline_dec
#define H5O_CRT_PIPELINE_DEL H5P__ocrt_pipeline_del
#define H5O_CRT_PIPELINE_COPY H5P__ocrt_pipeline_copy
#define H5O_CRT_PIPELINE_CMP H5P__ocrt_pipeline_cmp
#define H5O_CRT_PIPELINE_CLOSE H5P__ocrt_pipeline_close
static herr_t H5P__ocrt_reg_prop(H5P_genclass_t *pclass);
static herr_t H5P__ocrt_pipeline_enc(const void *value, void **_pp, size_t *size);
static herr_t H5P__ocrt_pipeline_dec(const void **_pp, void *value);
static herr_t H5P__ocrt_pipeline_set(hid_t prop_id, const char *name, size_t size, void *value);
static herr_t H5P__ocrt_pipeline_get(hid_t prop_id, const char *name, size_t size, void *value);
static herr_t H5P__ocrt_pipeline_del(hid_t prop_id, const char *name, size_t size, void *value);
static herr_t H5P__ocrt_pipeline_copy(const char *name, size_t size, void *value);
static int H5P__ocrt_pipeline_cmp(const void *value1, const void *value2, size_t size);
static herr_t H5P__ocrt_pipeline_close(const char *name, size_t size, void *value);
static herr_t H5P__set_filter(H5P_genplist_t *plist, H5Z_filter_t filter,
unsigned int flags, size_t cd_nelmts, const unsigned int cd_values[]);
const H5P_libclass_t H5P_CLS_OCRT[1] = {{
"object create",
H5P_TYPE_OBJECT_CREATE,
&H5P_CLS_ROOT_g,
&H5P_CLS_OBJECT_CREATE_g,
&H5P_CLS_OBJECT_CREATE_ID_g,
NULL,
H5P__ocrt_reg_prop,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL
}};
static const unsigned H5O_def_attr_max_compact_g = H5O_CRT_ATTR_MAX_COMPACT_DEF;
static const unsigned H5O_def_attr_min_dense_g = H5O_CRT_ATTR_MIN_DENSE_DEF;
static const uint8_t H5O_def_ohdr_flags_g = H5O_CRT_OHDR_FLAGS_DEF;
static const H5O_pline_t H5O_def_pline_g = H5O_CRT_PIPELINE_DEF;
static herr_t
H5P__ocrt_reg_prop(H5P_genclass_t *pclass)
{
herr_t ret_value = SUCCEED;
FUNC_ENTER_STATIC
if(H5P__register_real(pclass, H5O_CRT_ATTR_MAX_COMPACT_NAME, H5O_CRT_ATTR_MAX_COMPACT_SIZE, &H5O_def_attr_max_compact_g,
NULL, NULL, NULL, H5O_CRT_ATTR_MAX_COMPACT_ENC, H5O_CRT_ATTR_MAX_COMPACT_DEC,
NULL, NULL, NULL, NULL) < 0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
if(H5P__register_real(pclass, H5O_CRT_ATTR_MIN_DENSE_NAME, H5O_CRT_ATTR_MIN_DENSE_SIZE, &H5O_def_attr_min_dense_g,
NULL, NULL, NULL, H5O_CRT_ATTR_MIN_DENSE_ENC, H5O_CRT_ATTR_MIN_DENSE_DEC,
NULL, NULL, NULL, NULL) < 0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
if(H5P__register_real(pclass, H5O_CRT_OHDR_FLAGS_NAME, H5O_CRT_OHDR_FLAGS_SIZE, &H5O_def_ohdr_flags_g,
NULL, NULL, NULL, H5O_CRT_OHDR_FLAGS_ENC, H5O_CRT_OHDR_FLAGS_DEC,
NULL, NULL, NULL, NULL) < 0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
if(H5P__register_real(pclass, H5O_CRT_PIPELINE_NAME, H5O_CRT_PIPELINE_SIZE, &H5O_def_pline_g,
NULL, H5O_CRT_PIPELINE_SET, H5O_CRT_PIPELINE_GET, H5O_CRT_PIPELINE_ENC, H5O_CRT_PIPELINE_DEC,
H5O_CRT_PIPELINE_DEL, H5O_CRT_PIPELINE_COPY, H5O_CRT_PIPELINE_CMP, H5O_CRT_PIPELINE_CLOSE) < 0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
done:
FUNC_LEAVE_NOAPI(ret_value)
}
herr_t
H5Pset_attr_phase_change(hid_t plist_id, unsigned max_compact, unsigned min_dense)
{
H5P_genplist_t *plist;
herr_t ret_value = SUCCEED;
FUNC_ENTER_API(FAIL)
H5TRACE3("e", "iIuIu", plist_id, max_compact, min_dense);
if(max_compact < min_dense)
HGOTO_ERROR(H5E_ARGS, H5E_BADRANGE, FAIL, "max compact value must be >= min dense value")
if(max_compact > 65535)
HGOTO_ERROR(H5E_ARGS, H5E_BADRANGE, FAIL, "max compact value must be < 65536")
if(min_dense > 65535)
HGOTO_ERROR(H5E_ARGS, H5E_BADRANGE, FAIL, "min dense value must be < 65536")
if(NULL == (plist = H5P_object_verify(plist_id, H5P_OBJECT_CREATE)))
HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
if(H5P_set(plist, H5O_CRT_ATTR_MAX_COMPACT_NAME, &max_compact) < 0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set max. # of compact attributes in property list")
if(H5P_set(plist, H5O_CRT_ATTR_MIN_DENSE_NAME, &min_dense) < 0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set min. # of dense attributes in property list")
done:
FUNC_LEAVE_API(ret_value)
}
herr_t
H5Pget_attr_phase_change(hid_t plist_id, unsigned *max_compact, unsigned *min_dense)
{
H5P_genplist_t *plist;
herr_t ret_value = SUCCEED;
FUNC_ENTER_API(FAIL)
H5TRACE3("e", "i*Iu*Iu", plist_id, max_compact, min_dense);
if(NULL == (plist = H5P_object_verify(plist_id, H5P_OBJECT_CREATE)))
HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
if(max_compact) {
if(H5P_get(plist, H5O_CRT_ATTR_MAX_COMPACT_NAME, max_compact) < 0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get max. # of compact attributes")
}
if(min_dense) {
if(H5P_get(plist, H5O_CRT_ATTR_MIN_DENSE_NAME, min_dense) < 0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get min. # of dense attributes")
}
done:
FUNC_LEAVE_API(ret_value)
}
herr_t
H5Pset_attr_creation_order(hid_t plist_id, unsigned crt_order_flags)
{
H5P_genplist_t *plist;
uint8_t ohdr_flags;
herr_t ret_value = SUCCEED;
FUNC_ENTER_API(FAIL)
H5TRACE2("e", "iIu", plist_id, crt_order_flags);
if(!(crt_order_flags & H5P_CRT_ORDER_TRACKED) && (crt_order_flags & H5P_CRT_ORDER_INDEXED))
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "tracking creation order is required for index")
if(NULL == (plist = H5P_object_verify(plist_id, H5P_OBJECT_CREATE)))
HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
if(H5P_get(plist, H5O_CRT_OHDR_FLAGS_NAME, &ohdr_flags) < 0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get object header flags")
ohdr_flags &= (uint8_t)~(H5O_HDR_ATTR_CRT_ORDER_TRACKED | H5O_HDR_ATTR_CRT_ORDER_INDEXED);
ohdr_flags = (uint8_t)(ohdr_flags | ((crt_order_flags & H5P_CRT_ORDER_TRACKED) ? H5O_HDR_ATTR_CRT_ORDER_TRACKED : 0));
ohdr_flags = (uint8_t)(ohdr_flags | ((crt_order_flags & H5P_CRT_ORDER_INDEXED) ? H5O_HDR_ATTR_CRT_ORDER_INDEXED : 0));
if(H5P_set(plist, H5O_CRT_OHDR_FLAGS_NAME, &ohdr_flags) < 0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set object header flags")
done:
FUNC_LEAVE_API(ret_value)
}
herr_t
H5Pget_attr_creation_order(hid_t plist_id, unsigned *crt_order_flags)
{
herr_t ret_value = SUCCEED;
FUNC_ENTER_API(FAIL)
H5TRACE2("e", "i*Iu", plist_id, crt_order_flags);
if(crt_order_flags) {
H5P_genplist_t *plist;
uint8_t ohdr_flags;
*crt_order_flags = 0;
if(NULL == (plist = H5P_object_verify(plist_id, H5P_OBJECT_CREATE)))
HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
if(H5P_get(plist, H5O_CRT_OHDR_FLAGS_NAME, &ohdr_flags) < 0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get object header flags")
*crt_order_flags |= (ohdr_flags & H5O_HDR_ATTR_CRT_ORDER_TRACKED) ? H5P_CRT_ORDER_TRACKED : 0;
*crt_order_flags |= (ohdr_flags & H5O_HDR_ATTR_CRT_ORDER_INDEXED) ? H5P_CRT_ORDER_INDEXED : 0;
}
done:
FUNC_LEAVE_API(ret_value)
}
herr_t
H5Pset_obj_track_times(hid_t plist_id, hbool_t track_times)
{
H5P_genplist_t *plist;
uint8_t ohdr_flags;
herr_t ret_value = SUCCEED;
FUNC_ENTER_API(FAIL)
H5TRACE2("e", "ib", plist_id, track_times);
if(NULL == (plist = H5P_object_verify(plist_id, H5P_OBJECT_CREATE)))
HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
if(H5P_get(plist, H5O_CRT_OHDR_FLAGS_NAME, &ohdr_flags) < 0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get object header flags")
ohdr_flags &= (uint8_t)~H5O_HDR_STORE_TIMES;
ohdr_flags = (uint8_t)(ohdr_flags | (track_times ? H5O_HDR_STORE_TIMES : 0));
if(H5P_set(plist, H5O_CRT_OHDR_FLAGS_NAME, &ohdr_flags) < 0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set object header flags")
done:
FUNC_LEAVE_API(ret_value)
}
herr_t
H5Pget_obj_track_times(hid_t plist_id, hbool_t *track_times)
{
herr_t ret_value = SUCCEED;
FUNC_ENTER_API(FAIL)
H5TRACE2("e", "i*b", plist_id, track_times);
if(track_times) {
H5P_genplist_t *plist;
uint8_t ohdr_flags;
if(NULL == (plist = H5P_object_verify(plist_id, H5P_OBJECT_CREATE)))
HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
if(H5P_get(plist, H5O_CRT_OHDR_FLAGS_NAME, &ohdr_flags) < 0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get object header flags")
*track_times = (hbool_t)((ohdr_flags & H5O_HDR_STORE_TIMES) ? TRUE : FALSE);
}
done:
FUNC_LEAVE_API(ret_value)
}
herr_t
H5P_modify_filter(H5P_genplist_t *plist, H5Z_filter_t filter, unsigned flags,
size_t cd_nelmts, const unsigned cd_values[])
{
H5O_pline_t pline;
herr_t ret_value = SUCCEED;
FUNC_ENTER_NOAPI(FAIL)
if(H5P_peek(plist, H5O_CRT_PIPELINE_NAME, &pline) < 0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get pipeline")
if(H5Z_modify(&pline, filter, flags, cd_nelmts, cd_values) < 0)
HGOTO_ERROR(H5E_PLINE, H5E_CANTINIT, FAIL, "unable to add filter to pipeline")
if(H5P_poke(plist, H5O_CRT_PIPELINE_NAME, &pline) < 0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set pipeline")
done:
FUNC_LEAVE_NOAPI(ret_value)
}
herr_t
H5Pmodify_filter(hid_t plist_id, H5Z_filter_t filter, unsigned int flags,
size_t cd_nelmts, const unsigned int cd_values[])
{
H5P_genplist_t *plist;
herr_t ret_value = SUCCEED;
FUNC_ENTER_API(FAIL)
H5TRACE5("e", "iZfIuz*[a3]Iu", plist_id, filter, flags, cd_nelmts, cd_values);
if (filter<0 || filter>H5Z_FILTER_MAX)
HGOTO_ERROR (H5E_ARGS, H5E_BADVALUE, FAIL, "invalid filter identifier")
if (flags & ~((unsigned)H5Z_FLAG_DEFMASK))
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid flags")
if (cd_nelmts>0 && !cd_values)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no client data values supplied")
if(NULL == (plist = H5P_object_verify(plist_id, H5P_OBJECT_CREATE)))
HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
if(H5P_modify_filter(plist, filter, flags, cd_nelmts, cd_values) < 0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTINIT, FAIL, "can't modify filter")
done:
FUNC_LEAVE_API(ret_value)
}
herr_t
H5Pset_filter(hid_t plist_id, H5Z_filter_t filter, unsigned int flags,
size_t cd_nelmts, const unsigned int cd_values[])
{
H5P_genplist_t *plist;
herr_t ret_value=SUCCEED;
FUNC_ENTER_API(FAIL)
H5TRACE5("e", "iZfIuz*[a3]Iu", plist_id, filter, flags, cd_nelmts, cd_values);
if (filter<0 || filter>H5Z_FILTER_MAX)
HGOTO_ERROR (H5E_ARGS, H5E_BADVALUE, FAIL, "invalid filter identifier")
if (flags & ~((unsigned)H5Z_FLAG_DEFMASK))
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid flags")
if (cd_nelmts>0 && !cd_values)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no client data values supplied")
if(NULL == (plist = H5P_object_verify(plist_id, H5P_OBJECT_CREATE)))
HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
if(H5P__set_filter(plist, filter, flags, cd_nelmts, cd_values) < 0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "failed to call private function")
done:
FUNC_LEAVE_API(ret_value)
}
static herr_t
H5P__set_filter(H5P_genplist_t *plist, H5Z_filter_t filter, unsigned int flags,
size_t cd_nelmts, const unsigned int cd_values[])
{
H5O_pline_t pline;
htri_t filter_avail;
herr_t ret_value = SUCCEED;
FUNC_ENTER_STATIC
if((filter_avail = H5Z_filter_avail(filter)) < 0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't check filter availability")
if(H5P_peek(plist, H5O_CRT_PIPELINE_NAME, &pline) < 0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get pipeline")
if(H5Z_append(&pline, filter, flags, cd_nelmts, cd_values) < 0)
HGOTO_ERROR(H5E_PLINE, H5E_CANTINIT, FAIL, "unable to add filter to pipeline")
if(H5P_poke(plist, H5O_CRT_PIPELINE_NAME, &pline) < 0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set pipeline")
done:
FUNC_LEAVE_NOAPI(ret_value)
}
int
H5Pget_nfilters(hid_t plist_id)
{
H5P_genplist_t *plist;
H5O_pline_t pline;
int ret_value;
FUNC_ENTER_API(FAIL)
H5TRACE1("Is", "i", plist_id);
if(NULL == (plist = H5P_object_verify(plist_id, H5P_OBJECT_CREATE)))
HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
if(H5P_peek(plist, H5O_CRT_PIPELINE_NAME, &pline) < 0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get pipeline")
ret_value=(int)(pline.nused);
done:
FUNC_LEAVE_API(ret_value)
}
H5Z_filter_t
H5Pget_filter2(hid_t plist_id, unsigned idx, unsigned int *flags,
size_t *cd_nelmts, unsigned cd_values[],
size_t namelen, char name[],
unsigned *filter_config )
{
H5P_genplist_t *plist;
H5O_pline_t pline;
const H5Z_filter_info_t *filter;
H5Z_filter_t ret_value;
FUNC_ENTER_API(H5Z_FILTER_ERROR)
H5TRACE8("Zf", "iIux*zxzxx", plist_id, idx, flags, cd_nelmts, cd_values,
namelen, name, filter_config);
if(cd_nelmts || cd_values) {
if(cd_nelmts && *cd_nelmts > 256)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, H5Z_FILTER_ERROR, "probable uninitialized *cd_nelmts argument")
if(cd_nelmts && *cd_nelmts > 0 && !cd_values)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, H5Z_FILTER_ERROR, "client data values not supplied")
if(!cd_nelmts)
cd_values = NULL;
}
if(NULL == (plist = H5P_object_verify(plist_id, H5P_OBJECT_CREATE)))
HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, H5Z_FILTER_ERROR, "can't find object for ID")
if(H5P_peek(plist, H5O_CRT_PIPELINE_NAME, &pline) < 0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, H5Z_FILTER_ERROR, "can't get pipeline")
if(idx >= pline.nused)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, H5Z_FILTER_ERROR, "filter number is invalid")
filter = &pline.filter[idx];
if(H5P__get_filter(filter, flags, cd_nelmts, cd_values, namelen, name, filter_config) < 0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, H5Z_FILTER_ERROR, "can't get filter info")
ret_value = filter->id;
done:
FUNC_LEAVE_API(ret_value)
}
herr_t
H5P_get_filter_by_id(H5P_genplist_t *plist, H5Z_filter_t id, unsigned int *flags,
size_t *cd_nelmts, unsigned cd_values[],
size_t namelen, char name[], unsigned *filter_config)
{
H5O_pline_t pline;
H5Z_filter_info_t *filter;
herr_t ret_value = SUCCEED;
FUNC_ENTER_NOAPI(FAIL)
if(H5P_peek(plist, H5O_CRT_PIPELINE_NAME, &pline) < 0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get pipeline")
if(NULL == (filter = H5Z_filter_info(&pline, id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "filter ID is invalid")
if(H5P__get_filter(filter, flags, cd_nelmts, cd_values, namelen, name, filter_config) < 0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get filter info")
done:
FUNC_LEAVE_NOAPI(ret_value)
}
herr_t
H5Pget_filter_by_id2(hid_t plist_id, H5Z_filter_t id, unsigned int *flags,
size_t *cd_nelmts, unsigned cd_values[],
size_t namelen, char name[], unsigned *filter_config)
{
H5P_genplist_t *plist;
herr_t ret_value = SUCCEED;
FUNC_ENTER_API(FAIL)
H5TRACE8("e", "iZfx*zxzx*Iu", plist_id, id, flags, cd_nelmts, cd_values,
namelen, name, filter_config);
if(cd_nelmts || cd_values) {
if(cd_nelmts && *cd_nelmts > 256)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "probable uninitialized *cd_nelmts argument")
if(cd_nelmts && *cd_nelmts > 0 && !cd_values)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "client data values not supplied")
if(!cd_nelmts)
cd_values = NULL;
}
if(NULL == (plist = H5P_object_verify(plist_id, H5P_OBJECT_CREATE)))
HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
if(H5P_get_filter_by_id(plist, id, flags, cd_nelmts, cd_values, namelen,
name, filter_config) < 0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get filter info")
done:
FUNC_LEAVE_API(ret_value)
}
htri_t
H5Pall_filters_avail(hid_t plist_id)
{
H5P_genplist_t *plist;
H5O_pline_t pline;
htri_t ret_value;
FUNC_ENTER_API(FAIL)
H5TRACE1("t", "i", plist_id);
if(NULL == (plist = H5P_object_verify(plist_id, H5P_OBJECT_CREATE)))
HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
if(H5P_peek(plist, H5O_CRT_PIPELINE_NAME, &pline) < 0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get pipeline")
if((ret_value = H5Z_all_filters_avail(&pline)) < 0)
HGOTO_ERROR(H5E_PLIST, H5E_NOTFOUND, FAIL, "can't check pipeline information")
done:
FUNC_LEAVE_API(ret_value)
}
htri_t
H5P_filter_in_pline(H5P_genplist_t *plist, H5Z_filter_t id)
{
H5O_pline_t pline;
htri_t ret_value = SUCCEED;
FUNC_ENTER_NOAPI(FAIL)
if(H5P_peek(plist, H5O_CRT_PIPELINE_NAME, &pline) < 0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get pipeline")
if((ret_value = H5Z_filter_in_pline(&pline, id)) < 0)
HGOTO_ERROR(H5E_PLINE, H5E_CANTCOMPARE, FAIL, "can't find filter")
done:
FUNC_LEAVE_NOAPI(ret_value)
}
herr_t
H5Premove_filter(hid_t plist_id, H5Z_filter_t filter)
{
H5P_genplist_t *plist;
H5O_pline_t pline;
herr_t ret_value = SUCCEED;
FUNC_ENTER_API(FAIL)
H5TRACE2("e", "iZf", plist_id, filter);
if(NULL == (plist = H5P_object_verify(plist_id, H5P_OBJECT_CREATE)))
HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
if(H5P_peek(plist, H5O_CRT_PIPELINE_NAME, &pline) < 0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get pipeline")
if (pline.filter) {
if(H5Z_delete(&pline, filter) < 0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't delete filter")
if(H5P_poke(plist, H5O_CRT_PIPELINE_NAME, &pline) < 0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set pipeline")
}
done:
FUNC_LEAVE_API(ret_value)
}
herr_t
H5Pset_deflate(hid_t plist_id, unsigned level)
{
H5P_genplist_t *plist;
H5O_pline_t pline;
herr_t ret_value = SUCCEED;
FUNC_ENTER_API(FAIL)
H5TRACE2("e", "iIu", plist_id, level);
if(level > 9)
HGOTO_ERROR (H5E_ARGS, H5E_BADVALUE, FAIL, "invalid deflate level")
if(NULL == (plist = H5P_object_verify(plist_id, H5P_OBJECT_CREATE)))
HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
if(H5P_peek(plist, H5O_CRT_PIPELINE_NAME, &pline) < 0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get pipeline")
if(H5Z_append(&pline, H5Z_FILTER_DEFLATE, H5Z_FLAG_OPTIONAL, (size_t)1, &level) < 0)
HGOTO_ERROR(H5E_PLINE, H5E_CANTINIT, FAIL, "unable to add deflate filter to pipeline")
if(H5P_poke(plist, H5O_CRT_PIPELINE_NAME, &pline) < 0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set pipeline")
done:
FUNC_LEAVE_API(ret_value)
}
herr_t
H5Pset_fletcher32(hid_t plist_id)
{
H5P_genplist_t *plist;
H5O_pline_t pline;
herr_t ret_value=SUCCEED;
FUNC_ENTER_API(FAIL)
H5TRACE1("e", "i", plist_id);
if(NULL == (plist = H5P_object_verify(plist_id, H5P_OBJECT_CREATE)))
HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
if(H5P_peek(plist, H5O_CRT_PIPELINE_NAME, &pline) < 0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get pipeline")
if(H5Z_append(&pline, H5Z_FILTER_FLETCHER32, H5Z_FLAG_MANDATORY, (size_t)0, NULL) < 0)
HGOTO_ERROR(H5E_PLINE, H5E_CANTINIT, FAIL, "unable to add fletcher32 filter to pipeline")
if(H5P_poke(plist, H5O_CRT_PIPELINE_NAME, &pline) < 0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set pipeline")
done:
FUNC_LEAVE_API(ret_value)
}
herr_t
H5P__get_filter(const H5Z_filter_info_t *filter, unsigned int *flags,
size_t *cd_nelmts, unsigned cd_values[],
size_t namelen, char name[],
unsigned *filter_config )
{
FUNC_ENTER_PACKAGE_NOERR
HDassert(filter);
if(flags)
*flags = filter->flags;
if(cd_values) {
size_t i;
for(i = 0; i < filter->cd_nelmts && i < *cd_nelmts; i++)
cd_values[i] = filter->cd_values[i];
}
if(cd_nelmts)
*cd_nelmts = filter->cd_nelmts;
if(namelen > 0 && name) {
const char *s = filter->name;
if(!s) {
H5Z_class2_t *cls = H5Z_find(filter->id);
if(cls)
s = cls->name;
}
if(s) {
HDstrncpy(name, s, namelen);
name[namelen - 1] = '\0';
}
else {
if(filter->id < 256) {
HDstrncpy(name, "Unknown library filter", namelen);
name[namelen - 1] = '\0';
}
else
name[0] = '\0';
}
}
if(filter_config)
H5Z_get_filter_info(filter->id, filter_config);
FUNC_LEAVE_NOAPI(SUCCEED)
}
static herr_t
H5P__ocrt_pipeline_set(hid_t H5_ATTR_UNUSED prop_id, const char H5_ATTR_UNUSED *name,
size_t H5_ATTR_UNUSED size, void *value)
{
H5O_pline_t *pline = (H5O_pline_t *)value;
H5O_pline_t new_pline;
herr_t ret_value = SUCCEED;
FUNC_ENTER_STATIC
HDassert(value);
if(NULL == H5O_msg_copy(H5O_PLINE_ID, pline, &new_pline))
HGOTO_ERROR(H5E_PLIST, H5E_CANTCOPY, FAIL, "can't copy I/O pipeline")
*pline = new_pline;
done:
FUNC_LEAVE_NOAPI(ret_value)
}
static herr_t
H5P__ocrt_pipeline_get(hid_t H5_ATTR_UNUSED prop_id, const char H5_ATTR_UNUSED *name,
size_t H5_ATTR_UNUSED size, void *value)
{
H5O_pline_t *pline = (H5O_pline_t *)value;
H5O_pline_t new_pline;
herr_t ret_value = SUCCEED;
FUNC_ENTER_STATIC
HDassert(value);
if(NULL == H5O_msg_copy(H5O_PLINE_ID, pline, &new_pline))
HGOTO_ERROR(H5E_PLIST, H5E_CANTCOPY, FAIL, "can't copy I/O pipeline")
*pline = new_pline;
done:
FUNC_LEAVE_NOAPI(ret_value)
}
static herr_t
H5P__ocrt_pipeline_enc(const void *value, void **_pp, size_t *size)
{
const H5O_pline_t *pline = (const H5O_pline_t *)value;
uint8_t **pp = (uint8_t **)_pp;
size_t u;
FUNC_ENTER_STATIC_NOERR
HDassert(pline);
HDassert(size);
HDcompile_assert(sizeof(size_t) <= sizeof(uint64_t));
if(NULL != *pp) {
unsigned enc_size;
uint64_t enc_value;
*(*pp)++ = (uint8_t)sizeof(unsigned);
enc_value = (uint64_t)pline->nused;
enc_size = H5VM_limit_enc_size(enc_value);
HDassert(enc_size < 256);
*(*pp)++ = (uint8_t)enc_size;
UINT64ENCODE_VAR(*pp, enc_value, enc_size);
for(u = 0; u < pline->nused; u++) {
unsigned v;
INT32ENCODE(*pp, pline->filter[u].id)
H5_ENCODE_UNSIGNED(*pp, pline->filter[u].flags)
if(NULL != pline->filter[u].name) {
*(*pp)++ = (uint8_t)TRUE;
H5MM_memcpy(*pp, (uint8_t *)(pline->filter[u].name), H5Z_COMMON_NAME_LEN);
*pp += H5Z_COMMON_NAME_LEN;
}
else
*(*pp)++ = (uint8_t)FALSE;
enc_value = (uint64_t)pline->filter[u].cd_nelmts;
enc_size = H5VM_limit_enc_size(enc_value);
HDassert(enc_size < 256);
*(*pp)++ = (uint8_t)enc_size;
UINT64ENCODE_VAR(*pp, enc_value, enc_size);
for(v = 0; v < pline->filter[u].cd_nelmts; v++)
H5_ENCODE_UNSIGNED(*pp, pline->filter[u].cd_values[v])
}
}
*size += 1;
*size += (1 + H5VM_limit_enc_size((uint64_t)pline->nused));
for(u = 0; u < pline->nused; u++) {
*size += (sizeof(int32_t) + sizeof(unsigned) + 1);
if(NULL != pline->filter[u].name)
*size += H5Z_COMMON_NAME_LEN;
*size += (1 + H5VM_limit_enc_size((uint64_t)pline->filter[u].cd_nelmts));
*size += pline->filter[u].cd_nelmts * sizeof(unsigned);
}
FUNC_LEAVE_NOAPI(SUCCEED)
}
static herr_t
H5P__ocrt_pipeline_dec(const void **_pp, void *_value)
{
H5O_pline_t *pline = (H5O_pline_t *)_value;
const uint8_t **pp = (const uint8_t **)_pp;
size_t nused;
unsigned enc_size;
uint64_t enc_value;
size_t u;
herr_t ret_value = SUCCEED;
FUNC_ENTER_STATIC
HDcompile_assert(sizeof(size_t) <= sizeof(uint64_t));
enc_size = *(*pp)++;
if(enc_size != sizeof(unsigned))
HGOTO_ERROR(H5E_PLIST, H5E_BADVALUE, FAIL, "unsigned value can't be decoded")
enc_size = *(*pp)++;
HDassert(enc_size < 256);
UINT64DECODE_VAR(*pp, enc_value, enc_size);
nused = (size_t)enc_value;
HDmemset(pline, 0, sizeof(H5O_pline_t));
*pline = H5O_def_pline_g;
for(u = 0; u < nused; u++) {
H5Z_filter_info_t filter;
uint8_t has_name;
unsigned v;
INT32DECODE(*pp, filter.id)
H5_DECODE_UNSIGNED(*pp, filter.flags)
has_name = *(*pp)++;
if(has_name) {
filter.name = H5MM_xstrdup((const char *)(*pp));
*pp += H5Z_COMMON_NAME_LEN;
}
else
filter.name = NULL;
enc_size = *(*pp)++;
HDassert(enc_size < 256);
UINT64DECODE_VAR(*pp, enc_value, enc_size);
filter.cd_nelmts = (size_t)enc_value;
if(filter.cd_nelmts) {
if(NULL == (filter.cd_values = (unsigned *)H5MM_malloc(sizeof(unsigned) * filter.cd_nelmts)))
HGOTO_ERROR(H5E_PLIST, H5E_CANTALLOC, FAIL, "memory allocation failed for cd_values")
}
else
filter.cd_values = NULL;
for(v = 0; v < filter.cd_nelmts; v++)
H5_DECODE_UNSIGNED(*pp, filter.cd_values[v])
if(H5Z_append(pline, filter.id, filter.flags, filter.cd_nelmts, filter.cd_values) < 0)
HGOTO_ERROR(H5E_PLINE, H5E_CANTINIT, FAIL, "unable to add filter to pipeline")
filter.cd_values = (unsigned *)H5MM_xfree(filter.cd_values);
}
done:
FUNC_LEAVE_NOAPI(ret_value)
}
static herr_t
H5P__ocrt_pipeline_del(hid_t H5_ATTR_UNUSED prop_id, const char H5_ATTR_UNUSED *name,
size_t H5_ATTR_UNUSED size, void *value)
{
herr_t ret_value = SUCCEED;
FUNC_ENTER_STATIC
HDassert(value);
if(H5O_msg_reset(H5O_PLINE_ID, value) < 0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTRESET, FAIL, "can't release I/O pipeline message")
done:
FUNC_LEAVE_NOAPI(ret_value)
}
static herr_t
H5P__ocrt_pipeline_copy(const char H5_ATTR_UNUSED *name, size_t H5_ATTR_UNUSED size,
void *value)
{
H5O_pline_t *pline = (H5O_pline_t *)value;
H5O_pline_t new_pline;
herr_t ret_value = SUCCEED;
FUNC_ENTER_STATIC
HDassert(pline);
if(NULL == H5O_msg_copy(H5O_PLINE_ID, pline, &new_pline))
HGOTO_ERROR(H5E_PLIST, H5E_CANTCOPY, FAIL, "can't copy I/O pipeline")
*pline = new_pline;
done:
FUNC_LEAVE_NOAPI(ret_value)
}
static int
H5P__ocrt_pipeline_cmp(const void *_pline1, const void *_pline2, size_t H5_ATTR_UNUSED size)
{
const H5O_pline_t *pline1 = (const H5O_pline_t *)_pline1,
*pline2 = (const H5O_pline_t *)_pline2;
int cmp_value;
herr_t ret_value = 0;
FUNC_ENTER_STATIC_NOERR
HDassert(pline1);
HDassert(pline2);
HDassert(size == sizeof(H5O_pline_t));
if(pline1->nused < pline2->nused) HGOTO_DONE(-1);
if(pline1->nused > pline2->nused) HGOTO_DONE(1);
if(pline1->filter == NULL && pline2->filter != NULL) HGOTO_DONE(-1);
if(pline1->filter != NULL && pline2->filter == NULL) HGOTO_DONE(1);
if(pline1->filter != NULL && pline1->nused > 0) {
size_t u;
for(u = 0; u < pline1->nused; u++) {
if(pline1->filter[u].id < pline2->filter[u].id) HGOTO_DONE(-1);
if(pline1->filter[u].id > pline2->filter[u].id) HGOTO_DONE(1);
if(pline1->filter[u].flags < pline2->filter[u].flags) HGOTO_DONE(-1);
if(pline1->filter[u].flags > pline2->filter[u].flags) HGOTO_DONE(1);
if(pline1->filter[u].name == NULL && pline2->filter[u].name != NULL) HGOTO_DONE(-1);
if(pline1->filter[u].name != NULL && pline2->filter[u].name == NULL) HGOTO_DONE(1);
if(pline1->filter[u].name != NULL)
if((cmp_value = HDstrcmp(pline1->filter[u].name, pline2->filter[u].name)) != 0)
HGOTO_DONE(cmp_value);
if(pline1->filter[u].cd_nelmts < pline2->filter[u].cd_nelmts) HGOTO_DONE(-1);
if(pline1->filter[u].cd_nelmts > pline2->filter[u].cd_nelmts) HGOTO_DONE(1);
if(pline1->filter[u].cd_values == NULL && pline2->filter[u].cd_values != NULL) HGOTO_DONE(-1);
if(pline1->filter[u].cd_values != NULL && pline2->filter[u].cd_values == NULL) HGOTO_DONE(1);
if(pline1->filter[u].cd_values != NULL && pline1->filter[u].cd_nelmts > 0) {
size_t v;
for(v = 0; v < pline1->filter[u].cd_nelmts; v++) {
if(pline1->filter[u].cd_values[v] < pline2->filter[u].cd_values[v]) HGOTO_DONE(-1);
if(pline1->filter[u].cd_values[v] > pline2->filter[u].cd_values[v]) HGOTO_DONE(1);
}
}
}
}
done:
FUNC_LEAVE_NOAPI(ret_value)
}
static herr_t
H5P__ocrt_pipeline_close(const char H5_ATTR_UNUSED *name, size_t H5_ATTR_UNUSED size,
void *value)
{
herr_t ret_value = SUCCEED;
FUNC_ENTER_STATIC
HDassert(value);
if(H5O_msg_reset(H5O_PLINE_ID, value) < 0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTRESET, FAIL, "can't release I/O pipeline message")
done:
FUNC_LEAVE_NOAPI(ret_value)
}
#ifndef H5_NO_DEPRECATED_SYMBOLS
H5Z_filter_t
H5Pget_filter1(hid_t plist_id, unsigned idx, unsigned int *flags,
size_t *cd_nelmts, unsigned cd_values[],
size_t namelen, char name[])
{
H5O_pline_t pline;
const H5Z_filter_info_t *filter;
H5P_genplist_t *plist;
H5Z_filter_t ret_value;
FUNC_ENTER_API(H5Z_FILTER_ERROR)
H5TRACE7("Zf", "iIux*zxzx", plist_id, idx, flags, cd_nelmts, cd_values, namelen,
name);
if(cd_nelmts || cd_values) {
if(cd_nelmts && *cd_nelmts > 256)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, H5Z_FILTER_ERROR, "probable uninitialized *cd_nelmts argument")
if(cd_nelmts && *cd_nelmts > 0 && !cd_values)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, H5Z_FILTER_ERROR, "client data values not supplied")
if(!cd_nelmts)
cd_values = NULL;
}
if(NULL == (plist = H5P_object_verify(plist_id, H5P_OBJECT_CREATE)))
HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, H5Z_FILTER_ERROR, "can't find object for ID")
if(H5P_peek(plist, H5O_CRT_PIPELINE_NAME, &pline) < 0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, H5Z_FILTER_ERROR, "can't get pipeline")
if(idx >= pline.nused)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, H5Z_FILTER_ERROR, "filter number is invalid")
filter = &pline.filter[idx];
if(H5P__get_filter(filter, flags, cd_nelmts, cd_values, namelen, name, NULL) < 0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, H5Z_FILTER_ERROR, "can't get filter info")
ret_value = filter->id;
done:
FUNC_LEAVE_API(ret_value)
}
herr_t
H5Pget_filter_by_id1(hid_t plist_id, H5Z_filter_t id, unsigned int *flags,
size_t *cd_nelmts, unsigned cd_values[],
size_t namelen, char name[])
{
H5P_genplist_t *plist;
herr_t ret_value = SUCCEED;
FUNC_ENTER_API(FAIL)
H5TRACE7("e", "iZfx*zxzx", plist_id, id, flags, cd_nelmts, cd_values, namelen,
name);
if(cd_nelmts || cd_values) {
if(cd_nelmts && *cd_nelmts > 256)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "probable uninitialized *cd_nelmts argument")
if(cd_nelmts && *cd_nelmts > 0 && !cd_values)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "client data values not supplied")
if(!cd_nelmts)
cd_values = NULL;
}
if(NULL == (plist = H5P_object_verify(plist_id, H5P_OBJECT_CREATE)))
HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
if(H5P_get_filter_by_id(plist, id, flags, cd_nelmts, cd_values, namelen, name, NULL) < 0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get filter info")
done:
FUNC_LEAVE_API(ret_value)
}
#endif