diff options
author | Quincey Koziol <koziol@hdfgroup.org> | 2007-11-01 22:19:04 (GMT) |
---|---|---|
committer | Quincey Koziol <koziol@hdfgroup.org> | 2007-11-01 22:19:04 (GMT) |
commit | 522e714273faf7e8b1bbd0510a2a921ad6276ab3 (patch) | |
tree | c6773b372577a1c34e0803f7b27ec45a8fd0551e /src | |
parent | 579bb243077efc82e86d0723b2adec5abd6f1e4d (diff) | |
download | hdf5-522e714273faf7e8b1bbd0510a2a921ad6276ab3.zip hdf5-522e714273faf7e8b1bbd0510a2a921ad6276ab3.tar.gz hdf5-522e714273faf7e8b1bbd0510a2a921ad6276ab3.tar.bz2 |
[svn-r14234] Description:
Add H5Aexists and H5Aexists_by_name API routines, to match H5Lexists.
Tested on:
FreeBSD/32 6.2 (duty) in debug mode
FreeBSD/64 6.2 (liberty) w/C++ & FORTRAN, in debug mode
Linux/32 2.6 (kagiso) w/PGI compilers, w/C++ & FORTRAN, w/threadsafe,
in debug mode
Linux/64-amd64 2.6 (smirom) w/default API=1.6.x, w/C++ & FORTRAN,
in production mode
Linux/64-ia64 2.6 (cobalt) w/Intel compilers, w/C++ & FORTRAN,
in production mode
Solaris/32 2.10 (linew) w/deprecated symbols disabled, w/C++ & FORTRAN,
w/szip filter, in production mode
Mac OS X/32 10.4.10 (amazon) in debug mode
Linux/64-ia64 2.4 (tg-login3) w/parallel, w/FORTRAN, in production mode
Diffstat (limited to 'src')
-rw-r--r-- | src/H5A.c | 105 | ||||
-rw-r--r-- | src/H5Apublic.h | 5 | ||||
-rw-r--r-- | src/H5L.c | 6 | ||||
-rw-r--r-- | src/H5Oattribute.c | 13 |
4 files changed, 121 insertions, 8 deletions
@@ -2486,3 +2486,108 @@ done: FUNC_LEAVE_NOAPI(ret_value) } /* end H5A_nameof() */ + +/*------------------------------------------------------------------------- + * Function: H5Aexists + * + * Purpose: Checks if an attribute with a given name exists on an opened + * object. + * + * Return: Success: TRUE/FALSE + * Failure: Negative + * + * Programmer: Quincey Koziol + * Thursday, November 1, 2007 + * + *------------------------------------------------------------------------- + */ +htri_t +H5Aexists(hid_t obj_id, const char *attr_name) +{ + H5G_loc_t loc; /* Object location */ + htri_t ret_value; /* Return value */ + + FUNC_ENTER_API(H5Aexists, FAIL) + H5TRACE2("t", "i*s", obj_id, attr_name); + + /* check arguments */ + if(H5I_ATTR == H5I_get_type(obj_id)) + HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "location is not valid for an attribute") + if(H5G_loc(obj_id, &loc) < 0) + HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location") + if(!attr_name || !*attr_name) + HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no attribute name") + + /* Check if the attribute exists */ + if((ret_value = H5O_attr_exists(loc.oloc, attr_name, H5AC_ind_dxpl_id)) < 0) + HGOTO_ERROR(H5E_ATTR, H5E_CANTGET, FAIL, "unable to determine if attribute exists") + +done: + FUNC_LEAVE_API(ret_value) +} /* H5Aexists() */ + + +/*------------------------------------------------------------------------- + * Function: H5Aexists_by_name + * + * Purpose: Checks if an attribute with a given name exists on an object. + * + * Return: Success: TRUE/FALSE + * Failure: Negative + * + * Programmer: Quincey Koziol + * Thursday, November 1, 2007 + * + *------------------------------------------------------------------------- + */ +htri_t +H5Aexists_by_name(hid_t loc_id, const char *obj_name, const char *attr_name, + hid_t lapl_id) +{ + H5G_loc_t loc; /* Object location */ + H5G_loc_t obj_loc; /* Location used to open group */ + H5G_name_t obj_path; /* Opened object group hier. path */ + H5O_loc_t obj_oloc; /* Opened object object location */ + hbool_t loc_found = FALSE; /* Entry at 'obj_name' found */ + htri_t ret_value; /* Return value */ + + FUNC_ENTER_API(H5Aexists_by_name, FAIL) + H5TRACE4("t", "i*s*si", loc_id, obj_name, attr_name, lapl_id); + + /* check arguments */ + if(H5I_ATTR == H5I_get_type(loc_id)) + HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "location is not valid for an attribute") + if(H5G_loc(loc_id, &loc) < 0) + HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location") + if(!obj_name || !*obj_name) + HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no object name") + if(!attr_name || !*attr_name) + HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no attribute 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") + + /* Set up opened group location to fill in */ + obj_loc.oloc = &obj_oloc; + obj_loc.path = &obj_path; + H5G_loc_reset(&obj_loc); + + /* Find the object's location */ + if(H5G_loc_find(&loc, obj_name, &obj_loc/*out*/, lapl_id, H5AC_ind_dxpl_id) < 0) + HGOTO_ERROR(H5E_ATTR, H5E_NOTFOUND, FAIL, "object not found") + loc_found = TRUE; + + /* Check if the attribute exists */ + if((ret_value = H5O_attr_exists(obj_loc.oloc, attr_name, H5AC_ind_dxpl_id)) < 0) + HGOTO_ERROR(H5E_ATTR, H5E_CANTGET, FAIL, "unable to determine if attribute exists") + +done: + /* Release resources */ + if(loc_found && H5G_loc_free(&obj_loc) < 0) + HDONE_ERROR(H5E_ATTR, H5E_CANTRELEASE, FAIL, "can't free location") + + FUNC_LEAVE_API(ret_value) +} /* H5Aexists_by_name() */ + diff --git a/src/H5Apublic.h b/src/H5Apublic.h index c320a91..3586bad 100644 --- a/src/H5Apublic.h +++ b/src/H5Apublic.h @@ -45,7 +45,7 @@ H5_DLL hid_t H5Acreate2(hid_t loc_id, const char *attr_name, hid_t type_id, hid_t space_id, hid_t acpl_id, hid_t aapl_id); H5_DLL hid_t H5Acreate_by_name(hid_t loc_id, const char *obj_name, const char *attr_name, hid_t type_id, hid_t space_id, hid_t acpl_id, hid_t aapl_id, hid_t lapl_id); -H5_DLL hid_t H5Aopen(hid_t loc_id, const char *attr_name, hid_t aapl_id); +H5_DLL hid_t H5Aopen(hid_t obj_id, const char *attr_name, hid_t aapl_id); H5_DLL hid_t H5Aopen_by_name(hid_t loc_id, const char *obj_name, const char *attr_name, hid_t aapl_id, hid_t lapl_id); H5_DLL hid_t H5Aopen_by_idx(hid_t loc_id, const char *obj_name, @@ -81,6 +81,9 @@ H5_DLL herr_t H5Adelete_by_name(hid_t loc_id, const char *obj_name, const char *attr_name, hid_t lapl_id); H5_DLL herr_t H5Adelete_by_idx(hid_t loc_id, const char *obj_name, H5_index_t idx_type, H5_iter_order_t order, hsize_t n, hid_t lapl_id); +H5_DLL htri_t H5Aexists(hid_t obj_id, const char *attr_name); +H5_DLL htri_t H5Aexists_by_name(hid_t obj_id, const char *obj_name, + const char *attr_name, hid_t lapl_id); /* Symbols defined for compatibility with previous versions of the HDF5 API. * @@ -794,14 +794,14 @@ done: * *------------------------------------------------------------------------- */ -herr_t +htri_t H5Lexists(hid_t loc_id, const char *name, hid_t lapl_id) { H5G_loc_t loc; - herr_t ret_value = SUCCEED; + htri_t ret_value; FUNC_ENTER_API(H5Lexists, FAIL) - H5TRACE3("e", "i*si", loc_id, name, lapl_id); + H5TRACE3("t", "i*si", loc_id, name, lapl_id); /* Check arguments */ if(H5G_loc(loc_id, &loc)) diff --git a/src/H5Oattribute.c b/src/H5Oattribute.c index 5c0a91a..5c9f875 100644 --- a/src/H5Oattribute.c +++ b/src/H5Oattribute.c @@ -61,8 +61,6 @@ typedef struct { /* User data for iteration when opening an attribute */ typedef struct { /* down */ - H5F_t *f; /* Pointer to file attribute is in */ - hid_t dxpl_id; /* DXPL for operation */ const char *name; /* Name of attribute to open */ /* up */ @@ -117,6 +115,15 @@ typedef struct { hbool_t found; /* Found attribute to delete */ } H5O_iter_rm_t; +/* User data for iteration when checking if an attribute exists */ +typedef struct { + /* down */ + const char *name; /* Name of attribute to open */ + + /* up */ + hbool_t found; /* Found attribute */ +} H5O_iter_xst_t; + /********************/ /* Package Typedefs */ @@ -483,8 +490,6 @@ H5O_attr_open_by_name(const H5O_loc_t *loc, const char *name, hid_t dxpl_id) H5O_mesg_operator_t op; /* Wrapper for operator */ /* Set up user data for callback */ - udata.f = loc->file; - udata.dxpl_id = dxpl_id; udata.name = name; udata.attr = NULL; |