diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/H5Gdeprec.c | 123 | ||||
-rw-r--r-- | src/H5Gloc.c | 212 | ||||
-rw-r--r-- | src/H5Gprivate.h | 4 | ||||
-rw-r--r-- | src/H5Gpublic.h | 6 | ||||
-rw-r--r-- | src/H5O.c | 92 | ||||
-rw-r--r-- | src/H5Opublic.h | 4 |
6 files changed, 318 insertions, 123 deletions
diff --git a/src/H5Gdeprec.c b/src/H5Gdeprec.c index 2662778..2ce8aa3 100644 --- a/src/H5Gdeprec.c +++ b/src/H5Gdeprec.c @@ -81,10 +81,6 @@ static herr_t H5G_link_hard(hid_t cur_loc_id, const char *cur_name, static herr_t H5G_move(hid_t src_loc_id, const char *src_name, hid_t dst_loc_id, const char *dst_name); #endif /* H5_NO_DEPRECATED_SYMBOLS */ -static herr_t H5G_set_comment(H5G_loc_t *loc, const char *name, - const char *buf, hid_t dxpl_id); -static int H5G_get_comment(H5G_loc_t *loc, const char *name, - size_t bufsize, char *buf, hid_t dxpl_id); static herr_t H5G_get_objinfo_cb(H5G_loc_t *grp_loc/*in*/, const char *name, const H5O_link_t *lnk, H5G_loc_t *obj_loc, void *_udata/*in,out*/, H5G_own_loc_t *own_loc/*out*/); @@ -637,6 +633,7 @@ done: FUNC_LEAVE_API(ret_value) } /* end H5Gget_objname_by_idx() */ +#ifndef H5_NO_DEPRECATED_SYMBOLS /*------------------------------------------------------------------------- * Function: H5Gset_comment @@ -646,7 +643,7 @@ done: * one comment at a time. Passing NULL for the COMMENT argument * will remove the comment property from the object. * - * Note: Deprecated in favor of using attributes on group + * Note: Deprecated in favor of using attributes on object * * Return: Non-negative on success/Negative on failure * @@ -669,7 +666,7 @@ H5Gset_comment(hid_t loc_id, const char *name, const char *comment) if(!name || !*name) HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no name specified") - if(H5G_set_comment(&loc, name, comment, H5AC_dxpl_id) < 0) + if(H5G_loc_set_comment(&loc, name, comment, H5P_DEFAULT, H5AC_dxpl_id) < 0) HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "unable to set comment value") done: @@ -716,123 +713,13 @@ H5Gget_comment(hid_t loc_id, const char *name, size_t bufsize, char *buf) if(bufsize > 0 && !buf) HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no buffer specified") - if((ret_value = H5G_get_comment(&loc, name, bufsize, buf, H5AC_ind_dxpl_id)) < 0) + if((ret_value = (int)H5G_loc_get_comment(&loc, name, buf, bufsize, H5P_DEFAULT, H5AC_ind_dxpl_id)) < 0) HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "unable to get comment value") done: FUNC_LEAVE_API(ret_value) } /* end H5Gget_comment() */ - - -/*------------------------------------------------------------------------- - * Function: H5G_set_comment - * - * Purpose: (Re)sets the comment for an object. - * - * Return: Non-negative on success/Negative on failure - * - * Programmer: Robb Matzke - * Monday, July 20, 1998 - * - *------------------------------------------------------------------------- - */ -static herr_t -H5G_set_comment(H5G_loc_t *loc, const char *name, const char *buf, hid_t dxpl_id) -{ - H5G_loc_t obj_loc; /* Object's location */ - H5G_name_t path; - H5O_loc_t oloc; - hbool_t loc_valid = FALSE; - H5O_name_t comment; - herr_t ret_value = SUCCEED; /* Return value */ - - FUNC_ENTER_NOAPI_NOINIT(H5G_set_comment) - - /* Get the symbol table entry for the object */ - obj_loc.path = &path; - obj_loc.oloc = &oloc; - H5G_loc_reset(&obj_loc); - if(H5G_loc_find(loc, name, &obj_loc/*out*/, H5P_DEFAULT, dxpl_id) < 0) - HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "object not found") - loc_valid = TRUE; - - /* Remove the previous comment message if any */ - if(H5O_msg_remove(obj_loc.oloc, H5O_NAME_ID, 0, TRUE, dxpl_id) < 0) - H5E_clear_stack(NULL); - - /* Add the new message */ - if(buf && *buf) { - /* Casting away const OK -QAK */ - comment.s = (char *)buf; - if(H5O_msg_create(obj_loc.oloc, H5O_NAME_ID, 0, H5O_UPDATE_TIME, &comment, dxpl_id) < 0) - HGOTO_ERROR(H5E_OHDR, H5E_CANTINIT, FAIL, "unable to set comment object header message") - } /* end if */ - -done: - /* Release obj_loc */ - if(loc_valid && H5G_loc_free(&obj_loc) < 0) - HDONE_ERROR(H5E_SYM, H5E_CANTRELEASE, FAIL, "unable to free location") - - FUNC_LEAVE_NOAPI(ret_value) -} /* end H5G_set_comment() */ - - -/*------------------------------------------------------------------------- - * Function: H5G_get_comment - * - * Purpose: Get the comment value for an object. - * - * Return: Success: Number of bytes in the comment including the - * null terminator. Zero if the object has no - * comment. - * - * Failure: Negative - * - * Programmer: Robb Matzke - * Monday, July 20, 1998 - * - *------------------------------------------------------------------------- - */ -static int -H5G_get_comment(H5G_loc_t *loc, const char *name, size_t bufsize, char *buf, hid_t dxpl_id) -{ - H5O_name_t comment; - H5G_loc_t obj_loc; /* Object's location */ - H5G_name_t path; - H5O_loc_t oloc; - hbool_t loc_valid = FALSE; - int ret_value; /* Return value */ - - FUNC_ENTER_NOAPI_NOINIT(H5G_get_comment) - - /* Get the symbol table entry for the object */ - obj_loc.path = &path; - obj_loc.oloc = &oloc; - H5G_loc_reset(&obj_loc); - if(H5G_loc_find(loc, name, &obj_loc/*out*/, H5P_DEFAULT, dxpl_id) < 0) - HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "object not found") - loc_valid = TRUE; - - /* Get the message */ - comment.s = NULL; - if(NULL == H5O_msg_read(obj_loc.oloc, H5O_NAME_ID, &comment, dxpl_id)) { - if(buf && bufsize > 0) - buf[0] = '\0'; - ret_value = 0; - } else { - if(buf && bufsize) - HDstrncpy(buf, comment.s, bufsize); - ret_value = (int)HDstrlen(comment.s); - H5O_msg_reset(H5O_NAME_ID, &comment); - } /* end else */ - -done: - /* Release obj_loc */ - if(loc_valid && H5G_loc_free(&obj_loc) < 0) - HDONE_ERROR(H5E_SYM, H5E_CANTRELEASE, FAIL, "unable to free location") - - FUNC_LEAVE_NOAPI(ret_value) -} /* end H5G_get_comment() */ +#endif /* H5_NO_DEPRECATED_SYMBOLS */ /*------------------------------------------------------------------------- diff --git a/src/H5Gloc.c b/src/H5Gloc.c index 20c8a08..fc02539 100644 --- a/src/H5Gloc.c +++ b/src/H5Gloc.c @@ -79,6 +79,26 @@ typedef struct { H5O_info_t *oinfo; /* Object information to retrieve */ } H5G_loc_info_t; +/* User data for setting an object's comment in a group */ +typedef struct { + /* downward */ + hid_t dxpl_id; /* DXPL to use for operation */ + const char *comment; /* Object comment buffer */ + + /* upward */ +} H5G_loc_sc_t; + +/* User data for getting an object's comment in a group */ +typedef struct { + /* downward */ + hid_t dxpl_id; /* DXPL to use for operation */ + char *comment; /* Object comment buffer */ + size_t bufsize; /* Size of object comment buffer */ + + /* upward */ + ssize_t comment_size; /* Actual size of object comment */ +} H5G_loc_gc_t; + /********************/ /* Local Prototypes */ @@ -87,10 +107,16 @@ typedef struct { /* Group traversal callbacks */ static herr_t H5G_loc_find_cb(H5G_loc_t *grp_loc, const char *name, const H5O_link_t *lnk, H5G_loc_t *obj_loc, void *_udata, - H5G_own_loc_t *own_loc/*out*/); + H5G_own_loc_t *own_loc); static herr_t H5G_loc_find_by_idx_cb(H5G_loc_t *grp_loc, const char *name, const H5O_link_t *lnk, H5G_loc_t *obj_loc, void *_udata, - H5G_own_loc_t *own_loc/*out*/); + H5G_own_loc_t *own_loc); +static herr_t H5G_loc_set_comment_cb(H5G_loc_t *grp_loc, const char *name, + const H5O_link_t *lnk, H5G_loc_t *obj_loc, void *_udata, + H5G_own_loc_t *own_loc); +static herr_t H5G_loc_get_comment_cb(H5G_loc_t *grp_loc, const char *name, + const H5O_link_t *lnk, H5G_loc_t *obj_loc, void *_udata, + H5G_own_loc_t *own_loc); /*********************/ @@ -682,3 +708,185 @@ done: FUNC_LEAVE_NOAPI(ret_value) } /* end H5G_loc_info() */ + +/*------------------------------------------------------------------------- + * Function: H5G_loc_set_comment_cb + * + * Purpose: Callback for (re)setting object comment for an object in a group + * + * Return: Non-negative on success/Negative on failure + * + * Programmer: Quincey Koziol + * Thursday, August 30, 2007 + * + *------------------------------------------------------------------------- + */ +static herr_t +H5G_loc_set_comment_cb(H5G_loc_t UNUSED *grp_loc/*in*/, const char UNUSED *name, const H5O_link_t UNUSED *lnk, + H5G_loc_t *obj_loc, void *_udata/*in,out*/, H5G_own_loc_t *own_loc/*out*/) +{ + H5G_loc_sc_t *udata = (H5G_loc_sc_t *)_udata; /* User data passed in */ + H5O_name_t comment; /* Object header "comment" message */ + herr_t ret_value = SUCCEED; /* Return value */ + + FUNC_ENTER_NOAPI_NOINIT(H5G_loc_set_comment_cb) + + /* Check if the name in this group resolved to a valid link */ + if(obj_loc == NULL) + HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "name doesn't exist") + + /* Remove the previous comment message if any */ + if(H5O_msg_remove(obj_loc->oloc, H5O_NAME_ID, 0, TRUE, udata->dxpl_id) < 0) + H5E_clear_stack(NULL); + + /* Add the new message */ + if(udata->comment && *udata->comment) { + /* Casting away const OK -QAK */ + comment.s = (char *)udata->comment; + if(H5O_msg_create(obj_loc->oloc, H5O_NAME_ID, 0, H5O_UPDATE_TIME, &comment, udata->dxpl_id) < 0) + HGOTO_ERROR(H5E_OHDR, H5E_CANTINIT, FAIL, "unable to set comment object header message") + } /* end if */ + +done: + /* Indicate that this callback didn't take ownership of the group * + * location for the object */ + *own_loc = H5G_OWN_NONE; + + FUNC_LEAVE_NOAPI(ret_value) +} /* end H5G_loc_set_comment_cb() */ + + +/*------------------------------------------------------------------------- + * Function: H5G_loc_set_comment + * + * Purpose: (Re)set the information for an object from a group location + * and path to that object + * + * Return: Non-negative on success/Negative on failure + * + * Programmer: Quincey Koziol + * Thursday, August 30, 2007 + * + *------------------------------------------------------------------------- + */ +herr_t +H5G_loc_set_comment(H5G_loc_t *loc, const char *name, const char *comment, + hid_t lapl_id, hid_t dxpl_id) +{ + H5G_loc_sc_t udata; /* User data for traversal callback */ + herr_t ret_value = SUCCEED; /* Return value */ + + FUNC_ENTER_NOAPI(H5G_loc_set_comment, FAIL) + + /* Check args. */ + HDassert(loc); + HDassert(name && *name); + + /* Set up user data for locating object */ + udata.dxpl_id = dxpl_id; + udata.comment = comment; + + /* Traverse group hierarchy to locate object */ + if(H5G_traverse(loc, name, H5G_TARGET_NORMAL, H5G_loc_set_comment_cb, &udata, lapl_id, dxpl_id) < 0) + HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "can't find object") + +done: + FUNC_LEAVE_NOAPI(ret_value) +} /* end H5G_loc_set_comment() */ + + +/*------------------------------------------------------------------------- + * Function: H5G_loc_get_comment_cb + * + * Purpose: Callback for retrieving object comment for an object in a group + * + * Return: Non-negative on success/Negative on failure + * + * Programmer: Quincey Koziol + * Thursday, August 30, 2007 + * + *------------------------------------------------------------------------- + */ +static herr_t +H5G_loc_get_comment_cb(H5G_loc_t UNUSED *grp_loc/*in*/, const char UNUSED *name, const H5O_link_t UNUSED *lnk, + H5G_loc_t *obj_loc, void *_udata/*in,out*/, H5G_own_loc_t *own_loc/*out*/) +{ + H5G_loc_gc_t *udata = (H5G_loc_gc_t *)_udata; /* User data passed in */ + H5O_name_t comment; /* Object header "comment" message */ + herr_t ret_value = SUCCEED; /* Return value */ + + FUNC_ENTER_NOAPI_NOINIT(H5G_loc_get_comment_cb) + + /* Check if the name in this group resolved to a valid link */ + if(obj_loc == NULL) + HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "name doesn't exist") + + /* Query object comment */ + comment.s = NULL; + if(NULL == H5O_msg_read(obj_loc->oloc, H5O_NAME_ID, &comment, udata->dxpl_id)) { + if(udata->comment && udata->bufsize > 0) + udata->comment[0] = '\0'; + udata->comment_size = 0; + } else { + if(udata->comment && udata->bufsize) + HDstrncpy(udata->comment, comment.s, udata->bufsize); + udata->comment_size = HDstrlen(comment.s); + H5O_msg_reset(H5O_NAME_ID, &comment); + } /* end else */ + +done: + /* Indicate that this callback didn't take ownership of the group * + * location for the object */ + *own_loc = H5G_OWN_NONE; + + FUNC_LEAVE_NOAPI(ret_value) +} /* end H5G_loc_get_comment_cb() */ + + +/*------------------------------------------------------------------------- + * Function: H5G_loc_get_comment + * + * Purpose: Retrieve the information for an object from a group location + * and path to that object + * + * Return: Success: Number of bytes in the comment including the + * null terminator. Zero if the object has no + * comment. + * + * Failure: Negative + * + * Programmer: Quincey Koziol + * Thursday, August 30, 2007 + * + *------------------------------------------------------------------------- + */ +ssize_t +H5G_loc_get_comment(H5G_loc_t *loc, const char *name, char *comment/*out*/, + size_t bufsize, hid_t lapl_id, hid_t dxpl_id) +{ + H5G_loc_gc_t udata; /* User data for traversal callback */ + ssize_t ret_value; /* Return value */ + + FUNC_ENTER_NOAPI(H5G_loc_get_comment, FAIL) + + /* Check args. */ + HDassert(loc); + HDassert(name && *name); + + /* Set up user data for locating object */ + udata.dxpl_id = dxpl_id; + udata.comment = comment; + udata.bufsize = bufsize; + udata.comment_size = (-1); + + /* Traverse group hierarchy to locate object */ + if(H5G_traverse(loc, name, H5G_TARGET_NORMAL, H5G_loc_get_comment_cb, &udata, lapl_id, dxpl_id) < 0) + HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "can't find object") + + /* Set the return value */ + ret_value = udata.comment_size; + +done: + FUNC_LEAVE_NOAPI(ret_value) +} /* end H5G_loc_get_comment() */ + diff --git a/src/H5Gprivate.h b/src/H5Gprivate.h index 82b667b..14e10ff 100644 --- a/src/H5Gprivate.h +++ b/src/H5Gprivate.h @@ -200,6 +200,10 @@ H5_DLL herr_t H5G_loc_find_by_idx(H5G_loc_t *loc, const char *group_name, H5_DLL herr_t H5G_loc_info(H5G_loc_t *loc, const char *name, hbool_t want_ih_info, H5O_info_t *oinfo/*out*/, hid_t lapl_id, hid_t dxpl_id); +H5_DLL herr_t H5G_loc_set_comment(H5G_loc_t *loc, const char *name, + const char *comment, hid_t lapl_id, hid_t dxpl_id); +H5_DLL ssize_t H5G_loc_get_comment(H5G_loc_t *loc, const char *name, + char *comment/*out*/, size_t bufsize, hid_t lapl_id, hid_t dxpl_id); H5_DLL herr_t H5G_loc_reset(H5G_loc_t *loc); H5_DLL herr_t H5G_loc_free(H5G_loc_t *loc); diff --git a/src/H5Gpublic.h b/src/H5Gpublic.h index e0133c5..26baf8b 100644 --- a/src/H5Gpublic.h +++ b/src/H5Gpublic.h @@ -139,9 +139,6 @@ H5_DLL herr_t H5Gclose(hid_t group_id); */ H5_DLL ssize_t H5Gget_objname_by_idx(hid_t loc_id, hsize_t idx, char* name, size_t size); -H5_DLL herr_t H5Gset_comment(hid_t loc_id, const char *name, const char *comment); -H5_DLL int H5Gget_comment(hid_t loc_id, const char *name, size_t bufsize, - char *buf); H5_DLL herr_t H5Giterate(hid_t loc_id, const char *name, int *idx, H5G_iterate_t op, void *op_data); H5_DLL H5G_obj_t H5Gget_objtype_by_idx(hid_t loc_id, hsize_t idx); @@ -170,6 +167,9 @@ H5_DLL herr_t H5Gmove2(hid_t src_loc_id, const char *src_name, hid_t dst_loc_id, H5_DLL herr_t H5Gunlink(hid_t loc_id, const char *name); H5_DLL herr_t H5Gget_linkval(hid_t loc_id, const char *name, size_t size, char *buf/*out*/); +H5_DLL herr_t H5Gset_comment(hid_t loc_id, const char *name, const char *comment); +H5_DLL int H5Gget_comment(hid_t loc_id, const char *name, size_t bufsize, + char *buf); #endif /* H5_NO_DEPRECATED_SYMBOLS */ @@ -488,6 +488,7 @@ H5Oget_info(hid_t loc_id, const char *name, H5O_info_t *oinfo, hid_t lapl_id) /* Retrieve the object's information */ if(H5G_loc_info(&loc, name, TRUE, oinfo/*out*/, lapl_id, H5AC_ind_dxpl_id) < 0) HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "object not found") + done: FUNC_LEAVE_API(ret_value) } /* end H5Oget_info() */ @@ -563,6 +564,97 @@ done: /*------------------------------------------------------------------------- + * Function: H5Oset_comment + * + * Purpose: Gives the specified object a comment. The COMMENT string + * should be a null terminated string. An object can have only + * one comment at a time. Passing NULL for the COMMENT argument + * will remove the comment property from the object. + * + * Note: Deprecated in favor of using attributes on objects + * + * Return: Non-negative on success/Negative on failure + * + * Programmer: Quincey Koziol + * August 30 2007 + * + *------------------------------------------------------------------------- + */ +herr_t +H5Oset_comment(hid_t loc_id, const char *name, const char *comment, + hid_t lapl_id) +{ + H5G_loc_t loc; /* Location of group */ + herr_t ret_value = SUCCEED; /* Return value */ + + FUNC_ENTER_API(H5Oset_comment, FAIL) + + /* Check args */ + if(H5G_loc(loc_id, &loc) < 0) + HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location") + if(!name || !*name) + HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no name") + if(H5P_DEFAULT == lapl_id) + lapl_id = H5P_LINK_ACCESS_DEFAULT; + else + if(TRUE != H5P_isa_class(lapl_id, H5P_LINK_ACCESS)) + HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not link access property list ID") + + /* (Re)set the object's comment */ + if(H5G_loc_set_comment(&loc, name, comment, lapl_id, H5AC_ind_dxpl_id) < 0) + HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "object not found") + +done: + FUNC_LEAVE_API(ret_value) +} /* end H5Oset_comment() */ + + +/*------------------------------------------------------------------------- + * Function: H5Oget_comment + * + * Purpose: Retrieve comment for an object. + * + * Return: Success: Number of bytes in the comment including the + * null terminator. Zero if the object has no + * comment. + * + * Failure: Negative + * + * Programmer: Quincey Koziol + * August 30 2007 + * + *------------------------------------------------------------------------- + */ +ssize_t +H5Oget_comment(hid_t loc_id, const char *name, char *comment, size_t bufsize, + hid_t lapl_id) +{ + H5G_loc_t loc; /* Location of group */ + ssize_t ret_value; /* Return value */ + + FUNC_ENTER_API(H5Oget_comment, FAIL) + + /* Check args */ + if(H5G_loc(loc_id, &loc) < 0) + HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location") + if(!name || !*name) + HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no name") + if(H5P_DEFAULT == lapl_id) + lapl_id = H5P_LINK_ACCESS_DEFAULT; + else + if(TRUE != H5P_isa_class(lapl_id, H5P_LINK_ACCESS)) + HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not link access property list ID") + + /* Retrieve the object's comment */ + if((ret_value = H5G_loc_get_comment(&loc, name, comment/*out*/, bufsize, lapl_id, H5AC_ind_dxpl_id)) < 0) + HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "object not found") + +done: + FUNC_LEAVE_API(ret_value) +} /* end H5Oget_comment() */ + + +/*------------------------------------------------------------------------- * Function: H5Oclose * * Purpose: Close an open file object. diff --git a/src/H5Opublic.h b/src/H5Opublic.h index b10a4e4..17fe139 100644 --- a/src/H5Opublic.h +++ b/src/H5Opublic.h @@ -156,6 +156,10 @@ H5_DLL herr_t H5Oincr_refcount(hid_t object_id); H5_DLL herr_t H5Odecr_refcount(hid_t object_id); H5_DLL herr_t H5Ocopy(hid_t src_loc_id, const char *src_name, hid_t dst_loc_id, const char *dst_name, hid_t ocpypl_id, hid_t lcpl_id); +H5_DLL herr_t H5Oset_comment(hid_t loc_id, const char *name, + const char *comment, hid_t lapl_id); +H5_DLL ssize_t H5Oget_comment(hid_t loc_id, const char *name, char *comment, + size_t bufsize, hid_t lapl_id); H5_DLL herr_t H5Oclose(hid_t object_id); #ifdef __cplusplus |