From 9d41d3679e1b5d0bb430a7374bb458656e127f15 Mon Sep 17 00:00:00 2001 From: Robb Matzke Date: Tue, 2 Sep 1997 10:38:26 -0500 Subject: [svn-r61] ./src/H5.c Changed atexit() to HDatexit(). ./src/H5AC.c Changed qsort() to HDqsort(). ./src/H5B.c Changed memcmp() to HDmemcmp(). ./src/H5E.c ./src/H5M.c Added parentheses around indirect function calls so that checkposix doesn't complain and to advertise that it's an indirect function call. ./src/H5F.c ./src/H5G.c Added errors field to each function prologue to test the script mentioned above. ./src/H5H.c Changed fputc() to HDfputc(). ./src/H5MM.c ./src/H5MMprivate.h The argument for H5MM_xfree() is a pointer to a constant even though the argument to free() isn't. This reduces the number of warnings in other parts of the code but creates a new warning in this file. ./src/H5O.c Plugged a few memory leaks that happen during error handling. ./src/H5Oname.c ./src/debug.c Added `HD' to the beginning of some posix functions. --- src/H5.c | 2 +- src/H5AC.c | 2 +- src/H5B.c | 2 +- src/H5E.c | 2 +- src/H5F.c | 231 ++++++++++++++++++++++++++++++++++++++++-------------- src/H5G.c | 137 ++++++++++++++++++++++++++------ src/H5H.c | 4 +- src/H5M.c | 28 +++---- src/H5MM.c | 2 +- src/H5MMprivate.h | 2 +- src/H5O.c | 38 ++++++--- src/H5Oname.c | 8 +- src/debug.c | 34 ++++---- 13 files changed, 357 insertions(+), 135 deletions(-) diff --git a/src/H5.c b/src/H5.c index 7ebda45..4d6d113 100644 --- a/src/H5.c +++ b/src/H5.c @@ -74,7 +74,7 @@ herr_t H5_init_library(void) /* Install atexit() library cleanup routine */ if(install_atexit_g==TRUE) - if (atexit(&H5_term_library) != 0) + if (HDatexit(&H5_term_library) != 0) HRETURN_ERROR(H5E_FUNC, H5E_CANTINIT, FAIL); FUNC_LEAVE (SUCCEED); diff --git a/src/H5AC.c b/src/H5AC.c index 849f174..c3e4008 100644 --- a/src/H5AC.c +++ b/src/H5AC.c @@ -290,7 +290,7 @@ H5AC_flush (hdf5_file_t *f, const H5AC_class_t *type, haddr_t addr, for (i=0; icache; - qsort (map, H5AC_NSLOTS, sizeof(intn), H5AC_compare); + HDqsort (map, H5AC_NSLOTS, sizeof(intn), H5AC_compare); current_cache_g = NULL; #endif diff --git a/src/H5B.c b/src/H5B.c index f1fd996..7023899 100644 --- a/src/H5B.c +++ b/src/H5B.c @@ -260,7 +260,7 @@ H5B_load (hdf5_file_t *f, haddr_t addr, const void *_data) p = bt->page; /* magic number */ - if (memcmp (p, H5B_MAGIC, H5B_SIZEOF_MAGIC)) goto error; + if (HDmemcmp (p, H5B_MAGIC, H5B_SIZEOF_MAGIC)) goto error; p += 4; /* node type and level */ diff --git a/src/H5E.c b/src/H5E.c index 1d6e0c9..ea0e248 100644 --- a/src/H5E.c +++ b/src/H5E.c @@ -386,7 +386,7 @@ H5Epush(hdf_maj_err_code_t maj, hdf_min_err_code_t min, const char *function_nam if((err_stack=H5Aatom_object(thrderrid))==NULL) HGOTO_ERROR(H5E_BADATOM, H5E_BADATOM, FAIL); - err_stack->push(thrderrid, maj, min, function_name, file_name, line); + (err_stack->push)(thrderrid, maj, min, function_name, file_name, line); done: if(ret_value == FAIL) diff --git a/src/H5F.c b/src/H5F.c index 3b08963..03a3b52 100644 --- a/src/H5F.c +++ b/src/H5F.c @@ -7,6 +7,10 @@ * * * For conditions of distribution and use, see the accompanying * * hdf/COPYING file. * +* +* MODIFICATIONS +* Robb Matzke, 30 Aug 1997 +* Added `ERRORS' fields to function prologues. * * ****************************************************************************/ @@ -66,6 +70,8 @@ RETURNS DESCRIPTION Initializes any interface-specific data or routines. +ERRORS + Modifications: Robb Matzke, 4 Aug 1997 Changed pablo mask from H5_mask to H5F_mask for the FUNC_LEAVE call. @@ -92,6 +98,9 @@ static herr_t H5F_init_interface(void) const hdf5_file_t *f; IN: pointer to the file record uint8 **p; IN: pointer to buffer pointer to encode length in uint8 *l; IN: pointer to length to encode + + ERRORS + RETURNS none DESCRIPTION @@ -130,6 +139,9 @@ done: const hdf5_file_t *f; IN: pointer to the file record uint8 **p; IN: pointer to buffer pointer to encode offset in uint8 *o; IN: pointer to offset to encode + +ERRORS + RETURNS none DESCRIPTION @@ -168,6 +180,9 @@ done: intn HPcompare_filename(obj, key) const VOIDP obj; IN: pointer to the file record const VOIDP key; IN: pointer to the name of file + + ERRORS + RETURNS TRUE if the key matches the obj, FALSE otherwise DESCRIPTION @@ -191,13 +206,22 @@ H5F_compare_filename (const VOIDP _obj, const VOIDP _key) /*-------------------------------------------------------------------------- NAME H5Fget_create_template + PURPOSE Get an atom for a copy of the file-creation template for this file + USAGE hatom_t H5Fget_create_template(fid) hatom_t fid; IN: File ID + + ERRORS + ATOM BADATOM Can't get file struct. + FUNC CANTCREATE Can't create template. + FUNC CANTINIT Can't init template. + RETURNS Returns template ID on success, FAIL on failure + DESCRIPTION This function returns an atom with a copy of the template parameters used to create a file. @@ -214,14 +238,14 @@ hatom_t H5Fget_create_template(hatom_t fid) /* Get the file structure */ if((file=H5Aatom_object(fid))==NULL) - HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL); + HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL); /*can't get file struct*/ /* Create the template object to return */ if((ret_value=H5Mcreate(fid,H5_TEMPLATE,NULL))==FAIL) - HGOTO_ERROR(H5E_FUNC, H5E_CANTCREATE, FAIL); + HGOTO_ERROR(H5E_FUNC, H5E_CANTCREATE, FAIL); /*can't create template*/ if(H5C_init(ret_value,&(file->file_create_parms))==FAIL) - HGOTO_ERROR(H5E_FUNC, H5E_CANTINIT, FAIL); + HGOTO_ERROR(H5E_FUNC, H5E_CANTINIT, FAIL); /*can't init template*/ done: if(ret_value == FAIL) @@ -237,13 +261,24 @@ done: /*-------------------------------------------------------------------------- NAME H5Fis_hdf5 + PURPOSE Check the file signature to detect an HDF5 file. + USAGE hbool_t H5Fis_hdf5(filename) const char *filename; IN: Name of the file to check + ERRORS + ARGS BADRANGE No filename specified. + FILE BADFILE Low-level file open failure. + IO READERROR Read error. + IO READERROR Seek error. + IO SEEKERROR Unable to determine length of file due to seek + failure. + RETURNS TRUE/FALSE/FAIL + DESCRIPTION This function determines if a file is an HDF5 format file. --------------------------------------------------------------------------*/ @@ -260,25 +295,29 @@ hbool_t H5Fis_hdf5(const char *filename) /* Clear errors and check args and all the boring stuff. */ H5ECLEAR; if(filename==NULL) - HGOTO_ERROR(H5E_ARGS, H5E_BADRANGE, BFAIL); + HGOTO_ERROR(H5E_ARGS, H5E_BADRANGE, BFAIL); /*no filename specified*/ /* Open the file */ f_handle=H5F_OPEN(filename,0); - if(H5F_OPENERR(f_handle)) - HGOTO_ERROR(H5E_FILE, H5E_BADFILE, BFAIL); + if(H5F_OPENERR(f_handle)) { + /* Low-level file open failure */ + HGOTO_ERROR(H5E_FILE, H5E_BADFILE, BFAIL); + } /* Get the length of the file */ - if(H5F_SEEKEND(f_handle)==FAIL) - HGOTO_ERROR(H5E_IO, H5E_SEEKERROR, BFAIL); + if(H5F_SEEKEND(f_handle)==FAIL) { + /* Unable to determine length of file due to seek failure */ + HGOTO_ERROR(H5E_IO, H5E_SEEKERROR, BFAIL); + } file_len=H5F_TELL(f_handle); /* Check the offsets where the file signature is possible */ while(curr_offdir=HDgetcwd(NULL,0); /* get the directory we just created the file within */ @@ -476,7 +531,7 @@ hatom_t H5Fcreate(const char *filename, uintn flags, hatom_t create_temp, hatom_ if(create_temp==0) create_temp=H5C_get_default_atom(H5_TEMPLATE); if((f_create_parms=H5Aatom_object(create_temp))==NULL) - HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL); + HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL); /*can't atomize template*/ HDmemcpy(&new_file->file_create_parms,f_create_parms,sizeof(file_create_temp_t)); #ifdef LATER @@ -484,7 +539,7 @@ hatom_t H5Fcreate(const char *filename, uintn flags, hatom_t create_temp, hatom_ if(access_temp==0) access_temp=H5CPget_default_atom(H5_TEMPLATE); if((f_access_parms=H5Aatom_object(access_temp))==NULL) - HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL); + HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL); /*can't unatomize template*/ HDmemcpy(&new_file->file_access_parms,f_access_parms,sizeof(file_access_temp_t)); #endif /* LATER */ @@ -495,7 +550,7 @@ hatom_t H5Fcreate(const char *filename, uintn flags, hatom_t create_temp, hatom_ /* Get an atom for the file */ if((ret_value=H5Aregister_atom(H5_FILE, new_file))==FAIL) - HGOTO_ERROR(H5E_ATOM, H5E_CANTREGISTER, FAIL); + HGOTO_ERROR(H5E_ATOM, H5E_CANTREGISTER, FAIL); /*can't atomize file*/ done: if(ret_value == FAIL) @@ -519,15 +574,36 @@ done: /*-------------------------------------------------------------------------- NAME H5Fopen + PURPOSE Open an existing HDF5 file. + USAGE hatom_t H5Fopen(filename, flags, access_temp) const char *filename; IN: Name of the file to create uintn flags; IN: Flags to indicate various options. hatom_t access_temp; IN: File-access template + + ERRORS + ARGS BADRANGE Invalid file name. + ATOM BADATOM Can't atomize template. + ATOM BADATOM Can't unatomize template. + ATOM CANTREGISTER Can't atomize file. + ATOM CANTREGISTER Can't register new_file atom. + FILE CANTOPEN File doesn't exist. + FILE NOTHDF5 Not an HDF5 file. + FILE NOTHDF5 The file exists but doesn't appear to be an + HDF5 file. + IO READERROR Can't decode root symbol table entry. + IO READERROR Read boot block failed. + IO READERROR Read boot block signature failed. + IO READERROR Seek to boot block failed. + IO SEEKERROR Seek failed. + RESOURCE NOSPACE H5F_new() failed. + RETURNS Returns file ID on success, FAIL on failure + DESCRIPTION This is the primary function for accessing existing HDF5 files. The flags parameter determines whether writing to an existing file will be allowed @@ -560,7 +636,7 @@ hatom_t H5Fopen(const char *filename, uintn flags, hatom_t access_temp) /* Clear errors and check args and all the boring stuff. */ H5ECLEAR; if(filename==NULL) - HGOTO_ERROR(H5E_ARGS, H5E_BADRANGE, FAIL); + HGOTO_ERROR(H5E_ARGS, H5E_BADRANGE, FAIL);/*invalid file name*/ /* See if this file is already open */ new_file=H5Asearch_atom(H5_FILE,H5F_compare_filename,(const VOIDP)filename); @@ -570,8 +646,10 @@ hatom_t H5Fopen(const char *filename, uintn flags, hatom_t access_temp) { /* Get an atom for the file */ new_file->ref_count++; /* increment the reference count for the file */ - if((ret_value=H5Aregister_atom(H5_FILE, new_file))==FAIL) - HGOTO_ERROR(H5E_ATOM, H5E_CANTREGISTER, FAIL); + if((ret_value=H5Aregister_atom(H5_FILE, new_file))==FAIL) { + /* Can't register new_file atom */ + HGOTO_ERROR(H5E_ATOM, H5E_CANTREGISTER, FAIL); + } HGOTO_DONE(ret_value); } /* end if */ @@ -579,17 +657,19 @@ hatom_t H5Fopen(const char *filename, uintn flags, hatom_t access_temp) * If the file exists but has different permissions or if it's a new file, * start a new file handle for it, etc. */ - if(H5Fis_hdf5(filename)==BFALSE) - HGOTO_ERROR(H5E_FILE, H5E_NOTHDF5, FAIL); + if(H5Fis_hdf5(filename)==BFALSE) { + /* The file exists but doesn't appear to be an HDF5 file */ + HGOTO_ERROR(H5E_FILE, H5E_NOTHDF5, FAIL); + } /* Check if the file already exists */ f_handle=H5F_OPEN(filename,flags); if(H5F_OPENERR(f_handle)) - HGOTO_ERROR(H5E_FILE, H5E_CANTOPEN, FAIL); + HGOTO_ERROR(H5E_FILE, H5E_CANTOPEN, FAIL);/*file doesn't exist*/ /* Create the file node */ if (NULL==(new_file=H5F_new())) - HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL); + HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL);/*H5F_new() failed*/ /* Set the non-zero elements of the file structure */ new_file->dir=HDgetcwd(NULL,0); /* get the directory we just created the file within */ @@ -599,14 +679,14 @@ hatom_t H5Fopen(const char *filename, uintn flags, hatom_t access_temp) new_file->ref_count=1; /* only 1 fid handed out so far */ create_temp=H5C_get_default_atom(H5_TEMPLATE); if((f_create_parms=H5Aatom_object(create_temp))==NULL) - HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL); + HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL);/*can't unatomize template*/ HDmemcpy(&new_file->file_create_parms,f_create_parms,sizeof(file_create_temp_t)); #ifdef LATER if(access_temp<=0) access_temp=H5CPget_default_atom(H5_TEMPLATE); if((f_access_parms=H5Aatom_object(access_temp))==NULL) - HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL); + HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL);/*can't atomize template*/ HDmemcpy(&new_file->file_access_parms,f_access_parms,sizeof(file_access_temp_t)); #endif /* LATER */ @@ -615,16 +695,20 @@ hatom_t H5Fopen(const char *filename, uintn flags, hatom_t access_temp) /* Seek to the correct offset to read in the file signature & boot-block */ /* Get the length of the file */ if(H5F_SEEKEND(new_file->file_handle)==FAIL) - HGOTO_ERROR(H5E_IO, H5E_SEEKERROR, BFAIL); + HGOTO_ERROR(H5E_IO, H5E_SEEKERROR, BFAIL);/*seek failed*/ file_len=H5F_TELL(new_file->file_handle); /* Check the offsets where the file signature is possible */ while(curr_offfile_handle,curr_off)==FAIL) + if(H5F_SEEK(new_file->file_handle,curr_off)==FAIL) { + /*seek to boot block failed*/ HGOTO_ERROR(H5E_IO, H5E_READERROR, BFAIL); - if(H5F_READ(new_file->file_handle,temp_buf, H5F_SIGNATURE_LEN)==FAIL) + } + if(H5F_READ(new_file->file_handle,temp_buf, H5F_SIGNATURE_LEN)==FAIL) { + /*read boot block signature failed*/ HGOTO_ERROR(H5E_IO, H5E_READERROR, BFAIL); + } if(HDmemcmp(temp_buf,H5F_SIGNATURE,H5F_SIGNATURE_LEN)==0) { new_file->file_create_parms.userblock_size=curr_off; @@ -636,11 +720,11 @@ hatom_t H5Fopen(const char *filename, uintn flags, hatom_t access_temp) curr_off*=2; } /* end while */ if(curr_off>file_len) /* Why didn't H5Fis_hdf5 catch this? */ - HGOTO_ERROR(H5E_FILE, H5E_NOTHDF5, FAIL); + HGOTO_ERROR(H5E_FILE, H5E_NOTHDF5, FAIL); /*not an HDF5 file*/ /* Read in the fixed-size part of the boot-block */ if(H5F_READ(new_file->file_handle,temp_buf,16)==FAIL) - HGOTO_ERROR(H5E_IO, H5E_READERROR, FAIL); + HGOTO_ERROR(H5E_IO, H5E_READERROR, FAIL); /*read boot block failed*/ /* Decode fixed-size part of the boot block */ p=temp_buf; @@ -662,7 +746,7 @@ hatom_t H5Fopen(const char *filename, uintn flags, hatom_t access_temp) H5F_SIZEOF_SIZE(new_file) + /*logical size of HDF5 file*/ H5G_SIZEOF_ENTRY(new_file); /*root symbol table entry*/ if (H5F_READ(new_file->file_handle, temp_buf, variable_size)<0) - HGOTO_ERROR (H5E_IO, H5E_READERROR, FAIL); + HGOTO_ERROR (H5E_IO, H5E_READERROR, FAIL); /*read boot block failed*/ /* Decode the variable-size part of the boot block */ p = temp_buf; @@ -672,16 +756,13 @@ hatom_t H5Fopen(const char *filename, uintn flags, hatom_t access_temp) /* Decode the root symbol table entry */ if (H5G_decode (new_file, &p, new_file->root_sym)<0) { + /*can't decode root symbol table entry */ HGOTO_ERROR (H5E_IO, H5E_READERROR, FAIL); } - /* Set the initial type of the root symbol-entry */ -#ifdef QUINCEY - new_file->root_type= (new_file->root_sym->header>=0) ? H5F_ROOT_UNKNOWN : H5F_NONE; -#endif /* Get an atom for the file */ if((ret_value=H5Aregister_atom(H5_FILE, new_file))==FAIL) - HGOTO_ERROR(H5E_ATOM, H5E_CANTREGISTER, FAIL); + HGOTO_ERROR(H5E_ATOM, H5E_CANTREGISTER, FAIL);/*can't atomize file*/ done: if(ret_value == FAIL) @@ -703,15 +784,24 @@ done: /*-------------------------------------------------------------------------- NAME H5Fflush + PURPOSE Flush all cached data to disk and optionally invalidates all cached data. + USAGE herr_t H5Fclose(fid, invalidate) hatom_t fid; IN: File ID of file to close. hbool_t invalidate; IN: Invalidate all of the cache? + + ERRORS + ARGS BADTYPE Not a file atom. + ATOM BADATOM Can't get file struct. + CACHE CANTFLUSH Flush failed. + RETURNS SUCCEED/FAIL + DESCRIPTION This function flushes all cached data to disk and, if INVALIDATE is non-zero, removes cached objects from the cache so they must be @@ -751,6 +841,10 @@ H5Fflush (hatom_t fid, hbool_t invalidate) * 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. + * * Return: Success: SUCCEED * * Failure: FAIL @@ -812,13 +906,22 @@ H5F_flush (hdf5_file_t *f, hbool_t invalidate) /*-------------------------------------------------------------------------- NAME H5Fclose + PURPOSE Close an open HDF5 file. + USAGE int32 H5Fclose(fid) int32 fid; IN: File ID of file to close + + ERRORS + ARGS BADTYPE Not a file atom. + ATOM BADATOM Can't remove atom. + ATOM BADATOM Can't unatomize file. + RETURNS SUCCEED/FAIL + DESCRIPTION This function terminates access to an HDF5 file. If this is the last file ID open for a file and if access IDs are still in use, this function @@ -842,11 +945,11 @@ herr_t H5Fclose(hatom_t fid) /* Clear errors and check args and all the boring stuff. */ H5ECLEAR; if(H5Aatom_group(fid)!=H5_FILE) - HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL); + HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL);/*not a file atom*/ /* Get the file handle to close */ if((file=H5Aatom_object(fid))==NULL) - HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL); + HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL);/*can't unatomize file*/ /* Decrement the ref. count and recycle the file structure */ if((--file->ref_count)==0) @@ -857,7 +960,7 @@ herr_t H5Fclose(hatom_t fid) } H5F_dest (file); if(H5Aremove_atom(fid)==NULL) { - HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL); + HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL);/*can't remove atom*/ } } /* end if */ @@ -878,6 +981,10 @@ done: * Purpose: Reads some data from a file/server/etc into a buffer. * The data is contiguous. * + * Errors: + * IO READERROR Low-level read failure. + * IO SEEKERROR Low-level seek failure. + * * Return: Success: SUCCEED * * Failure: FAIL @@ -899,9 +1006,11 @@ H5F_block_read (hdf5_file_t *f, haddr_t addr, size_t size, void *buf) addr += f->file_create_parms.userblock_size; if (H5F_SEEK (f->file_handle, addr)<0) { + /* low-level seek failure */ HRETURN_ERROR (H5E_IO, H5E_SEEKERROR, FAIL); } if (H5F_READ (f->file_handle, buf, size)<0) { + /* low-level read failure */ HRETURN_ERROR (H5E_IO, H5E_READERROR, FAIL); } @@ -915,6 +1024,10 @@ H5F_block_read (hdf5_file_t *f, haddr_t addr, size_t size, void *buf) * Purpose: Writes some data from memory to a file/server/etc. The * data is contiguous. * + * Errors: + * IO SEEKERROR Low-level seek failure. + * IO WRITEERROR Low-level write failure. + * * Return: Success: SUCCEED * * Failure: FAIL @@ -936,9 +1049,11 @@ H5F_block_write (hdf5_file_t *f, haddr_t addr, size_t size, void *buf) addr += f->file_create_parms.userblock_size; if (H5F_SEEK (f->file_handle, addr)<0) { + /* low-level seek failure */ HRETURN_ERROR (H5E_IO, H5E_SEEKERROR, FAIL); } if (H5F_WRITE (f->file_handle, buf, size)<0) { + /* low-level write failure */ HRETURN_ERROR (H5E_IO, H5E_WRITEERROR, FAIL); } @@ -953,6 +1068,8 @@ H5F_block_write (hdf5_file_t *f, haddr_t addr, size_t size, void *buf) * is indented and the field name occupies the specified width * number of characters. * + * Errors: + * * Return: Success: SUCCEED * * Failure: FAIL diff --git a/src/H5G.c b/src/H5G.c index 3e756b5..616f7a6 100644 --- a/src/H5G.c +++ b/src/H5G.c @@ -25,6 +25,9 @@ * Robb Matzke, 5 Aug 1997 * Added calls to H5E. * + * Robb Matzke, 30 Aug 1997 + * Added `Errors:' field to function prologues. + * *------------------------------------------------------------------------- */ @@ -54,6 +57,8 @@ static intn interface_initialize_g = FALSE; * the size in characters of the component through SIZE_P not * counting leading slashes or the null terminator. * + * Errors: + * * Return: Success: Ptr into NAME. * * Failure: Ptr to the null terminator of NAME. @@ -72,7 +77,7 @@ H5G_component (const char *name, size_t *size_p) assert (name); while ('/'==*name) name++; - if (size_p) *size_p = strcspn (name, "/"); + if (size_p) *size_p = HDstrcspn (name, "/"); return name; } @@ -85,6 +90,8 @@ H5G_component (const char *name, size_t *size_p) * initialized to point to the size of the base name not * counting trailing slashes or the null character. * + * Errors: + * * Return: Success: Ptr to base name within NAME with SIZE_P * pointing to the number of characters in the * base name. @@ -120,7 +127,7 @@ H5G_basename (const char *name, size_t *size_p) return s + HDstrlen(s); /*null terminator*/ } - if (size_p) *size_p = strcspn (s, "/"); + if (size_p) *size_p = HDstrcspn (s, "/"); return s; } #endif @@ -166,6 +173,11 @@ H5G_basename (const char *name, size_t *size_p) * is initialized with the contents of the root symbol table * entry. * + * Errors: + * DIRECTORY COMPLEN Component is too long. + * DIRECTORY NOTFOUND Component not found. + * DIRECTORY NOTFOUND Root not found. + * * Return: Success: SUCCEED if the name can be fully * resolved. * @@ -229,7 +241,7 @@ H5G_namei (hdf5_file_t *f, H5G_entry_t *cwd, const char *name, * we can pass it down to the other symbol table functions. */ if (nchars+1 > sizeof(comp)) { - /* component name is too long */ + /* component is too long */ if (dir_ent) *dir_ent = *dir; HRETURN_ERROR (H5E_DIRECTORY, H5E_COMPLEN, -2); } @@ -247,7 +259,7 @@ H5G_namei (hdf5_file_t *f, H5G_entry_t *cwd, const char *name, H5O_name_t mesg; if (!aside && dir->header==f->root_sym->header && H5O_read (f, dir->header, dir, H5O_NAME, 0, &mesg)) { - if (!strcmp (mesg.s, comp)) { + if (!HDstrcmp (mesg.s, comp)) { H5O_reset (H5O_NAME, &mesg); *base = *dir; aside = TRUE; @@ -295,6 +307,12 @@ H5G_namei (hdf5_file_t *f, H5G_entry_t *cwd, const char *name, * is removed). If the root object doesn't have a name message * then the name `Root Object' is used. * + * Errors: + * DIRECTORY CANTINIT Can't create root. + * DIRECTORY CANTINIT Can't insert old root object in + * new root directory. + * DIRECTORY EXISTS Root directory already exists. + * * Return: Success: SUCCEED * * Failure: FAIL @@ -305,7 +323,8 @@ H5G_namei (hdf5_file_t *f, H5G_entry_t *cwd, const char *name, * * Modifications: * - *------------------------------------------------------------------------- */ + *------------------------------------------------------------------------- + */ static herr_t H5G_mkroot (hdf5_file_t *f, size_t size_hint) { @@ -349,7 +368,7 @@ H5G_mkroot (hdf5_file_t *f, size_t size_hint) */ if (H5G_stab_new (f, f->root_sym, size_hint)<0) { H5O_reset (H5O_NAME, &name); - HRETURN_ERROR (H5E_DIRECTORY, H5E_CANTINIT, FAIL); /*can't create dir*/ + HRETURN_ERROR (H5E_DIRECTORY, H5E_CANTINIT, FAIL); /*can't create root*/ } /* @@ -396,6 +415,14 @@ H5G_mkroot (hdf5_file_t *f, size_t size_hint) * (or any equivalent name) will result in an H5E_EXISTS * failure. * + * Errors: + * DIRECTORY CANTINIT Can't create dir. + * DIRECTORY CANTINIT Can't insert. + * DIRECTORY CANTINIT Lookup failed. + * DIRECTORY COMPLEN Component is too long. + * DIRECTORY EXISTS Already exists. + * DIRECTORY NOTFOUND Missing component. + * * Return: Success: SUCCEED, if DIR_ENT is not the null pointer * then it will be initialized with the * symbol table entry for the new directory. @@ -451,7 +478,7 @@ H5G_new (hdf5_file_t *f, H5G_entry_t *cwd, H5G_entry_t *dir_ent, /* missing component */ HRETURN_ERROR (H5E_DIRECTORY, H5E_NOTFOUND, FAIL); } else if (nchars+1 > sizeof _comp) { - /* component name is too long */ + /* component is too long */ HRETURN_ERROR (H5E_DIRECTORY, H5E_COMPLEN, FAIL); } else { /* null terminate */ @@ -492,6 +519,9 @@ H5G_new (hdf5_file_t *f, H5G_entry_t *cwd, H5G_entry_t *dir_ent, * This function will fail if the root object is * requested and there is none. * + * Errors: + * DIRECTORY NOTFOUND Object not found. + * * Return: Success: SUCCEED with DIR_ENT and ENT initialized. * * Failure: FAIL @@ -502,7 +532,8 @@ H5G_new (hdf5_file_t *f, H5G_entry_t *cwd, H5G_entry_t *dir_ent, * * Modifications: * - *------------------------------------------------------------------------- */ + *------------------------------------------------------------------------- + */ herr_t H5G_find (hdf5_file_t *f, H5G_entry_t *cwd, H5G_entry_t *dir_ent, const char *name, H5G_entry_t *ent) @@ -543,6 +574,17 @@ H5G_find (hdf5_file_t *f, H5G_entry_t *cwd, H5G_entry_t *dir_ent, * Inserting an object entry into the symbol table increments * the link counter for that object. * + * Errors: + * DIRECTORY CANTINIT Can't insert. + * DIRECTORY CANTINIT Cannot add/change name message. + * DIRECTORY CANTINIT Lookup failed. + * DIRECTORY COMPLEN Component is too long. + * DIRECTORY EXISTS Already exists. + * DIRECTORY EXISTS Root exists. + * DIRECTORY LINK Bad link count. + * DIRECTORY LINK Link inc failure. + * DIRECTORY NOTFOUND Component not found. + * * Return: Success: SUCCEED with optional DIR_ENT initialized with * the symbol table entry for the directory * which contains the new ENT. @@ -555,7 +597,8 @@ H5G_find (hdf5_file_t *f, H5G_entry_t *cwd, H5G_entry_t *dir_ent, * * Modifications: * - *------------------------------------------------------------------------- */ + *------------------------------------------------------------------------- + */ herr_t H5G_insert (hdf5_file_t *f, H5G_entry_t *cwd, H5G_entry_t *dir_ent, const char *name, H5G_entry_t *ent) @@ -623,10 +666,10 @@ H5G_insert (hdf5_file_t *f, H5G_entry_t *cwd, H5G_entry_t *dir_ent, */ if (rest[nchars]) { if (H5G_component (rest+nchars, NULL)) { - /* name component not found */ + /* component not found */ HRETURN_ERROR (H5E_DIRECTORY, H5E_NOTFOUND, FAIL); } else if (nchars+1 > sizeof _comp) { - /* name component is too long */ + /* component is too long */ HRETURN_ERROR (H5E_DIRECTORY, H5E_COMPLEN, FAIL); } else { /* null terminate */ @@ -686,6 +729,10 @@ H5G_insert (hdf5_file_t *f, H5G_entry_t *cwd, H5G_entry_t *dir_ent, * symbol since that's a special case. This function returns * failure if that is attempted. * + * Errors: + * DIRECTORY CANTINIT Can't modify. + * DIRECTORY NOTFOUND Entry not found. + * * Return: Success: SUCCEED with optional DIR_ENT initialized with * the symbol table entry for the directory * which contains the new ENT. @@ -746,6 +793,16 @@ H5G_modify (hdf5_file_t *f, H5G_entry_t *cwd, H5G_entry_t *dir_ent, * item in the heap is the empty string, and must appear at * heap offset zero. * + * Errors: + * INTERNAL CANTINIT B-tree's won't work if the first + * name isn't at the beginning of the + * heap. + * SYM CANTINIT Can't create B-tree. + * SYM CANTINIT Can't create header. + * SYM CANTINIT Can't create heap. + * 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 @@ -778,10 +835,10 @@ H5G_stab_new (hdf5_file_t *f, H5G_entry_t *self, size_t init) /* Create symbol table private heap */ if ((stab.heap = H5H_new (f, H5H_LOCAL, init))<0) { - HRETURN_ERROR (H5E_SYM, H5E_CANTINIT, FAIL); + HRETURN_ERROR (H5E_SYM, H5E_CANTINIT, FAIL); /*can't create heap*/ } if ((name = H5H_insert (f, stab.heap, 1, "")<0)) { - HRETURN_ERROR (H5E_SYM, H5E_CANTINIT, FAIL); + HRETURN_ERROR (H5E_SYM, H5E_CANTINIT, FAIL); /*can't initialize heap*/ } if (0!=name) { /* @@ -793,7 +850,7 @@ H5G_stab_new (hdf5_file_t *f, H5G_entry_t *self, size_t init) /* Create the B-tree */ if ((stab.btree = H5B_new (f, H5B_SNODE))<0) { - HRETURN_ERROR (H5E_SYM, H5E_CANTINIT, FAIL); + HRETURN_ERROR (H5E_SYM, H5E_CANTINIT, FAIL); /*can't create B-tree*/ } /* @@ -802,7 +859,7 @@ H5G_stab_new (hdf5_file_t *f, H5G_entry_t *self, size_t init) * incremented if the object is added to the directory hierarchy. */ if ((addr = H5O_new (f, 0, 4+2*H5F_SIZEOF_OFFSET(f)))<0) { - HRETURN_ERROR (H5E_SYM, H5E_CANTINIT, FAIL); + HRETURN_ERROR (H5E_SYM, H5E_CANTINIT, FAIL); /*can't create header*/ } /* insert the symbol table message */ @@ -812,7 +869,7 @@ H5G_stab_new (hdf5_file_t *f, H5G_entry_t *self, size_t init) self->type = H5G_NOTHING_CACHED; } if (H5O_modify(f, addr, self, NULL, H5O_STAB, H5O_NEW_MESG, &stab)<0) { - HRETURN_ERROR (H5E_SYM, H5E_CANTINIT, FAIL); + HRETURN_ERROR (H5E_SYM, H5E_CANTINIT, FAIL); /*can't create message*/ } FUNC_LEAVE (addr); @@ -826,6 +883,10 @@ H5G_stab_new (hdf5_file_t *f, H5G_entry_t *self, size_t init) * description is stored in SELF in file F and returns a * copy of the symbol table entry through the ENT argument. * + * Errors: + * SYM BADMESG Can't read message. + * SYM NOTFOUND Not found. + * * Return: Success: Address corresponding to the name. * * Failure: FAIL @@ -854,7 +915,7 @@ H5G_stab_find (hdf5_file_t *f, H5G_entry_t *self, const char *name, /* set up the udata */ if (NULL==H5O_read (f, self->header, self, H5O_STAB, 0, &stab)) { - HRETURN_ERROR (H5E_SYM, H5E_BADMESG, FAIL); + HRETURN_ERROR (H5E_SYM, H5E_BADMESG, FAIL); /*can't read message*/ } udata.operation = H5G_OPER_FIND; udata.name = name; @@ -862,7 +923,7 @@ H5G_stab_find (hdf5_file_t *f, H5G_entry_t *self, const char *name, /* search the B-tree */ if (H5B_find (f, H5B_SNODE, stab.btree, &udata)<0) { - HRETURN_ERROR (H5E_SYM, H5E_NOTFOUND, FAIL); + HRETURN_ERROR (H5E_SYM, H5E_NOTFOUND, FAIL); /*not found*/ } /* return the result */ @@ -879,6 +940,10 @@ H5G_stab_find (hdf5_file_t *f, H5G_entry_t *self, const char *name, * file F. ENT is the new symbol table entry to use for the * symbol. * + * Errors: + * SYM BADMESG Can't read message. + * SYM NOTFOUND Not found. + * * Return: Success: SUCCEED * * Failure: FAIL @@ -908,7 +973,7 @@ H5G_stab_modify (hdf5_file_t *f, H5G_entry_t *self, const char *name, /* set up the udata */ if (NULL==H5O_read (f, self->header, self, H5O_STAB, 0, &stab)) { - HRETURN_ERROR (H5E_SYM, H5E_BADMESG, FAIL); + HRETURN_ERROR (H5E_SYM, H5E_BADMESG, FAIL); /*can't read message*/ } udata.operation = H5G_OPER_MODIFY; udata.name = name; @@ -917,7 +982,7 @@ H5G_stab_modify (hdf5_file_t *f, H5G_entry_t *self, const char *name, /* search and modify the B-tree */ if (H5B_find (f, H5B_SNODE, stab.btree, &udata)<0) { - HRETURN_ERROR (H5E_SYM, H5E_NOTFOUND, FAIL); + HRETURN_ERROR (H5E_SYM, H5E_NOTFOUND, FAIL); /*not found*/ } FUNC_LEAVE (SUCCEED); @@ -931,6 +996,10 @@ H5G_stab_modify (hdf5_file_t *f, H5G_entry_t *self, const char *name, * file F. The name of the new symbol is NAME and its symbol * table entry is ENT. * + * Errors: + * SYM BADMESG Can't read message. + * SYM CANTINSERT Can't insert entry. + * * Return: Success: SUCCEED * * Failure: FAIL @@ -960,7 +1029,7 @@ H5G_stab_insert (hdf5_file_t *f, H5G_entry_t *self, const char *name, /* initialize data to pass through B-tree */ if (NULL==H5O_read (f, self->header, self, H5O_STAB, 0, &stab)) { - HRETURN_ERROR (H5E_SYM, H5E_BADMESG, FAIL); + HRETURN_ERROR (H5E_SYM, H5E_BADMESG, FAIL); /*can't read message*/ } udata.name = name; udata.heap = stab.heap; @@ -968,7 +1037,7 @@ H5G_stab_insert (hdf5_file_t *f, H5G_entry_t *self, const char *name, /* insert */ if (H5B_insert (f, H5B_SNODE, stab.btree, &udata)<0) { - HRETURN_ERROR (H5E_SYM, H5E_CANTINSERT, FAIL); + HRETURN_ERROR (H5E_SYM, H5E_CANTINSERT, FAIL); /*can't insert entry*/ } /* update the name offset in the entry */ @@ -987,6 +1056,10 @@ H5G_stab_insert (hdf5_file_t *f, H5G_entry_t *self, const char *name, * be filled in with data from the symbol table. Each of these * arrays should have at least MAXENTRIES elements. * + * Errors: + * SYM BADMESG Not a symbol table. + * SYM CANTLIST B-tree list failure. + * * Return: Success: The total number of symbols in the * symbol table. This may exceed MAXENTRIES, * but at most MAXENTRIES values are copied @@ -1021,7 +1094,7 @@ H5G_stab_list (hdf5_file_t *f, H5G_entry_t *self, intn maxentries, /* initialize data to pass through B-tree */ if (NULL==H5O_read (f, self->header, self, H5O_STAB, 0, &stab)) { - HRETURN_ERROR (H5E_SYM, H5E_BADMESG, FAIL); + HRETURN_ERROR (H5E_SYM, H5E_BADMESG, FAIL); /*not a symbol table*/ } udata.entry = entries; udata.name = names; @@ -1035,7 +1108,7 @@ H5G_stab_list (hdf5_file_t *f, H5G_entry_t *self, intn maxentries, if (names) { for (i=0; iversion = *p++; if (H5O_VERSION!=oh->version) { - HRETURN_ERROR (H5E_OHDR, H5E_VERSION, NULL); + HGOTO_ERROR (H5E_OHDR, H5E_VERSION, NULL); } /* decode alignment */ oh->alignment = *p++; if (4!=oh->alignment) { - HRETURN_ERROR (H5E_OHDR, H5E_ALIGNMENT, NULL); + HGOTO_ERROR (H5E_OHDR, H5E_ALIGNMENT, NULL); } /* decode number of messages */ @@ -235,7 +239,7 @@ H5O_load (hdf5_file_t *f, haddr_t addr, const void *_data) oh->chunk[chunkno].image = H5MM_xmalloc (chunk_size); if (H5F_block_read (f, chunk_addr, chunk_size, oh->chunk[chunkno].image)<0) { - HRETURN_ERROR (H5E_OHDR, H5E_READERROR, NULL); + HGOTO_ERROR (H5E_OHDR, H5E_READERROR, NULL); } @@ -247,10 +251,10 @@ H5O_load (hdf5_file_t *f, haddr_t addr, const void *_data) UINT16DECODE (p, mesg_size); if (id>=NELMTS(message_type_g) || NULL==message_type_g[id]) { - HRETURN_ERROR (H5E_OHDR, H5E_BADMESG, NULL); + HGOTO_ERROR (H5E_OHDR, H5E_BADMESG, NULL); } if (p + mesg_size > oh->chunk[chunkno].image + chunk_size) { - HRETURN_ERROR (H5E_OHDR, H5E_CANTINIT, NULL); + HGOTO_ERROR (H5E_OHDR, H5E_CANTINIT, NULL); } if (H5O_NULL_ID==id && oh->nmesgs>0 && @@ -261,10 +265,10 @@ H5O_load (hdf5_file_t *f, haddr_t addr, const void *_data) oh->mesg[mesgno].raw_size += 4 + mesg_size; } else { /* new message */ - mesgno = oh->nmesgs++; - if (mesgno>=nmesgs) { - HRETURN_ERROR (H5E_OHDR, H5E_CANTLOAD, NULL); + if (oh->nmesgs>=nmesgs) { + HGOTO_ERROR (H5E_OHDR, H5E_CANTLOAD, NULL); } + mesgno = oh->nmesgs++; oh->mesg[mesgno].type = message_type_g[id]; oh->mesg[mesgno].dirty = FALSE; oh->mesg[mesgno].native = NULL; @@ -288,6 +292,20 @@ H5O_load (hdf5_file_t *f, haddr_t addr, const void *_data) } } +done: + if (!ret_value && oh) { + /* + * Free resources. + */ + int i; + for (i=0; inchunks; i++) { + oh->chunk[i].image = H5MM_xfree (oh->chunk[i].image); + } + oh->chunk = H5MM_xfree (oh->chunk); + oh->mesg = H5MM_xfree (oh->mesg); + oh = H5MM_xfree (oh); + } + FUNC_LEAVE (oh); } diff --git a/src/H5Oname.c b/src/H5Oname.c index 47d5669..5631887 100644 --- a/src/H5Oname.c +++ b/src/H5Oname.c @@ -72,6 +72,7 @@ static void * H5O_name_decode (hdf5_file_t *f, size_t raw_size, const uint8 *p) { H5O_name_t *mesg; + char *s; FUNC_ENTER (H5O_name_decode, NULL, NULL); @@ -81,8 +82,9 @@ H5O_name_decode (hdf5_file_t *f, size_t raw_size, const uint8 *p) /* decode */ mesg = H5MM_xcalloc (1, sizeof(H5O_name_t)); - mesg->s = H5MM_xmalloc (raw_size); - HDmemcpy (mesg->s, p, raw_size); + s = H5MM_xmalloc (raw_size); + HDmemcpy (s, p, raw_size); + mesg->s = s; FUNC_LEAVE (mesg); } @@ -119,7 +121,7 @@ H5O_name_encode (hdf5_file_t *f, size_t raw_size, uint8 *p, const void *_mesg) assert (mesg && mesg->s); /* message size */ - size = strlen (mesg->s)+1; + size = HDstrlen (mesg->s)+1; assert (size<=raw_size); /* encode */ diff --git a/src/debug.c b/src/debug.c index b21a0c8..e6a0740 100644 --- a/src/debug.c +++ b/src/debug.c @@ -58,10 +58,10 @@ main (int argc, char *argv[]) */ if (argc>2) { printf ("New address: %s\n", argv[2]); - addr = strtol (argv[2], NULL, 0); + addr = HDstrtol (argv[2], NULL, 0); } if (argc>3) { - extra = strtol (argv[3], NULL, 0); + extra = HDstrtol (argv[3], NULL, 0); } /* @@ -69,11 +69,11 @@ main (int argc, char *argv[]) */ if ((fid = H5Fopen (argv[1], 0, 0))<0) { fprintf (stderr, "cannot open file\n"); - exit (1); + HDexit (1); } if (NULL==(f=H5Aatom_object (fid))) { fprintf (stderr, "cannot obtain hdf5_file_t pointer\n"); - exit (2); + HDexit (2); } /* @@ -82,28 +82,28 @@ main (int argc, char *argv[]) printf ("Reading signature at byte %lu\n", (unsigned long)addr); if (H5F_block_read (f, addr, sizeof(sig), sig)<0) { fprintf (stderr, "cannot read signature\n"); - exit (3); + HDexit (3); } - if (!memcmp (sig, H5F_SIGNATURE, H5F_SIGNATURE_LEN)) { + if (!HDmemcmp (sig, H5F_SIGNATURE, H5F_SIGNATURE_LEN)) { /* * Debug the boot block. */ status = H5F_debug (f, 0, stdout, 0, VCOL); - } else if (!memcmp (sig, H5H_MAGIC, H5H_SIZEOF_MAGIC)) { + } else if (!HDmemcmp (sig, H5H_MAGIC, H5H_SIZEOF_MAGIC)) { /* * Debug a heap. */ status = H5H_debug (f, addr, stdout, 0, VCOL); - } else if (!memcmp (sig, H5G_NODE_MAGIC, H5G_NODE_SIZEOF_MAGIC)) { + } else if (!HDmemcmp (sig, H5G_NODE_MAGIC, H5G_NODE_SIZEOF_MAGIC)) { /* * Debug a symbol table node. */ status = H5G_node_debug (f, addr, stdout, 0, VCOL, extra); - } else if (!memcmp (sig, H5B_MAGIC, H5B_SIZEOF_MAGIC)) { + } else if (!HDmemcmp (sig, H5B_MAGIC, H5B_SIZEOF_MAGIC)) { /* * Debug a B-tree. B-trees are debugged through the B-tree * subclass. The subclass identifier is the byte immediately @@ -117,7 +117,7 @@ main (int argc, char *argv[]) default: fprintf (stderr, "Unknown B-tree subtype %u\n", (unsigned)(subtype)); - exit (4); + HDexit (4); } } else if (sig[0]==H5O_VERSION && sig[1]==H5O_ALIGNMENT) { @@ -134,25 +134,25 @@ main (int argc, char *argv[]) printf ("%-*s ", VCOL, "Signature:"); for (i=0; i<8; i++) { if (sig[i]>' ' && sig[i]<='~' && '\\'!=sig[i]) { - putchar (sig[i]); + HDputchar (sig[i]); } else if ('\\'==sig[i]) { - putchar ('\\'); - putchar ('\\'); + HDputchar ('\\'); + HDputchar ('\\'); } else { printf ("\\%03o", sig[i]); } } - putchar ('\n'); + HDputchar ('\n'); fprintf (stderr, "unknown signature\n"); - exit (4); + HDexit (4); } if (status<0) { fprintf (stderr, "An error occurred\n"); - exit (5); + HDexit (5); } H5Fclose (fid); - exit (0); + HDexit (0); } -- cgit v0.12