summaryrefslogtreecommitdiffstats
path: root/src/H5Plapl.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/H5Plapl.c')
-rw-r--r--src/H5Plapl.c1019
1 files changed, 744 insertions, 275 deletions
diff --git a/src/H5Plapl.c b/src/H5Plapl.c
index 6c80493..469006b 100644
--- a/src/H5Plapl.c
+++ b/src/H5Plapl.c
@@ -1,23 +1,20 @@
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* Copyright by The HDF Group. *
- * 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://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have *
- * access to either file, you may request a copy from help@hdfgroup.org. *
+ * the COPYING file, which can be found at the root of the source code *
+ * distribution tree, or in https://www.hdfgroup.org/licenses. *
+ * If you do not have access to either file, you may request a copy from *
+ * help@hdfgroup.org. *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/*-------------------------------------------------------------------------
*
* Created: H5Plapl.c
* July 14 2006
- * James Laird <jlaird@ncsa.uiuc.edu>
+ * James Laird
*
* Purpose: Link access property list class routines
*
@@ -27,18 +24,18 @@
/****************/
/* Module Setup */
/****************/
-#define H5P_PACKAGE /*suppress error about including H5Ppkg */
+
+#include "H5Pmodule.h" /* This source code file is part of the H5P module */
/***********/
/* Headers */
/***********/
-#include "H5private.h" /* Generic Functions */
-#include "H5Eprivate.h" /* Error handling */
-#include "H5Iprivate.h" /* IDs */
-#include "H5Lprivate.h" /* Links */
-#include "H5MMprivate.h" /* Memory management */
-#include "H5Ppkg.h" /* Property lists */
-
+#include "H5private.h" /* Generic Functions */
+#include "H5Eprivate.h" /* Error handling */
+#include "H5Iprivate.h" /* IDs */
+#include "H5Lprivate.h" /* Links */
+#include "H5MMprivate.h" /* Memory management */
+#include "H5Ppkg.h" /* Property lists */
/****************/
/* Local Macros */
@@ -46,56 +43,88 @@
/* ======== Link access properties ======== */
/* Definitions for number of soft links to traverse */
-#define H5L_ACS_NLINKS_SIZE sizeof(size_t)
-#define H5L_ACS_NLINKS_DEF H5L_NUM_LINKS /*max symlinks to follow per lookup */
+#define H5L_ACS_NLINKS_SIZE sizeof(size_t)
+#define H5L_ACS_NLINKS_DEF H5L_NUM_LINKS /*max symlinks to follow per lookup */
+#define H5L_ACS_NLINKS_ENC H5P__encode_size_t
+#define H5L_ACS_NLINKS_DEC H5P__decode_size_t
+
/* Definitions for external link prefix */
-#define H5L_ACS_ELINK_PREFIX_SIZE sizeof(char *)
-#define H5L_ACS_ELINK_PREFIX_DEF NULL /*default is no prefix */
-#define H5L_ACS_ELINK_PREFIX_DEL H5P_lacc_elink_pref_del
-#define H5L_ACS_ELINK_PREFIX_COPY H5P_lacc_elink_pref_copy
-#define H5L_ACS_ELINK_PREFIX_CLOSE H5P_lacc_elink_pref_close
+#define H5L_ACS_ELINK_PREFIX_SIZE sizeof(char *)
+#define H5L_ACS_ELINK_PREFIX_DEF NULL /*default is no prefix */
+#define H5L_ACS_ELINK_PREFIX_SET H5P__lacc_elink_pref_set
+#define H5L_ACS_ELINK_PREFIX_GET H5P__lacc_elink_pref_get
+#define H5L_ACS_ELINK_PREFIX_ENC H5P__lacc_elink_pref_enc
+#define H5L_ACS_ELINK_PREFIX_DEC H5P__lacc_elink_pref_dec
+#define H5L_ACS_ELINK_PREFIX_DEL H5P__lacc_elink_pref_del
+#define H5L_ACS_ELINK_PREFIX_COPY H5P__lacc_elink_pref_copy
+#define H5L_ACS_ELINK_PREFIX_CMP H5P__lacc_elink_pref_cmp
+#define H5L_ACS_ELINK_PREFIX_CLOSE H5P__lacc_elink_pref_close
/* Definitions for setting fapl of external link access */
-#define H5L_ACS_ELINK_FAPL_SIZE sizeof(hid_t)
-#define H5L_ACS_ELINK_FAPL_DEF H5P_DEFAULT
-#define H5L_ACS_ELINK_FAPL_DEL H5P_lacc_elink_fapl_del
-#define H5L_ACS_ELINK_FAPL_COPY H5P_lacc_elink_fapl_copy
-#define H5L_ACS_ELINK_FAPL_CLOSE H5P_lacc_elink_fapl_close
+#define H5L_ACS_ELINK_FAPL_SIZE sizeof(hid_t)
+#define H5L_ACS_ELINK_FAPL_DEF H5P_DEFAULT
+#define H5L_ACS_ELINK_FAPL_SET H5P__lacc_elink_fapl_set
+#define H5L_ACS_ELINK_FAPL_GET H5P__lacc_elink_fapl_get
+#define H5L_ACS_ELINK_FAPL_ENC H5P__lacc_elink_fapl_enc
+#define H5L_ACS_ELINK_FAPL_DEC H5P__lacc_elink_fapl_dec
+#define H5L_ACS_ELINK_FAPL_DEL H5P__lacc_elink_fapl_del
+#define H5L_ACS_ELINK_FAPL_COPY H5P__lacc_elink_fapl_copy
+#define H5L_ACS_ELINK_FAPL_CMP H5P__lacc_elink_fapl_cmp
+#define H5L_ACS_ELINK_FAPL_CLOSE H5P__lacc_elink_fapl_close
/* Definitions for file access flags for external link traversal */
-#define H5L_ACS_ELINK_FLAGS_SIZE sizeof(unsigned)
-#define H5L_ACS_ELINK_FLAGS_DEF H5F_ACC_DEFAULT
+#define H5L_ACS_ELINK_FLAGS_SIZE sizeof(unsigned)
+#define H5L_ACS_ELINK_FLAGS_DEF H5F_ACC_DEFAULT
+#define H5L_ACS_ELINK_FLAGS_ENC H5P__encode_unsigned
+#define H5L_ACS_ELINK_FLAGS_DEC H5P__decode_unsigned
/* Definitions for callback function for external link traversal */
-#define H5L_ACS_ELINK_CB_SIZE sizeof(H5L_elink_cb_t)
-#define H5L_ACS_ELINK_CB_DEF {NULL,NULL}
+#define H5L_ACS_ELINK_CB_SIZE sizeof(H5L_elink_cb_t)
+#define H5L_ACS_ELINK_CB_DEF \
+ { \
+ NULL, NULL \
+ }
+
+#ifdef H5_HAVE_PARALLEL
+/* Definition for reading metadata collectively */
+#define H5L_ACS_COLL_MD_READ_SIZE sizeof(H5P_coll_md_read_flag_t)
+#define H5L_ACS_COLL_MD_READ_DEF H5P_USER_FALSE
+#define H5L_ACS_COLL_MD_READ_ENC H5P__encode_coll_md_read_flag_t
+#define H5L_ACS_COLL_MD_READ_DEC H5P__decode_coll_md_read_flag_t
+#endif /* H5_HAVE_PARALLEL */
/******************/
/* Local Typedefs */
/******************/
-
/********************/
/* Package Typedefs */
/********************/
-
/********************/
/* Local Prototypes */
/********************/
/* Property class callbacks */
-static herr_t H5P_lacc_reg_prop(H5P_genclass_t *pclass);
+static herr_t H5P__lacc_reg_prop(H5P_genclass_t *pclass);
/* Property list callbacks */
-static herr_t H5P_lacc_elink_pref_del(hid_t prop_id, const char* name, size_t size, void* value);
-static herr_t H5P_lacc_elink_pref_copy(const char* name, size_t size, void* value);
-static herr_t H5P_lacc_elink_pref_close(const char* name, size_t size, void* value);
-
-static herr_t H5P_lacc_elink_fapl_del(hid_t prop_id, const char* name, size_t size, void* value);
-static herr_t H5P_lacc_elink_fapl_copy(const char* name, size_t size, void* value);
-static herr_t H5P_lacc_elink_fapl_close(const char* name, size_t size, void* value);
-
+static herr_t H5P__lacc_elink_pref_set(hid_t prop_id, const char *name, size_t size, void *value);
+static herr_t H5P__lacc_elink_pref_get(hid_t prop_id, const char *name, size_t size, void *value);
+static herr_t H5P__lacc_elink_pref_enc(const void *value, void **_pp, size_t *size);
+static herr_t H5P__lacc_elink_pref_dec(const void **_pp, void *value);
+static herr_t H5P__lacc_elink_pref_del(hid_t prop_id, const char *name, size_t size, void *value);
+static herr_t H5P__lacc_elink_pref_copy(const char *name, size_t size, void *value);
+static int H5P__lacc_elink_pref_cmp(const void *value1, const void *value2, size_t size);
+static herr_t H5P__lacc_elink_pref_close(const char *name, size_t size, void *value);
+static herr_t H5P__lacc_elink_fapl_set(hid_t prop_id, const char *name, size_t size, void *value);
+static herr_t H5P__lacc_elink_fapl_get(hid_t prop_id, const char *name, size_t size, void *value);
+static herr_t H5P__lacc_elink_fapl_enc(const void *value, void **_pp, size_t *size);
+static herr_t H5P__lacc_elink_fapl_dec(const void **_pp, void *value);
+static herr_t H5P__lacc_elink_fapl_del(hid_t prop_id, const char *name, size_t size, void *value);
+static herr_t H5P__lacc_elink_fapl_copy(const char *name, size_t size, void *value);
+static int H5P__lacc_elink_fapl_cmp(const void *value1, const void *value2, size_t size);
+static herr_t H5P__lacc_elink_fapl_close(const char *name, size_t size, void *value);
/*********************/
/* Package Variables */
@@ -103,33 +132,47 @@ static herr_t H5P_lacc_elink_fapl_close(const char* name, size_t size, void* val
/* Dataset creation property list class library initialization object */
const H5P_libclass_t H5P_CLS_LACC[1] = {{
- "link access", /* Class name for debugging */
- &H5P_CLS_ROOT_g, /* Parent class ID */
- &H5P_CLS_LINK_ACCESS_g, /* Pointer to class ID */
- &H5P_LST_LINK_ACCESS_g, /* Pointer to default property list ID */
- H5P_lacc_reg_prop, /* Default property registration routine */
- NULL, /* Class creation callback */
- NULL, /* Class creation callback info */
- NULL, /* Class copy callback */
- NULL, /* Class copy callback info */
- NULL, /* Class close callback */
- NULL /* Class close callback info */
+ "link access", /* Class name for debugging */
+ H5P_TYPE_LINK_ACCESS, /* Class type */
+
+ &H5P_CLS_ROOT_g, /* Parent class */
+ &H5P_CLS_LINK_ACCESS_g, /* Pointer to class */
+ &H5P_CLS_LINK_ACCESS_ID_g, /* Pointer to class ID */
+ &H5P_LST_LINK_ACCESS_ID_g, /* Pointer to default property list ID */
+ H5P__lacc_reg_prop, /* Default property registration routine */
+
+ NULL, /* Class creation callback */
+ NULL, /* Class creation callback info */
+ NULL, /* Class copy callback */
+ NULL, /* Class copy callback info */
+ NULL, /* Class close callback */
+ NULL /* Class close callback info */
}};
-
/*****************************/
/* Library Private Variables */
/*****************************/
-
/*******************/
/* Local Variables */
/*******************/
+/* Property value defaults */
+static const size_t H5L_def_nlinks_g = H5L_ACS_NLINKS_DEF; /* Default number of soft links to traverse */
+static const char *H5L_def_elink_prefix_g =
+ H5L_ACS_ELINK_PREFIX_DEF; /* Default external link prefix string */
+static const hid_t H5L_def_fapl_id_g = H5L_ACS_ELINK_FAPL_DEF; /* Default fapl for external link access */
+static const unsigned H5L_def_elink_flags_g =
+ H5L_ACS_ELINK_FLAGS_DEF; /* Default file access flags for external link traversal */
+static const H5L_elink_cb_t H5L_def_elink_cb_g =
+ H5L_ACS_ELINK_CB_DEF; /* Default external link traversal callback */
+#ifdef H5_HAVE_PARALLEL
+static const H5P_coll_md_read_flag_t H5L_def_coll_md_read_g =
+ H5L_ACS_COLL_MD_READ_DEF; /* Default setting for the collective metedata read flag */
+#endif /* H5_HAVE_PARALLEL */
-
/*-------------------------------------------------------------------------
- * Function: H5P_lacc_reg_prop
+ * Function: H5P__lacc_reg_prop
*
* Purpose: Register the dataset creation property list class's properties
*
@@ -138,160 +181,603 @@ const H5P_libclass_t H5P_CLS_LACC[1] = {{
* Programmer: Quincey Koziol
* October 31, 2006
*
- * Modifications:
- * Vailin Choi, Sept. 12th 2008
- * Register the setting of file access property list for link access
- *
*-------------------------------------------------------------------------
*/
static herr_t
-H5P_lacc_reg_prop(H5P_genclass_t *pclass)
+H5P__lacc_reg_prop(H5P_genclass_t *pclass)
{
- size_t nlinks = H5L_ACS_NLINKS_DEF; /* Default number of soft links to traverse */
- char *elink_prefix = H5L_ACS_ELINK_PREFIX_DEF; /* Default external link prefix string */
- hid_t def_fapl_id = H5L_ACS_ELINK_FAPL_DEF; /* Default fapl for external link access */
- unsigned elink_flags = H5L_ACS_ELINK_FLAGS_DEF; /* Default file access flags for external link traversal */
- H5L_elink_cb_t elink_cb = H5L_ACS_ELINK_CB_DEF; /* Default external link traversal callback */
+ herr_t ret_value = SUCCEED; /* Return value */
- herr_t ret_value = SUCCEED; /* Return value */
-
- FUNC_ENTER_NOAPI_NOINIT
+ FUNC_ENTER_PACKAGE
/* Register property for number of links traversed */
- if(H5P_register_real(pclass, H5L_ACS_NLINKS_NAME, H5L_ACS_NLINKS_SIZE, &nlinks, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
- HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
+ if (H5P__register_real(pclass, H5L_ACS_NLINKS_NAME, H5L_ACS_NLINKS_SIZE, &H5L_def_nlinks_g, NULL, NULL,
+ NULL, H5L_ACS_NLINKS_ENC, H5L_ACS_NLINKS_DEC, NULL, NULL, NULL, NULL) < 0)
+ HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
/* Register property for external link prefix */
- if(H5P_register_real(pclass, H5L_ACS_ELINK_PREFIX_NAME, H5L_ACS_ELINK_PREFIX_SIZE, &elink_prefix, NULL, NULL, NULL, H5L_ACS_ELINK_PREFIX_DEL, H5L_ACS_ELINK_PREFIX_COPY, NULL, H5L_ACS_ELINK_PREFIX_CLOSE) < 0)
- HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
+ if (H5P__register_real(pclass, H5L_ACS_ELINK_PREFIX_NAME, H5L_ACS_ELINK_PREFIX_SIZE,
+ &H5L_def_elink_prefix_g, NULL, H5L_ACS_ELINK_PREFIX_SET, H5L_ACS_ELINK_PREFIX_GET,
+ H5L_ACS_ELINK_PREFIX_ENC, H5L_ACS_ELINK_PREFIX_DEC, H5L_ACS_ELINK_PREFIX_DEL,
+ H5L_ACS_ELINK_PREFIX_COPY, H5L_ACS_ELINK_PREFIX_CMP,
+ H5L_ACS_ELINK_PREFIX_CLOSE) < 0)
+ HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
/* Register fapl for link access */
- if(H5P_register_real(pclass, H5L_ACS_ELINK_FAPL_NAME, H5L_ACS_ELINK_FAPL_SIZE, &def_fapl_id, NULL, NULL, NULL, H5L_ACS_ELINK_FAPL_DEL, H5L_ACS_ELINK_FAPL_COPY, NULL, H5L_ACS_ELINK_FAPL_CLOSE) < 0)
- HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
+ if (H5P__register_real(pclass, H5L_ACS_ELINK_FAPL_NAME, H5L_ACS_ELINK_FAPL_SIZE, &H5L_def_fapl_id_g, NULL,
+ H5L_ACS_ELINK_FAPL_SET, H5L_ACS_ELINK_FAPL_GET, H5L_ACS_ELINK_FAPL_ENC,
+ H5L_ACS_ELINK_FAPL_DEC, H5L_ACS_ELINK_FAPL_DEL, H5L_ACS_ELINK_FAPL_COPY,
+ H5L_ACS_ELINK_FAPL_CMP, H5L_ACS_ELINK_FAPL_CLOSE) < 0)
+ HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
/* Register property for external link file access flags */
- if(H5P_register_real(pclass, H5L_ACS_ELINK_FLAGS_NAME, H5L_ACS_ELINK_FLAGS_SIZE, &elink_flags, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
- HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
+ if (H5P__register_real(pclass, H5L_ACS_ELINK_FLAGS_NAME, H5L_ACS_ELINK_FLAGS_SIZE, &H5L_def_elink_flags_g,
+ NULL, NULL, NULL, H5L_ACS_ELINK_FLAGS_ENC, H5L_ACS_ELINK_FLAGS_DEC, NULL, NULL,
+ NULL, NULL) < 0)
+ HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
/* Register property for external link file traversal callback */
- if(H5P_register_real(pclass, H5L_ACS_ELINK_CB_NAME, H5L_ACS_ELINK_CB_SIZE, &elink_cb, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
- HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
+ /* (Note: this property should not have an encode/decode callback -QAK) */
+ if (H5P__register_real(pclass, H5L_ACS_ELINK_CB_NAME, H5L_ACS_ELINK_CB_SIZE, &H5L_def_elink_cb_g, NULL,
+ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
+ HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
+
+#ifdef H5_HAVE_PARALLEL
+ /* Register the metadata collective read flag */
+ if (H5P__register_real(pclass, H5_COLL_MD_READ_FLAG_NAME, H5L_ACS_COLL_MD_READ_SIZE,
+ &H5L_def_coll_md_read_g, NULL, NULL, NULL, H5L_ACS_COLL_MD_READ_ENC,
+ H5L_ACS_COLL_MD_READ_DEC, NULL, NULL, NULL, NULL) < 0)
+ HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
+#endif /* H5_HAVE_PARALLEL */
done:
FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5P_lacc_reg_prop() */
+} /* end H5P__lacc_reg_prop() */
+
+/*-------------------------------------------------------------------------
+ * Function: H5P__lacc_elink_fapl_set
+ *
+ * Purpose: Copies an external link FAPL property when it's set for a property list
+ *
+ * Return: Success: Non-negative
+ * Failure: Negative
+ *
+ * Programmer: Quincey Koziol
+ * Wednesday, Sept 2, 2015
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5P__lacc_elink_fapl_set(hid_t H5_ATTR_UNUSED prop_id, const char H5_ATTR_UNUSED *name,
+ size_t H5_ATTR_UNUSED size, void *value)
+{
+ hid_t l_fapl_id;
+ herr_t ret_value = SUCCEED;
+
+ FUNC_ENTER_PACKAGE
+
+ /* Sanity check */
+ HDassert(value);
+
+ /* Get the FAPL ID */
+ l_fapl_id = *(const hid_t *)value;
+
+ /* Duplicate the FAPL, if it's non-default */
+ if (l_fapl_id != H5P_DEFAULT) {
+ H5P_genplist_t *l_fapl_plist;
+
+ if (NULL == (l_fapl_plist = (H5P_genplist_t *)H5P_object_verify(l_fapl_id, H5P_FILE_ACCESS)))
+ HGOTO_ERROR(H5E_PLIST, H5E_BADTYPE, FAIL, "can't get property list")
+ if (((*(hid_t *)value) = H5P_copy_plist(l_fapl_plist, FALSE)) < 0)
+ HGOTO_ERROR(H5E_PLIST, H5E_CANTCOPY, FAIL, "unable to copy file access property list")
+ } /* end if */
+
+done:
+ FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5P__lacc_elink_fapl_set() */
+
+/*-------------------------------------------------------------------------
+ * Function: H5P__lacc_elink_fapl_get
+ *
+ * Purpose: Copies an external link FAPL property when it's retrieved from a property list
+ *
+ * Return: Success: Non-negative
+ * Failure: Negative
+ *
+ * Programmer: Quincey Koziol
+ * Wednesday, Sept 2, 2015
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5P__lacc_elink_fapl_get(hid_t H5_ATTR_UNUSED prop_id, const char H5_ATTR_UNUSED *name,
+ size_t H5_ATTR_UNUSED size, void *value)
+{
+ hid_t l_fapl_id;
+ herr_t ret_value = SUCCEED;
+
+ FUNC_ENTER_PACKAGE
+
+ /* Sanity check */
+ HDassert(value);
+
+ /* Get the FAPL ID */
+ l_fapl_id = *(const hid_t *)value;
+
+ /* Duplicate the FAPL, if it's non-default */
+ if (l_fapl_id != H5P_DEFAULT) {
+ H5P_genplist_t *l_fapl_plist;
+
+ if (NULL == (l_fapl_plist = (H5P_genplist_t *)H5P_object_verify(l_fapl_id, H5P_FILE_ACCESS)))
+ HGOTO_ERROR(H5E_PLIST, H5E_BADTYPE, FAIL, "can't get property list")
+ if (((*(hid_t *)value) = H5P_copy_plist(l_fapl_plist, FALSE)) < 0)
+ HGOTO_ERROR(H5E_PLIST, H5E_CANTCOPY, FAIL, "unable to copy file access property list")
+ } /* end if */
+
+done:
+ FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5P__lacc_elink_fapl_get() */
+
+/*-------------------------------------------------------------------------
+ * Function: H5P__lacc_elink_fapl_enc
+ *
+ * Purpose: Callback routine which is called whenever the elink FAPL
+ * property in the dataset access property list is
+ * encoded.
+ *
+ * Return: Success: Non-negative
+ * Failure: Negative
+ *
+ * Programmer: Quincey Koziol
+ * Wednesday, August 15, 2012
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5P__lacc_elink_fapl_enc(const void *value, void **_pp, size_t *size)
+{
+ const hid_t *elink_fapl = (const hid_t *)value; /* Property to encode */
+ uint8_t **pp = (uint8_t **)_pp;
+ H5P_genplist_t *fapl_plist; /* Pointer to property list */
+ hbool_t non_default_fapl = FALSE; /* Whether the FAPL is non-default */
+ size_t fapl_size = 0; /* FAPL's encoded size */
+ herr_t ret_value = SUCCEED; /* Return value */
+
+ FUNC_ENTER_PACKAGE
+
+ /* Check for non-default FAPL */
+ if (*elink_fapl != H5P_DEFAULT) {
+ if (NULL == (fapl_plist = (H5P_genplist_t *)H5P_object_verify(*elink_fapl, H5P_FILE_ACCESS)))
+ HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get property list")
+ non_default_fapl = TRUE;
+ } /* end if */
+
+ if (NULL != *pp) {
+ /* Store whether the FAPL is non-default */
+ *(*pp)++ = (uint8_t)non_default_fapl;
+ } /* end if */
+
+ /* Encode the property list, if non-default */
+ /* (if *pp == NULL, will only compute the size) */
+ if (non_default_fapl) {
+ if (H5P__encode(fapl_plist, TRUE, NULL, &fapl_size) < 0)
+ HGOTO_ERROR(H5E_PLIST, H5E_CANTENCODE, FAIL, "can't encode property list")
+
+ if (*pp) {
+ uint64_t enc_value;
+ unsigned enc_size;
+
+ /* encode the length of the plist */
+ enc_value = (uint64_t)fapl_size;
+ enc_size = H5VM_limit_enc_size(enc_value);
+ HDassert(enc_size < 256);
+ *(*pp)++ = (uint8_t)enc_size;
+ UINT64ENCODE_VAR(*pp, enc_value, enc_size);
+
+ /* encode the plist */
+ if (H5P__encode(fapl_plist, TRUE, *pp, &fapl_size) < 0)
+ HGOTO_ERROR(H5E_PLIST, H5E_CANTENCODE, FAIL, "can't encode property list")
+
+ *pp += fapl_size;
+ }
+ fapl_size += (1 + H5VM_limit_enc_size((uint64_t)fapl_size));
+ } /* end if */
+
+ *size += (1 + fapl_size); /* Non-default flag, plus encoded property list size */
+
+done:
+ FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5P__lacc_elink_fapl_enc() */
+
+/*-------------------------------------------------------------------------
+ * Function: H5P__lacc_elink_fapl_dec
+ *
+ * Purpose: Callback routine which is called whenever the elink FAPL
+ * property in the dataset access property list is
+ * decoded.
+ *
+ * Return: Success: Non-negative
+ * Failure: Negative
+ *
+ * Programmer: Quincey Koziol
+ * Wednesday, August 15, 2012
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5P__lacc_elink_fapl_dec(const void **_pp, void *_value)
+{
+ hid_t *elink_fapl = (hid_t *)_value; /* The elink FAPL value */
+ const uint8_t **pp = (const uint8_t **)_pp;
+ hbool_t non_default_fapl; /* Whether the FAPL is non-default */
+ herr_t ret_value = SUCCEED; /* Return value */
+
+ FUNC_ENTER_PACKAGE
+
+ /* Sanity check */
+ HDassert(pp);
+ HDassert(*pp);
+ HDassert(elink_fapl);
+ HDcompile_assert(sizeof(size_t) <= sizeof(uint64_t));
+
+ /* Determine if the FAPL is non-default */
+ non_default_fapl = (hbool_t) * (*pp)++;
+
+ if (non_default_fapl) {
+ size_t fapl_size = 0; /* Encoded size of property list */
+ unsigned enc_size;
+ uint64_t enc_value;
+
+ /* Decode the plist length */
+ enc_size = *(*pp)++;
+ HDassert(enc_size < 256);
+ UINT64DECODE_VAR(*pp, enc_value, enc_size);
+ fapl_size = (size_t)enc_value;
+
+ /* Decode the property list */
+ if ((*elink_fapl = H5P__decode(*pp)) < 0)
+ HGOTO_ERROR(H5E_PLIST, H5E_CANTDECODE, FAIL, "can't decode property")
+
+ *pp += fapl_size;
+ } /* end if */
+ else
+ *elink_fapl = H5P_DEFAULT;
+
+done:
+ FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5P__lacc_elink_fapl_dec() */
-
/*--------------------------------------------------------------------------
- * Function: H5P_lacc_elink_fapl_del
+ * Function: H5P__lacc_elink_fapl_del
*
- * Purpose: Close the FAPL for link access
+ * Purpose: Close the FAPL for link access
*
- * Return: Success: Non-negative
- * Failure: Negative
+ * Return: Success: Non-negative
+ * Failure: Negative
*
- * Programmer: Vailin Choi
- * Tuesday, Sept 23, 2008
+ * Programmer: Vailin Choi
+ * Tuesday, Sept 23, 2008
*
*--------------------------------------------------------------------------
*/
-/* ARGSUSED */
static herr_t
-H5P_lacc_elink_fapl_del(hid_t UNUSED prop_id, const char UNUSED *name, size_t UNUSED size, void *value)
+H5P__lacc_elink_fapl_del(hid_t H5_ATTR_UNUSED prop_id, const char H5_ATTR_UNUSED *name,
+ size_t H5_ATTR_UNUSED size, void *value)
{
- hid_t l_fapl_id;
- herr_t ret_value = SUCCEED;
+ hid_t l_fapl_id;
+ herr_t ret_value = SUCCEED;
- FUNC_ENTER_NOAPI(FAIL)
+ FUNC_ENTER_PACKAGE
+ /* Sanity check */
HDassert(value);
+ /* Get the FAPL ID */
l_fapl_id = (*(const hid_t *)value);
- if((l_fapl_id > H5P_DEFAULT) && (H5I_dec_ref(l_fapl_id) < 0))
- HGOTO_ERROR(H5E_PLIST, H5E_CANTRELEASE, FAIL, "unable to close atom for file access property list")
+ /* Close the FAPL */
+ if (l_fapl_id != H5P_DEFAULT && H5I_dec_ref(l_fapl_id) < 0)
+ HGOTO_ERROR(H5E_PLIST, H5E_CANTRELEASE, FAIL, "unable to close ID for file access property list")
done:
FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5P_lacc_elink_fapl_del() */
+} /* end H5P__lacc_elink_fapl_del() */
-
/*--------------------------------------------------------------------------
- * Function: H5P_lacc_elink_fapl_copy
+ * Function: H5P__lacc_elink_fapl_copy
*
- * Purpose: Copy the FAPL for link access
+ * Purpose: Copy the FAPL for link access
*
- * Return: Success: Non-negative
- * Failure: Negative
+ * Return: Success: Non-negative
+ * Failure: Negative
*
- * Programmer: Vailin Choi
- * Tuesday, Sept 23, 2008
+ * Programmer: Vailin Choi
+ * Tuesday, Sept 23, 2008
*
*--------------------------------------------------------------------------
*/
-/* ARGSUSED */
static herr_t
-H5P_lacc_elink_fapl_copy(const char UNUSED *name, size_t UNUSED size, void *value)
+H5P__lacc_elink_fapl_copy(const char H5_ATTR_UNUSED *name, size_t H5_ATTR_UNUSED size, void *value)
{
- hid_t l_fapl_id;
- herr_t ret_value = SUCCEED;
+ hid_t l_fapl_id;
+ herr_t ret_value = SUCCEED;
- FUNC_ENTER_NOAPI(FAIL)
+ FUNC_ENTER_PACKAGE
+ /* Sanity check */
HDassert(value);
+ /* Get the FAPL ID */
l_fapl_id = (*(const hid_t *)value);
- if(l_fapl_id > H5P_DEFAULT) {
+ /* Duplicate the FAPL, if it's non-default */
+ if (l_fapl_id != H5P_DEFAULT) {
H5P_genplist_t *l_fapl_plist;
- if(NULL == (l_fapl_plist = (H5P_genplist_t *)H5P_object_verify(l_fapl_id, H5P_FILE_ACCESS)))
- HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "can't get property list")
+ if (NULL == (l_fapl_plist = (H5P_genplist_t *)H5P_object_verify(l_fapl_id, H5P_FILE_ACCESS)))
+ HGOTO_ERROR(H5E_PLIST, H5E_BADTYPE, FAIL, "can't get property list")
+ if (((*(hid_t *)value) = H5P_copy_plist(l_fapl_plist, FALSE)) < 0)
+ HGOTO_ERROR(H5E_PLIST, H5E_CANTCOPY, FAIL, "unable to copy file access property list")
+ } /* end if */
+
+done:
+ FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5P__lacc_elink_fapl_copy() */
- if(((*(hid_t *)value) = H5P_copy_plist(l_fapl_plist, FALSE)) < 0)
- HGOTO_ERROR(H5E_INTERNAL, H5E_CANTINIT, FAIL, "unable to copy file access properties")
+/*-------------------------------------------------------------------------
+ * Function: H5P__lacc_elink_fapl_cmp
+ *
+ * Purpose: Callback routine which is called whenever the elink FAPL
+ * property in the link access property list is
+ * compared.
+ *
+ * Return: zero if VALUE1 and VALUE2 are equal, non zero otherwise.
+ *
+ * Programmer: Quincey Koziol
+ * Wednesday, August 15, 2012
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+H5P__lacc_elink_fapl_cmp(const void *value1, const void *value2, size_t H5_ATTR_UNUSED size)
+{
+ const hid_t *fapl1 = (const hid_t *)value1;
+ const hid_t *fapl2 = (const hid_t *)value2;
+ H5P_genplist_t *obj1, *obj2; /* Property lists to compare */
+ int ret_value = 0;
+
+ FUNC_ENTER_PACKAGE_NOERR
+
+ /* Check for comparison with default value */
+ if (*fapl1 == 0 && *fapl2 > 0)
+ HGOTO_DONE(1);
+ if (*fapl1 > 0 && *fapl2 == 0)
+ HGOTO_DONE(-1);
+
+ /* Get the property list objects */
+ obj1 = (H5P_genplist_t *)H5I_object(*fapl1);
+ obj2 = (H5P_genplist_t *)H5I_object(*fapl2);
+
+ /* Check for NULL property lists */
+ if (obj1 == NULL && obj2 != NULL)
+ HGOTO_DONE(1);
+ if (obj1 != NULL && obj2 == NULL)
+ HGOTO_DONE(-1);
+ if (obj1 && obj2) {
+ herr_t H5_ATTR_NDEBUG_UNUSED status;
+
+ status = H5P__cmp_plist(obj1, obj2, &ret_value);
+ HDassert(status >= 0);
} /* end if */
done:
FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5P_lacc_elink_fapl_copy() */
+} /* end H5P__lacc_elink_fapl_cmp() */
-
/*--------------------------------------------------------------------------
- * Function: H5P_lacc_elink_fapl_close
+ * Function: H5P__lacc_elink_fapl_close
*
- * Purpose: Close the FAPL for link access
+ * Purpose: Close the FAPL for link access
*
- * Return: Success: Non-negative
- * Failure: Negative
+ * Return: Success: Non-negative
+ * Failure: Negative
*
- * Programmer: Vailin Choi
- * Tuesday, Sept 23, 2008
+ * Programmer: Vailin Choi
+ * Tuesday, Sept 23, 2008
*
*---------------------------------------------------------------------------
*/
-/* ARGSUSED */
static herr_t
-H5P_lacc_elink_fapl_close(const char UNUSED *name, size_t UNUSED size, void *value)
+H5P__lacc_elink_fapl_close(const char H5_ATTR_UNUSED *name, size_t H5_ATTR_UNUSED size, void *value)
{
- hid_t l_fapl_id;
- herr_t ret_value = SUCCEED;
+ hid_t l_fapl_id;
+ herr_t ret_value = SUCCEED;
- FUNC_ENTER_NOAPI_NOINIT
+ FUNC_ENTER_PACKAGE
+ /* Sanity check */
HDassert(value);
+ /* Get the FAPL ID */
l_fapl_id = (*(const hid_t *)value);
- if((l_fapl_id > H5P_DEFAULT) && (H5I_dec_ref(l_fapl_id) < 0))
- HGOTO_ERROR(H5E_PLIST, H5E_CANTRELEASE, FAIL, "unable to close atom for file access property list")
+
+ /* Close the FAPL */
+ if ((l_fapl_id > H5P_DEFAULT) && (H5I_dec_ref(l_fapl_id) < 0))
+ HGOTO_ERROR(H5E_PLIST, H5E_CANTRELEASE, FAIL, "unable to close ID for file access property list")
+
+done:
+ FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5P__lacc_elink_fapl_close() */
+
+/*-------------------------------------------------------------------------
+ * Function: H5P__lacc_elink_pref_set
+ *
+ * Purpose: Copies an external link prefix property when it's set for a property list
+ *
+ * Return: Success: Non-negative
+ * Failure: Negative
+ *
+ * Programmer: Quincey Koziol
+ * Wednesday, Sept 2, 2015
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5P__lacc_elink_pref_set(hid_t H5_ATTR_UNUSED prop_id, const char H5_ATTR_UNUSED *name,
+ size_t H5_ATTR_UNUSED size, void *value)
+{
+ FUNC_ENTER_PACKAGE_NOERR
+
+ /* Sanity check */
+ HDassert(value);
+
+ /* Copy the prefix */
+ *(char **)value = H5MM_xstrdup(*(const char **)value);
+
+ FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5P__lacc_elink_pref_set() */
+
+/*-------------------------------------------------------------------------
+ * Function: H5P__lacc_elink_pref_get
+ *
+ * Purpose: Copies an external link prefix property when it's retrieved from a property list
+ *
+ * Return: Success: Non-negative
+ * Failure: Negative
+ *
+ * Programmer: Quincey Koziol
+ * Wednesday, Sept 2, 2015
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5P__lacc_elink_pref_get(hid_t H5_ATTR_UNUSED prop_id, const char H5_ATTR_UNUSED *name,
+ size_t H5_ATTR_UNUSED size, void *value)
+{
+ FUNC_ENTER_PACKAGE_NOERR
+
+ /* Sanity check */
+ HDassert(value);
+
+ /* Copy the prefix */
+ *(char **)value = H5MM_xstrdup(*(const char **)value);
+
+ FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5P__lacc_elink_pref_get() */
+
+/*-------------------------------------------------------------------------
+ * Function: H5P__lacc_elink_pref_enc
+ *
+ * Purpose: Callback routine which is called whenever the elink flags
+ * property in the dataset access property list is
+ * encoded.
+ *
+ * Return: Success: Non-negative
+ * Failure: Negative
+ *
+ * Programmer: Mohamad Chaarawi
+ * Monday, October 10, 2011
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5P__lacc_elink_pref_enc(const void *value, void **_pp, size_t *size)
+{
+ const char *elink_pref = *(const char *const *)value;
+ uint8_t **pp = (uint8_t **)_pp;
+ size_t len = 0;
+ uint64_t enc_value;
+ unsigned enc_size;
+
+ FUNC_ENTER_PACKAGE_NOERR
+
+ HDcompile_assert(sizeof(size_t) <= sizeof(uint64_t));
+
+ /* calculate prefix length */
+ if (NULL != elink_pref)
+ len = HDstrlen(elink_pref);
+
+ enc_value = (uint64_t)len;
+ enc_size = H5VM_limit_enc_size(enc_value);
+ HDassert(enc_size < 256);
+
+ if (NULL != *pp) {
+ /* encode the length of the prefix */
+ *(*pp)++ = (uint8_t)enc_size;
+ UINT64ENCODE_VAR(*pp, enc_value, enc_size);
+
+ /* encode the prefix */
+ if (NULL != elink_pref) {
+ H5MM_memcpy(*(char **)pp, elink_pref, len);
+ *pp += len;
+ } /* end if */
+ } /* end if */
+
+ *size += (1 + enc_size);
+ if (NULL != elink_pref)
+ *size += len;
+
+ FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5P__lacc_elink_pref_enc() */
+
+/*-------------------------------------------------------------------------
+ * Function: H5P__lacc_elink_pref_dec
+ *
+ * Purpose: Callback routine which is called whenever the elink prefix
+ * property in the dataset access property list is
+ * decoded.
+ *
+ * Return: Success: Non-negative
+ * Failure: Negative
+ *
+ * Programmer: Mohamad Chaarawi
+ * Monday, October 10, 2011
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5P__lacc_elink_pref_dec(const void **_pp, void *_value)
+{
+ char **elink_pref = (char **)_value;
+ const uint8_t **pp = (const uint8_t **)_pp;
+ size_t len;
+ uint64_t enc_value; /* Decoded property value */
+ unsigned enc_size; /* Size of encoded property */
+ herr_t ret_value = SUCCEED;
+
+ FUNC_ENTER_PACKAGE
+
+ HDassert(pp);
+ HDassert(*pp);
+ HDassert(elink_pref);
+ HDcompile_assert(sizeof(size_t) <= sizeof(uint64_t));
+
+ /* Decode the size */
+ enc_size = *(*pp)++;
+ HDassert(enc_size < 256);
+
+ /* Decode the value */
+ UINT64DECODE_VAR(*pp, enc_value, enc_size);
+ len = (size_t)enc_value;
+
+ if (0 != len) {
+ /* Make a copy of the user's prefix string */
+ if (NULL == (*elink_pref = (char *)H5MM_malloc(len + 1)))
+ HGOTO_ERROR(H5E_RESOURCE, H5E_CANTINIT, FAIL, "memory allocation failed for prefix")
+ HDstrncpy(*elink_pref, *(const char **)pp, len);
+ (*elink_pref)[len] = '\0';
+
+ *pp += len;
+ } /* end if */
+ else
+ *elink_pref = NULL;
done:
FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5P_lacc_elink_fapl_close() */
+} /* end H5P__lacc_elink_pref_dec() */
-
/*-------------------------------------------------------------------------
- * Function: H5P_lacc_elink_pref_del
+ * Function: H5P__lacc_elink_pref_del
*
* Purpose: Frees memory used to store the external link prefix string
*
@@ -302,22 +788,21 @@ done:
*
*-------------------------------------------------------------------------
*/
-/* ARGSUSED */
static herr_t
-H5P_lacc_elink_pref_del(hid_t UNUSED prop_id, const char UNUSED *name, size_t UNUSED size, void *value)
+H5P__lacc_elink_pref_del(hid_t H5_ATTR_UNUSED prop_id, const char H5_ATTR_UNUSED *name,
+ size_t H5_ATTR_UNUSED size, void *value)
{
- FUNC_ENTER_NOAPI_NOINIT_NOERR
+ FUNC_ENTER_PACKAGE_NOERR
HDassert(value);
H5MM_xfree(*(void **)value);
FUNC_LEAVE_NOAPI(SUCCEED)
-} /* end H5P_lacc_elink_pref_del() */
+} /* end H5P__lacc_elink_pref_del() */
-
/*-------------------------------------------------------------------------
- * Function: H5P_lacc_elink_pref_copy
+ * Function: H5P__lacc_elink_pref_copy
*
* Purpose: Creates a copy of the external link prefix string
*
@@ -328,22 +813,54 @@ H5P_lacc_elink_pref_del(hid_t UNUSED prop_id, const char UNUSED *name, size_t UN
*
*-------------------------------------------------------------------------
*/
-/* ARGSUSED */
static herr_t
-H5P_lacc_elink_pref_copy(const char UNUSED *name, size_t UNUSED size, void *value)
+H5P__lacc_elink_pref_copy(const char H5_ATTR_UNUSED *name, size_t H5_ATTR_UNUSED size, void *value)
{
- FUNC_ENTER_NOAPI_NOINIT_NOERR
+ FUNC_ENTER_PACKAGE_NOERR
HDassert(value);
*(char **)value = H5MM_xstrdup(*(const char **)value);
FUNC_LEAVE_NOAPI(SUCCEED)
-} /* end H5P_lacc_elink_pref_copy() */
+} /* end H5P__lacc_elink_pref_copy() */
+
+/*-------------------------------------------------------------------------
+ * Function: H5P__lacc_elink_pref_cmp
+ *
+ * Purpose: Callback routine which is called whenever the elink prefix
+ * property in the dataset creation property list is
+ * compared.
+ *
+ * Return: zero if VALUE1 and VALUE2 are equal, non zero otherwise.
+ *
+ * Programmer: Mohamad Chaarawi
+ * Thursday, November 3, 2011
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+H5P__lacc_elink_pref_cmp(const void *value1, const void *value2, size_t H5_ATTR_UNUSED size)
+{
+ const char *pref1 = *(const char *const *)value1;
+ const char *pref2 = *(const char *const *)value2;
+ int ret_value = 0;
+
+ FUNC_ENTER_PACKAGE_NOERR
+
+ if (NULL == pref1 && NULL != pref2)
+ HGOTO_DONE(1);
+ if (NULL != pref1 && NULL == pref2)
+ HGOTO_DONE(-1);
+ if (NULL != pref1 && NULL != pref2)
+ ret_value = HDstrcmp(pref1, pref2);
+
+done:
+ FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5P__lacc_elink_pref_cmp() */
-
/*-------------------------------------------------------------------------
- * Function: H5P_lacc_elink_pref_close
+ * Function: H5P__lacc_elink_pref_close
*
* Purpose: Frees memory used to store the external link prefix string
*
@@ -354,20 +871,18 @@ H5P_lacc_elink_pref_copy(const char UNUSED *name, size_t UNUSED size, void *valu
*
*-------------------------------------------------------------------------
*/
-/* ARGSUSED */
static herr_t
-H5P_lacc_elink_pref_close(const char UNUSED *name, size_t UNUSED size, void *value)
+H5P__lacc_elink_pref_close(const char H5_ATTR_UNUSED *name, size_t H5_ATTR_UNUSED size, void *value)
{
- FUNC_ENTER_NOAPI_NOINIT_NOERR
+ FUNC_ENTER_PACKAGE_NOERR
HDassert(value);
H5MM_xfree(*(void **)value);
FUNC_LEAVE_NOAPI(SUCCEED)
-} /* end H5P_lacc_elink_pref_close() */
+} /* end H5P__lacc_elink_pref_close() */
-
/*-------------------------------------------------------------------------
* Function: H5Pset_nlinks
*
@@ -392,28 +907,27 @@ H5P_lacc_elink_pref_close(const char UNUSED *name, size_t UNUSED size, void *val
herr_t
H5Pset_nlinks(hid_t plist_id, size_t nlinks)
{
- H5P_genplist_t *plist; /* Property list pointer */
- herr_t ret_value = SUCCEED; /* Return value */
+ H5P_genplist_t *plist; /* Property list pointer */
+ herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_API(FAIL)
H5TRACE2("e", "iz", plist_id, nlinks);
- if(nlinks <= 0)
+ if (nlinks <= 0)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "number of links must be positive");
/* Get the plist structure */
- if(NULL == (plist = H5P_object_verify(plist_id, H5P_LINK_ACCESS)))
- HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
+ if (NULL == (plist = H5P_object_verify(plist_id, H5P_LINK_ACCESS)))
+ HGOTO_ERROR(H5E_ID, H5E_BADID, FAIL, "can't find object for ID")
/* Set number of links */
- if(H5P_set(plist, H5L_ACS_NLINKS_NAME, &nlinks) < 0)
+ if (H5P_set(plist, H5L_ACS_NLINKS_NAME, &nlinks) < 0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set nlink info")
done:
FUNC_LEAVE_API(ret_value)
} /* end H5Pset_nlinks() */
-
/*-------------------------------------------------------------------------
* Function: H5Pget_nlinks
*
@@ -431,30 +945,29 @@ done:
*-------------------------------------------------------------------------
*/
herr_t
-H5Pget_nlinks(hid_t plist_id, size_t *nlinks)
+H5Pget_nlinks(hid_t plist_id, size_t *nlinks /*out*/)
{
- H5P_genplist_t *plist; /* Property list pointer */
- herr_t ret_value = SUCCEED; /* Return value */
+ H5P_genplist_t *plist; /* Property list pointer */
+ herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_API(FAIL)
- H5TRACE2("e", "i*z", plist_id, nlinks);
+ H5TRACE2("e", "ix", plist_id, nlinks);
- if(!nlinks)
+ if (!nlinks)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid pointer passed in");
/* Get the plist structure */
- if(NULL == (plist = H5P_object_verify(plist_id, H5P_LINK_ACCESS)))
- HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
+ if (NULL == (plist = H5P_object_verify(plist_id, H5P_LINK_ACCESS)))
+ HGOTO_ERROR(H5E_ID, H5E_BADID, FAIL, "can't find object for ID")
/* Get the current number of links */
- if(H5P_get(plist, H5L_ACS_NLINKS_NAME, nlinks) < 0)
+ if (H5P_get(plist, H5L_ACS_NLINKS_NAME, nlinks) < 0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get number of links")
done:
FUNC_LEAVE_API(ret_value)
}
-
/*-------------------------------------------------------------------------
* Function: H5Pset_elink_prefix
*
@@ -472,37 +985,24 @@ done:
herr_t
H5Pset_elink_prefix(hid_t plist_id, const char *prefix)
{
- H5P_genplist_t *plist; /* Property list pointer */
- char *my_prefix; /* Copy of prefix string */
- herr_t ret_value = SUCCEED; /* Return value */
+ H5P_genplist_t *plist; /* Property list pointer */
+ herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_API(FAIL)
H5TRACE2("e", "i*s", plist_id, prefix);
/* Get the plist structure */
- if(NULL == (plist = H5P_object_verify(plist_id, H5P_LINK_ACCESS)))
- HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
-
- /* Get current prefix value */
- if(H5P_get(plist, H5L_ACS_ELINK_PREFIX_NAME, &my_prefix) < 0)
- HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get prefix info")
-
- /* Free existing prefix, if there is one */
- H5MM_xfree(my_prefix);
-
- /* Make a copy of the user's prefix string */
- if(NULL == (my_prefix = H5MM_xstrdup(prefix)))
- HGOTO_ERROR(H5E_PLIST, H5E_CANTCOPY, FAIL, "can't copy prefix")
+ if (NULL == (plist = H5P_object_verify(plist_id, H5P_LINK_ACCESS)))
+ HGOTO_ERROR(H5E_ID, H5E_BADID, FAIL, "can't find object for ID")
/* Set prefix */
- if(H5P_set(plist, H5L_ACS_ELINK_PREFIX_NAME, &my_prefix) < 0)
+ if (H5P_set(plist, H5L_ACS_ELINK_PREFIX_NAME, &prefix) < 0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set prefix info")
done:
FUNC_LEAVE_API(ret_value)
} /* end H5Pset_elink_prefix() */
-
/*-------------------------------------------------------------------------
* Function: H5Pget_elink_prefix
*
@@ -520,34 +1020,34 @@ done:
*-------------------------------------------------------------------------
*/
ssize_t
-H5Pget_elink_prefix(hid_t plist_id, char *prefix, size_t size)
+H5Pget_elink_prefix(hid_t plist_id, char *prefix /*out*/, size_t size)
{
- H5P_genplist_t *plist; /* Property list pointer */
- char *my_prefix; /* Library's copy of the prefix */
- size_t len; /* Length of prefix string */
- ssize_t ret_value; /* Return value */
+ H5P_genplist_t *plist; /* Property list pointer */
+ char *my_prefix; /* Library's copy of the prefix */
+ size_t len; /* Length of prefix string */
+ ssize_t ret_value; /* Return value */
FUNC_ENTER_API(FAIL)
- H5TRACE3("Zs", "i*sz", plist_id, prefix, size);
+ H5TRACE3("Zs", "ixz", plist_id, prefix, size);
/* Get the plist structure */
- if(NULL == (plist = H5P_object_verify(plist_id, H5P_LINK_ACCESS)))
- HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
+ if (NULL == (plist = H5P_object_verify(plist_id, H5P_LINK_ACCESS)))
+ HGOTO_ERROR(H5E_ID, H5E_BADID, FAIL, "can't find object for ID")
/* Get the current prefix */
- if(H5P_get(plist, H5L_ACS_ELINK_PREFIX_NAME, &my_prefix) < 0)
+ if (H5P_peek(plist, H5L_ACS_ELINK_PREFIX_NAME, &my_prefix) < 0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get external link prefix")
/* Check for prefix being set */
- if(my_prefix) {
+ if (my_prefix) {
/* Copy to user's buffer, if given */
len = HDstrlen(my_prefix);
- if(prefix) {
- HDstrncpy(prefix, my_prefix, MIN(len + 1, size));
- if(len >= size)
+ if (prefix) {
+ HDstrncpy(prefix, my_prefix, size);
+ if (len >= size)
prefix[size - 1] = '\0';
} /* end if */
- } /* end if */
+ } /* end if */
else
len = 0;
@@ -573,41 +1073,24 @@ done:
herr_t
H5Pset_elink_fapl(hid_t lapl_id, hid_t fapl_id)
{
- H5P_genplist_t *plist, *fapl_plist; /* Property list pointer */
- hid_t l_fapl_id, new_fapl_id;
- herr_t ret_value = SUCCEED; /* Return value */
+ H5P_genplist_t *plist; /* Property list pointer */
+ herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_API(FAIL)
H5TRACE2("e", "ii", lapl_id, fapl_id);
/* Check arguments */
- if(NULL == (plist = H5P_object_verify(lapl_id, H5P_LINK_ACCESS)))
+ if (NULL == (plist = H5P_object_verify(lapl_id, H5P_LINK_ACCESS)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a link access property list");
- /* Get the current file access property list for the link access */
- if(H5P_get(plist, H5L_ACS_ELINK_FAPL_NAME, &l_fapl_id) < 0)
- HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get fapl")
-
- /* Close the current file access property list if set */
- if((l_fapl_id > H5P_DEFAULT) && (H5I_dec_ref(l_fapl_id) < 0))
- HGOTO_ERROR(H5E_PLIST, H5E_CANTRELEASE, FAIL, "unable to close atom for file access property list")
-
- if(NULL == (fapl_plist = H5P_object_verify(fapl_id, H5P_FILE_ACCESS)))
- HGOTO_ERROR(H5E_PLIST, H5E_BADTYPE, FAIL, "not a file access property list");
-
- /* Make a copy of the property list for FAPL_ID */
- if((new_fapl_id = H5P_copy_plist(fapl_plist, FALSE)) < 0)
- HGOTO_ERROR(H5E_PLIST, H5E_CANTINIT, FAIL, "unable to copy file access properties")
-
/* Set the file access property list for the link access */
- if(H5P_set(plist, H5L_ACS_ELINK_FAPL_NAME, &new_fapl_id) < 0)
+ if (H5P_set(plist, H5L_ACS_ELINK_FAPL_NAME, &fapl_id) < 0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set fapl for link")
done:
FUNC_LEAVE_API(ret_value)
} /* end H5Pset_elink_fapl() */
-
/*-------------------------------------------------------------------------
* Function: H5Pget_elink_fapl
*
@@ -624,34 +1107,23 @@ done:
hid_t
H5Pget_elink_fapl(hid_t lapl_id)
{
- H5P_genplist_t *plist, *fapl_plist; /* Property list pointer */
- hid_t l_fapl_id;
- hid_t ret_value=FAIL; /* Return value */
+ H5P_genplist_t *plist; /* Property list pointer */
+ hid_t ret_value; /* Return value */
FUNC_ENTER_API(FAIL)
H5TRACE1("i", "i", lapl_id);
/* Get the plist structure */
- if(NULL == (plist = H5P_object_verify(lapl_id, H5P_LINK_ACCESS)))
- HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
+ if (NULL == (plist = H5P_object_verify(lapl_id, H5P_LINK_ACCESS)))
+ HGOTO_ERROR(H5E_ID, H5E_BADID, FAIL, "can't find object for ID")
- if(H5P_get(plist, H5L_ACS_ELINK_FAPL_NAME, &l_fapl_id) < 0)
+ if (H5P_get(plist, H5L_ACS_ELINK_FAPL_NAME, &ret_value) < 0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get fapl for links")
- if(l_fapl_id > H5P_DEFAULT) {
- if(NULL==(fapl_plist = H5P_object_verify(l_fapl_id, H5P_FILE_ACCESS)))
- HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a file access property list");
-
- if((ret_value = H5P_copy_plist(fapl_plist, TRUE)) < 0)
- HGOTO_ERROR(H5E_INTERNAL, H5E_CANTINIT, FAIL, "unable to copy file access properties")
- } else
- ret_value = l_fapl_id;
-
done:
FUNC_LEAVE_API(ret_value);
} /* end H5Pget_elink_fapl() */
-
/*-------------------------------------------------------------------------
* Function: H5Pset_elink_acc_flags
*
@@ -659,7 +1131,7 @@ done:
* external link. This should be either H5F_ACC_RDONLY or
* H5F_ACC_RDWR, or H5F_ACC_DEFAULT to unset the value.
*
- * Return: Non-negative on success/Negative on failure
+ * Return: Non-negative on success/Negative on failure
*
* Programmer: Neil Fortner
* Tuesday, December 9, 2008
@@ -669,36 +1141,37 @@ done:
herr_t
H5Pset_elink_acc_flags(hid_t lapl_id, unsigned flags)
{
- H5P_genplist_t *plist; /* Property list pointer */
- herr_t ret_value = SUCCEED; /* Return value */
+ H5P_genplist_t *plist; /* Property list pointer */
+ herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_API(FAIL)
H5TRACE2("e", "iIu", lapl_id, flags);
/* Check that flags are valid */
- if((flags != H5F_ACC_RDWR) && (flags != H5F_ACC_RDONLY) && (flags != H5F_ACC_DEFAULT))
+ if ((flags != H5F_ACC_RDWR) && (flags != (H5F_ACC_RDWR | H5F_ACC_SWMR_WRITE)) &&
+ (flags != H5F_ACC_RDONLY) && (flags != (H5F_ACC_RDONLY | H5F_ACC_SWMR_READ)) &&
+ (flags != H5F_ACC_DEFAULT))
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid file open flags")
/* Get the plist structure */
- if(NULL == (plist = H5P_object_verify(lapl_id, H5P_LINK_ACCESS)))
- HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
+ if (NULL == (plist = H5P_object_verify(lapl_id, H5P_LINK_ACCESS)))
+ HGOTO_ERROR(H5E_ID, H5E_BADID, FAIL, "can't find object for ID")
/* Set flags */
- if(H5P_set(plist, H5L_ACS_ELINK_FLAGS_NAME, &flags) < 0)
+ if (H5P_set(plist, H5L_ACS_ELINK_FLAGS_NAME, &flags) < 0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set access flags")
done:
FUNC_LEAVE_API(ret_value)
} /* end H5Pset_elink_acc_flags() */
-
/*-------------------------------------------------------------------------
* Function: H5Pget_elink_acc_flags
*
* Purpose: Gets the file access flags to be used when traversing an
* external link.
*
- * Return: Non-negative on success/Negative on failure
+ * Return: Non-negative on success/Negative on failure
*
* Programmer: Neil Fortner
* Tuesday, December 9, 2008
@@ -706,28 +1179,27 @@ done:
*-------------------------------------------------------------------------
*/
herr_t
-H5Pget_elink_acc_flags(hid_t lapl_id, unsigned *flags)
+H5Pget_elink_acc_flags(hid_t lapl_id, unsigned *flags /*out*/)
{
- H5P_genplist_t *plist; /* Property list pointer */
- herr_t ret_value = SUCCEED; /* Return value */
+ H5P_genplist_t *plist; /* Property list pointer */
+ herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_API(FAIL)
- H5TRACE2("e", "i*Iu", lapl_id, flags);
+ H5TRACE2("e", "ix", lapl_id, flags);
/* Get the plist structure */
- if(NULL == (plist = H5P_object_verify(lapl_id, H5P_LINK_ACCESS)))
- HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
+ if (NULL == (plist = H5P_object_verify(lapl_id, H5P_LINK_ACCESS)))
+ HGOTO_ERROR(H5E_ID, H5E_BADID, FAIL, "can't find object for ID")
/* Get flags */
if (flags)
- if(H5P_get(plist, H5L_ACS_ELINK_FLAGS_NAME, flags)<0)
+ if (H5P_get(plist, H5L_ACS_ELINK_FLAGS_NAME, flags) < 0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, 0, "can't get access flags")
done:
FUNC_LEAVE_API(ret_value)
} /* end H5Pget_elink_acc_flags() */
-
/*-------------------------------------------------------------------------
* Function: H5Pset_elink_cb
*
@@ -735,7 +1207,7 @@ done:
* external link. This should be either H5F_ACC_RDONLY or
* H5F_ACC_RDWR.
*
- * Return: Non-negative on success/Negative on failure
+ * Return: Non-negative on success/Negative on failure
*
* Programmer: Neil Fortner
* Tuesday, December 15, 2008
@@ -745,42 +1217,41 @@ done:
herr_t
H5Pset_elink_cb(hid_t lapl_id, H5L_elink_traverse_t func, void *op_data)
{
- H5P_genplist_t *plist; /* Property list pointer */
- H5L_elink_cb_t cb_info; /* Callback info struct */
- herr_t ret_value = SUCCEED; /* Return value */
+ H5P_genplist_t *plist; /* Property list pointer */
+ H5L_elink_cb_t cb_info; /* Callback info struct */
+ herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_API(FAIL)
- H5TRACE3("e", "ix*x", lapl_id, func, op_data);
+ H5TRACE3("e", "iLt*x", lapl_id, func, op_data);
/* Check if the callback function is NULL and the user data is non-NULL.
* This is almost certainly an error as the user data will not be used. */
- if(!func && op_data)
+ if (!func && op_data)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "callback is NULL while user data is not")
/* Get the plist structure */
- if(NULL == (plist = H5P_object_verify(lapl_id, H5P_LINK_ACCESS)))
- HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
+ if (NULL == (plist = H5P_object_verify(lapl_id, H5P_LINK_ACCESS)))
+ HGOTO_ERROR(H5E_ID, H5E_BADID, FAIL, "can't find object for ID")
/* Populate the callback info struct */
- cb_info.func = func;
+ cb_info.func = func;
cb_info.user_data = op_data;
/* Set callback info */
- if(H5P_set(plist, H5L_ACS_ELINK_CB_NAME, &cb_info) < 0)
+ if (H5P_set(plist, H5L_ACS_ELINK_CB_NAME, &cb_info) < 0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set callback info")
done:
FUNC_LEAVE_API(ret_value)
} /* end H5Pset_elink_acc_flags() */
-
/*-------------------------------------------------------------------------
* Function: H5Pget_elink_cb
*
* Purpose: Gets the file access flags to be used when traversing an
* external link.
*
- * Return: Non-negative on success/Negative on failure
+ * Return: Non-negative on success/Negative on failure
*
* Programmer: Neil Fortner
* Tuesday, December 15, 2008
@@ -788,30 +1259,28 @@ done:
*-------------------------------------------------------------------------
*/
herr_t
-H5Pget_elink_cb(hid_t lapl_id, H5L_elink_traverse_t *func, void **op_data)
+H5Pget_elink_cb(hid_t lapl_id, H5L_elink_traverse_t *func /*out*/, void **op_data /*out*/)
{
- H5P_genplist_t *plist; /* Property list pointer */
- H5L_elink_cb_t cb_info; /* Callback info struct */
- herr_t ret_value = SUCCEED; /* Return value */
+ H5P_genplist_t *plist; /* Property list pointer */
+ H5L_elink_cb_t cb_info; /* Callback info struct */
+ herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_API(FAIL)
- H5TRACE3("e", "i*x**x", lapl_id, func, op_data);
+ H5TRACE3("e", "ixx", lapl_id, func, op_data);
/* Get the plist structure */
- if(NULL == (plist = H5P_object_verify(lapl_id, H5P_LINK_ACCESS)))
- HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
+ if (NULL == (plist = H5P_object_verify(lapl_id, H5P_LINK_ACCESS)))
+ HGOTO_ERROR(H5E_ID, H5E_BADID, FAIL, "can't find object for ID")
/* Get callback_info */
- if(H5P_get(plist, H5L_ACS_ELINK_CB_NAME, &cb_info)<0)
+ if (H5P_get(plist, H5L_ACS_ELINK_CB_NAME, &cb_info) < 0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get callback info")
- if(func)
+ if (func)
*func = cb_info.func;
-
- if(op_data)
+ if (op_data)
*op_data = cb_info.user_data;
done:
FUNC_LEAVE_API(ret_value)
} /* end H5Pget_elink_cb() */
-