summaryrefslogtreecommitdiffstats
path: root/src/H5Gnode.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/H5Gnode.c')
-rw-r--r--src/H5Gnode.c1577
1 files changed, 777 insertions, 800 deletions
diff --git a/src/H5Gnode.c b/src/H5Gnode.c
index f124d3e..d1d53ea 100644
--- a/src/H5Gnode.c
+++ b/src/H5Gnode.c
@@ -1,1017 +1,994 @@
/*-------------------------------------------------------------------------
- * Copyright (C) 1997 National Center for Supercomputing Applications.
+ * Copyright (C) 1997 National Center for Supercomputing Applications.
* All rights reserved.
*
*-------------------------------------------------------------------------
*
- * Created: snode.c
- * Jun 26 1997
- * Robb Matzke <matzke@llnl.gov>
+ * Created: snode.c
+ * Jun 26 1997
+ * Robb Matzke <matzke@llnl.gov>
*
- * Purpose: Functions for handling symbol table nodes. A
- * symbol table node is a small collection of symbol
- * table entries. A B-tree usually points to the
- * symbol table nodes for any given symbol table.
+ * Purpose: Functions for handling symbol table nodes. A
+ * symbol table node is a small collection of symbol
+ * table entries. A B-tree usually points to the
+ * symbol table nodes for any given symbol table.
*
* Modifications:
*
*-------------------------------------------------------------------------
*/
-#define H5G_PACKAGE /*suppress error message about including H5Gpkg.h*/
+#define H5G_PACKAGE /*suppress error message about including H5Gpkg.h */
/* Packages needed by this file... */
-#include <H5private.h> /*library */
-#include <H5ACprivate.h> /*cache */
-#include <H5Bprivate.h> /*B-link trees */
-#include <H5Eprivate.h> /*error handling */
-#include <H5Gpkg.h> /*me */
-#include <H5Hprivate.h> /*heap */
-#include <H5MFprivate.h> /*file memory management */
-#include <H5MMprivate.h> /*core memory management */
-#include <H5Oprivate.h> /*header messages */
-
-#define PABLO_MASK H5G_node_mask
+#include <H5private.h> /*library */
+#include <H5ACprivate.h> /*cache */
+#include <H5Bprivate.h> /*B-link trees */
+#include <H5Eprivate.h> /*error handling */
+#include <H5Gpkg.h> /*me */
+#include <H5Hprivate.h> /*heap */
+#include <H5MFprivate.h> /*file memory management */
+#include <H5MMprivate.h> /*core memory management */
+#include <H5Oprivate.h> /*header messages */
+
+#define PABLO_MASK H5G_node_mask
/* PRIVATE PROTOTYPES */
-static herr_t H5G_node_decode_key (H5F_t *f, H5B_t *bt, uint8 *raw,
- void *_key);
-static herr_t H5G_node_encode_key (H5F_t *f, H5B_t *bt, uint8 *raw,
- void *_key);
-static size_t H5G_node_size (H5F_t *f);
-static herr_t H5G_node_create (H5F_t *f, H5B_ins_t op, void *_lt_key,
- void *_udata, void *_rt_key,
- haddr_t *addr/*out*/);
-static herr_t H5G_node_flush (H5F_t *f, hbool_t destroy, const haddr_t *addr,
- H5G_node_t *sym);
-static H5G_node_t *H5G_node_load (H5F_t *f, const haddr_t *addr,
- const void *_udata1, void *_udata2);
-static intn H5G_node_cmp2 (H5F_t *f, void *_lt_key, void *_udata,
- void *_rt_key);
-static intn H5G_node_cmp3 (H5F_t *f, void *_lt_key, void *_udata,
- void *_rt_key);
-static herr_t H5G_node_found (H5F_t *f, const haddr_t *addr,
- const void *_lt_key, void *_udata,
- const void *_rt_key);
-static H5B_ins_t H5G_node_insert (H5F_t *f, const haddr_t *addr,
- void *_lt_key, hbool_t *lt_key_changed,
- void *_md_key, void *_udata,
- void *_rt_key, hbool_t *rt_key_changed,
- haddr_t *new_node/*out*/);
-static herr_t H5G_node_list (H5F_t *f, const haddr_t *addr, void *_udata);
-static size_t H5G_node_sizeof_rkey (H5F_t *f, const void *_udata);
+static herr_t H5G_node_decode_key(H5F_t *f, H5B_t *bt, uint8 *raw,
+ void *_key);
+static herr_t H5G_node_encode_key(H5F_t *f, H5B_t *bt, uint8 *raw,
+ void *_key);
+static size_t H5G_node_size(H5F_t *f);
+static herr_t H5G_node_create(H5F_t *f, H5B_ins_t op, void *_lt_key,
+ void *_udata, void *_rt_key,
+ haddr_t *addr /*out */ );
+static herr_t H5G_node_flush(H5F_t *f, hbool_t destroy, const haddr_t *addr,
+ H5G_node_t *sym);
+static H5G_node_t *H5G_node_load(H5F_t *f, const haddr_t *addr,
+ const void *_udata1, void *_udata2);
+static intn H5G_node_cmp2(H5F_t *f, void *_lt_key, void *_udata,
+ void *_rt_key);
+static intn H5G_node_cmp3(H5F_t *f, void *_lt_key, void *_udata,
+ void *_rt_key);
+static herr_t H5G_node_found(H5F_t *f, const haddr_t *addr,
+ const void *_lt_key, void *_udata,
+ const void *_rt_key);
+static H5B_ins_t H5G_node_insert(H5F_t *f, const haddr_t *addr,
+ void *_lt_key, hbool_t *lt_key_changed,
+ void *_md_key, void *_udata,
+ void *_rt_key, hbool_t *rt_key_changed,
+ haddr_t *new_node /*out */ );
+static herr_t H5G_node_list(H5F_t *f, const haddr_t *addr, void *_udata);
+static size_t H5G_node_sizeof_rkey(H5F_t *f, const void *_udata);
/* H5G inherits cache-like properties from H5AC */
-const H5AC_class_t H5AC_SNODE[1] = {{
- H5AC_SNODE_ID,
- (void*(*)(H5F_t*,const haddr_t*,const void*,void*))H5G_node_load,
- (herr_t(*)(H5F_t*,hbool_t,const haddr_t*,void*))H5G_node_flush,
-}};
+const H5AC_class_t H5AC_SNODE[1] =
+{
+ {
+ H5AC_SNODE_ID,
+ (void *(*)(H5F_t *, const haddr_t *, const void *, void *)) H5G_node_load,
+ (herr_t (*)(H5F_t *, hbool_t, const haddr_t *, void *)) H5G_node_flush,
+ }};
/* H5G inherits B-tree like properties from H5B */
-H5B_class_t H5B_SNODE[1] = {{
- H5B_SNODE_ID, /*id */
- sizeof (H5G_node_key_t), /*sizeof_nkey */
- H5G_node_sizeof_rkey, /*get_sizeof_rkey */
- H5G_node_create, /*new */
- H5G_node_cmp2, /*cmp2 */
- H5G_node_cmp3, /*cmp3 */
- H5G_node_found, /*found */
- H5G_node_insert, /*insert */
- TRUE, /*follow min branch? */
- TRUE, /*follow max branch? */
- H5G_node_list, /*list */
- H5G_node_decode_key, /*decode */
- H5G_node_encode_key, /*encode */
-}};
+H5B_class_t H5B_SNODE[1] =
+{
+ {
+ H5B_SNODE_ID, /*id */
+ sizeof(H5G_node_key_t), /*sizeof_nkey */
+ H5G_node_sizeof_rkey, /*get_sizeof_rkey */
+ H5G_node_create, /*new */
+ H5G_node_cmp2, /*cmp2 */
+ H5G_node_cmp3, /*cmp3 */
+ H5G_node_found, /*found */
+ H5G_node_insert, /*insert */
+ TRUE, /*follow min branch? */
+ TRUE, /*follow max branch? */
+ H5G_node_list, /*list */
+ H5G_node_decode_key, /*decode */
+ H5G_node_encode_key, /*encode */
+ }};
/* Interface initialization */
-static intn interface_initialize_g = FALSE;
-#define INTERFACE_INIT NULL
-
+static intn interface_initialize_g = FALSE;
+#define INTERFACE_INIT NULL
/*-------------------------------------------------------------------------
- * Function: H5G_node_sizeof_rkey
+ * Function: H5G_node_sizeof_rkey
*
- * Purpose: Returns the size of a raw B-link tree key for the specified
- * file.
+ * Purpose: Returns the size of a raw B-link tree key for the specified
+ * file.
*
- * Return: Success: Size of the key.
+ * Return: Success: Size of the key.
*
- * Failure: never fails
+ * Failure: never fails
*
- * Programmer: Robb Matzke
- * matzke@llnl.gov
- * Jul 14 1997
+ * Programmer: Robb Matzke
+ * matzke@llnl.gov
+ * Jul 14 1997
*
* Modifications:
*
*-------------------------------------------------------------------------
*/
static size_t
-H5G_node_sizeof_rkey (H5F_t *f, const void *udata __attribute__((unused)))
+H5G_node_sizeof_rkey(H5F_t *f, const void *udata __attribute__((unused)))
{
- return H5F_SIZEOF_SIZE(f); /*the name offset*/
+ return H5F_SIZEOF_SIZE(f); /*the name offset */
}
-
/*-------------------------------------------------------------------------
- * Function: H5G_node_decode_key
+ * Function: H5G_node_decode_key
*
- * Purpose: Decodes a raw key into a native key.
+ * Purpose: Decodes a raw key into a native key.
*
- * Return: Success: SUCCEED
+ * Return: Success: SUCCEED
*
- * Failure: FAIL
+ * Failure: FAIL
*
- * Programmer: Robb Matzke
- * matzke@llnl.gov
- * Jul 8 1997
+ * Programmer: Robb Matzke
+ * matzke@llnl.gov
+ * Jul 8 1997
*
* Modifications:
*
*-------------------------------------------------------------------------
*/
static herr_t
-H5G_node_decode_key (H5F_t *f, H5B_t *bt, uint8 *raw, void *_key)
+H5G_node_decode_key(H5F_t *f, H5B_t *bt, uint8 *raw, void *_key)
{
- H5G_node_key_t *key = (H5G_node_key_t *)_key;
+ H5G_node_key_t *key = (H5G_node_key_t *) _key;
- FUNC_ENTER (H5G_node_decode_key, FAIL);
+ FUNC_ENTER(H5G_node_decode_key, FAIL);
- assert (f);
- assert (raw);
- assert (key);
+ assert(f);
+ assert(raw);
+ assert(key);
- H5F_decode_length (f, raw, key->offset);
+ H5F_decode_length(f, raw, key->offset);
- FUNC_LEAVE (SUCCEED);
+ FUNC_LEAVE(SUCCEED);
}
-
/*-------------------------------------------------------------------------
- * Function: H5G_node_encode_key
+ * Function: H5G_node_encode_key
*
- * Purpose: Encodes a native key into a raw key.
+ * Purpose: Encodes a native key into a raw key.
*
- * Return: Success: SUCCEED
+ * Return: Success: SUCCEED
*
- * Failure: FAIL
+ * Failure: FAIL
*
- * Programmer: Robb Matzke
- * matzke@llnl.gov
- * Jul 8 1997
+ * Programmer: Robb Matzke
+ * matzke@llnl.gov
+ * Jul 8 1997
*
* Modifications:
*
*-------------------------------------------------------------------------
*/
static herr_t
-H5G_node_encode_key (H5F_t *f, H5B_t *bt, uint8 *raw, void *_key)
+H5G_node_encode_key(H5F_t *f, H5B_t *bt, uint8 *raw, void *_key)
{
- H5G_node_key_t *key = (H5G_node_key_t *)_key;
+ H5G_node_key_t *key = (H5G_node_key_t *) _key;
- FUNC_ENTER (H5G_node_encode_key, FAIL);
+ FUNC_ENTER(H5G_node_encode_key, FAIL);
- assert (f);
- assert (raw);
- assert (key);
+ assert(f);
+ assert(raw);
+ assert(key);
- H5F_encode_length (f, raw, key->offset);
+ H5F_encode_length(f, raw, key->offset);
- FUNC_LEAVE (SUCCEED);
+ FUNC_LEAVE(SUCCEED);
}
-
/*-------------------------------------------------------------------------
- * Function: H5G_node_size
+ * Function: H5G_node_size
*
- * Purpose: Returns the total size of a symbol table node.
+ * Purpose: Returns the total size of a symbol table node.
*
- * Return: Success: Total size of the node in bytes.
+ * Return: Success: Total size of the node in bytes.
*
- * Failure: Never fails.
+ * Failure: Never fails.
*
- * Programmer: Robb Matzke
- * matzke@llnl.gov
- * Jun 23 1997
+ * Programmer: Robb Matzke
+ * matzke@llnl.gov
+ * Jun 23 1997
*
* Modifications:
*
*-------------------------------------------------------------------------
*/
static size_t
-H5G_node_size (H5F_t *f)
+H5G_node_size(H5F_t *f)
{
- return H5G_NODE_SIZEOF_HDR(f) +
- (2*H5G_NODE_K(f)) * H5G_SIZEOF_ENTRY(f);
+ return H5G_NODE_SIZEOF_HDR(f) +
+ (2 * H5G_NODE_K(f)) * H5G_SIZEOF_ENTRY(f);
}
-
/*-------------------------------------------------------------------------
- * Function: H5G_node_create
+ * Function: H5G_node_create
*
- * Purpose: Creates a new empty symbol table node. This function is
- * called by the B-tree insert function for an empty tree. It
- * is also called internally to split a symbol node with LT_KEY
- * and RT_KEY null pointers.
+ * Purpose: Creates a new empty symbol table node. This function is
+ * called by the B-tree insert function for an empty tree. It
+ * is also called internally to split a symbol node with LT_KEY
+ * and RT_KEY null pointers.
*
- * Return: Success: SUCCEED. The address of symbol table node is
- * returned through the ADDR argument.
+ * Return: Success: SUCCEED. The address of symbol table node is
+ * returned through the ADDR argument.
*
- * Failure: FAIL
+ * Failure: FAIL
*
- * Programmer: Robb Matzke
- * matzke@llnl.gov
- * Jun 23 1997
+ * Programmer: Robb Matzke
+ * matzke@llnl.gov
+ * Jun 23 1997
*
* Modifications:
*
*-------------------------------------------------------------------------
*/
static herr_t
-H5G_node_create (H5F_t *f, H5B_ins_t op,
- void *_lt_key, void *_udata, void *_rt_key,
- haddr_t *addr/*out*/)
+H5G_node_create(H5F_t *f, H5B_ins_t op,
+ void *_lt_key, void *_udata, void *_rt_key,
+ haddr_t *addr /*out */ )
{
- H5G_node_key_t *lt_key = (H5G_node_key_t*)_lt_key;
- H5G_node_key_t *rt_key = (H5G_node_key_t*)_rt_key;
- H5G_node_t *sym = NULL;
- size_t size = 0;
-
- FUNC_ENTER (H5G_node_create, FAIL);
-
- /*
- * Check arguments.
- */
- assert (f);
- assert (H5B_INS_FIRST==op);
-
- sym = H5MM_xcalloc (1, sizeof(H5G_node_t));
- size = H5G_node_size (f);
- if (H5MF_alloc (f, H5MF_META, size, addr/*out*/)<0) {
- H5MM_xfree (sym);
- HRETURN_ERROR (H5E_SYM, H5E_CANTINIT, FAIL,
- "unable to allocate file space");
- }
-
- sym->dirty = TRUE;
- sym->entry = H5MM_xcalloc (2 * H5G_NODE_K(f), sizeof(H5G_entry_t));
- if (H5AC_set (f, H5AC_SNODE, addr, sym)<0) {
- H5MM_xfree (sym->entry);
- H5MM_xfree (sym);
- HRETURN_ERROR (H5E_SYM, H5E_CANTINIT, FAIL,
- "unable to cache symbol table leaf node");
- }
-
- /*
- * The left and right symbols in an empty tree are both the
- * empty string stored at offset zero by the H5G functions. This
- * allows the comparison functions to work correctly without knowing
- * that there are no symbols.
- */
- if (lt_key) lt_key->offset = 0;
- if (rt_key) rt_key->offset = 0;
-
- FUNC_LEAVE (SUCCEED);
+ H5G_node_key_t *lt_key = (H5G_node_key_t *) _lt_key;
+ H5G_node_key_t *rt_key = (H5G_node_key_t *) _rt_key;
+ H5G_node_t *sym = NULL;
+ size_t size = 0;
+
+ FUNC_ENTER(H5G_node_create, FAIL);
+
+ /*
+ * Check arguments.
+ */
+ assert(f);
+ assert(H5B_INS_FIRST == op);
+
+ sym = H5MM_xcalloc(1, sizeof(H5G_node_t));
+ size = H5G_node_size(f);
+ if (H5MF_alloc(f, H5MF_META, size, addr /*out */ ) < 0) {
+ H5MM_xfree(sym);
+ HRETURN_ERROR(H5E_SYM, H5E_CANTINIT, FAIL,
+ "unable to allocate file space");
+ }
+ sym->dirty = TRUE;
+ sym->entry = H5MM_xcalloc(2 * H5G_NODE_K(f), sizeof(H5G_entry_t));
+ if (H5AC_set(f, H5AC_SNODE, addr, sym) < 0) {
+ H5MM_xfree(sym->entry);
+ H5MM_xfree(sym);
+ HRETURN_ERROR(H5E_SYM, H5E_CANTINIT, FAIL,
+ "unable to cache symbol table leaf node");
+ }
+ /*
+ * The left and right symbols in an empty tree are both the
+ * empty string stored at offset zero by the H5G functions. This
+ * allows the comparison functions to work correctly without knowing
+ * that there are no symbols.
+ */
+ if (lt_key)
+ lt_key->offset = 0;
+ if (rt_key)
+ rt_key->offset = 0;
+
+ FUNC_LEAVE(SUCCEED);
}
-
/*-------------------------------------------------------------------------
- * Function: H5G_node_flush
+ * Function: H5G_node_flush
*
- * Purpose: Flush a symbol table node to disk.
+ * Purpose: Flush a symbol table node to disk.
*
- * Return: Success: SUCCEED
+ * Return: Success: SUCCEED
*
- * Failure: FAIL
+ * Failure: FAIL
*
- * Programmer: Robb Matzke
- * matzke@llnl.gov
- * Jun 23 1997
+ * Programmer: Robb Matzke
+ * matzke@llnl.gov
+ * Jun 23 1997
*
* Modifications:
*
*-------------------------------------------------------------------------
*/
static herr_t
-H5G_node_flush (H5F_t *f, hbool_t destroy, const haddr_t *addr,
- H5G_node_t *sym)
+H5G_node_flush(H5F_t *f, hbool_t destroy, const haddr_t *addr,
+ H5G_node_t *sym)
{
- uint8 *buf=NULL, *p=NULL;
- size_t size;
- herr_t status;
- int i;
-
- FUNC_ENTER (H5G_node_flush, FAIL);
-
- /*
- * Check arguments.
- */
- assert (f);
- assert (addr && H5F_addr_defined (addr));
- assert (sym);
-
- /*
- * Look for dirty entries and set the node dirty flag.
- */
- for (i=0; i<sym->nsyms; i++) {
- if (sym->entry[i].dirty) sym->dirty = TRUE;
- }
-
- /*
- * Write the symbol node to disk.
- */
- if (sym->dirty) {
- size = H5G_node_size (f);
- buf = p = H5MM_xmalloc (size);
-
- /* magic number */
- HDmemcpy (p, H5G_NODE_MAGIC, H5G_NODE_SIZEOF_MAGIC);
- p += 4;
-
- /* version number */
- *p++ = H5G_NODE_VERS;
-
- /* reserved */
- *p++ = 0;
-
- /* number of symbols */
- UINT16ENCODE (p, sym->nsyms);
-
- /* entries */
- H5G_ent_encode_vec (f, &p, sym->entry, sym->nsyms);
- HDmemset (p, 0, size - (p-buf));
-
- status = H5F_block_write (f, addr, size, buf);
- buf = H5MM_xfree (buf);
- if (status<0) HRETURN_ERROR (H5E_SYM, H5E_WRITEERROR, FAIL,
- "unable to write symbol table node to "
- "the file");
- }
-
- /*
- * Destroy the symbol node? This might happen if the node is being
- * preempted from the cache.
- */
- if (destroy) {
- sym->entry = H5MM_xfree (sym->entry);
- H5MM_xfree (sym);
- }
-
- FUNC_LEAVE (SUCCEED);
+ uint8 *buf = NULL, *p = NULL;
+ size_t size;
+ herr_t status;
+ int i;
+
+ FUNC_ENTER(H5G_node_flush, FAIL);
+
+ /*
+ * Check arguments.
+ */
+ assert(f);
+ assert(addr && H5F_addr_defined(addr));
+ assert(sym);
+
+ /*
+ * Look for dirty entries and set the node dirty flag.
+ */
+ for (i = 0; i < sym->nsyms; i++) {
+ if (sym->entry[i].dirty)
+ sym->dirty = TRUE;
+ }
+
+ /*
+ * Write the symbol node to disk.
+ */
+ if (sym->dirty) {
+ size = H5G_node_size(f);
+ buf = p = H5MM_xmalloc(size);
+
+ /* magic number */
+ HDmemcpy(p, H5G_NODE_MAGIC, H5G_NODE_SIZEOF_MAGIC);
+ p += 4;
+
+ /* version number */
+ *p++ = H5G_NODE_VERS;
+
+ /* reserved */
+ *p++ = 0;
+
+ /* number of symbols */
+ UINT16ENCODE(p, sym->nsyms);
+
+ /* entries */
+ H5G_ent_encode_vec(f, &p, sym->entry, sym->nsyms);
+ HDmemset(p, 0, size - (p - buf));
+
+ status = H5F_block_write(f, addr, size, buf);
+ buf = H5MM_xfree(buf);
+ if (status < 0)
+ HRETURN_ERROR(H5E_SYM, H5E_WRITEERROR, FAIL,
+ "unable to write symbol table node to "
+ "the file");
+ }
+ /*
+ * Destroy the symbol node? This might happen if the node is being
+ * preempted from the cache.
+ */
+ if (destroy) {
+ sym->entry = H5MM_xfree(sym->entry);
+ H5MM_xfree(sym);
+ }
+ FUNC_LEAVE(SUCCEED);
}
-
/*-------------------------------------------------------------------------
- * Function: H5G_node_load
+ * Function: H5G_node_load
*
- * Purpose: Loads a symbol table node from the file.
+ * Purpose: Loads a symbol table node from the file.
*
- * Return: Success: Ptr to the new table.
+ * Return: Success: Ptr to the new table.
*
- * Failure: NULL
+ * Failure: NULL
*
- * Programmer: Robb Matzke
- * matzke@llnl.gov
- * Jun 23 1997
+ * Programmer: Robb Matzke
+ * matzke@llnl.gov
+ * Jun 23 1997
*
* Modifications:
*
*-------------------------------------------------------------------------
*/
-static H5G_node_t *
-H5G_node_load (H5F_t *f, const haddr_t *addr, const void *_udata1,
- void *_udata2)
+static H5G_node_t *
+H5G_node_load(H5F_t *f, const haddr_t *addr, const void *_udata1,
+ void *_udata2)
{
- H5G_node_t *sym = NULL;
- size_t size = 0;
- uint8 *buf = NULL;
- const uint8 *p = NULL;
- H5G_node_t *ret_value = NULL; /*for error handling*/
-
- FUNC_ENTER (H5G_node_load, NULL);
-
- /*
- * Check arguments.
- */
- assert (f);
- assert (addr && H5F_addr_defined (addr));
- assert (!_udata1);
- assert (NULL==_udata2);
-
- /*
- * Initialize variables.
- */
- size = H5G_node_size (f);
- p = buf = H5MM_xmalloc (size);
- sym = H5MM_xcalloc (1, sizeof(H5G_node_t));
- sym->entry = H5MM_xcalloc (2*H5G_NODE_K(f), sizeof(H5G_entry_t));
-
- if (H5F_block_read (f, addr, size, buf)<0) {
- HGOTO_ERROR (H5E_SYM, H5E_READERROR, NULL,
- "unabel to read symbol table node");
- }
-
- /* magic */
- if (HDmemcmp (p, H5G_NODE_MAGIC, H5G_NODE_SIZEOF_MAGIC)) {
- HGOTO_ERROR (H5E_SYM, H5E_CANTLOAD, NULL,
- "bad symbol table node signature");
- }
- p += 4;
-
- /* version */
- if (H5G_NODE_VERS!=*p++) {
- HGOTO_ERROR (H5E_SYM, H5E_CANTLOAD, NULL,
- "bad symbol table node version");
- }
-
- /* reserved */
- p++;
-
- /* number of symbols */
- UINT16DECODE (p, sym->nsyms);
-
- /* entries */
- if (H5G_ent_decode_vec (f, &p, sym->entry, sym->nsyms)<0) {
- HGOTO_ERROR (H5E_SYM, H5E_CANTLOAD, NULL,
- "unable to decode symbol table entries");
- }
- buf = H5MM_xfree (buf);
-
- ret_value = sym;
-
-
- done:
- if (!ret_value) {
- buf = H5MM_xfree (buf);
- if (sym) {
- sym->entry = H5MM_xfree (sym->entry);
- sym = H5MM_xfree (sym);
- }
- }
- FUNC_LEAVE (ret_value);
+ H5G_node_t *sym = NULL;
+ size_t size = 0;
+ uint8 *buf = NULL;
+ const uint8 *p = NULL;
+ H5G_node_t *ret_value = NULL; /*for error handling */
+
+ FUNC_ENTER(H5G_node_load, NULL);
+
+ /*
+ * Check arguments.
+ */
+ assert(f);
+ assert(addr && H5F_addr_defined(addr));
+ assert(!_udata1);
+ assert(NULL == _udata2);
+
+ /*
+ * Initialize variables.
+ */
+ size = H5G_node_size(f);
+ p = buf = H5MM_xmalloc(size);
+ sym = H5MM_xcalloc(1, sizeof(H5G_node_t));
+ sym->entry = H5MM_xcalloc(2 * H5G_NODE_K(f), sizeof(H5G_entry_t));
+
+ if (H5F_block_read(f, addr, size, buf) < 0) {
+ HGOTO_ERROR(H5E_SYM, H5E_READERROR, NULL,
+ "unabel to read symbol table node");
+ }
+ /* magic */
+ if (HDmemcmp(p, H5G_NODE_MAGIC, H5G_NODE_SIZEOF_MAGIC)) {
+ HGOTO_ERROR(H5E_SYM, H5E_CANTLOAD, NULL,
+ "bad symbol table node signature");
+ }
+ p += 4;
+
+ /* version */
+ if (H5G_NODE_VERS != *p++) {
+ HGOTO_ERROR(H5E_SYM, H5E_CANTLOAD, NULL,
+ "bad symbol table node version");
+ }
+ /* reserved */
+ p++;
+
+ /* number of symbols */
+ UINT16DECODE(p, sym->nsyms);
+
+ /* entries */
+ if (H5G_ent_decode_vec(f, &p, sym->entry, sym->nsyms) < 0) {
+ HGOTO_ERROR(H5E_SYM, H5E_CANTLOAD, NULL,
+ "unable to decode symbol table entries");
+ }
+ buf = H5MM_xfree(buf);
+
+ ret_value = sym;
+
+ done:
+ if (!ret_value) {
+ buf = H5MM_xfree(buf);
+ if (sym) {
+ sym->entry = H5MM_xfree(sym->entry);
+ sym = H5MM_xfree(sym);
+ }
+ }
+ FUNC_LEAVE(ret_value);
}
-
/*-------------------------------------------------------------------------
- * Function: H5G_node_cmp2
+ * Function: H5G_node_cmp2
*
- * Purpose: Compares two keys from a B-tree node (LT_KEY and RT_KEY).
- * The UDATA pointer supplies extra data not contained in the
- * keys (in this case, the heap address).
+ * Purpose: Compares two keys from a B-tree node (LT_KEY and RT_KEY).
+ * The UDATA pointer supplies extra data not contained in the
+ * keys (in this case, the heap address).
*
- * Return: Success: negative if LT_KEY is less than RT_KEY.
+ * Return: Success: negative if LT_KEY is less than RT_KEY.
*
- * positive if LT_KEY is greater than RT_KEY.
+ * positive if LT_KEY is greater than RT_KEY.
*
- * zero if LT_KEY and RT_KEY are equal.
+ * zero if LT_KEY and RT_KEY are equal.
*
- * Failure: FAIL (same as LT_KEY<RT_KEY)
+ * Failure: FAIL (same as LT_KEY<RT_KEY)
*
- * Programmer: Robb Matzke
- * matzke@llnl.gov
- * Jun 23 1997
+ * Programmer: Robb Matzke
+ * matzke@llnl.gov
+ * Jun 23 1997
*
* Modifications:
*
*-------------------------------------------------------------------------
*/
static intn
-H5G_node_cmp2 (H5F_t *f, void *_lt_key, void *_udata, void *_rt_key)
+H5G_node_cmp2(H5F_t *f, void *_lt_key, void *_udata, void *_rt_key)
{
- H5G_bt_ud1_t *udata = (H5G_bt_ud1_t *)_udata;
- H5G_node_key_t *lt_key = (H5G_node_key_t *)_lt_key;
- H5G_node_key_t *rt_key = (H5G_node_key_t *)_rt_key;
- const char *s1, *s2;
- intn cmp;
-
- FUNC_ENTER (H5G_node_cmp2, FAIL);
-
- assert (udata);
- assert (lt_key);
- assert (rt_key);
-
- if (NULL==(s1=H5H_peek (f, &(udata->heap_addr), lt_key->offset))) {
- HRETURN_ERROR (H5E_SYM, H5E_NOTFOUND, FAIL,
- "unable to read symbol name");
- }
- if (NULL==(s2=H5H_peek (f, &(udata->heap_addr), rt_key->offset))) {
- HRETURN_ERROR (H5E_SYM, H5E_NOTFOUND, FAIL,
- "unable to read symbol name");
- }
-
- cmp = HDstrcmp (s1, s2);
-
- FUNC_LEAVE (cmp);
+ H5G_bt_ud1_t *udata = (H5G_bt_ud1_t *) _udata;
+ H5G_node_key_t *lt_key = (H5G_node_key_t *) _lt_key;
+ H5G_node_key_t *rt_key = (H5G_node_key_t *) _rt_key;
+ const char *s1, *s2;
+ intn cmp;
+
+ FUNC_ENTER(H5G_node_cmp2, FAIL);
+
+ assert(udata);
+ assert(lt_key);
+ assert(rt_key);
+
+ if (NULL == (s1 = H5H_peek(f, &(udata->heap_addr), lt_key->offset))) {
+ HRETURN_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL,
+ "unable to read symbol name");
+ }
+ if (NULL == (s2 = H5H_peek(f, &(udata->heap_addr), rt_key->offset))) {
+ HRETURN_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL,
+ "unable to read symbol name");
+ }
+ cmp = HDstrcmp(s1, s2);
+
+ FUNC_LEAVE(cmp);
}
-
/*-------------------------------------------------------------------------
- * Function: H5G_node_cmp3
+ * Function: H5G_node_cmp3
*
- * Purpose: Compares two keys from a B-tree node (LT_KEY and RT_KEY)
- * against another key (not necessarily the same type)
- * pointed to by UDATA.
+ * Purpose: Compares two keys from a B-tree node (LT_KEY and RT_KEY)
+ * against another key (not necessarily the same type)
+ * pointed to by UDATA.
*
- * Return: Success: negative if the UDATA key is less than
- * or equal to the LT_KEY
+ * Return: Success: negative if the UDATA key is less than
+ * or equal to the LT_KEY
*
- * positive if the UDATA key is greater
- * than the RT_KEY.
+ * positive if the UDATA key is greater
+ * than the RT_KEY.
*
- * zero if the UDATA key falls between
- * the LT_KEY (exclusive) and the
- * RT_KEY (inclusive).
+ * zero if the UDATA key falls between
+ * the LT_KEY (exclusive) and the
+ * RT_KEY (inclusive).
*
- * Failure: FAIL (same as UDATA < LT_KEY)
+ * Failure: FAIL (same as UDATA < LT_KEY)
*
- * Programmer: Robb Matzke
- * matzke@llnl.gov
- * Jun 23 1997
+ * Programmer: Robb Matzke
+ * matzke@llnl.gov
+ * Jun 23 1997
*
* Modifications:
*
*-------------------------------------------------------------------------
*/
static intn
-H5G_node_cmp3 (H5F_t *f, void *_lt_key, void *_udata, void *_rt_key)
+H5G_node_cmp3(H5F_t *f, void *_lt_key, void *_udata, void *_rt_key)
{
- H5G_bt_ud1_t *udata = (H5G_bt_ud1_t *)_udata;
- H5G_node_key_t *lt_key = (H5G_node_key_t *)_lt_key;
- H5G_node_key_t *rt_key = (H5G_node_key_t *)_rt_key;
- const char *s;
-
- FUNC_ENTER (H5G_node_cmp3, FAIL);
-
- /* left side */
- if (NULL==(s=H5H_peek (f, &(udata->heap_addr), lt_key->offset))) {
- HRETURN_ERROR (H5E_SYM, H5E_NOTFOUND, FAIL,
- "unable to read symbol name");
- }
- if (HDstrcmp (udata->name, s)<=0) HRETURN (-1);
-
- /* right side */
- if (NULL==(s=H5H_peek (f, &(udata->heap_addr), rt_key->offset))) {
- HRETURN_ERROR (H5E_SYM, H5E_NOTFOUND, FAIL,
- "unable to read symbol name");
- }
- if (HDstrcmp (udata->name, s)>0) HRETURN(1);
-
- FUNC_LEAVE (0);
+ H5G_bt_ud1_t *udata = (H5G_bt_ud1_t *) _udata;
+ H5G_node_key_t *lt_key = (H5G_node_key_t *) _lt_key;
+ H5G_node_key_t *rt_key = (H5G_node_key_t *) _rt_key;
+ const char *s;
+
+ FUNC_ENTER(H5G_node_cmp3, FAIL);
+
+ /* left side */
+ if (NULL == (s = H5H_peek(f, &(udata->heap_addr), lt_key->offset))) {
+ HRETURN_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL,
+ "unable to read symbol name");
+ }
+ if (HDstrcmp(udata->name, s) <= 0)
+ HRETURN(-1);
+
+ /* right side */
+ if (NULL == (s = H5H_peek(f, &(udata->heap_addr), rt_key->offset))) {
+ HRETURN_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL,
+ "unable to read symbol name");
+ }
+ if (HDstrcmp(udata->name, s) > 0)
+ HRETURN(1);
+
+ FUNC_LEAVE(0);
}
-
/*-------------------------------------------------------------------------
- * Function: H5G_node_found
+ * Function: H5G_node_found
*
- * Purpose: The B-tree search engine has found the symbol table node
- * which contains the requested symbol if the symbol exists.
- * This function should examine that node for the symbol and
- * return information about the symbol through the UDATA
- * structure which contains the symbol name on function
- * entry.
+ * Purpose: The B-tree search engine has found the symbol table node
+ * which contains the requested symbol if the symbol exists.
+ * This function should examine that node for the symbol and
+ * return information about the symbol through the UDATA
+ * structure which contains the symbol name on function
+ * entry.
*
- * If the operation flag in UDATA is H5G_OPER_FIND, then
- * the entry is copied from the symbol table to the UDATA
- * entry field. Otherwise the entry is copied from the
- * UDATA entry field to the symbol table.
+ * If the operation flag in UDATA is H5G_OPER_FIND, then
+ * the entry is copied from the symbol table to the UDATA
+ * entry field. Otherwise the entry is copied from the
+ * UDATA entry field to the symbol table.
*
- * Return: Success: SUCCEED if found and data returned through
- * the UDATA pointer.
+ * Return: Success: SUCCEED if found and data returned through
+ * the UDATA pointer.
*
- * Failure: FAIL if not found.
+ * Failure: FAIL if not found.
*
- * Programmer: Robb Matzke
- * matzke@llnl.gov
- * Jun 23 1997
+ * Programmer: Robb Matzke
+ * matzke@llnl.gov
+ * Jun 23 1997
*
* Modifications:
*
*-------------------------------------------------------------------------
*/
static herr_t
-H5G_node_found (H5F_t *f, const haddr_t *addr, const void *_lt_key,
- void *_udata, const void *_rt_key)
+H5G_node_found(H5F_t *f, const haddr_t *addr, const void *_lt_key,
+ void *_udata, const void *_rt_key)
{
- H5G_bt_ud1_t *bt_udata = (H5G_bt_ud1_t *)_udata;
- H5G_node_t *sn = NULL;
- intn lt=0, idx=0, rt, cmp=1;
- const char *s;
- herr_t ret_value = FAIL;
-
- FUNC_ENTER (H5G_node_found, FAIL);
-
- /*
- * Check arguments.
- */
- assert (f);
- assert (addr && H5F_addr_defined (addr));
- assert (bt_udata);
-
-
- /*
- * Load the symbol table node for exclusive access.
- */
- if (NULL==(sn=H5AC_protect (f, H5AC_SNODE, addr, NULL, NULL))) {
- HGOTO_ERROR (H5E_SYM, H5E_CANTLOAD, FAIL,
- "unable to protect symbol table node");
- }
-
- /*
- * Binary search.
- */
- rt = sn->nsyms;
- while (lt<rt && cmp) {
- idx = (lt + rt) / 2;
- if (NULL==(s=H5H_peek (f, &(bt_udata->heap_addr),
- sn->entry[idx].name_off))) {
- HGOTO_ERROR (H5E_SYM, H5E_NOTFOUND, FAIL,
- "unable to read symbol name");
- }
- cmp = HDstrcmp (bt_udata->name, s);
-
- if (cmp<0) {
- rt = idx;
- } else {
- lt = idx+1;
- }
- }
- if (cmp) HGOTO_ERROR (H5E_SYM, H5E_NOTFOUND, FAIL, "not found");
-
- switch (bt_udata->operation) {
- case H5G_OPER_FIND:
- /*
- * The caller is querying the symbol entry. Return just a pointer to
- * the entry. The pointer is valid until the next call to H5AC.
- */
- bt_udata->ent = sn->entry[idx];
- break;
-
- default:
- HRETURN_ERROR (H5E_SYM, H5E_UNSUPPORTED, FAIL,
- "internal erorr (unknown symbol find operation)");
- break;
- }
- ret_value = SUCCEED;
-
-done:
- if (sn && H5AC_unprotect (f, H5AC_SNODE, addr, sn)<0) {
- HRETURN_ERROR (H5E_SYM, H5E_PROTECT, FAIL,
- "unable to release symbol table node");
- }
-
- FUNC_LEAVE (ret_value);
+ H5G_bt_ud1_t *bt_udata = (H5G_bt_ud1_t *) _udata;
+ H5G_node_t *sn = NULL;
+ intn lt = 0, idx = 0, rt, cmp = 1;
+ const char *s;
+ herr_t ret_value = FAIL;
+
+ FUNC_ENTER(H5G_node_found, FAIL);
+
+ /*
+ * Check arguments.
+ */
+ assert(f);
+ assert(addr && H5F_addr_defined(addr));
+ assert(bt_udata);
+
+ /*
+ * Load the symbol table node for exclusive access.
+ */
+ if (NULL == (sn = H5AC_protect(f, H5AC_SNODE, addr, NULL, NULL))) {
+ HGOTO_ERROR(H5E_SYM, H5E_CANTLOAD, FAIL,
+ "unable to protect symbol table node");
+ }
+ /*
+ * Binary search.
+ */
+ rt = sn->nsyms;
+ while (lt < rt && cmp) {
+ idx = (lt + rt) / 2;
+ if (NULL == (s = H5H_peek(f, &(bt_udata->heap_addr),
+ sn->entry[idx].name_off))) {
+ HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL,
+ "unable to read symbol name");
+ }
+ cmp = HDstrcmp(bt_udata->name, s);
+
+ if (cmp < 0) {
+ rt = idx;
+ } else {
+ lt = idx + 1;
+ }
+ }
+ if (cmp)
+ HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "not found");
+
+ switch (bt_udata->operation) {
+ case H5G_OPER_FIND:
+ /*
+ * The caller is querying the symbol entry. Return just a pointer to
+ * the entry. The pointer is valid until the next call to H5AC.
+ */
+ bt_udata->ent = sn->entry[idx];
+ break;
+
+ default:
+ HRETURN_ERROR(H5E_SYM, H5E_UNSUPPORTED, FAIL,
+ "internal erorr (unknown symbol find operation)");
+ break;
+ }
+ ret_value = SUCCEED;
+
+ done:
+ if (sn && H5AC_unprotect(f, H5AC_SNODE, addr, sn) < 0) {
+ HRETURN_ERROR(H5E_SYM, H5E_PROTECT, FAIL,
+ "unable to release symbol table node");
+ }
+ FUNC_LEAVE(ret_value);
}
-
/*-------------------------------------------------------------------------
- * Function: H5G_node_insert
+ * Function: H5G_node_insert
*
- * Purpose: The B-tree insertion engine has found the symbol table node
- * which should receive the new symbol/address pair. This
- * function adds it to that node unless it already existed.
+ * Purpose: The B-tree insertion engine has found the symbol table node
+ * which should receive the new symbol/address pair. This
+ * function adds it to that node unless it already existed.
*
- * If the node has no room for the symbol then the node is
- * split into two nodes. The original node contains the
- * low values and the new node contains the high values.
- * The new symbol table entry is added to either node as
- * appropriate. When a split occurs, this function will
- * write the maximum key of the low node to the MID buffer
- * and return the address of the new node.
+ * If the node has no room for the symbol then the node is
+ * split into two nodes. The original node contains the
+ * low values and the new node contains the high values.
+ * The new symbol table entry is added to either node as
+ * appropriate. When a split occurs, this function will
+ * write the maximum key of the low node to the MID buffer
+ * and return the address of the new node.
*
- * If the new key is larger than RIGHT then update RIGHT
- * with the new key.
+ * If the new key is larger than RIGHT then update RIGHT
+ * with the new key.
*
- * Return: Success: An insertion command for the caller, one of
- * the H5B_INS_* constants. The address of the
- * new node, if any, is returned through the
- * NEW_NODE argument. NEW_NODE might not be
- * initialized if the return value is
- * H5B_INS_NOOP.
+ * Return: Success: An insertion command for the caller, one of
+ * the H5B_INS_* constants. The address of the
+ * new node, if any, is returned through the
+ * NEW_NODE argument. NEW_NODE might not be
+ * initialized if the return value is
+ * H5B_INS_NOOP.
*
- * Failure: H5B_INS_ERROR, NEW_NODE might not be
- * initialized.
+ * Failure: H5B_INS_ERROR, NEW_NODE might not be
+ * initialized.
*
- * Programmer: Robb Matzke
- * matzke@llnl.gov
- * Jun 24 1997
+ * Programmer: Robb Matzke
+ * matzke@llnl.gov
+ * Jun 24 1997
*
* Modifications:
*
*-------------------------------------------------------------------------
*/
static H5B_ins_t
-H5G_node_insert (H5F_t *f, const haddr_t *addr,
- void *_lt_key, hbool_t *lt_key_changed,
- void *_md_key, void *_udata,
- void *_rt_key, hbool_t *rt_key_changed,
- haddr_t *new_node)
+H5G_node_insert(H5F_t *f, const haddr_t *addr,
+ void *_lt_key, hbool_t *lt_key_changed,
+ void *_md_key, void *_udata,
+ void *_rt_key, hbool_t *rt_key_changed,
+ haddr_t *new_node)
{
- H5G_node_key_t *md_key = (H5G_node_key_t *)_md_key;
- H5G_node_key_t *rt_key = (H5G_node_key_t *)_rt_key;
- H5G_bt_ud1_t *bt_udata = (H5G_bt_ud1_t *)_udata;
-
- H5G_node_t *sn=NULL, *snrt=NULL;
- size_t offset; /*offset of name in heap*/
- const char *s;
- intn idx=-1, cmp=1;
- intn lt=0, rt; /*binary search cntrs */
- H5B_ins_t ret_value = H5B_INS_ERROR;
- H5G_node_t *insert_into=NULL; /*node that gets new entry*/
- haddr_t insert_addr; /*address of that node */
-
- FUNC_ENTER (H5G_node_insert, H5B_INS_ERROR);
-
- /*
- * Check arguments.
- */
- assert (f);
- assert (addr && H5F_addr_defined (addr));
- assert (md_key);
- assert (rt_key);
- assert (bt_udata);
- assert (new_node);
-
- /*
- * Load the symbol node.
- */
- if (NULL==(sn=H5AC_protect (f, H5AC_SNODE, addr, NULL, NULL))) {
- HGOTO_ERROR (H5E_SYM, H5E_CANTLOAD, H5B_INS_ERROR,
- "unable to protect symbol table node");
- }
-
- /*
- * Where does the new symbol get inserted? We use a binary search.
- */
- rt = sn->nsyms;
- while (lt<rt) {
- idx = (lt + rt) / 2;
- if (NULL==(s=H5H_peek (f, &(bt_udata->heap_addr),
- sn->entry[idx].name_off))) {
- HGOTO_ERROR (H5E_SYM, H5E_NOTFOUND, H5B_INS_ERROR,
- "unable to read symbol name");
- }
- if (0==(cmp=HDstrcmp (bt_udata->name, s))) {
- /*already present*/
- HGOTO_ERROR (H5E_SYM, H5E_CANTINSERT, H5B_INS_ERROR,
- "symbol is already present in symbol table");
- }
- if (cmp<0) {
- rt = idx;
- } else {
- lt = idx+1;
- }
- }
- idx += cmp>0 ? 1 : 0;
-
- /*
- * Add the new name to the heap. The caller will check if the
- * heap address changed and update the symbol table object header
- * with the new heap address.
- */
- offset = H5H_insert (f, &(bt_udata->heap_addr), HDstrlen(bt_udata->name)+1,
- bt_udata->name);
- bt_udata->ent.name_off = offset;
- if (offset<=0) {
- HGOTO_ERROR (H5E_SYM, H5E_CANTINSERT, H5B_INS_ERROR,
- "unable to insert symbol name into heap");
- }
-
- if (sn->nsyms>=2*H5G_NODE_K(f)) {
- /*
- * The node is full. Split it into a left and right
- * node and return the address of the new right node (the
- * left node is at the same address as the original node).
- */
- ret_value = H5B_INS_RIGHT;
-
- /* The right node */
- if (H5G_node_create (f, H5B_INS_FIRST, NULL, NULL, NULL,
- new_node/*out*/)<0) {
- HGOTO_ERROR (H5E_SYM, H5E_CANTINIT, H5B_INS_ERROR,
- "unable to split symbol table node");
- }
- if (NULL==(snrt=H5AC_find (f, H5AC_SNODE, new_node, NULL, NULL))) {
- HGOTO_ERROR (H5E_SYM, H5E_CANTLOAD, H5B_INS_ERROR,
- "unable to split symbol table node");
- }
- HDmemcpy (snrt->entry, sn->entry + H5G_NODE_K(f),
- H5G_NODE_K(f) * sizeof(H5G_entry_t));
- snrt->nsyms = H5G_NODE_K(f);
- snrt->dirty = TRUE;
-
- /* The left node */
- HDmemset (sn->entry + H5G_NODE_K(f), 0,
- H5G_NODE_K(f) * sizeof(H5G_entry_t));
- sn->nsyms = H5G_NODE_K (f);
- sn->dirty = TRUE;
-
- /* The middle key */
- md_key->offset = sn->entry[sn->nsyms-1].name_off;
-
- /* Where to insert the new entry? */
- if (idx<=H5G_NODE_K(f)) {
- insert_into = sn;
- insert_addr = *addr;
- if (idx==H5G_NODE_K(f)) md_key->offset = offset;
- } else {
- idx -= H5G_NODE_K (f);
- insert_into = snrt;
- insert_addr = *new_node;
- }
-
- } else {
- /* Where to insert the new entry? */
- ret_value = H5B_INS_NOOP;
- sn->dirty = TRUE;
- insert_into = sn;
- insert_addr = *addr;
- if (idx==sn->nsyms) {
- rt_key->offset = offset;
- *rt_key_changed = TRUE;
- }
- }
-
- /* Move entries */
- HDmemmove (insert_into->entry + idx + 1,
- insert_into->entry + idx,
- (insert_into->nsyms-idx) * sizeof(H5G_entry_t));
- insert_into->entry[idx] = bt_udata->ent;
- insert_into->entry[idx].dirty = TRUE;
- insert_into->nsyms += 1;
-
-done:
- if (sn && H5AC_unprotect (f, H5AC_SNODE, addr, sn)<0) {
- HRETURN_ERROR (H5E_SYM, H5E_PROTECT, H5B_INS_ERROR,
- "unable to release symbol table node");
- }
-
- FUNC_LEAVE (ret_value);
+ H5G_node_key_t *md_key = (H5G_node_key_t *) _md_key;
+ H5G_node_key_t *rt_key = (H5G_node_key_t *) _rt_key;
+ H5G_bt_ud1_t *bt_udata = (H5G_bt_ud1_t *) _udata;
+
+ H5G_node_t *sn = NULL, *snrt = NULL;
+ size_t offset; /*offset of name in heap */
+ const char *s;
+ intn idx = -1, cmp = 1;
+ intn lt = 0, rt; /*binary search cntrs */
+ H5B_ins_t ret_value = H5B_INS_ERROR;
+ H5G_node_t *insert_into = NULL; /*node that gets new entry */
+ haddr_t insert_addr; /*address of that node */
+
+ FUNC_ENTER(H5G_node_insert, H5B_INS_ERROR);
+
+ /*
+ * Check arguments.
+ */
+ assert(f);
+ assert(addr && H5F_addr_defined(addr));
+ assert(md_key);
+ assert(rt_key);
+ assert(bt_udata);
+ assert(new_node);
+
+ /*
+ * Load the symbol node.
+ */
+ if (NULL == (sn = H5AC_protect(f, H5AC_SNODE, addr, NULL, NULL))) {
+ HGOTO_ERROR(H5E_SYM, H5E_CANTLOAD, H5B_INS_ERROR,
+ "unable to protect symbol table node");
+ }
+ /*
+ * Where does the new symbol get inserted? We use a binary search.
+ */
+ rt = sn->nsyms;
+ while (lt < rt) {
+ idx = (lt + rt) / 2;
+ if (NULL == (s = H5H_peek(f, &(bt_udata->heap_addr),
+ sn->entry[idx].name_off))) {
+ HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, H5B_INS_ERROR,
+ "unable to read symbol name");
+ }
+ if (0 == (cmp = HDstrcmp(bt_udata->name, s))) {
+ /*already present */
+ HGOTO_ERROR(H5E_SYM, H5E_CANTINSERT, H5B_INS_ERROR,
+ "symbol is already present in symbol table");
+ }
+ if (cmp < 0) {
+ rt = idx;
+ } else {
+ lt = idx + 1;
+ }
+ }
+ idx += cmp > 0 ? 1 : 0;
+
+ /*
+ * Add the new name to the heap. The caller will check if the
+ * heap address changed and update the symbol table object header
+ * with the new heap address.
+ */
+ offset = H5H_insert(f, &(bt_udata->heap_addr), HDstrlen(bt_udata->name) + 1,
+ bt_udata->name);
+ bt_udata->ent.name_off = offset;
+ if (offset <= 0) {
+ HGOTO_ERROR(H5E_SYM, H5E_CANTINSERT, H5B_INS_ERROR,
+ "unable to insert symbol name into heap");
+ }
+ if (sn->nsyms >= 2 * H5G_NODE_K(f)) {
+ /*
+ * The node is full. Split it into a left and right
+ * node and return the address of the new right node (the
+ * left node is at the same address as the original node).
+ */
+ ret_value = H5B_INS_RIGHT;
+
+ /* The right node */
+ if (H5G_node_create(f, H5B_INS_FIRST, NULL, NULL, NULL,
+ new_node /*out */ ) < 0) {
+ HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, H5B_INS_ERROR,
+ "unable to split symbol table node");
+ }
+ if (NULL == (snrt = H5AC_find(f, H5AC_SNODE, new_node, NULL, NULL))) {
+ HGOTO_ERROR(H5E_SYM, H5E_CANTLOAD, H5B_INS_ERROR,
+ "unable to split symbol table node");
+ }
+ HDmemcpy(snrt->entry, sn->entry + H5G_NODE_K(f),
+ H5G_NODE_K(f) * sizeof(H5G_entry_t));
+ snrt->nsyms = H5G_NODE_K(f);
+ snrt->dirty = TRUE;
+
+ /* The left node */
+ HDmemset(sn->entry + H5G_NODE_K(f), 0,
+ H5G_NODE_K(f) * sizeof(H5G_entry_t));
+ sn->nsyms = H5G_NODE_K(f);
+ sn->dirty = TRUE;
+
+ /* The middle key */
+ md_key->offset = sn->entry[sn->nsyms - 1].name_off;
+
+ /* Where to insert the new entry? */
+ if (idx <= H5G_NODE_K(f)) {
+ insert_into = sn;
+ insert_addr = *addr;
+ if (idx == H5G_NODE_K(f))
+ md_key->offset = offset;
+ } else {
+ idx -= H5G_NODE_K(f);
+ insert_into = snrt;
+ insert_addr = *new_node;
+ }
+
+ } else {
+ /* Where to insert the new entry? */
+ ret_value = H5B_INS_NOOP;
+ sn->dirty = TRUE;
+ insert_into = sn;
+ insert_addr = *addr;
+ if (idx == sn->nsyms) {
+ rt_key->offset = offset;
+ *rt_key_changed = TRUE;
+ }
+ }
+
+ /* Move entries */
+ HDmemmove(insert_into->entry + idx + 1,
+ insert_into->entry + idx,
+ (insert_into->nsyms - idx) * sizeof(H5G_entry_t));
+ insert_into->entry[idx] = bt_udata->ent;
+ insert_into->entry[idx].dirty = TRUE;
+ insert_into->nsyms += 1;
+
+ done:
+ if (sn && H5AC_unprotect(f, H5AC_SNODE, addr, sn) < 0) {
+ HRETURN_ERROR(H5E_SYM, H5E_PROTECT, H5B_INS_ERROR,
+ "unable to release symbol table node");
+ }
+ FUNC_LEAVE(ret_value);
}
-
/*-------------------------------------------------------------------------
- * Function: H5G_node_list
+ * Function: H5G_node_list
*
- * Purpose: This function gets called during a group list operation.
- * It should fill in data in the UDATA struct.
+ * Purpose: This function gets called during a group list operation.
+ * It should fill in data in the UDATA struct.
*
- * Return: Success: SUCCEED
+ * Return: Success: SUCCEED
*
- * Failure: FAIL
+ * Failure: FAIL
*
- * Programmer: Robb Matzke
- * matzke@llnl.gov
- * Jun 24 1997
+ * Programmer: Robb Matzke
+ * matzke@llnl.gov
+ * Jun 24 1997
*
* Modifications:
*
*-------------------------------------------------------------------------
*/
static herr_t
-H5G_node_list (H5F_t *f, const haddr_t *addr, void *_udata)
+H5G_node_list(H5F_t *f, const haddr_t *addr, void *_udata)
{
- H5G_bt_ud2_t *bt_udata = (H5G_bt_ud2_t *)_udata;
- H5G_node_t *sn = NULL;
- intn i;
- const char *s;
- herr_t ret_value = FAIL;
-
- FUNC_ENTER (H5G_node_list, FAIL);
-
- /*
- * Check arguments.
- */
- assert (f);
- assert (addr && H5F_addr_defined (addr));
- assert (bt_udata);
-
- if (NULL==(sn=H5AC_protect (f, H5AC_SNODE, addr, NULL, NULL))) {
- HGOTO_ERROR (H5E_SYM, H5E_CANTLOAD, FAIL,
- "unable to protect symbol table node");
- }
-
- /*
- * If we've already overflowed the user-supplied buffer, then just
- * keep track of how many names we've seen and don't bother doing
- * anything else.
- */
- if (bt_udata->nsyms >= bt_udata->maxentries) {
- bt_udata->nsyms += sn->nsyms;
- HGOTO_DONE (SUCCEED);
- }
-
- /*
- * Save the symbol table entries.
- */
- if (bt_udata->entry) {
- for (i=0; i<sn->nsyms && bt_udata->nsyms+i<bt_udata->maxentries; i++) {
- bt_udata->entry[bt_udata->nsyms+i] = sn->entry[i];
- }
- }
- if (bt_udata->name) {
- for (i=0; i<sn->nsyms && bt_udata->nsyms+i<bt_udata->maxentries; i++) {
- if (NULL==(s=H5H_peek (f, &(bt_udata->heap_addr),
- sn->entry[i].name_off))) {
- HGOTO_ERROR (H5E_SYM, H5E_NOTFOUND, FAIL,
- "unable to read symbol name");
- }
- bt_udata->name[bt_udata->nsyms+i] = H5MM_xstrdup (s);
- }
- }
-
- /*
- * Update the number of symbols.
- */
- bt_udata->nsyms += sn->nsyms;
- ret_value = SUCCEED;
-
-done:
- if (sn && H5AC_unprotect (f, H5AC_SNODE, addr, sn)<0) {
- HRETURN_ERROR (H5E_CACHE, H5E_PROTECT, FAIL,
- "unable to release symbol table node");
- }
- FUNC_LEAVE (ret_value);
+ H5G_bt_ud2_t *bt_udata = (H5G_bt_ud2_t *) _udata;
+ H5G_node_t *sn = NULL;
+ intn i;
+ const char *s;
+ herr_t ret_value = FAIL;
+
+ FUNC_ENTER(H5G_node_list, FAIL);
+
+ /*
+ * Check arguments.
+ */
+ assert(f);
+ assert(addr && H5F_addr_defined(addr));
+ assert(bt_udata);
+
+ if (NULL == (sn = H5AC_protect(f, H5AC_SNODE, addr, NULL, NULL))) {
+ HGOTO_ERROR(H5E_SYM, H5E_CANTLOAD, FAIL,
+ "unable to protect symbol table node");
+ }
+ /*
+ * If we've already overflowed the user-supplied buffer, then just
+ * keep track of how many names we've seen and don't bother doing
+ * anything else.
+ */
+ if (bt_udata->nsyms >= bt_udata->maxentries) {
+ bt_udata->nsyms += sn->nsyms;
+ HGOTO_DONE(SUCCEED);
+ }
+ /*
+ * Save the symbol table entries.
+ */
+ if (bt_udata->entry) {
+ for (i = 0; i < sn->nsyms && bt_udata->nsyms + i < bt_udata->maxentries; i++) {
+ bt_udata->entry[bt_udata->nsyms + i] = sn->entry[i];
+ }
+ }
+ if (bt_udata->name) {
+ for (i = 0; i < sn->nsyms && bt_udata->nsyms + i < bt_udata->maxentries; i++) {
+ if (NULL == (s = H5H_peek(f, &(bt_udata->heap_addr),
+ sn->entry[i].name_off))) {
+ HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL,
+ "unable to read symbol name");
+ }
+ bt_udata->name[bt_udata->nsyms + i] = H5MM_xstrdup(s);
+ }
+ }
+ /*
+ * Update the number of symbols.
+ */
+ bt_udata->nsyms += sn->nsyms;
+ ret_value = SUCCEED;
+
+ done:
+ if (sn && H5AC_unprotect(f, H5AC_SNODE, addr, sn) < 0) {
+ HRETURN_ERROR(H5E_CACHE, H5E_PROTECT, FAIL,
+ "unable to release symbol table node");
+ }
+ FUNC_LEAVE(ret_value);
}
-
/*-------------------------------------------------------------------------
- * Function: H5G_node_debug
+ * Function: H5G_node_debug
*
- * Purpose: Prints debugging information about a symbol table node
- * or a B-tree node for a symbol table B-tree.
+ * Purpose: Prints debugging information about a symbol table node
+ * or a B-tree node for a symbol table B-tree.
*
- * Return: Success: SUCCEED
+ * Return: Success: SUCCEED
*
- * Failure: FAIL
+ * Failure: FAIL
*
- * Programmer: Robb Matzke
- * matzke@llnl.gov
- * Aug 4 1997
+ * Programmer: Robb Matzke
+ * matzke@llnl.gov
+ * Aug 4 1997
*
* Modifications:
*
*-------------------------------------------------------------------------
*/
herr_t
-H5G_node_debug (H5F_t *f, const haddr_t *addr, FILE *stream, intn indent,
- intn fwidth, const haddr_t *heap)
+H5G_node_debug(H5F_t *f, const haddr_t *addr, FILE * stream, intn indent,
+ intn fwidth, const haddr_t *heap)
{
- int i;
- H5G_node_t *sn = NULL;
- herr_t status;
- const char *s;
-
- FUNC_ENTER (H5G_node_debug, FAIL);
-
- /*
- * Check arguments.
- */
- assert (f);
- assert (addr && H5F_addr_defined (addr));
- assert (stream);
- assert (indent>=0);
- assert (fwidth>=0);
-
-
- /*
- * If we couldn't load the symbol table node, then try loading the
- * B-tree node.
- */
- if (NULL==(sn=H5AC_protect(f, H5AC_SNODE, addr, NULL, NULL))) {
- H5ECLEAR; /*discard that error*/
- status = H5B_debug (f, addr, stream, indent, fwidth, H5B_SNODE, NULL);
- if (status<0) {
- HRETURN_ERROR (H5E_SYM, H5E_CANTLOAD, FAIL,
- "unable to debug B-tree node");
- }
- HRETURN (SUCCEED);
- }
-
-
- fprintf (stream, "%*sSymbol Table Node...\n", indent, "");
- fprintf (stream, "%*s%-*s %s\n", indent, "", fwidth,
- "Dirty:",
- sn->dirty?"Yes":"No");
- fprintf (stream, "%*s%-*s %d of %d\n", indent, "", fwidth,
- "Number of Symbols:",
- sn->nsyms, 2*H5G_NODE_K(f));
-
-
- indent += 3;
- fwidth = MAX (0, fwidth-3);
- for (i=0; i<sn->nsyms; i++) {
- fprintf (stream, "%*sSymbol %d:\n", indent-3, "", i);
- if (H5F_addr_defined (heap) &&
- (s = H5H_peek (f, heap, sn->entry[i].name_off))) {
- fprintf (stream, "%*s%-*s `%s'\n", indent, "", fwidth,
- "Name:",
- s);
- }
- H5G_ent_debug (f, sn->entry+i, stream, indent, fwidth);
- }
-
- H5AC_unprotect (f, H5AC_SNODE, addr, sn);
- FUNC_LEAVE (SUCCEED);
+ int i;
+ H5G_node_t *sn = NULL;
+ herr_t status;
+ const char *s;
+
+ FUNC_ENTER(H5G_node_debug, FAIL);
+
+ /*
+ * Check arguments.
+ */
+ assert(f);
+ assert(addr && H5F_addr_defined(addr));
+ assert(stream);
+ assert(indent >= 0);
+ assert(fwidth >= 0);
+
+ /*
+ * If we couldn't load the symbol table node, then try loading the
+ * B-tree node.
+ */
+ if (NULL == (sn = H5AC_protect(f, H5AC_SNODE, addr, NULL, NULL))) {
+ H5ECLEAR; /*discard that error */
+ status = H5B_debug(f, addr, stream, indent, fwidth, H5B_SNODE, NULL);
+ if (status < 0) {
+ HRETURN_ERROR(H5E_SYM, H5E_CANTLOAD, FAIL,
+ "unable to debug B-tree node");
+ }
+ HRETURN(SUCCEED);
+ }
+ fprintf(stream, "%*sSymbol Table Node...\n", indent, "");
+ fprintf(stream, "%*s%-*s %s\n", indent, "", fwidth,
+ "Dirty:",
+ sn->dirty ? "Yes" : "No");
+ fprintf(stream, "%*s%-*s %d of %d\n", indent, "", fwidth,
+ "Number of Symbols:",
+ sn->nsyms, 2 * H5G_NODE_K(f));
+
+ indent += 3;
+ fwidth = MAX(0, fwidth - 3);
+ for (i = 0; i < sn->nsyms; i++) {
+ fprintf(stream, "%*sSymbol %d:\n", indent - 3, "", i);
+ if (H5F_addr_defined(heap) &&
+ (s = H5H_peek(f, heap, sn->entry[i].name_off))) {
+ fprintf(stream, "%*s%-*s `%s'\n", indent, "", fwidth,
+ "Name:",
+ s);
+ }
+ H5G_ent_debug(f, sn->entry + i, stream, indent, fwidth);
+ }
+
+ H5AC_unprotect(f, H5AC_SNODE, addr, sn);
+ FUNC_LEAVE(SUCCEED);
}
-