summaryrefslogtreecommitdiffstats
path: root/src/H5F.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/H5F.c')
-rw-r--r--src/H5F.c1882
1 files changed, 922 insertions, 960 deletions
diff --git a/src/H5F.c b/src/H5F.c
index 416f3e9..985f10a 100644
--- a/src/H5F.c
+++ b/src/H5F.c
@@ -9,13 +9,13 @@
* hdf/COPYING file. *
*
* MODIFICATIONS
-* Robb Matzke, 30 Aug 1997
-* Added `ERRORS' fields to function prologues.
+* Robb Matzke, 30 Aug 1997
+* Added `ERRORS' fields to function prologues.
* *
****************************************************************************/
#ifdef RCSID
-static char RcsId[] = "@(#)$Revision$";
+static char RcsId[] = "@(#)$Revision$";
#endif
/* $Id$ */
@@ -23,28 +23,28 @@ static char RcsId[] = "@(#)$Revision$";
/*LINTLIBRARY */
/*
FILE
- hdf5file.c
+ hdf5file.c
HDF5 file I/O routines
EXPORTED ROUTINES
- H5Fcreate -- Create an HDF5 file
- H5Fclose -- Close an open HDF5 file
+ H5Fcreate -- Create an HDF5 file
+ H5Fclose -- Close an open HDF5 file
LIBRARY-SCOPED ROUTINES
LOCAL ROUTINES
- H5F_init_interface -- initialize the H5F interface
+ H5F_init_interface -- initialize the H5F interface
*/
/* Packages needed by this file... */
-#include <H5private.h> /*library functions */
-#include <H5Aprivate.h> /*atoms */
-#include <H5ACprivate.h> /*cache */
-#include <H5Cprivate.h> /*templates */
-#include <H5Eprivate.h> /*error handling */
-#include <H5Gprivate.h> /*symbol tables */
-#include <H5Mprivate.h> /*meta data */
-#include <H5MMprivate.h> /*core memory management */
+#include <H5private.h> /*library functions */
+#include <H5Aprivate.h> /*atoms */
+#include <H5ACprivate.h> /*cache */
+#include <H5Cprivate.h> /*templates */
+#include <H5Eprivate.h> /*error handling */
+#include <H5Gprivate.h> /*symbol tables */
+#include <H5Mprivate.h> /*meta data */
+#include <H5MMprivate.h> /*core memory management */
#include <ctype.h>
#include <sys/types.h>
@@ -57,29 +57,29 @@ static char RcsId[] = "@(#)$Revision$";
*/
/* #define H5F_OPT_SEEK */
-
-#define PABLO_MASK H5F_mask
+#define PABLO_MASK H5F_mask
/*--------------------- Locally scoped variables -----------------------------*/
/*
* Define the default file creation template.
*/
-const H5F_create_t H5F_create_dflt = {
- 0, /* Default user-block size */
- 4, /* Default 1/2 rank for symtab leaf nodes */
- { /* Default 1/2 rank for btree intern nodes*/
- 16, /* Symbol table internal nodes */
- 32, /* Indexed storage internal nodes */
- 0, /* unused */
- 0, /* unused */
- 0, /* unused */
- 0, /* unused */
- 0, /* unused */
- 0, /* unused */
+const H5F_create_t H5F_create_dflt =
+{
+ 0, /* Default user-block size */
+ 4, /* Default 1/2 rank for symtab leaf nodes */
+ { /* Default 1/2 rank for btree intern nodes */
+ 16, /* Symbol table internal nodes */
+ 32, /* Indexed storage internal nodes */
+ 0, /* unused */
+ 0, /* unused */
+ 0, /* unused */
+ 0, /* unused */
+ 0, /* unused */
+ 0, /* unused */
},
- 4, /* Default offset size */
- 4, /* Default length size */
+ 4, /* Default offset size */
+ 4, /* Default length size */
HDF5_BOOTBLOCK_VERSION, /* Current Boot-Block version # */
HDF5_SMALLOBJECT_VERSION, /* Current Small-Object heap version # */
HDF5_FREESPACE_VERSION, /* Current Free-Space info version # */
@@ -88,16 +88,16 @@ const H5F_create_t H5F_create_dflt = {
};
/* Interface initialization */
-static intn interface_initialize_g = FALSE;
+static intn interface_initialize_g = FALSE;
#define INTERFACE_INIT H5F_init_interface
-static herr_t H5F_init_interface(void);
-static void H5F_term_interface (void);
+static herr_t H5F_init_interface(void);
+static void H5F_term_interface(void);
/* PRIVATE PROTOTYPES */
-static H5F_t *H5F_new (H5F_file_t *shared);
-static H5F_t *H5F_dest (H5F_t *f);
-static herr_t H5F_flush (H5F_t *f, hbool_t invalidate);
-static herr_t H5F_locate_signature (H5F_low_t *f_handle, haddr_t *addr/*out*/);
+static H5F_t *H5F_new(H5F_file_t *shared);
+static H5F_t *H5F_dest(H5F_t *f);
+static herr_t H5F_flush(H5F_t *f, hbool_t invalidate);
+static herr_t H5F_locate_signature(H5F_low_t *f_handle, haddr_t *addr /*out */ );
/*--------------------------------------------------------------------------
NAME
@@ -118,17 +118,18 @@ Modifications:
It was already H5F_mask for the PABLO_TRACE_ON call.
--------------------------------------------------------------------------*/
-static herr_t H5F_init_interface(void)
+static herr_t
+H5F_init_interface(void)
{
- herr_t ret_value = SUCCEED;
- FUNC_ENTER (H5F_init_interface, FAIL);
+ herr_t ret_value = SUCCEED;
+ FUNC_ENTER(H5F_init_interface, FAIL);
/* Initialize the atom group for the file IDs */
- if((ret_value=H5Ainit_group(H5_FILE,H5A_FILEID_HASHSIZE,0,NULL))!=FAIL)
- ret_value=H5_add_exit(&H5F_term_interface);
+ if ((ret_value = H5Ainit_group(H5_FILE, H5A_FILEID_HASHSIZE, 0, NULL)) != FAIL)
+ ret_value = H5_add_exit(&H5F_term_interface);
FUNC_LEAVE(ret_value);
-} /* H5F_init_interface */
+} /* H5F_init_interface */
/*--------------------------------------------------------------------------
NAME
@@ -148,7 +149,7 @@ static herr_t H5F_init_interface(void)
REVISION LOG
--------------------------------------------------------------------------*/
static void
-H5F_term_interface (void)
+H5F_term_interface(void)
{
H5Adestroy_group(H5_FILE);
}
@@ -169,33 +170,33 @@ H5F_term_interface (void)
DESCRIPTION
Encode non-standard (i.e. not 2, 4 or 8-byte) lengths in file meta-data.
--------------------------------------------------------------------------*/
-void H5F_encode_length_unusual(const H5F_t *f, uint8 **p, uint8 *l)
+void
+H5F_encode_length_unusual(const H5F_t *f, uint8 **p, uint8 *l)
{
- intn i = H5F_SIZEOF_SIZE (f);
+ intn i = H5F_SIZEOF_SIZE(f);
#ifdef WORDS_BIGENDIAN
/*
* For non-little-endian platforms, encode each byte in memory backwards.
*/
- for(; i>=0; i--,(*p)++)
- *(*p)=*(l+i);
+ for (; i >= 0; i--, (*p)++)
+ *(*p) = *(l + i);
#else
/* platform has little-endian integers */
- for(; i>=0; i--,(*p)++)
- *(*p)=*l;
+ for (; i >= 0; i--, (*p)++)
+ *(*p) = *l;
#endif
#ifdef LATER
-done:
- if(ret_value == FALSE)
- { /* Error condition cleanup */
+ done:
+ if (ret_value == FALSE) { /* Error condition cleanup */
- } /* end if */
-#endif /* LATER */
+ } /* end if */
+#endif /* LATER */
/* Normal function cleanup */
-} /* H5F_encode_length_unusual */
+} /* H5F_encode_length_unusual */
/*--------------------------------------------------------------------------
NAME
@@ -221,32 +222,30 @@ done:
used to create a file.
--------------------------------------------------------------------------*/
hid_t
-H5Fget_create_template (hid_t fid)
+H5Fget_create_template(hid_t fid)
{
- H5F_t *file = NULL;
- hid_t ret_value = FAIL;
- H5F_create_t *tmpl = NULL;
+ H5F_t *file = NULL;
+ hid_t ret_value = FAIL;
+ H5F_create_t *tmpl = NULL;
- FUNC_ENTER (H5Fget_create_template, FAIL);
+ FUNC_ENTER(H5Fget_create_template, FAIL);
H5ECLEAR;
/* check args */
- if (H5_FILE!=H5Aatom_group (fid)) {
- HRETURN_ERROR (H5E_ATOM, H5E_BADATOM, FAIL, "not a file");
+ if (H5_FILE != H5Aatom_group(fid)) {
+ HRETURN_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "not a file");
}
- if (NULL==(file=H5Aatom_object (fid))) {
- HRETURN_ERROR (H5E_ATOM, H5E_BADATOM, FAIL, "can't get file struct");
+ if (NULL == (file = H5Aatom_object(fid))) {
+ HRETURN_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't get file struct");
}
-
/* Create the template object to return */
- tmpl = H5MM_xmalloc (sizeof(H5F_create_t));
+ tmpl = H5MM_xmalloc(sizeof(H5F_create_t));
*tmpl = file->shared->create_parms;
- if ((ret_value=H5C_create (H5C_FILE_CREATE, tmpl))<0) {
- HRETURN_ERROR (H5E_ATOM, H5E_CANTREGISTER, FAIL,
- "can't register template");
+ if ((ret_value = H5C_create(H5C_FILE_CREATE, tmpl)) < 0) {
+ HRETURN_ERROR(H5E_ATOM, H5E_CANTREGISTER, FAIL,
+ "can't register template");
}
-
- FUNC_LEAVE (ret_value);
+ FUNC_LEAVE(ret_value);
}
/*--------------------------------------------------------------------------
@@ -266,34 +265,33 @@ H5Fget_create_template (hid_t fid)
keys.
--------------------------------------------------------------------------*/
static intn
-H5F_compare_files (const VOIDP _obj, const VOIDP _key)
+H5F_compare_files(const VOIDP _obj, const VOIDP _key)
{
- const H5F_t *obj = (const H5F_t *)_obj;
- const H5F_search_t *key = (const H5F_search_t *)_key;
- int ret_value = FALSE;
-
- FUNC_ENTER (H5F_compare_files, FALSE);
+ const H5F_t *obj = (const H5F_t *) _obj;
+ const H5F_search_t *key = (const H5F_search_t *) _key;
+ int ret_value = FALSE;
- ret_value = (obj->shared->key.dev == key->dev &&
- obj->shared->key.ino == key->ino);
+ FUNC_ENTER(H5F_compare_files, FALSE);
- FUNC_LEAVE (ret_value);
-}
+ ret_value = (obj->shared->key.dev == key->dev &&
+ obj->shared->key.ino == key->ino);
+ FUNC_LEAVE(ret_value);
+}
/*-------------------------------------------------------------------------
- * Function: H5F_locate_signature
+ * Function: H5F_locate_signature
*
- * Purpose: Finds the HDF5 boot block signature in a file. The signature
- * can appear at address 0, or any power of two beginning with
- * 512.
+ * Purpose: Finds the HDF5 boot block signature in a file. The signature
+ * can appear at address 0, or any power of two beginning with
+ * 512.
*
- * Return: Success: SUCCEED. The address of the signature is
- * returned through the ADDR argument.
+ * Return: Success: SUCCEED. The address of the signature is
+ * returned through the ADDR argument.
*
- * Failure: FAIL
+ * Failure: FAIL
*
- * Programmer: Robb Matzke
+ * Programmer: Robb Matzke
* Friday, November 7, 1997
*
* Modifications:
@@ -301,25 +299,26 @@ H5F_compare_files (const VOIDP _obj, const VOIDP _key)
*-------------------------------------------------------------------------
*/
static herr_t
-H5F_locate_signature (H5F_low_t *f_handle, haddr_t *addr/*out*/)
+H5F_locate_signature(H5F_low_t *f_handle, haddr_t *addr /*out */ )
{
- haddr_t max_addr;
- uint8 buf[H5F_SIGNATURE_LEN];
- uintn n=9;
-
- FUNC_ENTER (H5F_locate_signature, FAIL);
-
- H5F_low_size (f_handle, &max_addr);
- H5F_addr_reset (addr);
- while (H5F_addr_lt (addr, &max_addr)) {
- if (H5F_low_read (f_handle, addr, H5F_SIGNATURE_LEN, buf)<0) {
- HRETURN_ERROR (H5E_IO, H5E_READERROR, FAIL, "can't read file");
- }
- if (!HDmemcmp (buf, H5F_SIGNATURE, H5F_SIGNATURE_LEN)) break;
- H5F_addr_pow2 (n++, addr);
- }
-
- FUNC_LEAVE (SUCCEED);
+ haddr_t max_addr;
+ uint8 buf[H5F_SIGNATURE_LEN];
+ uintn n = 9;
+
+ FUNC_ENTER(H5F_locate_signature, FAIL);
+
+ H5F_low_size(f_handle, &max_addr);
+ H5F_addr_reset(addr);
+ while (H5F_addr_lt(addr, &max_addr)) {
+ if (H5F_low_read(f_handle, addr, H5F_SIGNATURE_LEN, buf) < 0) {
+ HRETURN_ERROR(H5E_IO, H5E_READERROR, FAIL, "can't read file");
+ }
+ if (!HDmemcmp(buf, H5F_SIGNATURE, H5F_SIGNATURE_LEN))
+ break;
+ H5F_addr_pow2(n++, addr);
+ }
+
+ FUNC_LEAVE(SUCCEED);
}
/*--------------------------------------------------------------------------
@@ -346,598 +345,577 @@ H5F_locate_signature (H5F_low_t *f_handle, haddr_t *addr/*out*/)
DESCRIPTION
This function determines if a file is an HDF5 format file.
--------------------------------------------------------------------------*/
-hbool_t H5Fis_hdf5(const char *filename)
+hbool_t
+H5Fis_hdf5(const char *filename)
{
- H5F_low_t *f_handle=NULL; /* file handle */
- haddr_t addr; /* Address of file signature & header */
- hbool_t ret_value = BFALSE;
+ H5F_low_t *f_handle = NULL; /* file handle */
+ haddr_t addr; /* Address of file signature & header */
+ hbool_t ret_value = BFALSE;
FUNC_ENTER(H5Fis_hdf5, BFAIL);
/* Clear errors and check args and all the boring stuff. */
H5ECLEAR;
- if(filename==NULL)
+ if (filename == NULL)
HGOTO_ERROR(H5E_ARGS, H5E_BADRANGE, BFAIL, "no filename specified");
/* Open the file */
- if (NULL==(f_handle=H5F_low_open (H5F_LOW_DFLT, filename, 0, NULL))) {
- HGOTO_ERROR(H5E_FILE, H5E_BADFILE, BFAIL,
- "low-level file open failure");
+ if (NULL == (f_handle = H5F_low_open(H5F_LOW_DFLT, filename, 0, NULL))) {
+ HGOTO_ERROR(H5E_FILE, H5E_BADFILE, BFAIL,
+ "low-level file open failure");
}
-
- if (H5F_locate_signature (f_handle, &addr)>=0) {
- ret_value = BTRUE;
+ if (H5F_locate_signature(f_handle, &addr) >= 0) {
+ ret_value = BTRUE;
}
-
- done:
- H5F_low_close(f_handle); /* close the file we opened */
+ done:
+ H5F_low_close(f_handle); /* close the file we opened */
FUNC_LEAVE(ret_value);
}
-
/*-------------------------------------------------------------------------
- * Function: H5F_new
+ * Function: H5F_new
*
- * Purpose: Creates a new file object and initializes it. The
- * H5Fopen and H5Fcreate functions then fill in various
- * fields. If SHARED is a non-null pointer then the shared info
- * to which it points has the reference count incremented.
- * Otherwise a new, empty shared info struct is created.
+ * Purpose: Creates a new file object and initializes it. The
+ * H5Fopen and H5Fcreate functions then fill in various
+ * fields. If SHARED is a non-null pointer then the shared info
+ * to which it points has the reference count incremented.
+ * Otherwise a new, empty shared info struct is created.
*
* Errors:
*
- * Return: Success: Ptr to a new file struct.
+ * Return: Success: Ptr to a new file struct.
*
- * Failure: NULL
+ * Failure: NULL
*
- * Programmer: Robb Matzke
- * matzke@llnl.gov
- * Jul 18 1997
+ * Programmer: Robb Matzke
+ * matzke@llnl.gov
+ * Jul 18 1997
*
* Modifications:
*
*-------------------------------------------------------------------------
*/
-static H5F_t *
-H5F_new (H5F_file_t *shared)
+static H5F_t *
+H5F_new(H5F_file_t *shared)
{
- H5F_t *f = NULL;
- FUNC_ENTER (H5F_new, NULL);
-
- f = H5MM_xcalloc (1, sizeof(H5F_t));
- f->shared = shared;
-
- if (!f->shared) {
- f->shared = H5MM_xcalloc (1, sizeof(H5F_file_t));
- H5F_addr_undef (&(f->shared->boot_addr));
- H5F_addr_undef (&(f->shared->base_addr));
- H5F_addr_undef (&(f->shared->smallobj_addr));
- H5F_addr_undef (&(f->shared->freespace_addr));
- H5F_addr_undef (&(f->shared->hdf5_eof));
-
- /* Create a main cache */
- H5AC_create (f, H5AC_NSLOTS);
- }
-
- f->shared->nrefs++;
+ H5F_t *f = NULL;
+ FUNC_ENTER(H5F_new, NULL);
+
+ f = H5MM_xcalloc(1, sizeof(H5F_t));
+ f->shared = shared;
+
+ if (!f->shared) {
+ f->shared = H5MM_xcalloc(1, sizeof(H5F_file_t));
+ H5F_addr_undef(&(f->shared->boot_addr));
+ H5F_addr_undef(&(f->shared->base_addr));
+ H5F_addr_undef(&(f->shared->smallobj_addr));
+ H5F_addr_undef(&(f->shared->freespace_addr));
+ H5F_addr_undef(&(f->shared->hdf5_eof));
+
+ /* Create a main cache */
+ H5AC_create(f, H5AC_NSLOTS);
+ }
+ f->shared->nrefs++;
- FUNC_LEAVE (f);
+ FUNC_LEAVE(f);
}
-
/*-------------------------------------------------------------------------
- * Function: H5F_dest
+ * Function: H5F_dest
*
- * Purpose: Destroys a file structure. This function does not flush
- * the cache or anything else; it only frees memory associated
- * with the file struct. The shared info for the file is freed
- * only when its reference count reaches zero.
+ * Purpose: Destroys a file structure. This function does not flush
+ * the cache or anything else; it only frees memory associated
+ * with the file struct. The shared info for the file is freed
+ * only when its reference count reaches zero.
*
* Errors:
*
- * Return: Success: NULL
+ * Return: Success: NULL
*
- * Failure: NULL
+ * Failure: NULL
*
- * Programmer: Robb Matzke
- * matzke@llnl.gov
- * Jul 18 1997
+ * Programmer: Robb Matzke
+ * matzke@llnl.gov
+ * Jul 18 1997
*
* Modifications:
*
*-------------------------------------------------------------------------
*/
-static H5F_t *
-H5F_dest (H5F_t *f)
+static H5F_t *
+H5F_dest(H5F_t *f)
{
- FUNC_ENTER (H5F_dest, NULL);
-
- if (f) {
- if (0 == --(f->shared->nrefs)) {
- H5AC_dest (f);
- f->shared->root_ent = H5MM_xfree (f->shared->root_ent);
- f->shared = H5MM_xfree (f->shared);
- }
- f->name = H5MM_xfree (f->name);
- H5MM_xfree (f);
- }
-
- FUNC_LEAVE (NULL);
+ FUNC_ENTER(H5F_dest, NULL);
+
+ if (f) {
+ if (0 == --(f->shared->nrefs)) {
+ H5AC_dest(f);
+ f->shared->root_ent = H5MM_xfree(f->shared->root_ent);
+ f->shared = H5MM_xfree(f->shared);
+ }
+ f->name = H5MM_xfree(f->name);
+ H5MM_xfree(f);
+ }
+ FUNC_LEAVE(NULL);
}
-
-
/*-------------------------------------------------------------------------
- * Function: H5F_open
+ * Function: H5F_open
*
- * Purpose: Opens (or creates) a file. This function understands the
- * following flags which are similar in nature to the Posix
- * open(2) flags.
+ * Purpose: Opens (or creates) a file. This function understands the
+ * following flags which are similar in nature to the Posix
+ * open(2) flags.
*
- * H5F_ACC_WRITE: Open with read/write access. If the file is
- * currently open for read-only access then it
- * will be reopened. Absence of this flag
- * implies read-only access.
+ * H5F_ACC_WRITE: Open with read/write access. If the file is
+ * currently open for read-only access then it
+ * will be reopened. Absence of this flag
+ * implies read-only access.
*
- * H5F_ACC_CREAT: Create a new file if it doesn't exist yet.
- * The permissions are 0666 bit-wise AND with
- * the current umask. H5F_ACC_WRITE must also
- * be specified.
+ * H5F_ACC_CREAT: Create a new file if it doesn't exist yet.
+ * The permissions are 0666 bit-wise AND with
+ * the current umask. H5F_ACC_WRITE must also
+ * be specified.
*
- * H5F_ACC_EXCL: This flag causes H5F_open() to fail if the
- * file already exists.
+ * H5F_ACC_EXCL: This flag causes H5F_open() to fail if the
+ * file already exists.
*
- * H5F_ACC_TRUNC: The file is truncated and a new HDF5 boot
- * block is written. This operation will fail
- * if the file is already open.
+ * H5F_ACC_TRUNC: The file is truncated and a new HDF5 boot
+ * block is written. This operation will fail
+ * if the file is already open.
*
- * Unlinking the file name from the group directed graph while
- * the file is opened causes the file to continue to exist but
- * one will not be able to upgrade the file from read-only
- * access to read-write access by reopening it. Disk resources
- * for the file are released when all handles to the file are
- * closed. NOTE: This paragraph probably only applies to Unix;
- * deleting the file name in other OS's has undefined results.
+ * Unlinking the file name from the group directed graph while
+ * the file is opened causes the file to continue to exist but
+ * one will not be able to upgrade the file from read-only
+ * access to read-write access by reopening it. Disk resources
+ * for the file are released when all handles to the file are
+ * closed. NOTE: This paragraph probably only applies to Unix;
+ * deleting the file name in other OS's has undefined results.
*
- * The CREATE_PARMS argument is optional. A null pointer will
- * cause the default file creation parameters to be used.
+ * The CREATE_PARMS argument is optional. A null pointer will
+ * cause the default file creation parameters to be used.
*
- * The TYPE argument determins the low-level type of file that
- * is opened. The special value H5F_LOW_DFLT uses the default
- * method which is defined at compile time.
+ * The TYPE argument determins the low-level type of file that
+ * is opened. The special value H5F_LOW_DFLT uses the default
+ * method which is defined at compile time.
*
* Errors:
- * ATOM BADATOM Can't unatomize default template
- * id.
- * FILE BADVALUE Can't create file without write
- * intent.
- * FILE BADVALUE Can't truncate without write intent.
- * FILE CANTCREATE Can't create file.
- * FILE CANTCREATE Can't truncate file.
- * FILE CANTINIT Can't get default file create template
- * id.
- * FILE CANTINIT Can't write file boot block.
- * FILE CANTOPENFILE Bad address size.
- * FILE CANTOPENFILE Bad boot block version number.
- * FILE CANTOPENFILE Bad free space version number.
- * FILE CANTOPENFILE Bad length size.
- * FILE CANTOPENFILE Bad object dir version number.
- * FILE CANTOPENFILE Bad shared header version number.
- * FILE CANTOPENFILE Bad small object heap version number.
- * FILE CANTOPENFILE Bad symbol table internal node 1/2
- * rank.
- * FILE CANTOPENFILE Bad symbol table leaf node 1/2 rank.
- * FILE CANTOPENFILE Can't read root symbol entry.
- * FILE CANTOPENFILE Cannot open existing file.
- * FILE CANTOPENFILE File cannot be reopened with write
- * access.
- * FILE CANTOPENFILE File does not exist.
- * FILE CANTOPENFILE Invalid file family name.
- * FILE FILEEXISTS File already exists - CREAT EXCL
- * failed.
- * FILE FILEOPEN File already open - TRUNC failed.
- * FILE NOTHDF5 Can't find signature.
- * FILE NOTHDF5 Can't read boot block.
- * FILE READERROR File is not readable.
- * FILE TRUNCATED Truncated file?
- * FILE WRITEERROR File is not writable.
- * IO READERROR Can't read boot block.
- *
- * Return: Success: Ptr to the file pointer.
- *
- * Failure: NULL
- *
- * Programmer: Robb Matzke
+ * ATOM BADATOM Can't unatomize default template
+ * id.
+ * FILE BADVALUE Can't create file without write
+ * intent.
+ * FILE BADVALUE Can't truncate without write intent.
+ * FILE CANTCREATE Can't create file.
+ * FILE CANTCREATE Can't truncate file.
+ * FILE CANTINIT Can't get default file create template
+ * id.
+ * FILE CANTINIT Can't write file boot block.
+ * FILE CANTOPENFILE Bad address size.
+ * FILE CANTOPENFILE Bad boot block version number.
+ * FILE CANTOPENFILE Bad free space version number.
+ * FILE CANTOPENFILE Bad length size.
+ * FILE CANTOPENFILE Bad object dir version number.
+ * FILE CANTOPENFILE Bad shared header version number.
+ * FILE CANTOPENFILE Bad small object heap version number.
+ * FILE CANTOPENFILE Bad symbol table internal node 1/2
+ * rank.
+ * FILE CANTOPENFILE Bad symbol table leaf node 1/2 rank.
+ * FILE CANTOPENFILE Can't read root symbol entry.
+ * FILE CANTOPENFILE Cannot open existing file.
+ * FILE CANTOPENFILE File cannot be reopened with write
+ * access.
+ * FILE CANTOPENFILE File does not exist.
+ * FILE CANTOPENFILE Invalid file family name.
+ * FILE FILEEXISTS File already exists - CREAT EXCL
+ * failed.
+ * FILE FILEOPEN File already open - TRUNC failed.
+ * FILE NOTHDF5 Can't find signature.
+ * FILE NOTHDF5 Can't read boot block.
+ * FILE READERROR File is not readable.
+ * FILE TRUNCATED Truncated file?
+ * FILE WRITEERROR File is not writable.
+ * IO READERROR Can't read boot block.
+ *
+ * Return: Success: Ptr to the file pointer.
+ *
+ * Failure: NULL
+ *
+ * Programmer: Robb Matzke
* Tuesday, September 23, 1997
*
* Modifications:
*
- * Robb Matzke, 11 Nov 1997
- * If the name contains the pattern /[^%]%\d*[duxX]/ then the file is
- * assumed to be a family of files. The TYPE argument is ignored and
- * H5F_LOW_FAM is used instead.
+ * Robb Matzke, 11 Nov 1997
+ * If the name contains the pattern /[^%]%\d*[duxX]/ then the file is
+ * assumed to be a family of files. The TYPE argument is ignored and
+ * H5F_LOW_FAM is used instead.
*
*-------------------------------------------------------------------------
*/
-H5F_t *
-H5F_open (const H5F_low_class_t *type, const char *name, uintn flags,
- const H5F_create_t *create_parms)
+H5F_t *
+H5F_open(const H5F_low_class_t *type, const char *name, uintn flags,
+ const H5F_create_t *create_parms)
{
- H5F_t *f = NULL; /*return value */
- H5F_t *ret_value = NULL; /*a copy of `f' */
- H5F_t *old = NULL; /*a file already opened */
- H5F_search_t search; /*file search key */
- H5F_low_t *fd = NULL; /*low level file desc */
- hbool_t empty_file = FALSE; /*is file empty? */
- hbool_t file_exists = FALSE; /*file already exists */
- uint8 buf[256]; /*I/O buffer.. */
- const uint8 *p=NULL; /* ..and pointer into it*/
- size_t fixed_size = 24; /*size of fixed part of boot blk*/
- size_t variable_size; /*variable part of boot block */
- H5F_create_t *cp=NULL; /*file creation parameters */
- haddr_t addr1, addr2; /*temporary address */
- H5G_entry_t root_ent; /*root symbol table entry */
- const char *s = name;
-
- FUNC_ENTER (H5F_open, NULL);
-
- assert (name && *name);
-
- /*
- * Does the name look like a family name? A family name always has a
- * percent (not preceded by a percent) followed by an optional plus and/or
- * minus, followed by optional digits, followed by the letter `d', `u',
- * `x', or `X'. This is a printf() format for an integer.
- */
- while (*s) {
- if ('%'!=*s++) continue;
- if ('%'==*s) {
- s++;
- continue;
- }
- while (*s && isdigit (*s)) s++;
- if ('d'!=*s && 'u'!=*s && 'x'!=*s && 'X'!=*s) continue;
- break;
- }
- if (*s) {
+ H5F_t *f = NULL; /*return value */
+ H5F_t *ret_value = NULL; /*a copy of `f' */
+ H5F_t *old = NULL; /*a file already opened */
+ H5F_search_t search; /*file search key */
+ H5F_low_t *fd = NULL; /*low level file desc */
+ hbool_t empty_file = FALSE; /*is file empty? */
+ hbool_t file_exists = FALSE; /*file already exists */
+ uint8 buf[256]; /*I/O buffer.. */
+ const uint8 *p = NULL; /* ..and pointer into it */
+ size_t fixed_size = 24; /*size of fixed part of boot blk */
+ size_t variable_size; /*variable part of boot block */
+ H5F_create_t *cp = NULL; /*file creation parameters */
+ haddr_t addr1, addr2; /*temporary address */
+ H5G_entry_t root_ent; /*root symbol table entry */
+ const char *s = name;
+
+ FUNC_ENTER(H5F_open, NULL);
+
+ assert(name && *name);
+
+ /*
+ * Does the name look like a family name? A family name always has a
+ * percent (not preceded by a percent) followed by an optional plus and/or
+ * minus, followed by optional digits, followed by the letter `d', `u',
+ * `x', or `X'. This is a printf() format for an integer.
+ */
+ while (*s) {
+ if ('%' != *s++)
+ continue;
+ if ('%' == *s) {
+ s++;
+ continue;
+ }
+ while (*s && isdigit(*s))
+ s++;
+ if ('d' != *s && 'u' != *s && 'x' != *s && 'X' != *s)
+ continue;
+ break;
+ }
+ if (*s) {
#ifdef H5F_DEBUG
- if (type!=H5F_LOW_FAM) {
- fprintf (stderr, "HDF5-DIAG: opening a file family\n");
- }
+ if (type != H5F_LOW_FAM) {
+ fprintf(stderr, "HDF5-DIAG: opening a file family\n");
+ }
#endif
- type = H5F_LOW_FAM;
- } else if (type==H5F_LOW_FAM) {
- HRETURN_ERROR (H5E_FILE, H5E_CANTOPENFILE, NULL,
- "invalid file family name");
- }
-
- /*
- * If the name ends with `.h5' and there's another file that ends with
- * `.raw' then open the file as a split file.
- */
- {
- if (H5F_LOW_SPLIT!=type && (s=strstr (name, ".h5")) && !s[3]) {
- char fullname[4096];
- strncpy (fullname, name, s-name);
- strcpy (fullname+(s-name), ".raw");
- if (H5F_low_access (H5F_LOW_DFLT, fullname, F_OK, NULL)) {
+ type = H5F_LOW_FAM;
+ } else if (type == H5F_LOW_FAM) {
+ HRETURN_ERROR(H5E_FILE, H5E_CANTOPENFILE, NULL,
+ "invalid file family name");
+ }
+ /*
+ * If the name ends with `.h5' and there's another file that ends with
+ * `.raw' then open the file as a split file.
+ */
+ {
+ if (H5F_LOW_SPLIT != type && (s = strstr(name, ".h5")) && !s[3]) {
+ char fullname[4096];
+ strncpy(fullname, name, s - name);
+ strcpy(fullname + (s - name), ".raw");
+ if (H5F_low_access(H5F_LOW_DFLT, fullname, F_OK, NULL)) {
#ifdef H5F_DEBUG
- fprintf (stderr, "HDF5-DIAG: opening a split file\n");
+ fprintf(stderr, "HDF5-DIAG: opening a split file\n");
#endif
- fullname[s-name] = '\0';
- f = H5F_open (H5F_LOW_SPLIT, fullname, flags, create_parms);
- HRETURN (f);
- }
- }
- }
-
- /*
- * If no file creation parameters are supplied then use defaults.
- */
- if (!create_parms) create_parms = &H5F_create_dflt;
-
- /*
- * Does the file exist? If so, get the device and i-node values so we can
- * compare them with other files already open. On Unix (and other systems
- * with hard or soft links) it doesn't work to compare files based only on
- * their full path name.
- */
- file_exists = H5F_low_access (type, name, F_OK, &search);
-
- /*
- * Open the low-level file (if necessary) and create an H5F_t struct that
- * points to an H5F_file_t struct.
- */
- if (file_exists) {
- if (flags & H5F_ACC_EXCL) {
- HRETURN_ERROR (H5E_FILE, H5E_FILEEXISTS, NULL,
- "file already exists - CREAT EXCL failed");
- }
- if (!H5F_low_access (type, name, R_OK, NULL)) {
- HRETURN_ERROR (H5E_FILE, H5E_READERROR, NULL,
- "file is not readable");
- }
- if ((flags & H5F_ACC_WRITE) &&
- !H5F_low_access (type, name, W_OK, NULL)) {
- HRETURN_ERROR (H5E_FILE, H5E_WRITEERROR, NULL,
- "file is not writable");
- }
-
- if ((old=H5Asearch_atom (H5_FILE, H5F_compare_files, &search))) {
- if (flags & H5F_ACC_TRUNC) {
- HRETURN_ERROR (H5E_FILE, H5E_FILEOPEN, NULL,
- "file already open - TRUNC failed");
- }
- if ((flags & H5F_ACC_WRITE) &&
- 0==(old->shared->flags & H5F_ACC_WRITE)) {
- if (NULL==(fd=H5F_low_open (type, name, H5F_ACC_WRITE, NULL))) {
- HRETURN_ERROR (H5E_FILE, H5E_CANTOPENFILE, NULL,
- "file cannot be reopened with write access");
- }
- H5F_low_close (old->shared->lf);
- old->shared->lf = fd;
- old->shared->flags |= H5F_ACC_WRITE;
- fd = NULL; /*so we don't close it during error*/
- }
- f = H5F_new (old->shared);
-
- } else if (flags & H5F_ACC_TRUNC) {
- /* Truncate existing file */
- if (0==(flags & H5F_ACC_WRITE)) {
- HRETURN_ERROR (H5E_FILE, H5E_BADVALUE, NULL,
- "can't truncate without write intent");
- }
- fd = H5F_low_open (type, name, H5F_ACC_WRITE|H5F_ACC_TRUNC, NULL);
- if (!fd) {
- HRETURN_ERROR (H5E_FILE, H5E_CANTCREATE, NULL,
- "can't truncate file");
- }
- f = H5F_new (NULL);
- f->shared->key = search;
- f->shared->flags = flags;
- f->shared->lf = fd;
- empty_file = TRUE;
-
- } else {
- fd = H5F_low_open (type, name, (flags & H5F_ACC_WRITE), NULL);
- if (!fd) {
- HRETURN_ERROR (H5E_FILE, H5E_CANTOPENFILE, NULL,
- "cannot open existing file");
- }
- f = H5F_new (NULL);
- f->shared->key = search;
- f->shared->flags = flags;
- f->shared->lf = fd;
- }
-
- } else if (flags & H5F_ACC_CREAT) {
- if (0==(flags & H5F_ACC_WRITE)) {
- HRETURN_ERROR (H5E_FILE, H5E_BADVALUE, NULL,
- "can't create file without write intent");
- }
- fd = H5F_low_open (type, name,
- H5F_ACC_WRITE|H5F_ACC_CREAT|H5F_ACC_EXCL,
- &search);
- if (!fd) {
- HRETURN_ERROR (H5E_FILE, H5E_CANTCREATE, NULL,
- "can't create file");
- }
- f = H5F_new (NULL);
- f->shared->key = search;
- f->shared->flags = flags;
- f->shared->lf = fd;
- empty_file = TRUE;
-
- } else {
- HRETURN_ERROR (H5E_FILE, H5E_CANTOPENFILE, NULL,
- "file does not exist");
- }
- assert (f);
-
- /*
- * The intent at the top level file struct are not necessarily the same as
- * the flags at the bottom. The top level describes how the file can be
- * accessed through the HDF5 library. The bottom level describes how the
- * file can be accessed through the C library.
- */
- f->intent = flags;
- f->name = H5MM_xstrdup (name);
-
- /*
- * Update the file creation parameters with default values if this is the
- * first time this file is opened.
- */
- if (1==f->shared->nrefs) {
- f->shared->create_parms = *create_parms;
- }
- cp = &(f->shared->create_parms);
-
- /*
- * Read or write the file boot block.
- */
- if (empty_file) {
- /*
- * For new files we must write the boot block. The boot block starts
- * immediately after the user-defined header, which we have already
- * insured is a proper size. The base address is set to the same thing
- * as the boot block.
- */
- H5F_addr_reset (&(f->shared->boot_addr));
- H5F_addr_inc (&(f->shared->boot_addr),
- f->shared->create_parms.userblock_size);
- f->shared->base_addr = f->shared->boot_addr;
-
- f->shared->consist_flags = 0x03;
- if (H5F_flush (f, FALSE)<0) {
- HGOTO_ERROR (H5E_FILE, H5E_CANTINIT, NULL,
- "can't write file boot block");
- }
- } else if (1==f->shared->nrefs) {
- /* For existing files we must read the boot block. */
- if (H5F_locate_signature (f->shared->lf, &(f->shared->boot_addr))<0) {
- HGOTO_ERROR (H5E_FILE, H5E_NOTHDF5, NULL, "can't find signature");
- }
- if (H5F_low_read (f->shared->lf, &(f->shared->boot_addr),
- fixed_size, buf)<0) {
- HGOTO_ERROR (H5E_IO, H5E_READERROR, NULL, "can't read boot block");
- }
-
- /*
- * Decode the fixed size part of the boot block. For each of the
- * version parameters, check that the library is able to handle that
- * version.
- */
- p = buf + H5F_SIGNATURE_LEN; /*already checked*/
-
- cp->bootblock_ver = *p++;
- if (cp->bootblock_ver != HDF5_BOOTBLOCK_VERSION) {
- HGOTO_ERROR (H5E_FILE, H5E_CANTOPENFILE, NULL,
- "bad boot block version number");
- }
-
- cp->smallobject_ver = *p++;
- if (cp->smallobject_ver != HDF5_SMALLOBJECT_VERSION) {
- HGOTO_ERROR (H5E_FILE, H5E_CANTOPENFILE, NULL,
- "bad small object heap version number");
- }
-
- cp->freespace_ver = *p++;
- if (cp->freespace_ver != HDF5_FREESPACE_VERSION) {
- HGOTO_ERROR (H5E_FILE, H5E_CANTOPENFILE, NULL,
- "bad free space version number");
- }
-
- cp->objectdir_ver = *p++;
- if (cp->objectdir_ver != HDF5_OBJECTDIR_VERSION) {
- HGOTO_ERROR (H5E_FILE, H5E_CANTOPENFILE, NULL,
- "bad object dir version number");
- }
-
- cp->sharedheader_ver = *p++;
- if (cp->sharedheader_ver != HDF5_SHAREDHEADER_VERSION) {
- HGOTO_ERROR (H5E_FILE, H5E_CANTOPENFILE, NULL,
- "bad shared header version number");
- }
-
- cp->sizeof_addr = *p++;
- if (cp->sizeof_addr!=2 &&
- cp->sizeof_addr!=4 &&
- cp->sizeof_addr!=8 &&
- cp->sizeof_addr!=16 &&
- cp->sizeof_addr!=32) {
- HGOTO_ERROR (H5E_FILE, H5E_CANTOPENFILE, NULL,
- "bad address size");
- }
-
- cp->sizeof_size = *p++;
- if (cp->sizeof_size!=2 &&
- cp->sizeof_size!=4 &&
- cp->sizeof_size!=8 &&
- cp->sizeof_size!=16 &&
- cp->sizeof_size!=32) {
- HGOTO_ERROR (H5E_FILE, H5E_CANTOPENFILE, NULL,
- "bad length size");
- }
-
- /* Reserved byte */
- p++;
-
- UINT16DECODE (p, cp->sym_leaf_k);
- if (cp->sym_leaf_k<1) {
- HGOTO_ERROR (H5E_FILE, H5E_CANTOPENFILE, NULL,
- "bad symbol table leaf node 1/2 rank");
- }
-
- UINT16DECODE (p, cp->btree_k[H5B_SNODE_ID]);
- if (cp->btree_k[H5B_SNODE_ID]<1) {
- HGOTO_ERROR (H5E_FILE, H5E_CANTOPENFILE, NULL,
- "bad symbol table internal node 1/2 rank");
- }
-
- UINT32DECODE (p, f->shared->consist_flags);
- /* nothing to check for consistency flags */
-
- assert (p-buf == fixed_size);
-
- /* Read the variable length part of the boot block... */
- variable_size = H5F_SIZEOF_ADDR (f) + /*base address*/
- H5F_SIZEOF_ADDR (f) + /*global small obj heap*/
- H5F_SIZEOF_ADDR (f) + /*global free list addr*/
- H5F_SIZEOF_ADDR (f) + /*logical file size*/
- H5G_SIZEOF_ENTRY (f);
- assert (variable_size <= sizeof buf);
- addr1 = f->shared->boot_addr;
- H5F_addr_inc (&addr1, fixed_size);
- if (H5F_low_read (f->shared->lf, &addr1, variable_size, buf)<0) {
- HGOTO_ERROR (H5E_FILE, H5E_NOTHDF5, NULL,
- "can't read boot block");
- }
-
- p = buf;
- H5F_addr_decode (f, &p, &(f->shared->base_addr));
- H5F_addr_decode (f, &p, &(f->shared->smallobj_addr));
- H5F_addr_decode (f, &p, &(f->shared->freespace_addr));
- H5F_addr_decode (f, &p, &(f->shared->hdf5_eof));
- if (H5G_ent_decode (f, &p, &root_ent)<0) {
- HGOTO_ERROR (H5E_FILE, H5E_CANTOPENFILE, NULL,
- "can't read root symbol entry");
- }
- if (H5F_addr_defined (&(root_ent.header))) {
- f->shared->root_ent = H5MM_xmalloc (sizeof(H5G_entry_t));
- *(f->shared->root_ent) = root_ent;
- }
-
-
- /*
- * The userdefined data is the area of the file before the base
- * address.
- */
- f->shared->create_parms.userblock_size=f->shared->base_addr.offset;
- }
-
- /*
- * What is the current size of the file? The max_addr field is a relative
- * address while H5F_low_size() returns an absolute address.
- */
- H5F_low_size (f->shared->lf, &addr1);
- addr2 = f->shared->hdf5_eof;
- H5F_addr_add (&addr2, &(f->shared->base_addr));
- if (H5F_addr_lt (&addr1, &addr2)) {
- /*
- * Truncated file? This might happen if one tries to open the first
- * member of a file family.
- */
- HGOTO_ERROR (H5E_FILE, H5E_TRUNCATED, NULL, "truncated file");
- } else if (H5F_addr_gt (&addr1, &addr2)) {
- /*
- * The file is larger than the hdf5 data. It either has extra junk at
- * the end, or a wrapper. In either case, make the file think it's
- * shorter so when we allocate memory from the file for hdf5 it's
- * allocated immediately after the end of the previous hdf5 data. This
- * will cause internal wrappers to be overwritten if they follow the
- * hdf5 data.
- */
+ fullname[s - name] = '\0';
+ f = H5F_open(H5F_LOW_SPLIT, fullname, flags, create_parms);
+ HRETURN(f);
+ }
+ }
+ }
+
+ /*
+ * If no file creation parameters are supplied then use defaults.
+ */
+ if (!create_parms)
+ create_parms = &H5F_create_dflt;
+
+ /*
+ * Does the file exist? If so, get the device and i-node values so we can
+ * compare them with other files already open. On Unix (and other systems
+ * with hard or soft links) it doesn't work to compare files based only on
+ * their full path name.
+ */
+ file_exists = H5F_low_access(type, name, F_OK, &search);
+
+ /*
+ * Open the low-level file (if necessary) and create an H5F_t struct that
+ * points to an H5F_file_t struct.
+ */
+ if (file_exists) {
+ if (flags & H5F_ACC_EXCL) {
+ HRETURN_ERROR(H5E_FILE, H5E_FILEEXISTS, NULL,
+ "file already exists - CREAT EXCL failed");
+ }
+ if (!H5F_low_access(type, name, R_OK, NULL)) {
+ HRETURN_ERROR(H5E_FILE, H5E_READERROR, NULL,
+ "file is not readable");
+ }
+ if ((flags & H5F_ACC_WRITE) &&
+ !H5F_low_access(type, name, W_OK, NULL)) {
+ HRETURN_ERROR(H5E_FILE, H5E_WRITEERROR, NULL,
+ "file is not writable");
+ }
+ if ((old = H5Asearch_atom(H5_FILE, H5F_compare_files, &search))) {
+ if (flags & H5F_ACC_TRUNC) {
+ HRETURN_ERROR(H5E_FILE, H5E_FILEOPEN, NULL,
+ "file already open - TRUNC failed");
+ }
+ if ((flags & H5F_ACC_WRITE) &&
+ 0 == (old->shared->flags & H5F_ACC_WRITE)) {
+ if (NULL == (fd = H5F_low_open(type, name, H5F_ACC_WRITE, NULL))) {
+ HRETURN_ERROR(H5E_FILE, H5E_CANTOPENFILE, NULL,
+ "file cannot be reopened with write access");
+ }
+ H5F_low_close(old->shared->lf);
+ old->shared->lf = fd;
+ old->shared->flags |= H5F_ACC_WRITE;
+ fd = NULL; /*so we don't close it during error */
+ }
+ f = H5F_new(old->shared);
+
+ } else if (flags & H5F_ACC_TRUNC) {
+ /* Truncate existing file */
+ if (0 == (flags & H5F_ACC_WRITE)) {
+ HRETURN_ERROR(H5E_FILE, H5E_BADVALUE, NULL,
+ "can't truncate without write intent");
+ }
+ fd = H5F_low_open(type, name, H5F_ACC_WRITE | H5F_ACC_TRUNC, NULL);
+ if (!fd) {
+ HRETURN_ERROR(H5E_FILE, H5E_CANTCREATE, NULL,
+ "can't truncate file");
+ }
+ f = H5F_new(NULL);
+ f->shared->key = search;
+ f->shared->flags = flags;
+ f->shared->lf = fd;
+ empty_file = TRUE;
+
+ } else {
+ fd = H5F_low_open(type, name, (flags & H5F_ACC_WRITE), NULL);
+ if (!fd) {
+ HRETURN_ERROR(H5E_FILE, H5E_CANTOPENFILE, NULL,
+ "cannot open existing file");
+ }
+ f = H5F_new(NULL);
+ f->shared->key = search;
+ f->shared->flags = flags;
+ f->shared->lf = fd;
+ }
+
+ } else if (flags & H5F_ACC_CREAT) {
+ if (0 == (flags & H5F_ACC_WRITE)) {
+ HRETURN_ERROR(H5E_FILE, H5E_BADVALUE, NULL,
+ "can't create file without write intent");
+ }
+ fd = H5F_low_open(type, name,
+ H5F_ACC_WRITE | H5F_ACC_CREAT | H5F_ACC_EXCL,
+ &search);
+ if (!fd) {
+ HRETURN_ERROR(H5E_FILE, H5E_CANTCREATE, NULL,
+ "can't create file");
+ }
+ f = H5F_new(NULL);
+ f->shared->key = search;
+ f->shared->flags = flags;
+ f->shared->lf = fd;
+ empty_file = TRUE;
+
+ } else {
+ HRETURN_ERROR(H5E_FILE, H5E_CANTOPENFILE, NULL,
+ "file does not exist");
+ }
+ assert(f);
+
+ /*
+ * The intent at the top level file struct are not necessarily the same as
+ * the flags at the bottom. The top level describes how the file can be
+ * accessed through the HDF5 library. The bottom level describes how the
+ * file can be accessed through the C library.
+ */
+ f->intent = flags;
+ f->name = H5MM_xstrdup(name);
+
+ /*
+ * Update the file creation parameters with default values if this is the
+ * first time this file is opened.
+ */
+ if (1 == f->shared->nrefs) {
+ f->shared->create_parms = *create_parms;
+ }
+ cp = &(f->shared->create_parms);
+
+ /*
+ * Read or write the file boot block.
+ */
+ if (empty_file) {
+ /*
+ * For new files we must write the boot block. The boot block starts
+ * immediately after the user-defined header, which we have already
+ * insured is a proper size. The base address is set to the same thing
+ * as the boot block.
+ */
+ H5F_addr_reset(&(f->shared->boot_addr));
+ H5F_addr_inc(&(f->shared->boot_addr),
+ f->shared->create_parms.userblock_size);
+ f->shared->base_addr = f->shared->boot_addr;
+
+ f->shared->consist_flags = 0x03;
+ if (H5F_flush(f, FALSE) < 0) {
+ HGOTO_ERROR(H5E_FILE, H5E_CANTINIT, NULL,
+ "can't write file boot block");
+ }
+ } else if (1 == f->shared->nrefs) {
+ /* For existing files we must read the boot block. */
+ if (H5F_locate_signature(f->shared->lf, &(f->shared->boot_addr)) < 0) {
+ HGOTO_ERROR(H5E_FILE, H5E_NOTHDF5, NULL, "can't find signature");
+ }
+ if (H5F_low_read(f->shared->lf, &(f->shared->boot_addr),
+ fixed_size, buf) < 0) {
+ HGOTO_ERROR(H5E_IO, H5E_READERROR, NULL, "can't read boot block");
+ }
+ /*
+ * Decode the fixed size part of the boot block. For each of the
+ * version parameters, check that the library is able to handle that
+ * version.
+ */
+ p = buf + H5F_SIGNATURE_LEN; /*already checked */
+
+ cp->bootblock_ver = *p++;
+ if (cp->bootblock_ver != HDF5_BOOTBLOCK_VERSION) {
+ HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, NULL,
+ "bad boot block version number");
+ }
+ cp->smallobject_ver = *p++;
+ if (cp->smallobject_ver != HDF5_SMALLOBJECT_VERSION) {
+ HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, NULL,
+ "bad small object heap version number");
+ }
+ cp->freespace_ver = *p++;
+ if (cp->freespace_ver != HDF5_FREESPACE_VERSION) {
+ HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, NULL,
+ "bad free space version number");
+ }
+ cp->objectdir_ver = *p++;
+ if (cp->objectdir_ver != HDF5_OBJECTDIR_VERSION) {
+ HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, NULL,
+ "bad object dir version number");
+ }
+ cp->sharedheader_ver = *p++;
+ if (cp->sharedheader_ver != HDF5_SHAREDHEADER_VERSION) {
+ HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, NULL,
+ "bad shared header version number");
+ }
+ cp->sizeof_addr = *p++;
+ if (cp->sizeof_addr != 2 &&
+ cp->sizeof_addr != 4 &&
+ cp->sizeof_addr != 8 &&
+ cp->sizeof_addr != 16 &&
+ cp->sizeof_addr != 32) {
+ HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, NULL,
+ "bad address size");
+ }
+ cp->sizeof_size = *p++;
+ if (cp->sizeof_size != 2 &&
+ cp->sizeof_size != 4 &&
+ cp->sizeof_size != 8 &&
+ cp->sizeof_size != 16 &&
+ cp->sizeof_size != 32) {
+ HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, NULL,
+ "bad length size");
+ }
+ /* Reserved byte */
+ p++;
+
+ UINT16DECODE(p, cp->sym_leaf_k);
+ if (cp->sym_leaf_k < 1) {
+ HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, NULL,
+ "bad symbol table leaf node 1/2 rank");
+ }
+ UINT16DECODE(p, cp->btree_k[H5B_SNODE_ID]);
+ if (cp->btree_k[H5B_SNODE_ID] < 1) {
+ HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, NULL,
+ "bad symbol table internal node 1/2 rank");
+ }
+ UINT32DECODE(p, f->shared->consist_flags);
+ /* nothing to check for consistency flags */
+
+ assert(p - buf == fixed_size);
+
+ /* Read the variable length part of the boot block... */
+ variable_size = H5F_SIZEOF_ADDR(f) + /*base address */
+ H5F_SIZEOF_ADDR(f) + /*global small obj heap */
+ H5F_SIZEOF_ADDR(f) + /*global free list addr */
+ H5F_SIZEOF_ADDR(f) + /*logical file size */
+ H5G_SIZEOF_ENTRY(f);
+ assert(variable_size <= sizeof buf);
+ addr1 = f->shared->boot_addr;
+ H5F_addr_inc(&addr1, fixed_size);
+ if (H5F_low_read(f->shared->lf, &addr1, variable_size, buf) < 0) {
+ HGOTO_ERROR(H5E_FILE, H5E_NOTHDF5, NULL,
+ "can't read boot block");
+ }
+ p = buf;
+ H5F_addr_decode(f, &p, &(f->shared->base_addr));
+ H5F_addr_decode(f, &p, &(f->shared->smallobj_addr));
+ H5F_addr_decode(f, &p, &(f->shared->freespace_addr));
+ H5F_addr_decode(f, &p, &(f->shared->hdf5_eof));
+ if (H5G_ent_decode(f, &p, &root_ent) < 0) {
+ HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, NULL,
+ "can't read root symbol entry");
+ }
+ if (H5F_addr_defined(&(root_ent.header))) {
+ f->shared->root_ent = H5MM_xmalloc(sizeof(H5G_entry_t));
+ *(f->shared->root_ent) = root_ent;
+ }
+ /*
+ * The userdefined data is the area of the file before the base
+ * address.
+ */
+ f->shared->create_parms.userblock_size = f->shared->base_addr.offset;
+ }
+ /*
+ * What is the current size of the file? The max_addr field is a relative
+ * address while H5F_low_size() returns an absolute address.
+ */
+ H5F_low_size(f->shared->lf, &addr1);
+ addr2 = f->shared->hdf5_eof;
+ H5F_addr_add(&addr2, &(f->shared->base_addr));
+ if (H5F_addr_lt(&addr1, &addr2)) {
+ /*
+ * Truncated file? This might happen if one tries to open the first
+ * member of a file family.
+ */
+ HGOTO_ERROR(H5E_FILE, H5E_TRUNCATED, NULL, "truncated file");
+ } else if (H5F_addr_gt(&addr1, &addr2)) {
+ /*
+ * The file is larger than the hdf5 data. It either has extra junk at
+ * the end, or a wrapper. In either case, make the file think it's
+ * shorter so when we allocate memory from the file for hdf5 it's
+ * allocated immediately after the end of the previous hdf5 data. This
+ * will cause internal wrappers to be overwritten if they follow the
+ * hdf5 data.
+ */
#ifdef H5F_DEBUG
- fprintf (stderr, "HDF5-DIAG: resetting EOF from ");
- H5F_addr_print (stderr, &addr1);
- fprintf (stderr, " to ");
- H5F_addr_print (stderr, &addr2);
- fprintf (stderr, " (abs)\n");
+ fprintf(stderr, "HDF5-DIAG: resetting EOF from ");
+ H5F_addr_print(stderr, &addr1);
+ fprintf(stderr, " to ");
+ H5F_addr_print(stderr, &addr2);
+ fprintf(stderr, " (abs)\n");
#endif
- H5F_low_seteof (f->shared->lf, &addr2);
- }
-
-
- /* Success! */
- ret_value = f;
-
- done:
- if (!ret_value) {
- if (f) H5F_dest (f);
- H5F_low_close (fd);
- }
-
- FUNC_LEAVE (ret_value);
+ H5F_low_seteof(f->shared->lf, &addr2);
+ }
+ /* Success! */
+ ret_value = f;
+
+ done:
+ if (!ret_value) {
+ if (f)
+ H5F_dest(f);
+ H5F_low_close(fd);
+ }
+ FUNC_LEAVE(ret_value);
}
/*--------------------------------------------------------------------------
@@ -972,8 +950,8 @@ H5F_open (const H5F_low_class_t *type, const char *name, uintn flags,
of the file open call.
The flags currently defined:
H5ACC_OVERWRITE - Truncate file, if it already exists. The file
- will be truncated, erasing all data previously stored in the
- file.
+ will be truncated, erasing all data previously stored in the
+ file.
The more complex behaviors of a file's creation and access are
controlled through the file-creation and file-access templates. The value
of 0 for a template value indicates that the library should use the default
@@ -993,64 +971,61 @@ H5F_open (const H5F_low_class_t *type, const char *name, uintn flags,
Most of the work is now done by H5F_open() since H5Fcreate() and H5Fopen()
originally contained almost identical code.
--------------------------------------------------------------------------*/
-hid_t H5Fcreate(const char *filename, uintn flags, hid_t create_temp,
- hid_t access_temp)
+hid_t
+H5Fcreate(const char *filename, uintn flags, hid_t create_temp,
+ hid_t access_temp)
{
- H5F_t *new_file=NULL; /* file struct for new file */
- const H5F_create_t *create_parms; /* pointer to the parameters to
- * use when creating the file
- */
- hid_t ret_value = FAIL;
+ H5F_t *new_file = NULL; /* file struct for new file */
+ const H5F_create_t *create_parms; /* pointer to the parameters to
+ * use when creating the file
+ */
+ hid_t ret_value = FAIL;
FUNC_ENTER(H5Fcreate, FAIL);
H5ECLEAR;
/* Check/fix arguments */
if (!filename || !*filename)
- HGOTO_ERROR (H5E_ARGS, H5E_BADVALUE, FAIL, "invalid file name");
+ HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid file name");
if (flags & ~H5ACC_OVERWRITE)
- HGOTO_ERROR (H5E_ARGS, H5E_BADVALUE, FAIL, "invalid flags");
+ HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid flags");
flags = (H5F_ACC_WRITE | H5F_ACC_CREAT) |
- (H5ACC_OVERWRITE==flags ? H5F_ACC_TRUNC : H5F_ACC_EXCL);
-
- if (create_temp<=0) {
- create_parms = &H5F_create_dflt;
- } else if (NULL==(create_parms=H5Aatom_object (create_temp))) {
- HGOTO_ERROR (H5E_ATOM, H5E_BADATOM, FAIL, "can't unatomize template");
+ (H5ACC_OVERWRITE == flags ? H5F_ACC_TRUNC : H5F_ACC_EXCL);
+
+ if (create_temp <= 0) {
+ create_parms = &H5F_create_dflt;
+ } else if (NULL == (create_parms = H5Aatom_object(create_temp))) {
+ HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't unatomize template");
}
-
#ifdef LATER
- if (access_temp<=0) {
- access_parms = &H5F_access_dflt;
- } else if (NULL==(access_parms=H5Aatom_object (access_temp))) {
- HGOTO_ERROR (H5E_ATOM, H5E_BADATOM, FAIL); /*can't unatomize template*/
+ if (access_temp <= 0) {
+ access_parms = &H5F_access_dflt;
+ } else if (NULL == (access_parms = H5Aatom_object(access_temp))) {
+ HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL); /*can't unatomize template */
}
#endif
-
+
/*
* Create a new file or truncate an existing file.
*/
- if (NULL==(new_file = H5F_open (H5F_LOW_DFLT, filename, flags,
- create_parms))) {
- HGOTO_ERROR (H5E_FILE, H5E_CANTOPENFILE, FAIL, "can't create file");
+ if (NULL == (new_file = H5F_open(H5F_LOW_DFLT, filename, flags,
+ create_parms))) {
+ HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, FAIL, "can't create file");
}
-
/* Get an atom for the file */
- if ((ret_value=H5Aregister_atom (H5_FILE, new_file))<0)
+ if ((ret_value = H5Aregister_atom(H5_FILE, new_file)) < 0)
HGOTO_ERROR(H5E_ATOM, H5E_CANTREGISTER, FAIL, "can't atomize file");
- done:
- if (ret_value<0 && new_file) {
- /* Error condition cleanup */
- H5F_close (new_file);
+ done:
+ if (ret_value < 0 && new_file) {
+ /* Error condition cleanup */
+ H5F_close(new_file);
}
-
/* Normal function cleanup */
FUNC_LEAVE(ret_value);
}
-
/*--------------------------------------------------------------------------
NAME
H5Fopen
@@ -1092,141 +1067,135 @@ hid_t H5Fcreate(const char *filename, uintn flags, hid_t create_temp,
Most of the work is now done by H5F_open() since H5Fcreate() and H5Fopen()
originally contained almost identical code.
--------------------------------------------------------------------------*/
-hid_t H5Fopen(const char *filename, uintn flags, hid_t access_temp)
+hid_t
+H5Fopen(const char *filename, uintn flags, hid_t access_temp)
{
- H5F_t *new_file=NULL; /* file struct for new file */
- hid_t ret_value = FAIL;
+ H5F_t *new_file = NULL; /* file struct for new file */
+ hid_t ret_value = FAIL;
FUNC_ENTER(H5Fopen, FAIL);
H5ECLEAR;
/* Check/fix arguments. */
if (!filename || !*filename)
- HGOTO_ERROR (H5E_ARGS, H5E_BADRANGE, FAIL, "invalid file name");
+ HGOTO_ERROR(H5E_ARGS, H5E_BADRANGE, FAIL, "invalid file name");
flags = flags & H5ACC_WRITE ? H5F_ACC_WRITE : 0;
#ifdef LATER
- if (access_temp<=0)
- access_temp = H5CPget_default_atom (H5_TEMPLATE);
- if (NULL==(f_access_parms=H5Aatom_object (access_temp)))
- HGOTO_ERROR (H5E_ATOM, H5E_BADATOM, FAIL);/*can't unatomize template*/
+ if (access_temp <= 0)
+ access_temp = H5CPget_default_atom(H5_TEMPLATE);
+ if (NULL == (f_access_parms = H5Aatom_object(access_temp)))
+ HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL); /*can't unatomize template */
#endif
/* Open the file */
- if (NULL==(new_file=H5F_open (H5F_LOW_DFLT, filename, flags, NULL))) {
- HGOTO_ERROR (H5E_FILE, H5E_CANTOPENFILE, FAIL, "cant open file");
+ if (NULL == (new_file = H5F_open(H5F_LOW_DFLT, filename, flags, NULL))) {
+ HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, FAIL, "cant open file");
}
-
/* Get an atom for the file */
- if ((ret_value = H5Aregister_atom (H5_FILE, new_file))<0)
+ if ((ret_value = H5Aregister_atom(H5_FILE, new_file)) < 0)
HGOTO_ERROR(H5E_ATOM, H5E_CANTREGISTER, FAIL, "can't atomize file");
- done:
- if (ret_value<0 && new_file) {
- H5F_close (new_file);
+ done:
+ if (ret_value < 0 && new_file) {
+ H5F_close(new_file);
}
-
/* Normal function cleanup */
FUNC_LEAVE(ret_value);
}
-
/*-------------------------------------------------------------------------
- * Function: H5F_flush
+ * Function: H5F_flush
*
- * Purpose: Flushes (and optionally invalidates) cached data plus the
- * file boot block. If the logical file size field is zero
- * then it is updated to be the length of the boot block.
+ * Purpose: Flushes (and optionally invalidates) cached data plus the
+ * file boot block. If the logical file size field is zero
+ * then it is updated to be the length of the boot block.
*
* Errors:
- * CACHE CANTFLUSH Can't flush cache.
- * IO WRITEERROR Can't write header.
+ * CACHE CANTFLUSH Can't flush cache.
+ * IO WRITEERROR Can't write header.
*
- * Return: Success: SUCCEED
+ * Return: Success: SUCCEED
*
- * Failure: FAIL
+ * Failure: FAIL
*
- * Programmer: Robb Matzke
- * matzke@llnl.gov
- * Aug 29 1997
+ * Programmer: Robb Matzke
+ * matzke@llnl.gov
+ * Aug 29 1997
*
* Modifications:
*
*-------------------------------------------------------------------------
*/
static herr_t
-H5F_flush (H5F_t *f, hbool_t invalidate)
+H5F_flush(H5F_t *f, hbool_t invalidate)
{
- uint8 buf[2048], *p=buf;
-
- FUNC_ENTER (H5F_flush, FAIL);
-
- /*
- * Nothing to do if the file is read only. This determination is made at
- * the shared open(2) flags level, implying that opening a file twice,
- * once for read-only and once for read-write, and then calling
- * H5F_flush() with the read-only handle, still causes data to be flushed.
- */
- if (0==(H5F_ACC_WRITE & f->shared->flags)) HRETURN (SUCCEED);
-
- /* flush (and invalidate) the entire cache */
- if (H5AC_flush (f, NULL, 0, invalidate)<0) {
- HRETURN_ERROR (H5E_CACHE, H5E_CANTFLUSH, FAIL, "can't flush cache");
- }
-
- /* encode the file boot block */
- HDmemcpy (p, H5F_SIGNATURE, H5F_SIGNATURE_LEN);
- p += H5F_SIGNATURE_LEN;
-
- *p++ = f->shared->create_parms.bootblock_ver;
- *p++ = f->shared->create_parms.smallobject_ver;
- *p++ = f->shared->create_parms.freespace_ver;
- *p++ = f->shared->create_parms.objectdir_ver;
- *p++ = f->shared->create_parms.sharedheader_ver;
- *p++ = H5F_SIZEOF_ADDR (f);
- *p++ = H5F_SIZEOF_SIZE (f);
- *p++ = 0; /*reserved*/
- UINT16ENCODE (p, f->shared->create_parms.sym_leaf_k);
- UINT16ENCODE (p, f->shared->create_parms.btree_k[H5B_SNODE_ID]);
- UINT32ENCODE (p, f->shared->consist_flags);
- H5F_addr_encode (f, &p, &(f->shared->base_addr));
- H5F_addr_encode (f, &p, &(f->shared->smallobj_addr));
- H5F_addr_encode (f, &p, &(f->shared->freespace_addr));
- H5F_addr_encode (f, &p, &(f->shared->hdf5_eof));
- H5G_ent_encode (f, &p, f->shared->root_ent);
-
- /* update file length if necessary */
- if (!H5F_addr_defined (&(f->shared->hdf5_eof))) {
- H5F_addr_reset (&(f->shared->hdf5_eof));
- H5F_addr_inc (&(f->shared->hdf5_eof), p-buf);
- H5F_low_seteof (f->shared->lf, &(f->shared->hdf5_eof));
- }
-
- /* write the boot block to disk */
- if (H5F_low_write (f->shared->lf, &(f->shared->boot_addr), p-buf, buf)<0) {
- HRETURN_ERROR (H5E_IO, H5E_WRITEERROR, FAIL, "can't write header");
- }
-
- /* Flush file buffers to disk */
- if (H5F_low_flush (f->shared->lf)<0) {
- HRETURN_ERROR (H5E_IO, H5E_WRITEERROR, FAIL, "low level flush failed");
- }
-
- FUNC_LEAVE (SUCCEED);
-}
+ uint8 buf[2048], *p = buf;
+
+ FUNC_ENTER(H5F_flush, FAIL);
+ /*
+ * Nothing to do if the file is read only. This determination is made at
+ * the shared open(2) flags level, implying that opening a file twice,
+ * once for read-only and once for read-write, and then calling
+ * H5F_flush() with the read-only handle, still causes data to be flushed.
+ */
+ if (0 == (H5F_ACC_WRITE & f->shared->flags))
+ HRETURN(SUCCEED);
+
+ /* flush (and invalidate) the entire cache */
+ if (H5AC_flush(f, NULL, 0, invalidate) < 0) {
+ HRETURN_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, "can't flush cache");
+ }
+ /* encode the file boot block */
+ HDmemcpy(p, H5F_SIGNATURE, H5F_SIGNATURE_LEN);
+ p += H5F_SIGNATURE_LEN;
+
+ *p++ = f->shared->create_parms.bootblock_ver;
+ *p++ = f->shared->create_parms.smallobject_ver;
+ *p++ = f->shared->create_parms.freespace_ver;
+ *p++ = f->shared->create_parms.objectdir_ver;
+ *p++ = f->shared->create_parms.sharedheader_ver;
+ *p++ = H5F_SIZEOF_ADDR(f);
+ *p++ = H5F_SIZEOF_SIZE(f);
+ *p++ = 0; /*reserved */
+ UINT16ENCODE(p, f->shared->create_parms.sym_leaf_k);
+ UINT16ENCODE(p, f->shared->create_parms.btree_k[H5B_SNODE_ID]);
+ UINT32ENCODE(p, f->shared->consist_flags);
+ H5F_addr_encode(f, &p, &(f->shared->base_addr));
+ H5F_addr_encode(f, &p, &(f->shared->smallobj_addr));
+ H5F_addr_encode(f, &p, &(f->shared->freespace_addr));
+ H5F_addr_encode(f, &p, &(f->shared->hdf5_eof));
+ H5G_ent_encode(f, &p, f->shared->root_ent);
+
+ /* update file length if necessary */
+ if (!H5F_addr_defined(&(f->shared->hdf5_eof))) {
+ H5F_addr_reset(&(f->shared->hdf5_eof));
+ H5F_addr_inc(&(f->shared->hdf5_eof), p - buf);
+ H5F_low_seteof(f->shared->lf, &(f->shared->hdf5_eof));
+ }
+ /* write the boot block to disk */
+ if (H5F_low_write(f->shared->lf, &(f->shared->boot_addr), p - buf, buf) < 0) {
+ HRETURN_ERROR(H5E_IO, H5E_WRITEERROR, FAIL, "can't write header");
+ }
+ /* Flush file buffers to disk */
+ if (H5F_low_flush(f->shared->lf) < 0) {
+ HRETURN_ERROR(H5E_IO, H5E_WRITEERROR, FAIL, "low level flush failed");
+ }
+ FUNC_LEAVE(SUCCEED);
+}
/*-------------------------------------------------------------------------
- * Function: H5F_close
+ * Function: H5F_close
*
- * Purpose: Closes an open HDF5 file.
+ * Purpose: Closes an open HDF5 file.
*
- * Return: Success: SUCCEED
+ * Return: Success: SUCCEED
*
- * Failure: FAIL
+ * Failure: FAIL
*
- * Programmer: Robb Matzke
+ * Programmer: Robb Matzke
* Tuesday, September 23, 1997
*
* Modifications:
@@ -1234,48 +1203,47 @@ H5F_flush (H5F_t *f, hbool_t invalidate)
*-------------------------------------------------------------------------
*/
herr_t
-H5F_close (H5F_t *f)
+H5F_close(H5F_t *f)
{
- FUNC_ENTER (H5F_close, FAIL);
-
- /* Close all current working groups */
- while (H5G_pop (f)>=0) /*void*/;
-
- /* Flush the boot block and caches */
- if (H5F_flush (f, TRUE)<0) {
- HRETURN_ERROR (H5E_CACHE, H5E_CANTFLUSH, FAIL, "can't flush cache");
- }
-
- /*
- * If object headers are still open then delay deletion of resources until
- * they have all been closed. The file is in a consistent state now, so
- * forgetting to close everything is not a major problem.
- */
- if (f->nopen>0) {
+ FUNC_ENTER(H5F_close, FAIL);
+
+ /* Close all current working groups */
+ while (H5G_pop(f) >= 0) /*void */
+ ;
+
+ /* Flush the boot block and caches */
+ if (H5F_flush(f, TRUE) < 0) {
+ HRETURN_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, "can't flush cache");
+ }
+ /*
+ * If object headers are still open then delay deletion of resources until
+ * they have all been closed. The file is in a consistent state now, so
+ * forgetting to close everything is not a major problem.
+ */
+ if (f->nopen > 0) {
#ifndef NDEBUG
- fprintf (stderr, "HDF5-DIAG: H5F_close: %d object header%s still "
- "open (file close will complete when %s closed)\n",
- f->nopen,
- 1==f->nopen?" is":"s are",
- 1==f->nopen?"that header is":"those headers are");
+ fprintf(stderr, "HDF5-DIAG: H5F_close: %d object header%s still "
+ "open (file close will complete when %s closed)\n",
+ f->nopen,
+ 1 == f->nopen ? " is" : "s are",
+ 1 == f->nopen ? "that header is" : "those headers are");
#endif
- f->close_pending = TRUE;
- HRETURN (SUCCEED);
- } else if (f->close_pending) {
+ f->close_pending = TRUE;
+ HRETURN(SUCCEED);
+ } else if (f->close_pending) {
#ifndef NDEBUG
- fprintf (stderr, "HDF5-DIAG: H5F_close: operation completed\n");
+ fprintf(stderr, "HDF5-DIAG: H5F_close: operation completed\n");
#endif
- }
-
-
- /* Dump debugging info */
- if (f->intent & H5F_ACC_DEBUG) H5AC_debug (f);
+ }
+ /* Dump debugging info */
+ if (f->intent & H5F_ACC_DEBUG)
+ H5AC_debug(f);
- /* Close files and release resources */
- H5F_low_close (f->shared->lf);
- f = H5F_dest (f);
+ /* Close files and release resources */
+ H5F_low_close(f->shared->lf);
+ f = H5F_dest(f);
- FUNC_LEAVE (SUCCEED);
+ FUNC_LEAVE(SUCCEED);
}
/*--------------------------------------------------------------------------
@@ -1311,240 +1279,234 @@ H5F_close (H5F_t *f)
The file boot block is flushed to disk since it's contents may have
changed.
--------------------------------------------------------------------------*/
-herr_t H5Fclose(hid_t fid)
+herr_t
+H5Fclose(hid_t fid)
{
- H5F_t *file=NULL; /* file struct for file to close */
- herr_t ret_value = SUCCEED;
+ H5F_t *file = NULL; /* file struct for file to close */
+ herr_t ret_value = SUCCEED;
FUNC_ENTER(H5Fclose, FAIL);
H5ECLEAR;
/* Check/fix arguments. */
- if (H5_FILE!=H5Aatom_group (fid))
- HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a file atom");
- if (NULL==(file=H5Aatom_object (fid)))
- HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't unatomize file");
+ if (H5_FILE != H5Aatom_group(fid))
+ HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a file atom");
+ if (NULL == (file = H5Aatom_object(fid)))
+ HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't unatomize file");
/* Close the file */
- ret_value = H5F_close (file);
-
+ ret_value = H5F_close(file);
+
/* Remove the file atom */
- if (NULL==H5Aremove_atom(fid)) {
- HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't remove atom");
+ if (NULL == H5Aremove_atom(fid)) {
+ HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't remove atom");
}
-
-done:
- FUNC_LEAVE (ret_value<0?FAIL:SUCCEED);
+ done:
+ FUNC_LEAVE(ret_value < 0 ? FAIL : SUCCEED);
}
-
/*-------------------------------------------------------------------------
- * Function: H5F_block_read
+ * Function: H5F_block_read
*
- * Purpose: Reads some data from a file/server/etc into a buffer.
- * The data is contiguous. The address is relative to the base
- * address for the file.
+ * Purpose: Reads some data from a file/server/etc into a buffer.
+ * The data is contiguous. The address is relative to the base
+ * address for the file.
*
* Errors:
- * IO READERROR Low-level read failed.
+ * IO READERROR Low-level read failed.
*
- * Return: Success: SUCCEED
+ * Return: Success: SUCCEED
*
- * Failure: FAIL
+ * Failure: FAIL
*
- * Programmer: Robb Matzke
- * matzke@llnl.gov
- * Jul 10 1997
+ * Programmer: Robb Matzke
+ * matzke@llnl.gov
+ * Jul 10 1997
*
* Modifications:
*
*-------------------------------------------------------------------------
*/
herr_t
-H5F_block_read (H5F_t *f, const haddr_t *addr, size_t size, void *buf)
+H5F_block_read(H5F_t *f, const haddr_t *addr, size_t size, void *buf)
{
- haddr_t abs_addr;
-
- FUNC_ENTER (H5F_block_read, FAIL);
+ haddr_t abs_addr;
- if (0==size) return 0;
+ FUNC_ENTER(H5F_block_read, FAIL);
- /* convert the relative address to an absolute address */
- abs_addr = f->shared->base_addr;
- H5F_addr_add (&abs_addr, addr);
+ if (0 == size)
+ return 0;
- /* Read the data */
- if (H5F_low_read (f->shared->lf, &abs_addr, size, buf)<0) {
- HRETURN_ERROR (H5E_IO, H5E_READERROR, FAIL, "low-level read failed");
- }
+ /* convert the relative address to an absolute address */
+ abs_addr = f->shared->base_addr;
+ H5F_addr_add(&abs_addr, addr);
- FUNC_LEAVE (SUCCEED);
+ /* Read the data */
+ if (H5F_low_read(f->shared->lf, &abs_addr, size, buf) < 0) {
+ HRETURN_ERROR(H5E_IO, H5E_READERROR, FAIL, "low-level read failed");
+ }
+ FUNC_LEAVE(SUCCEED);
}
-
/*-------------------------------------------------------------------------
- * Function: H5F_block_write
+ * Function: H5F_block_write
*
- * Purpose: Writes some data from memory to a file/server/etc. The
- * data is contiguous. The address is relative to the base
- * address.
+ * Purpose: Writes some data from memory to a file/server/etc. The
+ * data is contiguous. The address is relative to the base
+ * address.
*
* Errors:
- * IO WRITEERROR Low-level write failed.
- * IO WRITEERROR No write intent.
+ * IO WRITEERROR Low-level write failed.
+ * IO WRITEERROR No write intent.
*
- * Return: Success: SUCCEED
+ * Return: Success: SUCCEED
*
- * Failure: FAIL
+ * Failure: FAIL
*
- * Programmer: Robb Matzke
- * matzke@llnl.gov
- * Jul 10 1997
+ * Programmer: Robb Matzke
+ * matzke@llnl.gov
+ * Jul 10 1997
*
* Modifications:
*
*-------------------------------------------------------------------------
*/
herr_t
-H5F_block_write (H5F_t *f, const haddr_t *addr, size_t size, const void *buf)
+H5F_block_write(H5F_t *f, const haddr_t *addr, size_t size, const void *buf)
{
- haddr_t abs_addr;
-
- FUNC_ENTER (H5F_block_write, FAIL);
+ haddr_t abs_addr;
- if (0==size) return 0;
+ FUNC_ENTER(H5F_block_write, FAIL);
- if (0==(f->intent & H5F_ACC_WRITE)) {
- HRETURN_ERROR (H5E_IO, H5E_WRITEERROR, FAIL, "no write intent");
- }
+ if (0 == size)
+ return 0;
- /* Convert the relative address to an absolute address */
- abs_addr = f->shared->base_addr;
- H5F_addr_add (&abs_addr, addr);
-
- /* Write the data */
- if (H5F_low_write (f->shared->lf, &abs_addr, size, buf)) {
- HRETURN_ERROR (H5E_IO, H5E_WRITEERROR, FAIL, "low-level write failed");
- }
+ if (0 == (f->intent & H5F_ACC_WRITE)) {
+ HRETURN_ERROR(H5E_IO, H5E_WRITEERROR, FAIL, "no write intent");
+ }
+ /* Convert the relative address to an absolute address */
+ abs_addr = f->shared->base_addr;
+ H5F_addr_add(&abs_addr, addr);
- FUNC_LEAVE (SUCCEED);
+ /* Write the data */
+ if (H5F_low_write(f->shared->lf, &abs_addr, size, buf)) {
+ HRETURN_ERROR(H5E_IO, H5E_WRITEERROR, FAIL, "low-level write failed");
+ }
+ FUNC_LEAVE(SUCCEED);
}
-
/*-------------------------------------------------------------------------
- * Function: H5F_debug
+ * Function: H5F_debug
*
- * Purpose: Prints a file header to the specified stream. Each line
- * is indented and the field name occupies the specified width
- * number of characters.
+ * Purpose: Prints a file header to the specified stream. Each line
+ * is indented and the field name occupies the specified width
+ * number of characters.
*
* Errors:
*
- * Return: Success: SUCCEED
+ * Return: Success: SUCCEED
*
- * Failure: FAIL
+ * Failure: FAIL
*
- * Programmer: Robb Matzke
- * matzke@llnl.gov
- * Aug 1 1997
+ * Programmer: Robb Matzke
+ * matzke@llnl.gov
+ * Aug 1 1997
*
* Modifications:
*
*-------------------------------------------------------------------------
*/
herr_t
-H5F_debug (H5F_t *f, const haddr_t *addr, FILE *stream, intn indent,
- intn fwidth)
+H5F_debug(H5F_t *f, const haddr_t *addr, FILE * stream, intn indent,
+ intn fwidth)
{
- FUNC_ENTER (H5F_debug, FAIL);
-
- /* check args */
- assert (f);
- assert (addr && H5F_addr_defined (addr));
- assert (stream);
- assert (indent>=0);
- assert (fwidth>=0);
+ FUNC_ENTER(H5F_debug, FAIL);
- /* debug */
- fprintf (stream, "%*sFile Boot Block...\n", indent, "");
-
- fprintf (stream, "%*s%-*s %s\n", indent, "", fwidth,
- "File name:",
- f->name);
- fprintf (stream, "%*s%-*s 0x%08x\n", indent, "", fwidth,
- "Flags",
- (unsigned)(f->shared->flags));
- fprintf (stream, "%*s%-*s %u\n", indent, "", fwidth,
- "Reference count:",
- (unsigned)(f->shared->nrefs));
- fprintf (stream, "%*s%-*s 0x%08lx\n", indent, "", fwidth,
- "Consistency flags:",
- (unsigned long)(f->shared->consist_flags));
-
- fprintf (stream, "%*s%-*s ", indent, "", fwidth,
- "Address of boot block:");
- H5F_addr_print (stream, &(f->shared->boot_addr));
- fprintf (stream, " (abs)\n");
-
- fprintf (stream, "%*s%-*s ", indent, "", fwidth,
- "Base address:");
- H5F_addr_print (stream, &(f->shared->base_addr));
- fprintf (stream, " (abs)\n");
-
- fprintf (stream, "%*s%-*s ", indent, "", fwidth,
- "Small object heap address:");
- H5F_addr_print (stream, &(f->shared->smallobj_addr));
- fprintf (stream, " (rel)\n");
-
- fprintf (stream, "%*s%-*s ", indent, "", fwidth,
- "Free list address:");
- H5F_addr_print (stream, &(f->shared->freespace_addr));
- fprintf (stream, " (rel)\n");
-
- fprintf (stream, "%*s%-*s ", indent, "", fwidth,
- "Total size of hdf5 data:");
- H5F_addr_print (stream, &(f->shared->hdf5_eof));
- fprintf (stream, " bytes\n");
-
- fprintf (stream, "%*s%-*s %lu bytes\n", indent, "", fwidth,
- "Size of user block:",
- (unsigned long)(f->shared->create_parms.userblock_size));
- fprintf (stream, "%*s%-*s %u bytes\n", indent, "", fwidth,
- "Size of file size_t type:",
- (unsigned)(f->shared->create_parms.sizeof_size));
- fprintf (stream, "%*s%-*s %u bytes\n", indent, "", fwidth,
- "Size of file haddr_t type:",
- (unsigned)(f->shared->create_parms.sizeof_addr));
- fprintf (stream, "%*s%-*s %u\n", indent, "", fwidth,
- "Symbol table leaf node 1/2 rank:",
- (unsigned)(f->shared->create_parms.sym_leaf_k));
- fprintf (stream, "%*s%-*s %u\n", indent, "", fwidth,
- "Symbol table internal node 1/2 rank:",
- (unsigned)(f->shared->create_parms.btree_k[H5B_SNODE_ID]));
- fprintf (stream, "%*s%-*s %u\n", indent, "", fwidth,
- "Boot block version number:",
- (unsigned)(f->shared->create_parms.bootblock_ver));
- fprintf (stream, "%*s%-*s %u\n", indent, "", fwidth,
- "Small object heap version number:",
- (unsigned)(f->shared->create_parms.smallobject_ver));
- fprintf (stream, "%*s%-*s %u\n", indent, "", fwidth,
- "Free list version number:",
- (unsigned)(f->shared->create_parms.freespace_ver));
- fprintf (stream, "%*s%-*s %u\n", indent, "", fwidth,
- "Object directory version number:",
- (unsigned)(f->shared->create_parms.objectdir_ver));
- fprintf (stream, "%*s%-*s %u\n", indent, "", fwidth,
- "Shared header version number:",
- (unsigned)(f->shared->create_parms.sharedheader_ver));
-
- fprintf (stream, "%*s%-*s %s\n", indent, "", fwidth,
- "Root symbol table entry:",
- f->shared->root_ent ? "" : "(none)");
- if (f->shared->root_ent) {
- H5G_ent_debug (f, f->shared->root_ent, stream,
- indent+3, MAX(0, fwidth-3));
- }
-
-
- FUNC_LEAVE (SUCCEED);
+ /* check args */
+ assert(f);
+ assert(addr && H5F_addr_defined(addr));
+ assert(stream);
+ assert(indent >= 0);
+ assert(fwidth >= 0);
+
+ /* debug */
+ fprintf(stream, "%*sFile Boot Block...\n", indent, "");
+
+ fprintf(stream, "%*s%-*s %s\n", indent, "", fwidth,
+ "File name:",
+ f->name);
+ fprintf(stream, "%*s%-*s 0x%08x\n", indent, "", fwidth,
+ "Flags",
+ (unsigned) (f->shared->flags));
+ fprintf(stream, "%*s%-*s %u\n", indent, "", fwidth,
+ "Reference count:",
+ (unsigned) (f->shared->nrefs));
+ fprintf(stream, "%*s%-*s 0x%08lx\n", indent, "", fwidth,
+ "Consistency flags:",
+ (unsigned long) (f->shared->consist_flags));
+
+ fprintf(stream, "%*s%-*s ", indent, "", fwidth,
+ "Address of boot block:");
+ H5F_addr_print(stream, &(f->shared->boot_addr));
+ fprintf(stream, " (abs)\n");
+
+ fprintf(stream, "%*s%-*s ", indent, "", fwidth,
+ "Base address:");
+ H5F_addr_print(stream, &(f->shared->base_addr));
+ fprintf(stream, " (abs)\n");
+
+ fprintf(stream, "%*s%-*s ", indent, "", fwidth,
+ "Small object heap address:");
+ H5F_addr_print(stream, &(f->shared->smallobj_addr));
+ fprintf(stream, " (rel)\n");
+
+ fprintf(stream, "%*s%-*s ", indent, "", fwidth,
+ "Free list address:");
+ H5F_addr_print(stream, &(f->shared->freespace_addr));
+ fprintf(stream, " (rel)\n");
+
+ fprintf(stream, "%*s%-*s ", indent, "", fwidth,
+ "Total size of hdf5 data:");
+ H5F_addr_print(stream, &(f->shared->hdf5_eof));
+ fprintf(stream, " bytes\n");
+
+ fprintf(stream, "%*s%-*s %lu bytes\n", indent, "", fwidth,
+ "Size of user block:",
+ (unsigned long) (f->shared->create_parms.userblock_size));
+ fprintf(stream, "%*s%-*s %u bytes\n", indent, "", fwidth,
+ "Size of file size_t type:",
+ (unsigned) (f->shared->create_parms.sizeof_size));
+ fprintf(stream, "%*s%-*s %u bytes\n", indent, "", fwidth,
+ "Size of file haddr_t type:",
+ (unsigned) (f->shared->create_parms.sizeof_addr));
+ fprintf(stream, "%*s%-*s %u\n", indent, "", fwidth,
+ "Symbol table leaf node 1/2 rank:",
+ (unsigned) (f->shared->create_parms.sym_leaf_k));
+ fprintf(stream, "%*s%-*s %u\n", indent, "", fwidth,
+ "Symbol table internal node 1/2 rank:",
+ (unsigned) (f->shared->create_parms.btree_k[H5B_SNODE_ID]));
+ fprintf(stream, "%*s%-*s %u\n", indent, "", fwidth,
+ "Boot block version number:",
+ (unsigned) (f->shared->create_parms.bootblock_ver));
+ fprintf(stream, "%*s%-*s %u\n", indent, "", fwidth,
+ "Small object heap version number:",
+ (unsigned) (f->shared->create_parms.smallobject_ver));
+ fprintf(stream, "%*s%-*s %u\n", indent, "", fwidth,
+ "Free list version number:",
+ (unsigned) (f->shared->create_parms.freespace_ver));
+ fprintf(stream, "%*s%-*s %u\n", indent, "", fwidth,
+ "Object directory version number:",
+ (unsigned) (f->shared->create_parms.objectdir_ver));
+ fprintf(stream, "%*s%-*s %u\n", indent, "", fwidth,
+ "Shared header version number:",
+ (unsigned) (f->shared->create_parms.sharedheader_ver));
+
+ fprintf(stream, "%*s%-*s %s\n", indent, "", fwidth,
+ "Root symbol table entry:",
+ f->shared->root_ent ? "" : "(none)");
+ if (f->shared->root_ent) {
+ H5G_ent_debug(f, f->shared->root_ent, stream,
+ indent + 3, MAX(0, fwidth - 3));
+ }
+ FUNC_LEAVE(SUCCEED);
}