summaryrefslogtreecommitdiffstats
path: root/src/H5P.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/H5P.c')
-rw-r--r--src/H5P.c1013
1 files changed, 615 insertions, 398 deletions
diff --git a/src/H5P.c b/src/H5P.c
index 89cadcf..2bf839b4 100644
--- a/src/H5P.c
+++ b/src/H5P.c
@@ -1,17 +1,17 @@
/****************************************************************************
-* NCSA HDF *
-* Software Development Group *
-* National Center for Supercomputing Applications *
-* University of Illinois at Urbana-Champaign *
-* 605 E. Springfield, Champaign IL 61820 *
-* *
-* For conditions of distribution and use, see the accompanying *
-* hdf/COPYING file. *
-* *
+* NCSA HDF *
+* Software Development Group *
+* National Center for Supercomputing Applications *
+* University of Illinois at Urbana-Champaign *
+* 605 E. Springfield, Champaign IL 61820 *
+* *
+* For conditions of distribution and use, see the accompanying *
+* hdf/COPYING file. *
+* *
****************************************************************************/
#ifdef RCSID
-static char RcsId[] = "@(#)$Revision$";
+static char RcsId[] = "@(#)$Revision$";
#endif
/* $Id$ */
@@ -19,23 +19,23 @@ static char RcsId[] = "@(#)$Revision$";
#include <stdarg.h>
/* Private header files */
-#include <H5private.h> /* Generic Functions */
-#include <H5Aprivate.h> /* Atoms */
-#include <H5Bprivate.h> /* B-tree subclass names */
-#include <H5Pprivate.h> /* Template information */
-#include <H5Dprivate.h> /* Datasets */
-#include <H5Eprivate.h> /* Error handling */
-#include <H5MMprivate.h> /* Memory management */
+#include <H5private.h> /* Generic Functions */
+#include <H5Aprivate.h> /* Atoms */
+#include <H5Bprivate.h> /* B-tree subclass names */
+#include <H5Dprivate.h> /* Datasets */
+#include <H5Eprivate.h> /* Error handling */
+#include <H5MMprivate.h> /* Memory management */
+#include <H5Pprivate.h> /* Property lists */
-#define PABLO_MASK H5P_mask
+#define PABLO_MASK H5P_mask
/* Is the interface initialized? */
-static hbool_t interface_initialize_g = FALSE;
+static hbool_t interface_initialize_g = FALSE;
#define INTERFACE_INIT H5P_init_interface
-static herr_t H5P_init_interface(void);
+static herr_t H5P_init_interface(void);
/* PRIVATE PROTOTYPES */
-static void H5P_term_interface(void);
+static void H5P_term_interface(void);
/*--------------------------------------------------------------------------
NAME
@@ -52,9 +52,9 @@ DESCRIPTION
static herr_t
H5P_init_interface(void)
{
- herr_t ret_value = SUCCEED;
- intn i;
- herr_t status;
+ herr_t ret_value = SUCCEED;
+ intn i;
+ herr_t status;
FUNC_ENTER(H5P_init_interface, FAIL);
@@ -76,21 +76,21 @@ H5P_init_interface(void)
* atom groups aren't.
*/
for (i = 0; i < H5P_NCLASSES; i++) {
- status = H5A_init_group((group_t)(H5_TEMPLATE_0 +i),
+ status = H5A_init_group((group_t)(H5_TEMPLATE_0 +i),
H5A_TEMPID_HASHSIZE, 0, NULL);
- if (status < 0) ret_value = FAIL;
+ if (status < 0) ret_value = FAIL;
}
if (ret_value < 0) {
- HRETURN_ERROR(H5E_ATOM, H5E_CANTINIT, FAIL,
- "unable to initialize atom group");
+ HRETURN_ERROR(H5E_ATOM, H5E_CANTINIT, FAIL,
+ "unable to initialize atom group");
}
/*
* Register cleanup function.
*/
if (H5_add_exit(H5P_term_interface) < 0) {
- HRETURN_ERROR(H5E_INTERNAL, H5E_CANTINIT, FAIL,
- "unable to install atexit function");
+ HRETURN_ERROR(H5E_INTERNAL, H5E_CANTINIT, FAIL,
+ "unable to install atexit function");
}
FUNC_LEAVE(ret_value);
@@ -116,10 +116,10 @@ H5P_init_interface(void)
static void
H5P_term_interface(void)
{
- intn i;
+ intn i;
for (i = 0; i < H5P_NCLASSES; i++) {
- H5A_destroy_group((group_t)(H5_TEMPLATE_0 + i));
+ H5A_destroy_group((group_t)(H5_TEMPLATE_0 + i));
}
}
@@ -130,13 +130,13 @@ H5P_term_interface(void)
Returns a copy of the default template for some class of templates.
USAGE
herr_t H5Pcreate (type)
- H5P_class_t type; IN: Template class whose default is desired.
+ H5P_class_t type; IN: Template class whose default is desired.
RETURNS
Template ID or FAIL
ERRORS
- ARGS BADVALUE Unknown template class.
- ATOM CANTINIT Can't register template.
+ ARGS BADVALUE Unknown template class.
+ ATOM CANTINIT Can't register template.
INTERNAL UNSUPPORTED Not implemented yet.
DESCRIPTION
@@ -145,8 +145,8 @@ H5P_term_interface(void)
hid_t
H5Pcreate(H5P_class_t type)
{
- hid_t ret_value = FAIL;
- void *tmpl = NULL;
+ hid_t ret_value = FAIL;
+ void *tmpl = NULL;
FUNC_ENTER(H5Pcreate, FAIL);
@@ -154,50 +154,50 @@ H5Pcreate(H5P_class_t type)
switch (type) {
case H5P_FILE_CREATE:
tmpl = H5MM_xmalloc(sizeof(H5F_create_t));
- memcpy(tmpl, &H5F_create_dflt, sizeof(H5F_create_t));
- break;
+ memcpy(tmpl, &H5F_create_dflt, sizeof(H5F_create_t));
+ break;
case H5P_FILE_ACCESS:
- tmpl = H5MM_xmalloc(sizeof(H5F_access_t));
- memcpy(tmpl, &H5F_access_dflt, sizeof(H5F_access_t));
- break;
+ tmpl = H5MM_xmalloc(sizeof(H5F_access_t));
+ memcpy(tmpl, &H5F_access_dflt, sizeof(H5F_access_t));
+ break;
case H5P_DATASET_CREATE:
- tmpl = H5MM_xmalloc(sizeof(H5D_create_t));
- memcpy(tmpl, &H5D_create_dflt, sizeof(H5D_create_t));
- break;
+ tmpl = H5MM_xmalloc(sizeof(H5D_create_t));
+ memcpy(tmpl, &H5D_create_dflt, sizeof(H5D_create_t));
+ break;
case H5P_DATASET_XFER:
- tmpl = H5MM_xmalloc(sizeof(H5D_xfer_t));
- memcpy(tmpl, &H5D_xfer_dflt, sizeof(H5D_xfer_t));
- break;
+ tmpl = H5MM_xmalloc(sizeof(H5D_xfer_t));
+ memcpy(tmpl, &H5D_xfer_dflt, sizeof(H5D_xfer_t));
+ break;
default:
- HRETURN_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL,
- "unknown template class");
+ HRETURN_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL,
+ "unknown template class");
}
/* Atomize the new template */
if ((ret_value = H5P_create(type, tmpl)) < 0) {
- HRETURN_ERROR(H5E_ATOM, H5E_CANTINIT, FAIL,
- "can't register template");
+ HRETURN_ERROR(H5E_ATOM, H5E_CANTINIT, FAIL,
+ "can't register template");
}
FUNC_LEAVE(ret_value);
}
/*-------------------------------------------------------------------------
- * Function: H5P_create
+ * Function: H5P_create
*
- * Purpose: Given a pointer to some template struct, atomize the template
- * and return its ID. The template memory is not copied, so the
- * caller should not free it; it will be freed by H5P_release().
+ * Purpose: Given a pointer to some template struct, atomize the template
+ * and return its ID. The template memory is not copied, so the
+ * caller should not free it; it will be freed by H5P_release().
*
- * Return: Success: A new template ID.
+ * Return: Success: A new template ID.
*
- * Failure: FAIL
+ * Failure: FAIL
*
- * Programmer: Robb Matzke
- * Wednesday, December 3, 1997
+ * Programmer: Robb Matzke
+ * Wednesday, December 3, 1997
*
* Modifications:
*
@@ -216,8 +216,8 @@ H5P_create(H5P_class_t type, void *tmpl)
/* Atomize the new template */
if ((ret_value=H5A_register((group_t)(H5_TEMPLATE_0+type), tmpl)) < 0) {
- HRETURN_ERROR(H5E_ATOM, H5E_CANTINIT, FAIL,
- "can't register template");
+ HRETURN_ERROR(H5E_ATOM, H5E_CANTINIT, FAIL,
+ "can't register template");
}
FUNC_LEAVE(ret_value);
@@ -230,24 +230,24 @@ H5P_create(H5P_class_t type, void *tmpl)
Release access to a template object.
USAGE
herr_t H5Pclose(oid)
- hid_t oid; IN: Template object to release access to
+ hid_t oid; IN: Template object to release access to
RETURNS
SUCCEED/FAIL
DESCRIPTION
- This function releases access to a template object
+ This function releases access to a template object
--------------------------------------------------------------------------*/
herr_t
H5Pclose(hid_t tid)
{
H5P_class_t type;
- void *tmpl = NULL;
+ void *tmpl = NULL;
FUNC_ENTER(H5Pclose, FAIL);
/* Check arguments */
if ((type=H5Pget_class (tid))<0 ||
NULL==(tmpl=H5A_object (tid))) {
- HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a property list");
+ HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a property list");
}
/*
@@ -273,7 +273,7 @@ H5Pclose(hid_t tid)
* Failure: FAIL
*
* Programmer: Robb Matzke
- * Wednesday, February 18, 1998
+ * Wednesday, February 18, 1998
*
* Modifications:
*
@@ -283,6 +283,7 @@ herr_t
H5P_close (H5P_class_t type, void *tmpl)
{
H5F_access_t *fa_list = (H5F_access_t*)tmpl;
+ H5D_create_t *dc_list = (H5D_create_t*)tmpl;
FUNC_ENTER (H5P_close, FAIL);
@@ -323,7 +324,13 @@ H5P_close (H5P_class_t type, void *tmpl)
break;
case H5P_FILE_CREATE:
+ /*nothing to do*/
+ break;
+
case H5P_DATASET_CREATE:
+ H5O_reset (H5O_EFL, &(dc_list->efl));
+ break;
+
case H5P_DATASET_XFER:
/*nothing to do*/
break;
@@ -340,16 +347,16 @@ H5P_close (H5P_class_t type, void *tmpl)
/*-------------------------------------------------------------------------
- * Function: H5Pget_class
+ * Function: H5Pget_class
*
- * Purpose: Returns the class identifier for a template.
+ * Purpose: Returns the class identifier for a template.
*
- * Return: Success: A template class
+ * Return: Success: A template class
*
- * Failure: H5P_NO_CLASS (-1)
+ * Failure: H5P_NO_CLASS (-1)
*
- * Programmer: Robb Matzke
- * Wednesday, December 3, 1997
+ * Programmer: Robb Matzke
+ * Wednesday, December 3, 1997
*
* Modifications:
*
@@ -358,43 +365,43 @@ H5P_close (H5P_class_t type, void *tmpl)
H5P_class_t
H5Pget_class(hid_t tid)
{
- group_t group;
- H5P_class_t ret_value = H5P_NO_CLASS;
+ group_t group;
+ H5P_class_t ret_value = H5P_NO_CLASS;
FUNC_ENTER(H5Pget_class, H5P_NO_CLASS);
if ((group = H5A_group(tid)) < 0 ||
#ifndef NDEBUG
- group >= H5_TEMPLATE_MAX ||
+ group >= H5_TEMPLATE_MAX ||
#endif
- group < H5_TEMPLATE_0) {
- HRETURN_ERROR(H5E_ATOM, H5E_BADATOM, H5P_NO_CLASS, "not a template");
+ group < H5_TEMPLATE_0) {
+ HRETURN_ERROR(H5E_ATOM, H5E_BADATOM, H5P_NO_CLASS, "not a template");
}
ret_value = (H5P_class_t)(group - H5_TEMPLATE_0);
FUNC_LEAVE(ret_value);
}
/*-------------------------------------------------------------------------
- * Function: H5Pget_version
+ * Function: H5Pget_version
*
- * Purpose: Retrieves version information for various parts of a file.
+ * Purpose: Retrieves version information for various parts of a file.
*
- * BOOT: The file boot block.
- * HEAP: The global heap.
- * FREELIST: The global free list.
- * STAB: The root symbol table entry.
- * SHHDR: Shared object headers.
+ * BOOT: The file boot block.
+ * HEAP: The global heap.
+ * FREELIST: The global free list.
+ * STAB: The root symbol table entry.
+ * SHHDR: Shared object headers.
*
- * Any (or even all) of the output arguments can be null
- * pointers.
+ * Any (or even all) of the output arguments can be null
+ * pointers.
*
- * Return: Success: SUCCEED, version information is returned
- * through the arguments.
+ * Return: Success: SUCCEED, version information is returned
+ * through the arguments.
*
- * Failure: FAIL
+ * Failure: FAIL
*
- * Programmer: Robb Matzke
- * Wednesday, January 7, 1998
+ * Programmer: Robb Matzke
+ * Wednesday, January 7, 1998
*
* Modifications:
*
@@ -402,44 +409,44 @@ H5Pget_class(hid_t tid)
*/
herr_t
H5Pget_version(hid_t tid, int *boot /*out */ , int *heap /*out */ ,
- int *freelist /*out */ , int *stab /*out */ , int *shhdr /*out */ )
+ int *freelist /*out */ , int *stab /*out */ , int *shhdr /*out */ )
{
- H5F_create_t *tmpl = NULL;
+ H5F_create_t *tmpl = NULL;
FUNC_ENTER(H5Pget_version, FAIL);
/* Check arguments */
if (H5P_FILE_CREATE != H5Pget_class(tid) ||
- NULL == (tmpl = H5A_object(tid))) {
- HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL,
- "not a file creation template");
+ NULL == (tmpl = H5A_object(tid))) {
+ HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL,
+ "not a file creation template");
}
/* Get values */
if (boot)
- *boot = tmpl->bootblock_ver;
+ *boot = tmpl->bootblock_ver;
if (heap)
- *heap = tmpl->smallobject_ver;
+ *heap = tmpl->smallobject_ver;
if (freelist)
- *freelist = tmpl->freespace_ver;
+ *freelist = tmpl->freespace_ver;
if (stab)
- *stab = tmpl->objectdir_ver;
+ *stab = tmpl->objectdir_ver;
if (shhdr)
- *shhdr = tmpl->sharedheader_ver;
+ *shhdr = tmpl->sharedheader_ver;
FUNC_LEAVE(SUCCEED);
}
/*-------------------------------------------------------------------------
- * Function: H5Pset_userblock
+ * Function: H5Pset_userblock
*
- * Purpose: Sets the userblock size field of a file creation template.
+ * Purpose: Sets the userblock size field of a file creation template.
*
- * Return: Success: SUCCEED
+ * Return: Success: SUCCEED
*
- * Failure: FAIL
+ * Failure: FAIL
*
- * Programmer: Robb Matzke
- * Tuesday, January 6, 1998
+ * Programmer: Robb Matzke
+ * Tuesday, January 6, 1998
*
* Modifications:
*
@@ -448,25 +455,25 @@ H5Pget_version(hid_t tid, int *boot /*out */ , int *heap /*out */ ,
herr_t
H5Pset_userblock(hid_t tid, size_t size)
{
- intn i;
- H5F_create_t *tmpl = NULL;
+ intn i;
+ H5F_create_t *tmpl = NULL;
FUNC_ENTER(H5Pset_userblock, FAIL);
/* Check arguments */
if (H5P_FILE_CREATE != H5Pget_class(tid) ||
- NULL == (tmpl = H5A_object(tid))) {
- HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL,
- "not a file creation template");
+ NULL == (tmpl = H5A_object(tid))) {
+ HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL,
+ "not a file creation template");
}
for (i = 8; i < 8 * sizeof(int); i++) {
- uintn p2 = 8 == i ? 0 : 1 << i;
- if (size == p2)
- break;
+ uintn p2 = 8 == i ? 0 : 1 << i;
+ if (size == p2)
+ break;
}
if (i >= 8 * sizeof(int)) {
- HRETURN_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL,
- "userblock size is not valid");
+ HRETURN_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL,
+ "userblock size is not valid");
}
/* Set value */
tmpl->userblock_size = size;
@@ -475,16 +482,16 @@ H5Pset_userblock(hid_t tid, size_t size)
}
/*-------------------------------------------------------------------------
- * Function: H5Pget_userblock
+ * Function: H5Pget_userblock
*
- * Purpose: Queries the size of a user block in a file creation template.
+ * Purpose: Queries the size of a user block in a file creation template.
*
- * Return: Success: SUCCEED, size returned through SIZE argument.
+ * Return: Success: SUCCEED, size returned through SIZE argument.
*
- * Failure: FAIL
+ * Failure: FAIL
*
- * Programmer: Robb Matzke
- * Wednesday, January 7, 1998
+ * Programmer: Robb Matzke
+ * Wednesday, January 7, 1998
*
* Modifications:
*
@@ -493,36 +500,36 @@ H5Pset_userblock(hid_t tid, size_t size)
herr_t
H5Pget_userblock(hid_t tid, size_t *size)
{
- H5F_create_t *tmpl = NULL;
+ H5F_create_t *tmpl = NULL;
FUNC_ENTER(H5Pget_userblock, FAIL);
/* Check args */
if (H5P_FILE_CREATE != H5Pget_class(tid) ||
- NULL == (tmpl = H5A_object(tid))) {
- HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL,
- "not a file creation template");
+ NULL == (tmpl = H5A_object(tid))) {
+ HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL,
+ "not a file creation template");
}
/* Get value */
if (size)
- *size = tmpl->userblock_size;
+ *size = tmpl->userblock_size;
FUNC_LEAVE(SUCCEED);
}
/*-------------------------------------------------------------------------
- * Function: H5Pset_sizes
+ * Function: H5Pset_sizes
*
- * Purpose: Sets file size-of addresses and sizes. TEMPLATE
- * should be a file creation template. A value of zero causes
- * the property to not change.
+ * Purpose: Sets file size-of addresses and sizes. TEMPLATE
+ * should be a file creation template. A value of zero causes
+ * the property to not change.
*
- * Return: Success: SUCCEED
+ * Return: Success: SUCCEED
*
- * Failure: FAIL
+ * Failure: FAIL
*
- * Programmer: Robb Matzke
- * Tuesday, January 6, 1998
+ * Programmer: Robb Matzke
+ * Tuesday, January 6, 1998
*
* Modifications:
*
@@ -531,52 +538,52 @@ H5Pget_userblock(hid_t tid, size_t *size)
herr_t
H5Pset_sizes(hid_t tid, size_t sizeof_addr, size_t sizeof_size)
{
- H5F_create_t *tmpl = NULL;
+ H5F_create_t *tmpl = NULL;
FUNC_ENTER(H5Pset_sizeof_addr, FAIL);
/* Check arguments */
if (H5P_FILE_CREATE != H5Pget_class(tid) ||
- NULL == (tmpl = H5A_object(tid))) {
- HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL,
- "not a file creation template");
+ NULL == (tmpl = H5A_object(tid))) {
+ HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL,
+ "not a file creation template");
}
if (sizeof_addr) {
- if (sizeof_addr != 2 && sizeof_addr != 4 &&
- sizeof_addr != 8 && sizeof_addr != 16) {
- HRETURN_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL,
- "file haddr_t size is not valid");
- }
+ if (sizeof_addr != 2 && sizeof_addr != 4 &&
+ sizeof_addr != 8 && sizeof_addr != 16) {
+ HRETURN_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL,
+ "file haddr_t size is not valid");
+ }
}
if (sizeof_size) {
- if (sizeof_size != 2 && sizeof_size != 4 &&
- sizeof_size != 8 && sizeof_size != 16) {
- HRETURN_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL,
- "file size_t size is not valid");
- }
+ if (sizeof_size != 2 && sizeof_size != 4 &&
+ sizeof_size != 8 && sizeof_size != 16) {
+ HRETURN_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL,
+ "file size_t size is not valid");
+ }
}
/* Set value */
if (sizeof_addr)
- tmpl->sizeof_addr = sizeof_addr;
+ tmpl->sizeof_addr = sizeof_addr;
if (sizeof_size)
- tmpl->sizeof_size = sizeof_size;
+ tmpl->sizeof_size = sizeof_size;
FUNC_LEAVE(SUCCEED);
}
/*-------------------------------------------------------------------------
- * Function: H5Pget_sizes
+ * Function: H5Pget_sizes
*
- * Purpose: Returns the size of address and size quantities stored in a
- * file according to a file creation template. Either (or even
- * both) SIZEOF_ADDR and SIZEOF_SIZE may be null pointers.
+ * Purpose: Returns the size of address and size quantities stored in a
+ * file according to a file creation template. Either (or even
+ * both) SIZEOF_ADDR and SIZEOF_SIZE may be null pointers.
*
- * Return: Success: SUCCEED, sizes returned through arguments.
+ * Return: Success: SUCCEED, sizes returned through arguments.
*
- * Failure: FAIL
+ * Failure: FAIL
*
- * Programmer: Robb Matzke
- * Wednesday, January 7, 1998
+ * Programmer: Robb Matzke
+ * Wednesday, January 7, 1998
*
* Modifications:
*
@@ -584,51 +591,51 @@ H5Pset_sizes(hid_t tid, size_t sizeof_addr, size_t sizeof_size)
*/
herr_t
H5Pget_sizes(hid_t tid,
- size_t *sizeof_addr /*out */ , size_t *sizeof_size /*out */ )
+ size_t *sizeof_addr /*out */ , size_t *sizeof_size /*out */ )
{
- H5F_create_t *tmpl = NULL;
+ H5F_create_t *tmpl = NULL;
FUNC_ENTER(H5Pget_sizes, FAIL);
/* Check args */
if (H5P_FILE_CREATE != H5Pget_class(tid) ||
- NULL == (tmpl = H5A_object(tid))) {
- HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL,
- "not a file creation template");
+ NULL == (tmpl = H5A_object(tid))) {
+ HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL,
+ "not a file creation template");
}
/* Get values */
if (sizeof_addr)
- *sizeof_addr = tmpl->sizeof_addr;
+ *sizeof_addr = tmpl->sizeof_addr;
if (sizeof_size)
- *sizeof_size = tmpl->sizeof_size;
+ *sizeof_size = tmpl->sizeof_size;
FUNC_LEAVE(SUCCEED);
}
/*-------------------------------------------------------------------------
- * Function: H5Pset_sym_k
+ * Function: H5Pset_sym_k
*
- * Purpose: IK is one half the rank of a tree that stores a symbol
- * table for a group. Internal nodes of the symbol table are on
- * average 75% full. That is, the average rank of the tree is
- * 1.5 times the value of IK.
+ * Purpose: IK is one half the rank of a tree that stores a symbol
+ * table for a group. Internal nodes of the symbol table are on
+ * average 75% full. That is, the average rank of the tree is
+ * 1.5 times the value of IK.
*
- * LK is one half of the number of symbols that can be stored in
- * a symbol table node. A symbol table node is the leaf of a
- * symbol table tree which is used to store a group. When
- * symbols are inserted randomly into a group, the group's
- * symbol table nodes are 75% full on average. That is, they
- * contain 1.5 times the number of symbols specified by LK.
+ * LK is one half of the number of symbols that can be stored in
+ * a symbol table node. A symbol table node is the leaf of a
+ * symbol table tree which is used to store a group. When
+ * symbols are inserted randomly into a group, the group's
+ * symbol table nodes are 75% full on average. That is, they
+ * contain 1.5 times the number of symbols specified by LK.
*
- * Either (or even both) of IK and LK can be zero in which case
- * that value is left unchanged.
+ * Either (or even both) of IK and LK can be zero in which case
+ * that value is left unchanged.
*
- * Return: Success: SUCCEED
+ * Return: Success: SUCCEED
*
- * Failure: FAIL
+ * Failure: FAIL
*
- * Programmer: Robb Matzke
- * Tuesday, January 6, 1998
+ * Programmer: Robb Matzke
+ * Tuesday, January 6, 1998
*
* Modifications:
*
@@ -637,40 +644,40 @@ H5Pget_sizes(hid_t tid,
herr_t
H5Pset_sym_k(hid_t tid, int ik, int lk)
{
- H5F_create_t *tmpl = NULL;
+ H5F_create_t *tmpl = NULL;
FUNC_ENTER(H5Pset_sym_k, FAIL);
/* Check arguments */
if (H5P_FILE_CREATE != H5Pget_class(tid) ||
- NULL == (tmpl = H5A_object(tid))) {
- HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL,
- "not a file creation template");
+ NULL == (tmpl = H5A_object(tid))) {
+ HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL,
+ "not a file creation template");
}
/* Set values */
if (ik > 0) {
- tmpl->btree_k[H5B_SNODE_ID] = ik;
+ tmpl->btree_k[H5B_SNODE_ID] = ik;
}
if (lk > 0) {
- tmpl->sym_leaf_k = lk;
+ tmpl->sym_leaf_k = lk;
}
FUNC_LEAVE(SUCCEED);
}
/*-------------------------------------------------------------------------
- * Function: H5Pget_sym_k
+ * Function: H5Pget_sym_k
*
- * Purpose: Retrieves the symbol table B-tree 1/2 rank (IK) and the
- * symbol table leaf node 1/2 size (LK). See H5Pset_sym_k() for
- * details. Either (or even both) IK and LK may be null
- * pointers.
+ * Purpose: Retrieves the symbol table B-tree 1/2 rank (IK) and the
+ * symbol table leaf node 1/2 size (LK). See H5Pset_sym_k() for
+ * details. Either (or even both) IK and LK may be null
+ * pointers.
*
- * Return: Success: SUCCEED
+ * Return: Success: SUCCEED
*
- * Failure: FAIL
+ * Failure: FAIL
*
- * Programmer: Robb Matzke
- * Wednesday, January 7, 1998
+ * Programmer: Robb Matzke
+ * Wednesday, January 7, 1998
*
* Modifications:
*
@@ -679,38 +686,38 @@ H5Pset_sym_k(hid_t tid, int ik, int lk)
herr_t
H5Pget_sym_k(hid_t tid, int *ik /*out */ , int *lk /*out */ )
{
- H5F_create_t *tmpl = NULL;
+ H5F_create_t *tmpl = NULL;
FUNC_ENTER(H5Pget_sym_k, FAIL);
/* Check arguments */
if (H5P_FILE_CREATE != H5Pget_class(tid) ||
- NULL == (tmpl = H5A_object(tid))) {
- HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL,
- "not a file creation template");
+ NULL == (tmpl = H5A_object(tid))) {
+ HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL,
+ "not a file creation template");
}
/* Get values */
if (ik)
- *ik = tmpl->btree_k[H5B_SNODE_ID];
+ *ik = tmpl->btree_k[H5B_SNODE_ID];
if (lk)
- *lk = tmpl->sym_leaf_k;
+ *lk = tmpl->sym_leaf_k;
FUNC_LEAVE(SUCCEED);
}
/*-------------------------------------------------------------------------
- * Function: H5Pset_istore_k
+ * Function: H5Pset_istore_k
*
- * Purpose: IK is one half the rank of a tree that stores chunked raw
- * data. On average, such a tree will be 75% full, or have an
- * average rank of 1.5 times the value of IK.
+ * Purpose: IK is one half the rank of a tree that stores chunked raw
+ * data. On average, such a tree will be 75% full, or have an
+ * average rank of 1.5 times the value of IK.
*
- * Return: Success: SUCCEED
+ * Return: Success: SUCCEED
*
- * Failure: FAIL
+ * Failure: FAIL
*
- * Programmer: Robb Matzke
- * Tuesday, January 6, 1998
+ * Programmer: Robb Matzke
+ * Tuesday, January 6, 1998
*
* Modifications:
*
@@ -719,19 +726,19 @@ H5Pget_sym_k(hid_t tid, int *ik /*out */ , int *lk /*out */ )
herr_t
H5Pset_istore_k(hid_t tid, int ik)
{
- H5F_create_t *tmpl = NULL;
+ H5F_create_t *tmpl = NULL;
FUNC_ENTER(H5Pset_istore_k, FAIL);
/* Check arguments */
if (H5P_FILE_CREATE != H5Pget_class(tid) ||
- NULL == (tmpl = H5A_object(tid))) {
- HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL,
- "not a file creation template");
+ NULL == (tmpl = H5A_object(tid))) {
+ HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL,
+ "not a file creation template");
}
if (ik <= 0) {
- HRETURN_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL,
- "istore IK value must be positive");
+ HRETURN_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL,
+ "istore IK value must be positive");
}
/* Set value */
tmpl->btree_k[H5B_ISTORE_ID] = ik;
@@ -740,18 +747,18 @@ H5Pset_istore_k(hid_t tid, int ik)
}
/*-------------------------------------------------------------------------
- * Function: H5Pget_istore_k
+ * Function: H5Pget_istore_k
*
- * Purpose: Queries the 1/2 rank of an indexed storage B-tree. See
- * H5Pset_istore_k() for details. The argument IK may be the
- * null pointer.
+ * Purpose: Queries the 1/2 rank of an indexed storage B-tree. See
+ * H5Pset_istore_k() for details. The argument IK may be the
+ * null pointer.
*
- * Return: Success: SUCCEED, size returned through IK
+ * Return: Success: SUCCEED, size returned through IK
*
- * Failure:
+ * Failure:
*
- * Programmer: Robb Matzke
- * Wednesday, January 7, 1998
+ * Programmer: Robb Matzke
+ * Wednesday, January 7, 1998
*
* Modifications:
*
@@ -760,34 +767,34 @@ H5Pset_istore_k(hid_t tid, int ik)
herr_t
H5Pget_istore_k(hid_t tid, int *ik /*out */ )
{
- H5F_create_t *tmpl = NULL;
+ H5F_create_t *tmpl = NULL;
FUNC_ENTER(H5Pget_istore_k, FAIL);
/* Check arguments */
if (H5P_FILE_CREATE != H5Pget_class(tid) ||
- NULL == (tmpl = H5A_object(tid))) {
- HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL,
- "not a file creation template");
+ NULL == (tmpl = H5A_object(tid))) {
+ HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL,
+ "not a file creation template");
}
/* Get value */
if (ik)
- *ik = tmpl->btree_k[H5B_ISTORE_ID];
+ *ik = tmpl->btree_k[H5B_ISTORE_ID];
FUNC_LEAVE(SUCCEED);
}
/*-------------------------------------------------------------------------
- * Function: H5Pset_layout
+ * Function: H5Pset_layout
*
- * Purpose: Sets the layout of raw data in the file.
+ * Purpose: Sets the layout of raw data in the file.
*
- * Return: Success: SUCCEED
+ * Return: Success: SUCCEED
*
- * Failure: FAIL
+ * Failure: FAIL
*
- * Programmer: Robb Matzke
- * Tuesday, January 6, 1998
+ * Programmer: Robb Matzke
+ * Tuesday, January 6, 1998
*
* Modifications:
*
@@ -796,19 +803,19 @@ H5Pget_istore_k(hid_t tid, int *ik /*out */ )
herr_t
H5Pset_layout(hid_t tid, H5D_layout_t layout)
{
- H5D_create_t *tmpl = NULL;
+ H5D_create_t *tmpl = NULL;
FUNC_ENTER(H5Pset_layout, FAIL);
/* Check arguments */
if (H5P_DATASET_CREATE != H5Pget_class(tid) ||
- NULL == (tmpl = H5A_object(tid))) {
- HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL,
- "not a dataset creation template");
+ NULL == (tmpl = H5A_object(tid))) {
+ HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL,
+ "not a dataset creation template");
}
if (layout < 0 || layout >= H5D_NLAYOUTS) {
- HRETURN_ERROR(H5E_ARGS, H5E_BADRANGE, FAIL,
- "raw data layout method is not valid");
+ HRETURN_ERROR(H5E_ARGS, H5E_BADRANGE, FAIL,
+ "raw data layout method is not valid");
}
/* Set value */
tmpl->layout = layout;
@@ -817,16 +824,16 @@ H5Pset_layout(hid_t tid, H5D_layout_t layout)
}
/*-------------------------------------------------------------------------
- * Function: H5Pget_layout
+ * Function: H5Pget_layout
*
- * Purpose: Retrieves layout type of a dataset creation template.
+ * Purpose: Retrieves layout type of a dataset creation template.
*
- * Return: Success: The layout type
+ * Return: Success: The layout type
*
- * Failure: H5D_LAYOUT_ERROR (-1, same as FAIL)
+ * Failure: H5D_LAYOUT_ERROR (-1, same as FAIL)
*
- * Programmer: Robb Matzke
- * Wednesday, January 7, 1998
+ * Programmer: Robb Matzke
+ * Wednesday, January 7, 1998
*
* Modifications:
*
@@ -835,35 +842,35 @@ H5Pset_layout(hid_t tid, H5D_layout_t layout)
H5D_layout_t
H5Pget_layout(hid_t tid)
{
- H5D_create_t *tmpl = NULL;
+ H5D_create_t *tmpl = NULL;
FUNC_ENTER(H5Pget_layout, H5D_LAYOUT_ERROR);
/* Check arguments */
if (H5P_DATASET_CREATE != H5Pget_class(tid) ||
- NULL == (tmpl = H5A_object(tid))) {
- HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, H5D_LAYOUT_ERROR,
- "not a dataset creation template");
+ NULL == (tmpl = H5A_object(tid))) {
+ HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, H5D_LAYOUT_ERROR,
+ "not a dataset creation template");
}
FUNC_LEAVE(tmpl->layout);
}
/*-------------------------------------------------------------------------
- * Function: H5Pset_chunk
+ * Function: H5Pset_chunk
*
- * Purpose: Sets the number of dimensions and the size of each chunk to
- * the values specified. The dimensionality of the chunk should
- * match the dimensionality of the data space.
+ * Purpose: Sets the number of dimensions and the size of each chunk to
+ * the values specified. The dimensionality of the chunk should
+ * match the dimensionality of the data space.
*
- * As a side effect, the layout method is changed to
- * H5D_CHUNKED.
+ * As a side effect, the layout method is changed to
+ * H5D_CHUNKED.
*
- * Return: Success: SUCCEED
+ * Return: Success: SUCCEED
*
- * Failure: FAIL
+ * Failure: FAIL
*
- * Programmer: Robb Matzke
- * Tuesday, January 6, 1998
+ * Programmer: Robb Matzke
+ * Tuesday, January 6, 1998
*
* Modifications:
*
@@ -872,59 +879,59 @@ H5Pget_layout(hid_t tid)
herr_t
H5Pset_chunk(hid_t tid, int ndims, const size_t dim[])
{
- int i;
- H5D_create_t *tmpl = NULL;
+ int i;
+ H5D_create_t *tmpl = NULL;
FUNC_ENTER(H5Pset_chunk, FAIL);
/* Check arguments */
if (H5P_DATASET_CREATE != H5Pget_class(tid) ||
- NULL == (tmpl = H5A_object(tid))) {
- HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL,
- "not a dataset creation template");
+ NULL == (tmpl = H5A_object(tid))) {
+ HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL,
+ "not a dataset creation template");
}
if (ndims <= 0) {
- HRETURN_ERROR(H5E_ARGS, H5E_BADRANGE, FAIL,
- "chunk dimensionality must be positive");
+ HRETURN_ERROR(H5E_ARGS, H5E_BADRANGE, FAIL,
+ "chunk dimensionality must be positive");
}
if (ndims > NELMTS(tmpl->chunk_size)) {
- HRETURN_ERROR(H5E_ARGS, H5E_BADRANGE, FAIL,
- "chunk dimensionality is too large");
+ HRETURN_ERROR(H5E_ARGS, H5E_BADRANGE, FAIL,
+ "chunk dimensionality is too large");
}
if (!dim) {
- HRETURN_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL,
- "no chunk dimensions specified");
+ HRETURN_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL,
+ "no chunk dimensions specified");
}
for (i = 0; i < ndims; i++) {
- if (dim[i] <= 0) {
- HRETURN_ERROR(H5E_ARGS, H5E_BADRANGE, FAIL,
- "all chunk dimensions must be positive");
- }
+ if (dim[i] <= 0) {
+ HRETURN_ERROR(H5E_ARGS, H5E_BADRANGE, FAIL,
+ "all chunk dimensions must be positive");
+ }
}
/* Set value */
tmpl->layout = H5D_CHUNKED;
tmpl->chunk_ndims = ndims;
for (i = 0; i < ndims; i++)
- tmpl->chunk_size[i] = dim[i];
+ tmpl->chunk_size[i] = dim[i];
FUNC_LEAVE(SUCCEED);
}
/*-------------------------------------------------------------------------
- * Function: H5Pget_chunk
+ * Function: H5Pget_chunk
*
- * Purpose: Retrieves the chunk size of chunked layout. The chunk
- * dimensionality is returned and the chunk size in each
- * dimension is returned through the DIM argument. At most
- * MAX_NDIMS elements of DIM will be initialized.
+ * Purpose: Retrieves the chunk size of chunked layout. The chunk
+ * dimensionality is returned and the chunk size in each
+ * dimension is returned through the DIM argument. At most
+ * MAX_NDIMS elements of DIM will be initialized.
*
- * Return: Success: Positive Chunk dimensionality.
+ * Return: Success: Positive Chunk dimensionality.
*
- * Failure: FAIL
+ * Failure: FAIL
*
- * Programmer: Robb Matzke
- * Wednesday, January 7, 1998
+ * Programmer: Robb Matzke
+ * Wednesday, January 7, 1998
*
* Modifications:
*
@@ -933,23 +940,23 @@ H5Pset_chunk(hid_t tid, int ndims, const size_t dim[])
int
H5Pget_chunk(hid_t tid, int max_ndims, size_t dim[] /*out */ )
{
- int i;
- H5D_create_t *tmpl = NULL;
+ int i;
+ H5D_create_t *tmpl = NULL;
FUNC_ENTER(H5Pget_chunk, FAIL);
/* Check arguments */
if (H5P_DATASET_CREATE != H5Pget_class(tid) ||
- NULL == (tmpl = H5A_object(tid))) {
- HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL,
- "not a dataset creation template");
+ NULL == (tmpl = H5A_object(tid))) {
+ HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL,
+ "not a dataset creation template");
}
if (H5D_CHUNKED != tmpl->layout) {
- HRETURN_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL,
- "not a chunked storage layout");
+ HRETURN_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL,
+ "not a chunked storage layout");
}
for (i = 0; i < tmpl->chunk_ndims && i < max_ndims && dim; i++) {
- dim[i] = tmpl->chunk_size[i];
+ dim[i] = tmpl->chunk_size[i];
}
FUNC_LEAVE(tmpl->chunk_ndims);
@@ -957,6 +964,182 @@ H5Pget_chunk(hid_t tid, int max_ndims, size_t dim[] /*out */ )
/*-------------------------------------------------------------------------
+ * Function: H5Pset_external
+ *
+ * Purpose: Adds an external file to the list of external files. PLIST_ID
+ * should be an object ID for a dataset creation property list.
+ * NAME is the name of an external file, OFFSET is the location
+ * where the data starts in that file, and SIZE is the number of
+ * bytes reserved in the file for the data.
+ *
+ * If a dataset is split across multiple files then the files
+ * should be defined in order. The total size of the dataset is
+ * the sum of the SIZE arguments for all the external files. If
+ * the total size is larger than the size of a dataset then the
+ * dataset can be extended (provided the data space also allows
+ * the extending).
+ *
+ * Return: Success: SUCCEED
+ *
+ * Failure: FAIL
+ *
+ * Programmer: Robb Matzke
+ * Tuesday, March 3, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Pset_external (hid_t plist_id, const char *name, size_t offset, size_t size)
+{
+ int idx;
+ size_t total, tmp;
+ H5D_create_t *plist = NULL;
+
+ FUNC_ENTER(H5Pset_external, FAIL);
+
+ /* Check arguments */
+ if (H5P_DATASET_CREATE != H5Pget_class(plist_id) ||
+ NULL == (plist = H5A_object(plist_id))) {
+ HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL,
+ "not a dataset creation property list");
+ }
+ if (!name || !*name) {
+ HRETURN_ERROR (H5E_ARGS, H5E_BADVALUE, FAIL,
+ "no name given");
+ }
+ if (size<=0) {
+ HRETURN_ERROR (H5E_ARGS, H5E_BADVALUE, FAIL,
+ "zero size");
+ }
+ if (plist->efl.nused>0 &&
+ H5O_EFL_UNLIMITED==plist->efl.slot[plist->efl.nused-1].size) {
+ HRETURN_ERROR (H5E_ARGS, H5E_BADVALUE, FAIL,
+ "previous file size is unlimited");
+ }
+ if (H5O_EFL_UNLIMITED!=size) {
+ for (idx=0, total=size; idx<plist->efl.nused; idx++, total=tmp) {
+ tmp = total + plist->efl.slot[idx].size;
+ if (tmp <= total) {
+ HRETURN_ERROR (H5E_EFL, H5E_OVERFLOW, FAIL,
+ "total external data size overflowed");
+ }
+ }
+ }
+
+ /* Add to the list */
+ if (plist->efl.nused>=plist->efl.nalloc) {
+ plist->efl.nalloc += H5O_EFL_ALLOC;
+ plist->efl.slot = H5MM_xrealloc (plist->efl.slot,
+ (plist->efl.nalloc *
+ sizeof(H5O_efl_entry_t)));
+ }
+ idx = plist->efl.nused;
+ plist->efl.slot[idx].name_offset = 0; /*not entered into heap yet*/
+ plist->efl.slot[idx].name = H5MM_xstrdup (name);
+ plist->efl.slot[idx].offset = offset;
+ plist->efl.slot[idx].size = size;
+ plist->efl.nused++;
+
+ FUNC_LEAVE(SUCCEED);
+}
+
+
+/*-------------------------------------------------------------------------
+ * Function: H5Pget_external_count
+ *
+ * Purpose: Returns the number of external files for this dataset.
+ *
+ * Return: Success: Number of external files
+ *
+ * Failure: FAIL
+ *
+ * Programmer: Robb Matzke
+ * Tuesday, March 3, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+int
+H5Pget_external_count (hid_t plist_id)
+{
+ H5D_create_t *plist = NULL;
+
+ FUNC_ENTER (H5Pget_external_count, FAIL);
+
+ /* Check arguments */
+ if (H5P_DATASET_CREATE != H5Pget_class(plist_id) ||
+ NULL == (plist = H5A_object(plist_id))) {
+ HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL,
+ "not a dataset creation property list");
+ }
+
+ /* Return */
+ FUNC_LEAVE (plist->efl.nused);
+}
+
+
+/*-------------------------------------------------------------------------
+ * Function: H5Pget_external
+ *
+ * Purpose: Returns information about an external file. External files
+ * are numbered from zero to N-1 where N is the value returned
+ * by H5Pget_external_count(). At most NAME_SIZE characters are
+ * copied into the NAME array. If the external file name is
+ * longer than NAME_SIZE with the null terminator, then the
+ * return value is not null terminated (similar to strncpy()).
+ *
+ * If NAME_SIZE is zero or NAME is the null pointer then the
+ * external file name is not returned. If OFFSET or SIZE are
+ * null pointers then the corresponding information is not
+ * returned.
+ *
+ * See Also: H5Pset_external()
+ *
+ * Return: Success: SUCCEED
+ *
+ * Failure: FAIL
+ *
+ * Programmer: Robb Matzke
+ * Tuesday, March 3, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Pget_external (hid_t plist_id, int idx, size_t name_size, char *name/*out*/,
+ size_t *offset/*out*/, size_t *size/*out*/)
+{
+ H5D_create_t *plist = NULL;
+
+ FUNC_ENTER (H5Pget_external, FAIL);
+
+ /* Check arguments */
+ if (H5P_DATASET_CREATE != H5Pget_class(plist_id) ||
+ NULL == (plist = H5A_object(plist_id))) {
+ HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL,
+ "not a dataset creation property list");
+ }
+ if (idx<0 || idx>=plist->efl.nused) {
+ HRETURN_ERROR (H5E_ARGS, H5E_BADRANGE, FAIL,
+ "external file index is out of range");
+ }
+
+ /* Return values */
+ if (name_size>0 && name) {
+ strncpy (name, plist->efl.slot[idx].name, name_size);
+ }
+ if (offset) *offset = plist->efl.slot[idx].offset;
+ if (size) *size = plist->efl.slot[idx].size;
+
+ FUNC_LEAVE (SUCCEED);
+}
+
+
+/*-------------------------------------------------------------------------
* Function: H5Pget_driver
*
* Purpose: Return the ID of the low-level file driver. TID should be a
@@ -967,7 +1150,7 @@ H5Pget_chunk(hid_t tid, int max_ndims, size_t dim[] /*out */ )
* Failure: H5F_LOW_ERROR (a negative value)
*
* Programmer: Robb Matzke
- * Thursday, February 26, 1998
+ * Thursday, February 26, 1998
*
* Modifications:
*
@@ -1003,7 +1186,7 @@ H5Pget_driver (hid_t tid)
* Failure: FAIL
*
* Programmer: Robb Matzke
- * Thursday, February 19, 1998
+ * Thursday, February 19, 1998
*
* Modifications:
*
@@ -1018,8 +1201,8 @@ H5Pset_stdio (hid_t tid)
/* Check arguments */
if (H5P_FILE_ACCESS != H5Pget_class(tid) ||
- NULL == (tmpl = H5A_object(tid))) {
- HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL,
+ NULL == (tmpl = H5A_object(tid))) {
+ HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL,
"not a file access template");
}
@@ -1035,7 +1218,7 @@ H5Pset_stdio (hid_t tid)
*
* Purpose: If the file access property list is set to the stdio driver
* then this function returns zero; otherwise it returns a
- * negative value. In the future, additional arguments may be
+ * negative value. In the future, additional arguments may be
* added to this function to match those added to H5Pset_stdio().
*
* Return: Success: SUCCEED
@@ -1043,7 +1226,7 @@ H5Pset_stdio (hid_t tid)
* Failure: FAIL
*
* Programmer: Robb Matzke
- * Thursday, February 26, 1998
+ * Thursday, February 26, 1998
*
* Modifications:
*
@@ -1083,7 +1266,7 @@ H5Pget_stdio (hid_t tid)
* Failure: FAIL
*
* Programmer: Robb Matzke
- * Thursday, February 19, 1998
+ * Thursday, February 19, 1998
*
* Modifications:
*
@@ -1098,8 +1281,8 @@ H5Pset_sec2 (hid_t tid)
/* Check arguments */
if (H5P_FILE_ACCESS != H5Pget_class(tid) ||
- NULL == (tmpl = H5A_object(tid))) {
- HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL,
+ NULL == (tmpl = H5A_object(tid))) {
+ HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL,
"not a file access template");
}
@@ -1115,7 +1298,7 @@ H5Pset_sec2 (hid_t tid)
*
* Purpose: If the file access property list is set to the sec2 driver
* then this function returns zero; otherwise it returns a
- * negative value. In the future, additional arguments may be
+ * negative value. In the future, additional arguments may be
* added to this function to match those added to H5Pset_sec2().
*
* Return: Success: SUCCEED
@@ -1123,7 +1306,7 @@ H5Pset_sec2 (hid_t tid)
* Failure: FAIL
*
* Programmer: Robb Matzke
- * Thursday, February 26, 1998
+ * Thursday, February 26, 1998
*
* Modifications:
*
@@ -1167,7 +1350,7 @@ H5Pget_sec2 (hid_t tid)
* Failure: FAIL
*
* Programmer: Robb Matzke
- * Thursday, February 19, 1998
+ * Thursday, February 19, 1998
*
* Modifications:
*
@@ -1182,8 +1365,8 @@ H5Pset_core (hid_t tid, size_t increment)
/* Check arguments */
if (H5P_FILE_ACCESS != H5Pget_class(tid) ||
- NULL == (tmpl = H5A_object(tid))) {
- HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL,
+ NULL == (tmpl = H5A_object(tid))) {
+ HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL,
"not a file access template");
}
if (increment<1) {
@@ -1204,7 +1387,7 @@ H5Pset_core (hid_t tid, size_t increment)
*
* Purpose: If the file access property list is set to the core driver
* then this function returns zero; otherwise it returns a
- * negative value. On success, the block size is returned
+ * negative value. On success, the block size is returned
* through the INCREMENT argument if it isn't the null pointer.
* In the future, additional arguments may be added to this
* function to match those added to H5Pset_core().
@@ -1214,7 +1397,7 @@ H5Pset_core (hid_t tid, size_t increment)
* Failure: FAIL
*
* Programmer: Robb Matzke
- * Thursday, February 26, 1998
+ * Thursday, February 26, 1998
*
* Modifications:
*
@@ -1258,7 +1441,7 @@ H5Pget_core (hid_t tid, size_t *increment/*out*/)
* Failure: FAIL
*
* Programmer: Robb Matzke
- * Thursday, February 19, 1998
+ * Thursday, February 19, 1998
*
* Modifications:
*
@@ -1276,20 +1459,20 @@ H5Pset_split (hid_t tid, const char *meta_ext, hid_t meta_tid,
/* Check arguments */
if (H5P_FILE_ACCESS != H5Pget_class(tid) ||
- NULL == (tmpl = H5A_object(tid))) {
- HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL,
+ NULL == (tmpl = H5A_object(tid))) {
+ HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL,
"not a file access template");
}
if (H5P_DEFAULT!=meta_tid &&
(H5P_FILE_ACCESS != H5Pget_class(meta_tid) ||
NULL == (tmpl = H5A_object(meta_tid)))) {
- HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL,
+ HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL,
"not a file access template");
}
if (H5P_DEFAULT!=raw_tid &&
(H5P_FILE_ACCESS != H5Pget_class(raw_tid) ||
NULL == (tmpl = H5A_object(raw_tid)))) {
- HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL,
+ HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL,
"not a file access template");
}
@@ -1309,12 +1492,12 @@ H5Pset_split (hid_t tid, const char *meta_ext, hid_t meta_tid,
*
* Purpose: If the file access property list is set to the sec2 driver
* then this function returns zero; otherwise it returns a
- * negative value. On success, at most META_EXT_SIZE characters
+ * negative value. On success, at most META_EXT_SIZE characters
* are copied to the META_EXT buffer if non-null and at most
* RAW_EXT_SIZE characters are copied to the RAW_EXT buffer if
* non-null. If the actual extension is larger than the number
* of characters requested then the buffer will not be null
- * terminated (that is, behavior like strncpy()). In addition,
+ * terminated (that is, behavior like strncpy()). In addition,
* if META_PROPERTIES and/or RAW_PROPERTIES are non-null then
* the file access property list of the meta file and/or raw
* file is copied and its OID returned through these arguments.
@@ -1329,7 +1512,7 @@ H5Pset_split (hid_t tid, const char *meta_ext, hid_t meta_tid,
* Failure: FAIL
*
* Programmer: Robb Matzke
- * Thursday, February 26, 1998
+ * Thursday, February 26, 1998
*
* Modifications:
*
@@ -1403,7 +1586,7 @@ H5Pget_split (hid_t tid, size_t meta_ext_size, char *meta_ext/*out*/,
* Failure: FAIL
*
* Programmer: Robb Matzke
- * Thursday, February 19, 1998
+ * Thursday, February 19, 1998
*
* Modifications:
*
@@ -1420,14 +1603,14 @@ H5Pset_family (hid_t tid, hid_t memb_tid)
/* Check arguments */
if (H5P_FILE_ACCESS != H5Pget_class(tid) ||
- NULL == (tmpl = H5A_object(tid))) {
- HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL,
+ NULL == (tmpl = H5A_object(tid))) {
+ HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL,
"not a file access template");
}
if (H5P_DEFAULT!=memb_tid &&
(H5P_FILE_ACCESS != H5Pget_class(memb_tid) ||
NULL == (tmpl = H5A_object(memb_tid)))) {
- HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL,
+ HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL,
"not a file access template");
}
@@ -1444,7 +1627,7 @@ H5Pset_family (hid_t tid, hid_t memb_tid)
*
* Purpose: If the file access property list is set to the family driver
* then this function returns zero; otherwise it returns a
- * negative value. On success, if MEMB_TID is a non-null
+ * negative value. On success, if MEMB_TID is a non-null
* pointer it will be initialized with the OID of a copy of the
* file access template used for the family members. If the
* family members have no file access template (that is, they
@@ -1458,7 +1641,7 @@ H5Pset_family (hid_t tid, hid_t memb_tid)
* Failure: FAIL
*
* Programmer: Robb Matzke
- * Thursday, February 26, 1998
+ * Thursday, February 26, 1998
*
* Modifications:
*
@@ -1496,50 +1679,50 @@ H5Pget_family (hid_t tid, hid_t *memb_tid)
/*-------------------------------------------------------------------------
- * Function: H5Pset_mpi
+ * Function: H5Pset_mpi
*
- * Signature: herr_t H5Pset_mpi(hid_t tid, MPI_Comm comm, MPI_Info info,
- * uintn access_mode)
+ * Signature: herr_t H5Pset_mpi(hid_t tid, MPI_Comm comm, MPI_Info info,
+ * uintn access_mode)
*
- * Purpose: Store the access mode for MPIO call and the user supplied
- * communicator and info in the access template which can then
- * be used to open file. This function is available only in the
- * parallel HDF5 library and is not a collective function.
+ * Purpose: Store the access mode for MPIO call and the user supplied
+ * communicator and info in the access template which can then
+ * be used to open file. This function is available only in the
+ * parallel HDF5 library and is not a collective function.
*
* Parameters:
- * hid_t tid
- * ID of template to modify
- * MPI_Comm comm
- * MPI communicator to be used for file open as defined in
- * MPI_FILE_OPEN of MPI-2. This function does not make a
- * duplicated communicator. Any modification to comm after
- * this function call returns may have undetermined effect
- * to the access template. Users should call this function
- * again to setup the template.
- * MPI_Info info
- * MPI info object to be used for file open as defined in
- * MPI_FILE_OPEN of MPI-2. This function does not make a
- * duplicated info. Any modification to info after
- * this function call returns may have undetermined effect
- * to the access template. Users should call this function
- * again to setup the template.
- * uintn access_mode
- * File data access modes:
- * H5ACC_INDEPENDENT
- * Allow independent datasets access.
- * H5ACC_COLLECTIVE
- * Allow only collective datasets access.
- *
- * Return: Success: SUCCEED
- *
- * Failure: FAIL
- *
- * Programmer: Albert Cheng
- * Feb 3, 1998
+ * hid_t tid
+ * ID of template to modify
+ * MPI_Comm comm
+ * MPI communicator to be used for file open as defined in
+ * MPI_FILE_OPEN of MPI-2. This function does not make a
+ * duplicated communicator. Any modification to comm after
+ * this function call returns may have undetermined effect
+ * to the access template. Users should call this function
+ * again to setup the template.
+ * MPI_Info info
+ * MPI info object to be used for file open as defined in
+ * MPI_FILE_OPEN of MPI-2. This function does not make a
+ * duplicated info. Any modification to info after
+ * this function call returns may have undetermined effect
+ * to the access template. Users should call this function
+ * again to setup the template.
+ * uintn access_mode
+ * File data access modes:
+ * H5ACC_INDEPENDENT
+ * Allow independent datasets access.
+ * H5ACC_COLLECTIVE
+ * Allow only collective datasets access.
+ *
+ * Return: Success: SUCCEED
+ *
+ * Failure: FAIL
+ *
+ * Programmer: Albert Cheng
+ * Feb 3, 1998
*
* Modifications:
*
- * Robb Matzke, 18 Feb 1998
+ * Robb Matzke, 18 Feb 1998
* Check all arguments before the template is updated so we don't leave
* the template in a bad state if something goes wrong. Also, the
* template data type changed to allow more generality so all the
@@ -1552,7 +1735,7 @@ H5Pget_family (hid_t tid, hid_t *memb_tid)
herr_t
H5Pset_mpi (hid_t tid, MPI_Comm comm, MPI_Info info, uintn access_mode)
{
- H5F_access_t *tmpl = NULL;
+ H5F_access_t *tmpl = NULL;
MPI_Comm lcomm;
int mrc; /* MPI return code */
@@ -1560,8 +1743,8 @@ H5Pset_mpi (hid_t tid, MPI_Comm comm, MPI_Info info, uintn access_mode)
/* Check arguments */
if (H5P_FILE_ACCESS != H5Pget_class(tid) ||
- NULL == (tmpl = H5A_object(tid))) {
- HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL,
+ NULL == (tmpl = H5A_object(tid))) {
+ HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL,
"not a file access template");
}
@@ -1594,8 +1777,8 @@ H5Pset_mpi (hid_t tid, MPI_Comm comm, MPI_Info info, uintn access_mode)
* after this call.
*/
if ((mrc = MPI_Comm_dup(comm, &lcomm)) != MPI_SUCCESS) {
- HRETURN_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL,
- "failure to duplicate communicator");
+ HRETURN_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL,
+ "failure to duplicate communicator");
}
tmpl->u.mpio.comm = comm;
@@ -1614,7 +1797,7 @@ H5Pset_mpi (hid_t tid, MPI_Comm comm, MPI_Info info, uintn access_mode)
*
* Purpose: If the file access property list is set to the mpi driver
* then this function returns zero; otherwise it returns a
- * negative value. In the future, additional arguments may be
+ * negative value. In the future, additional arguments may be
* added to this function to match those added to H5Pset_mpi().
*
* Return: Success: SUCCEED
@@ -1622,7 +1805,7 @@ H5Pset_mpi (hid_t tid, MPI_Comm comm, MPI_Info info, uintn access_mode)
* Failure: FAIL
*
* Programmer: Robb Matzke
- * Thursday, February 26, 1998
+ * Thursday, February 26, 1998
*
* Modifications:
*
@@ -1664,16 +1847,16 @@ H5Pget_mpi (hid_t tid, MPI_Comm *comm, MPI_Info *info, uintn *access_mode)
Copy a template
USAGE
hid_t H5P_copy(tid)
- hid_t tid; IN: Template object to copy
+ hid_t tid; IN: Template object to copy
RETURNS
Returns template ID (atom) on success, FAIL on failure
ERRORS
- ARGS BADRANGE Unknown template class.
- ATOM BADATOM Can't unatomize template.
+ ARGS BADRANGE Unknown template class.
+ ATOM BADATOM Can't unatomize template.
ATOM CANTREGISTER Register the atom for the new template.
INTERNAL UNSUPPORTED Dataset transfer properties are not implemented
- yet.
+ yet.
INTERNAL UNSUPPORTED File access properties are not implemented yet.
DESCRIPTION
@@ -1683,20 +1866,20 @@ H5Pget_mpi (hid_t tid, MPI_Comm *comm, MPI_Info *info, uintn *access_mode)
hid_t
H5Pcopy(hid_t tid)
{
- const void *tmpl = NULL;
- void *new_tmpl = NULL;
- H5P_class_t type;
- hid_t ret_value = FAIL;
- group_t group;
+ const void *tmpl = NULL;
+ void *new_tmpl = NULL;
+ H5P_class_t type;
+ hid_t ret_value = FAIL;
+ group_t group;
FUNC_ENTER(H5Pcopy, FAIL);
/* Check args */
if (NULL == (tmpl = H5A_object(tid)) ||
- (type = H5Pget_class(tid)) < 0 ||
- (group = H5A_group(tid)) < 0) {
- HRETURN_ERROR(H5E_ATOM, H5E_BADATOM, FAIL,
- "can't unatomize template");
+ (type = H5Pget_class(tid)) < 0 ||
+ (group = H5A_group(tid)) < 0) {
+ HRETURN_ERROR(H5E_ATOM, H5E_BADATOM, FAIL,
+ "can't unatomize template");
}
/* Copy it */
@@ -1707,8 +1890,8 @@ H5Pcopy(hid_t tid)
/* Register the atom for the new template */
if ((ret_value = H5A_register(group, new_tmpl)) < 0) {
- HRETURN_ERROR(H5E_ATOM, H5E_CANTREGISTER, FAIL,
- "unable to atomize template pointer");
+ HRETURN_ERROR(H5E_ATOM, H5E_CANTREGISTER, FAIL,
+ "unable to atomize template pointer");
}
FUNC_LEAVE(ret_value);
}
@@ -1724,7 +1907,7 @@ H5Pcopy(hid_t tid)
* Failure: NULL
*
* Programmer: Robb Matzke
- * Tuesday, February 3, 1998
+ * Tuesday, February 3, 1998
*
* Modifications:
*
@@ -1733,37 +1916,71 @@ H5Pcopy(hid_t tid)
void *
H5P_copy (H5P_class_t type, const void *src)
{
- size_t size;
- void *dst = NULL;
+ size_t size;
+ void *dst = NULL;
+ int i;
+ const H5D_create_t *dc_src = NULL;
+ H5D_create_t *dc_dst = NULL;
FUNC_ENTER (H5P_copy, NULL);
/* How big is the template */
switch (type) {
case H5P_FILE_CREATE:
- size = sizeof(H5F_create_t);
- break;
+ size = sizeof(H5F_create_t);
+ break;
case H5P_FILE_ACCESS:
size = sizeof(H5F_access_t);
break;
case H5P_DATASET_CREATE:
- size = sizeof(H5D_create_t);
- break;
+ size = sizeof(H5D_create_t);
+ break;
case H5P_DATASET_XFER:
- size = sizeof(H5D_xfer_t);
- break;
+ size = sizeof(H5D_xfer_t);
+ break;
default:
- HRETURN_ERROR(H5E_ARGS, H5E_BADRANGE, NULL,
- "unknown template class");
+ HRETURN_ERROR(H5E_ARGS, H5E_BADRANGE, NULL,
+ "unknown template class");
}
/* Create the new template */
dst = H5MM_xmalloc(size);
HDmemcpy(dst, src, size);
+ /* Deep-copy pointers */
+ switch (type) {
+ case H5P_FILE_CREATE:
+ break;
+
+ case H5P_FILE_ACCESS:
+ break;
+
+ case H5P_DATASET_CREATE:
+ dc_src = (const H5D_create_t*)src;
+ dc_dst = (H5D_create_t*)dst;
+
+ if (dc_src->efl.nalloc>0) {
+ dc_dst->efl.slot = H5MM_xmalloc (dc_dst->efl.nalloc *
+ sizeof(H5O_efl_entry_t));
+ for (i=0; i<dc_src->efl.nused; i++) {
+ char *s = H5MM_xstrdup (dc_src->efl.slot[i].name);
+ dc_dst->efl.slot[i] = dc_src->efl.slot[i];
+ dc_dst->efl.slot[i].name = s;
+ }
+ }
+ break;
+
+ case H5P_DATASET_XFER:
+ break;
+
+ default:
+ HRETURN_ERROR(H5E_ARGS, H5E_BADRANGE, NULL,
+ "unknown template class");
+ }
+
FUNC_LEAVE (dst);
}