summaryrefslogtreecommitdiffstats
path: root/src/H5Gstab.c
diff options
context:
space:
mode:
authorRobb Matzke <matzke@llnl.gov>1997-11-14 14:42:14 (GMT)
committerRobb Matzke <matzke@llnl.gov>1997-11-14 14:42:14 (GMT)
commitcdeeb5553a3920565d87201761dadd1fe32aa3b1 (patch)
treea209c61f85983c1a76bf5c65d1f3285c4861ec46 /src/H5Gstab.c
parent73897627660169de753597b9ff045d3112646506 (diff)
downloadhdf5-cdeeb5553a3920565d87201761dadd1fe32aa3b1.zip
hdf5-cdeeb5553a3920565d87201761dadd1fe32aa3b1.tar.gz
hdf5-cdeeb5553a3920565d87201761dadd1fe32aa3b1.tar.bz2
[svn-r136] ./MANIFEST
./src/Makefile.in Added H5Ffamily.c and H5Fsplit.c ./src/H5B.c ./src/H5Bprivate.h ./src/H5Gnode.c Added `const' to sublass arguments. ./src/H5F.c ./src/H5Flow.c ./src/H5Fsec2.c Make sure file buffers get flushed during a call to H5Fflush(). Check for overflow in address encoding and decoding. ./src/H5Ffam.c ./src/H5Fprivate.c ./test/istore.c Implementation of file families so 32-bit machines can access 64-bit files. ./src/H5Oprivate.h Removed H5O_NO_ADDR constant. ./config/freebsd2.2.1 ./config/linux Added -DH5G_DEBUG and -DH5F_DEBUG to the list of debugging flags. ./html/H5.format.html Changed some <offset>-sized things to <length>-sized things. ./src/H5AC.c ./src/H5ACprivate.h ./src/H5B.c ./src/H5Bprivate.h ./src/H5C.c ./src/H5D.c ./src/H5F.c ./src/H5Fcore.c ./src/H5Fistore.c ./src/H5Flow.c ./src/H5Fprivate.h ./src/H5Fsec2.c ./src/H5Fstdio.c ./src/H5G.c ./src/H5Gent.c ./src/H5Gnode.c ./src/H5Gpkg.h ./src/H5Gprivate.h ./src/H5Gshad.c ./src/H5Gstab.c ./src/H5H.c ./src/H5Hprivate.h ./src/H5MF.c ./src/H5MFprivate.h ./src/H5O.c ./src/H5Ocont.c ./src/H5Oistore.c ./src/H5Oprivate.h ./src/H5Ostab.c ./src/H5Ostdst.c ./src/H5pivate.h ./src/debug.c ./test/istore.c ./test/theap.c ./test/tohdr.c ./test/tstab.c Lots of changes caused by generalizing addresses. The haddr_t is now a struct, so you can no longer perform arithmetic on it. But since it's small, simple, and often used, storage is allocated like with an integer. But we always pass them around by reference. That is, when using an address in another struct, allocate space: struct my_struct { char *name; haddr_t address; } x; But when passing it to a function, pass by reference: H5F_addr_print (stderr, &(x.address)); Addresses should be initialized with H5F_addr_undef (&(x.address)); Functions for operating on addresses are in H5Flow.c and begin with H5F_addr_... Functions never return haddr_t or haddr_t*; they always pass them through arguments instead. A function that returns an address through an argument does so with its last argument and it is marked with `/*out*/'. Calls to such functions also mark output-only arguments with `/*out*/' ./src/H5Fsplit.c (new) A two-member family where all meta data goes in the first member and all raw data goes in the second member. ./src/H5B.c ./src/H5D.c ./src/H5F.c ./src/H5Ffamily.c ./src/H5Fistore.c ./src/H5Flow.c ./src/H5Fprivate.h ./src/H5Fsec2.c ./src/H5Fstdio.c ./src/H5Gnode.c ./src/H5H.c ./src/H5MF.c ./src/H5MFprivate.h ./src/H5O.c Differentiate between meta data storage and raw data storage. Provide a mechanism so that the file driver can extend the file to allocate more memory. ./src/H5E.c ./src/H5Epublic.c Added the error H5E_TRUNCATED to be reported when the file is shorter than the length recorded in the boot block. ./src/H5F.c Added H5F_locate_signature() so we only do it in one place now. ./INSTALL ./INSTALL_MAINT Just a couple clarifications. ./html/ExternalFiles.html ./html/storage.html Documents how external files work. ./test/hyperslab.c ./test/istore.c Fixed printf's on 64-bit machines. ./test/istore.c Added ifdef's to test the split file driver.
Diffstat (limited to 'src/H5Gstab.c')
-rw-r--r--src/H5Gstab.c60
1 files changed, 29 insertions, 31 deletions
diff --git a/src/H5Gstab.c b/src/H5Gstab.c
index 46f1eeb..4e16a2c 100644
--- a/src/H5Gstab.c
+++ b/src/H5Gstab.c
@@ -41,10 +41,7 @@ static hbool_t interface_initialize_g = FALSE;
* SYM CANTINIT Can't create message.
* SYM CANTINIT Can't initialize heap.
*
- * Return: Success: Address of new symbol table header. If
- * the caller supplies a symbol table entry
- * SELF then it will be initialized to point to
- * this symbol table.
+ * Return: Success: SUCCEED
*
* Failure: FAIL
*
@@ -56,10 +53,10 @@ static hbool_t interface_initialize_g = FALSE;
*
*-------------------------------------------------------------------------
*/
-haddr_t
+herr_t
H5G_stab_new (H5F_t *f, H5G_entry_t *self, size_t init)
{
- off_t name; /*offset of "" name */
+ size_t name; /*offset of "" name */
haddr_t addr; /*object header address */
H5O_stab_t stab; /*symbol table message */
@@ -69,13 +66,14 @@ H5G_stab_new (H5F_t *f, H5G_entry_t *self, size_t init)
* Check arguments.
*/
assert (f);
+ assert (self);
init = MAX(init, H5H_SIZEOF_FREE(f)+2);
/* Create symbol table private heap */
- if ((stab.heap_addr = H5H_new (f, H5H_LOCAL, init))<0) {
+ if (H5H_new (f, H5H_LOCAL, init, &(stab.heap_addr)/*out*/)<0) {
HRETURN_ERROR (H5E_SYM, H5E_CANTINIT, FAIL); /*can't create heap*/
}
- if ((name = H5H_insert (f, stab.heap_addr, 1, "")<0)) {
+ if ((name = H5H_insert (f, &(stab.heap_addr), 1, "")<0)) {
HRETURN_ERROR (H5E_SYM, H5E_CANTINIT, FAIL); /*can't initialize heap*/
}
if (0!=name) {
@@ -87,7 +85,7 @@ H5G_stab_new (H5F_t *f, H5G_entry_t *self, size_t init)
}
/* Create the B-tree */
- if ((stab.btree_addr = H5B_new (f, H5B_SNODE, NULL))<0) {
+ if (H5B_new (f, H5B_SNODE, NULL, &(stab.btree_addr)/*out*/)<0) {
HRETURN_ERROR (H5E_SYM, H5E_CANTINIT, FAIL); /*can't create B-tree*/
}
@@ -96,20 +94,18 @@ H5G_stab_new (H5F_t *f, H5G_entry_t *self, size_t init)
* since nothing refers to it yet. The link count will be
* incremented if the object is added to the group directed graph.
*/
- if ((addr = H5O_new (f, 0, 4+2*H5F_SIZEOF_OFFSET(f)))<0) {
+ if (H5O_new (f, 0, 4+2*H5F_SIZEOF_OFFSET(f), &addr/*out*/)<0) {
HRETURN_ERROR (H5E_SYM, H5E_CANTINIT, FAIL); /*can't create header*/
}
/* insert the symbol table message */
- if (self) {
- memset (self, 0, sizeof(H5G_entry_t));
- self->header = addr;
- }
- if (H5O_modify(f, addr, self, H5O_STAB, H5O_NEW_MESG, &stab)<0) {
+ memset (self, 0, sizeof(H5G_entry_t));
+ self->header = addr;
+ if (H5O_modify(f, NO_ADDR, self, H5O_STAB, H5O_NEW_MESG, &stab)<0) {
HRETURN_ERROR (H5E_SYM, H5E_CANTINIT, FAIL); /*can't create message*/
}
- FUNC_LEAVE (addr);
+ FUNC_LEAVE (SUCCEED);
}
@@ -144,7 +140,7 @@ H5G_stab_new (H5F_t *f, H5G_entry_t *self, size_t init)
*-------------------------------------------------------------------------
*/
H5G_entry_t *
-H5G_stab_find (H5F_t *f, haddr_t addr, H5G_entry_t *self,
+H5G_stab_find (H5F_t *f, const haddr_t *addr, H5G_entry_t *self,
const char *name)
{
H5G_bt_ud1_t udata; /*data to pass through B-tree */
@@ -154,13 +150,14 @@ H5G_stab_find (H5F_t *f, haddr_t addr, H5G_entry_t *self,
/* Check arguments */
assert (f);
- if (addr<=0 && (!self || self->header<=0)) {
+ assert (!addr || H5F_addr_defined (addr));
+ if (!addr && (!self || !H5F_addr_defined (&(self->header)))) {
HRETURN_ERROR (H5E_SYM, H5E_NOTFOUND, NULL);
}
if (!name || !*name) {
HRETURN_ERROR (H5E_SYM, H5E_NOTFOUND, NULL);
}
- if (addr<=0) addr = self->header;
+ if (!addr) addr = &(self->header);
/* set up the udata */
if (NULL==H5O_read (f, addr, self, H5O_STAB, 0, &stab)) {
@@ -169,20 +166,21 @@ H5G_stab_find (H5F_t *f, haddr_t addr, H5G_entry_t *self,
udata.operation = H5G_OPER_FIND;
udata.name = name;
udata.heap_addr = stab.heap_addr;
- udata.grp_addr = addr;
+ udata.grp_addr = *addr;
udata.node_ptr = NULL;
/* search the B-tree */
- if (H5B_find (f, H5B_SNODE, stab.btree_addr, &udata)<0) {
+ if (H5B_find (f, H5B_SNODE, &(stab.btree_addr), &udata)<0) {
if (udata.node_ptr) {
- H5AC_unprotect (f, H5AC_SNODE, udata.node_addr, udata.node_ptr);
+ H5AC_unprotect (f, H5AC_SNODE, &(udata.node_addr), udata.node_ptr);
}
HRETURN_ERROR (H5E_SYM, H5E_NOTFOUND, NULL); /*not found*/
}
/* Unprotect the symbol table node */
if (udata.node_ptr) {
- if (H5AC_unprotect (f, H5AC_SNODE, udata.node_addr, udata.node_ptr)<0) {
+ if (H5AC_unprotect (f, H5AC_SNODE, &(udata.node_addr),
+ udata.node_ptr)<0) {
HRETURN_ERROR (H5E_SYM, H5E_PROTECT, NULL);
}
}
@@ -233,12 +231,12 @@ H5G_stab_insert (H5F_t *f, H5G_entry_t *self, const char *name,
/* check arguments */
assert (f);
- assert (self && self->header>=0);
+ assert (self && H5F_addr_defined (&(self->header)));
assert (name && *name);
assert (ent);
/* initialize data to pass through B-tree */
- if (NULL==H5O_read (f, self->header, self, H5O_STAB, 0, &stab)) {
+ if (NULL==H5O_read (f, &(self->header), self, H5O_STAB, 0, &stab)) {
HRETURN_ERROR (H5E_SYM, H5E_BADMESG, NULL); /*can't read message*/
}
@@ -251,9 +249,9 @@ H5G_stab_insert (H5F_t *f, H5G_entry_t *self, const char *name,
udata.node_ptr = NULL;
/* insert */
- if (H5B_insert (f, H5B_SNODE, stab.btree_addr, &udata)<0) {
+ if (H5B_insert (f, H5B_SNODE, &(stab.btree_addr), &udata)<0) {
if (udata.node_ptr) {
- H5AC_unprotect (f, H5AC_SNODE, udata.node_addr, udata.node_ptr);
+ H5AC_unprotect (f, H5AC_SNODE, &(udata.node_addr), udata.node_ptr);
}
HRETURN_ERROR (H5E_SYM, H5E_CANTINSERT, NULL); /*can't insert entry*/
}
@@ -264,7 +262,7 @@ H5G_stab_insert (H5F_t *f, H5G_entry_t *self, const char *name,
* B-tree code. We unprotect it now, but the pointer will remain valid
* until the next call to H5AC.
*/
- if (H5AC_unprotect (f, H5AC_SNODE, udata.node_addr, udata.node_ptr)<0) {
+ if (H5AC_unprotect (f, H5AC_SNODE, &(udata.node_addr), udata.node_ptr)<0) {
HRETURN_ERROR (H5E_SYM, H5E_PROTECT, NULL); /*can't unprotect*/
}
@@ -317,11 +315,11 @@ H5G_stab_list (H5F_t *f, H5G_entry_t *self, intn maxentries,
/* check args */
assert (f);
- assert (self && self->header>=0);
+ assert (self && H5F_addr_defined (&(self->header)));
assert (maxentries>=0);
/* initialize data to pass through B-tree */
- if (NULL==H5O_read (f, self->header, self, H5O_STAB, 0, &stab)) {
+ if (NULL==H5O_read (f, &(self->header), self, H5O_STAB, 0, &stab)) {
HRETURN_ERROR (H5E_SYM, H5E_BADMESG, FAIL); /*not a symbol table*/
}
udata.entry = entries;
@@ -333,7 +331,7 @@ H5G_stab_list (H5F_t *f, H5G_entry_t *self, intn maxentries,
if (names) HDmemset (names, 0, maxentries);
/* list */
- if (H5B_list (f, H5B_SNODE, stab.btree_addr, &udata)<0) {
+ if (H5B_list (f, H5B_SNODE, &(stab.btree_addr), &udata)<0) {
if (names) {
for (i=0; i<maxentries; i++) H5MM_xfree (names[i]);
}