diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/H5Gdeprec.c | 226 | ||||
-rw-r--r-- | src/H5L.c | 384 | ||||
-rw-r--r-- | src/H5Lprivate.h | 8 |
3 files changed, 401 insertions, 217 deletions
diff --git a/src/H5Gdeprec.c b/src/H5Gdeprec.c index fc74bcf..92570d2 100644 --- a/src/H5Gdeprec.c +++ b/src/H5Gdeprec.c @@ -26,11 +26,59 @@ *------------------------------------------------------------------------- */ -/* Packages needed by this file... */ +/****************/ +/* Module Setup */ +/****************/ + + +/***********/ +/* Headers */ +/***********/ #include "H5private.h" /* Generic Functions */ #include "H5Eprivate.h" /* Error handling */ #include "H5Lprivate.h" /* Links */ + +/****************/ +/* Local Macros */ +/****************/ + + +/******************/ +/* Local Typedefs */ +/******************/ + + +/********************/ +/* Package Typedefs */ +/********************/ + + +/********************/ +/* Local Prototypes */ +/********************/ + +static herr_t H5G_link_hard(hid_t cur_loc_id, const char *cur_name, + hid_t new_loc_id, const char *new_name); +static herr_t H5G_move(hid_t src_loc_id, const char *src_name, + hid_t dst_loc_id, const char *dst_name); + + +/*********************/ +/* Package Variables */ +/*********************/ + + +/*****************************/ +/* Library Private Variables */ +/*****************************/ + + +/*******************/ +/* Local Variables */ +/*******************/ + + /*------------------------------------------------------------------------- * Function: H5Glink @@ -43,18 +91,31 @@ herr_t H5Glink(hid_t cur_loc_id, H5L_type_t type, const char *cur_name, const char *new_name) { - herr_t ret_value; + herr_t ret_value = SUCCEED; /* Return value */ FUNC_ENTER_API(H5Glink, FAIL) H5TRACE4("e","iLlss",cur_loc_id,type,cur_name,new_name); + /* Check arguments */ + if(!cur_name || !*cur_name) + HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no current name specified") + if(!new_name || !*new_name) + HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no new name specified") + if(type == H5L_TYPE_HARD) { - if((ret_value = H5Lcreate_hard(cur_loc_id, cur_name, H5L_SAME_LOC, new_name, H5P_DEFAULT, H5P_DEFAULT)) < 0) - HGOTO_ERROR(H5E_LINK, H5E_CANTINIT, FAIL, "Couldn't create link") + if((ret_value = H5G_link_hard(cur_loc_id, cur_name, H5L_SAME_LOC, new_name)) < 0) + HGOTO_ERROR(H5E_LINK, H5E_CANTINIT, FAIL, "couldn't create link") } /* end if */ else if(type == H5L_TYPE_SOFT) { - if((ret_value = H5Lcreate_soft(cur_name, cur_loc_id, new_name, H5P_DEFAULT, H5P_DEFAULT)) < 0) - HGOTO_ERROR(H5E_LINK, H5E_CANTINIT, FAIL, "Couldn't create link") + H5G_loc_t cur_loc; /* Group location for new link */ + + /* Finish checking arguments */ + if(H5G_loc(cur_loc_id, &cur_loc) < 0) + HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location") + + /* Create the link */ + if(H5L_create_soft(cur_name, &cur_loc, new_name, H5P_DEFAULT, H5P_DEFAULT, H5AC_dxpl_id) < 0) + HGOTO_ERROR(H5E_LINK, H5E_CANTINIT, FAIL, "unable to create link") } /* end else if */ else HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "Not a valid link type") @@ -68,7 +129,7 @@ done: * Function: H5Glink2 * * Purpose: Creates a link between two existing objects. The new - * API to do this is H5Llink. + * APIs to do this are H5Lcreate_hard and H5Lcreate_soft. * *------------------------------------------------------------------------- */ @@ -76,26 +137,39 @@ herr_t H5Glink2(hid_t cur_loc_id, const char *cur_name, H5L_type_t type, hid_t new_loc_id, const char *new_name) { - herr_t ret_value; + herr_t ret_value = SUCCEED; /* Return value */ FUNC_ENTER_API(H5Glink2, FAIL) H5TRACE5("e","isLlis",cur_loc_id,cur_name,type,new_loc_id,new_name); + /* Check arguments */ + if(!cur_name || !*cur_name) + HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no current name specified") + if(!new_name || !*new_name) + HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no new name specified") + if(type == H5L_TYPE_HARD) { - if((ret_value = H5Lcreate_hard(cur_loc_id, cur_name, new_loc_id, new_name, H5P_DEFAULT, H5P_DEFAULT)) < 0) - HGOTO_ERROR(H5E_LINK, H5E_CANTINIT, FAIL, "Couldn't create link") + if((ret_value = H5G_link_hard(cur_loc_id, cur_name, new_loc_id, new_name)) < 0) + HGOTO_ERROR(H5E_LINK, H5E_CANTINIT, FAIL, "couldn't create link") } /* end if */ else if(type == H5L_TYPE_SOFT) { + H5G_loc_t new_loc; /* Group location for new link */ + /* Soft links only need one location, the new_loc_id, but it's possible that * new_loc_id is H5L_SAME_LOC */ if(new_loc_id == H5L_SAME_LOC) new_loc_id = cur_loc_id; - if((ret_value = H5Lcreate_soft(cur_name, new_loc_id, new_name, H5P_DEFAULT, H5P_DEFAULT)) < 0) - HGOTO_ERROR(H5E_LINK, H5E_CANTINIT, FAIL, "Couldn't create link") + /* Finish checking arguments */ + if(H5G_loc(new_loc_id, &new_loc) < 0) + HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location") + + /* Create the link */ + if(H5L_create_soft(cur_name, &new_loc, new_name, H5P_DEFAULT, H5P_DEFAULT, H5AC_dxpl_id) < 0) + HGOTO_ERROR(H5E_LINK, H5E_CANTINIT, FAIL, "unable to create link") } /* end else if */ else - HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "Not a valid link type") + HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "not a valid link type") done: FUNC_LEAVE_API(ret_value) @@ -103,6 +177,60 @@ done: /*------------------------------------------------------------------------- + * Function: H5G_link_hard + * + * Purpose: Creates a hard link from NEW_NAME to CUR_NAME. + * + * CUR_NAME must name an existing object. CUR_NAME and + * NEW_NAME are interpreted relative to CUR_LOC_ID and + * NEW_LOC_ID, which are either file IDs or group IDs. + * + * Return: Non-negative on success/Negative on failure + * + * Programmer: Quincey Koziol + * Monday, November 6, 2006 + * + *------------------------------------------------------------------------- + */ +static herr_t +H5G_link_hard(hid_t cur_loc_id, const char *cur_name, hid_t new_loc_id, + const char *new_name) +{ + H5G_loc_t cur_loc, *cur_loc_p; /* Information about current link's group */ + H5G_loc_t new_loc, *new_loc_p; /* Information about new link's group */ + herr_t ret_value = SUCCEED; /* Return value */ + + FUNC_ENTER_NOAPI_NOINIT(H5G_link_hard) + + /* Finish checking arguments */ + if(cur_loc_id == H5L_SAME_LOC && new_loc_id == H5L_SAME_LOC) + HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "source and destination should not be both H5L_SAME_LOC") + if(cur_loc_id != H5L_SAME_LOC && H5G_loc(cur_loc_id, &cur_loc) < 0) + HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location") + if(new_loc_id != H5L_SAME_LOC && H5G_loc(new_loc_id, &new_loc) < 0) + HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location") + + /* Set up current & new location pointers */ + cur_loc_p = &cur_loc; + new_loc_p = &new_loc; + if(cur_loc_id == H5L_SAME_LOC) + cur_loc_p = new_loc_p; + else if(new_loc_id == H5L_SAME_LOC) + new_loc_p = cur_loc_p; + else if(cur_loc_p->oloc->file != new_loc_p->oloc->file) + HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "source and destination should be in the same file.") + + /* Create the link */ + if(H5L_create_hard(cur_loc_p, cur_name, new_loc_p, new_name, + H5P_DEFAULT, H5P_DEFAULT, H5AC_dxpl_id) < 0) + HGOTO_ERROR(H5E_LINK, H5E_CANTINIT, FAIL, "unable to create link") + +done: + FUNC_LEAVE_NOAPI(ret_value) +} /* end H5G_link_hard() */ + + +/*------------------------------------------------------------------------- * Function: H5Gmove * * Purpose: Moves and renames a link. The new API to do this is H5Lmove. @@ -112,13 +240,14 @@ done: herr_t H5Gmove(hid_t src_loc_id, const char *src_name, const char *dst_name) { - herr_t ret_value; + herr_t ret_value = SUCCEED; /* Return value */ FUNC_ENTER_API(H5Gmove, FAIL) H5TRACE3("e","iss",src_loc_id,src_name,dst_name); - if((ret_value = H5Lmove(src_loc_id, src_name, H5L_SAME_LOC, dst_name, H5P_DEFAULT, H5P_DEFAULT)) < 0) - HGOTO_ERROR(H5E_LINK, H5E_CANTINIT, FAIL, "Couldn't move link") + /* Call common routine to move the link */ + if(H5G_move(src_loc_id, src_name, H5L_SAME_LOC, dst_name) < 0) + HGOTO_ERROR(H5E_LINK, H5E_CANTINIT, FAIL, "couldn't move link") done: FUNC_LEAVE_API(ret_value) @@ -133,14 +262,16 @@ done: *------------------------------------------------------------------------- */ herr_t -H5Gmove2(hid_t src_loc_id, const char *src_name, hid_t dst_loc_id, const char *dst_name) +H5Gmove2(hid_t src_loc_id, const char *src_name, hid_t dst_loc_id, + const char *dst_name) { - herr_t ret_value; + herr_t ret_value = SUCCEED; /* Return value */ FUNC_ENTER_API(H5Gmove2, FAIL) H5TRACE4("e","isis",src_loc_id,src_name,dst_loc_id,dst_name); - if((ret_value = H5Lmove(src_loc_id, src_name, dst_loc_id, dst_name, H5P_DEFAULT, H5P_DEFAULT)) < 0) + /* Call common routine to move the link */ + if(H5G_move(src_loc_id, src_name, dst_loc_id, dst_name) < 0) HGOTO_ERROR(H5E_LINK, H5E_CANTINIT, FAIL, "couldn't move link") done: @@ -149,6 +280,63 @@ done: /*------------------------------------------------------------------------- + * Function: H5G_move + * + * Purpose: Renames an object within an HDF5 file and moves it to a new + * group. The original name SRC is unlinked from the group graph + * and then inserted with the new name DST (which can specify a + * new path for the object) as an atomic operation. The names + * are interpreted relative to SRC_LOC_ID and + * DST_LOC_ID, which are either file IDs or group ID. + * + * Return: Non-negative on success/Negative on failure + * + * Programmer: Quincey Koziol + * Monday, November 6, 2006 + * + *------------------------------------------------------------------------- + */ +static herr_t +H5G_move(hid_t src_loc_id, const char *src_name, hid_t dst_loc_id, + const char *dst_name) +{ + H5G_loc_t src_loc, *src_loc_p; /* Group info for source location */ + H5G_loc_t dst_loc, *dst_loc_p; /* Group info for destination location */ + herr_t ret_value = SUCCEED; /* Return value */ + + FUNC_ENTER_NOAPI_NOINIT(H5G_move) + + /* Check arguments */ + if(src_loc_id == H5L_SAME_LOC && dst_loc_id == H5L_SAME_LOC) + HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "source and destination should not both be H5L_SAME_LOC") + if(src_loc_id != H5L_SAME_LOC && H5G_loc(src_loc_id, &src_loc) < 0) + HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location") + if(dst_loc_id != H5L_SAME_LOC && H5G_loc(dst_loc_id, &dst_loc) < 0) + HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location") + if(!src_name || !*src_name) + HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no current name specified") + if(!dst_name || !*dst_name) + HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no destination name specified") + + /* Set up src & dst location pointers */ + src_loc_p = &src_loc; + dst_loc_p = &dst_loc; + if(src_loc_id == H5L_SAME_LOC) + src_loc_p = dst_loc_p; + else if(dst_loc_id == H5L_SAME_LOC) + dst_loc_p = src_loc_p; + + /* Move the link */ + if(H5L_move(src_loc_p, src_name, dst_loc_p, dst_name, FALSE, H5P_DEFAULT, + H5P_DEFAULT, H5AC_dxpl_id) < 0) + HGOTO_ERROR(H5E_LINK, H5E_CANTMOVE, FAIL, "unable to move link") + +done: + FUNC_LEAVE_NOAPI(ret_value) +} /* end H5G_move() */ + + +/*------------------------------------------------------------------------- * Function: H5Gunlink * * Purpose: Removes a link. The new API is H5Ldelete. @@ -102,20 +102,12 @@ static herr_t H5L_link_cb(H5G_loc_t *grp_loc/*in*/, const char *name, static herr_t H5L_create_real(H5G_loc_t *link_loc, const char *link_name, H5G_name_t *obj_path, H5F_t *obj_file, H5O_link_t *lnk, hid_t lcpl_id, hid_t lapl_id, hid_t dxpl_id); -static herr_t H5L_create_hard(H5G_loc_t *cur_loc, const char *cur_name, - H5G_loc_t *link_loc, const char *link_name, hid_t lcpl_id, - hid_t lapl_id, hid_t dxpl_id); -static herr_t H5L_create_soft(const char *target_path, H5G_loc_t *cur_loc, - const char *cur_name, hid_t lcpl_id, hid_t lapl_id, hid_t dxpl_id); static herr_t H5L_get_val_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*/); static herr_t H5L_delete_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*/); -static herr_t H5L_move(H5G_loc_t *src_loc, const char *src_name, - H5G_loc_t *dst_loc, const char *dst_name, hbool_t copy_flag, - hid_t lcpl_id, hid_t lapl_id, hid_t dxpl_id); static herr_t H5L_move_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*/); @@ -230,128 +222,11 @@ H5L_term_interface(void) /*------------------------------------------------------------------------- - * Function: H5Lregister - * - * Purpose: Registers a class of user-defined links, or changes the - * behavior of an existing class. - * - * The link class passed in will override any existing link - * class for the specified link class ID. It must at least - * include a H5L_class_t version (which should be - * H5L_LINK_CLASS_T_VERS), a link class ID, and a traversal - * function. - * - * Return: Non-negative on success/Negative on failure - * - * Programmer: James Laird - * Monday, July 10, 2006 - * - *------------------------------------------------------------------------- - */ -herr_t -H5Lregister(const H5L_class_t *cls) -{ - herr_t ret_value=SUCCEED; /* Return value */ - - FUNC_ENTER_API(H5Lregister, FAIL) - H5TRACE1("e","*x",cls); - - /* Check args */ - if (cls==NULL) - HGOTO_ERROR (H5E_ARGS, H5E_BADVALUE, FAIL, "invalid link class") - - /* Check H5L_class_t version number; this is where a function to convert - * from an outdated version should be called. - */ - if(cls->version != H5L_LINK_CLASS_T_VERS) - HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid H5L_class_t version number"); - - if (cls->id<H5L_TYPE_UD_MIN || cls->id>H5L_TYPE_MAX) - HGOTO_ERROR (H5E_ARGS, H5E_BADVALUE, FAIL, "invalid link identification number") - if (cls->trav_func==NULL) - HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no traversal function specified") - - /* Do it */ - if (H5L_register (cls)<0) - HGOTO_ERROR (H5E_LINK, H5E_NOTREGISTERED, FAIL, "unable to register link type") - -done: - FUNC_LEAVE_API(ret_value) -} - - -/*------------------------------------------------------------------------- - * Function: H5L_find_class_idx - * - * Purpose: Given a link class ID, return the offset in the global array - * that holds all the registered link classes. - * - * Return: Success: Non-negative index of entry in global - * link class table. - * Failure: Negative - * - * Programmer: James Laird - * Monday, July 10, 2006 - * - *------------------------------------------------------------------------- - */ -static int -H5L_find_class_idx(H5L_type_t id) -{ - size_t i; /* Local index variable */ - int ret_value=FAIL; /* Return value */ - - FUNC_ENTER_NOAPI_NOINIT_NOFUNC(H5L_find_class_idx) - - for (i=0; i<H5L_table_used_g; i++) - if (H5L_table_g[i].id == id) - HGOTO_DONE((int)i) - -done: - FUNC_LEAVE_NOAPI(ret_value) -} /* end H5L_find_class_idx */ - - -/*------------------------------------------------------------------------- - * Function: H5L_find_class - * - * Purpose: Given a link class ID return a pointer to a global struct that - * defines the link class. - * - * Return: Success: Ptr to entry in global link class table. - * Failure: NULL - * - * Programmer: James Laird - * Monday, July 10, 2006 - * - *------------------------------------------------------------------------- - */ -const H5L_class_t * -H5L_find_class(H5L_type_t id) -{ - int idx; /* Filter index in global table */ - H5L_class_t *ret_value=NULL; /* Return value */ - - FUNC_ENTER_NOAPI(H5L_find_class, NULL) - - /* Get the index in the global table */ - if((idx=H5L_find_class_idx(id))<0) - HGOTO_ERROR(H5E_LINK, H5E_NOTREGISTERED, NULL, "unable to find link class") - - /* Set return value */ - ret_value=H5L_table_g+idx; - -done: - FUNC_LEAVE_NOAPI(ret_value) -} /* end H5L_find_class */ - - -/*------------------------------------------------------------------------- * Function: H5Lmove * * Purpose: Renames an object within an HDF5 file and moves it to a new * group. The original name SRC is unlinked from the group graph - * and the inserted with the new name DST (which can specify a + * and then inserted with the new name DST (which can specify a * new path for the object) as an atomic operation. The names * are interpreted relative to SRC_LOC_ID and * DST_LOC_ID, which are either file IDs or group ID. @@ -365,7 +240,7 @@ done: */ herr_t H5Lmove(hid_t src_loc_id, const char *src_name, hid_t dst_loc_id, - const char *dst_name, hid_t lcpl_id, hid_t lapl_id) + const char *dst_name, hid_t lcpl_id, hid_t lapl_id) { H5G_loc_t src_loc, *src_loc_p; H5G_loc_t dst_loc, *dst_loc_p; @@ -376,6 +251,8 @@ H5Lmove(hid_t src_loc_id, const char *src_name, hid_t dst_loc_id, lapl_id); /* Check arguments */ + if(src_loc_id == H5L_SAME_LOC && dst_loc_id == H5L_SAME_LOC) + HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "source and destination should not both be H5L_SAME_LOC") if(src_loc_id != H5L_SAME_LOC && H5G_loc(src_loc_id, &src_loc) < 0) HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location") if(dst_loc_id != H5L_SAME_LOC && H5G_loc(dst_loc_id, &dst_loc) < 0) @@ -384,27 +261,25 @@ H5Lmove(hid_t src_loc_id, const char *src_name, hid_t dst_loc_id, HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no current name specified") if(!dst_name || !*dst_name) HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no destination name specified") + if(lcpl_id != H5P_DEFAULT && (TRUE != H5P_isa_class(lcpl_id, H5P_LINK_CREATE))) + HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a link creation property list") /* Set up src & dst location pointers */ src_loc_p = &src_loc; dst_loc_p = &dst_loc; - if(src_loc_id == H5L_SAME_LOC && dst_loc_id == H5L_SAME_LOC) - HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "source and destination should not both be H5L_SAME_LOC") - else if(src_loc_id == H5L_SAME_LOC) + if(src_loc_id == H5L_SAME_LOC) src_loc_p = dst_loc_p; else if(dst_loc_id == H5L_SAME_LOC) dst_loc_p = src_loc_p; - if(lcpl_id != H5P_DEFAULT && (TRUE != H5P_isa_class(lcpl_id, H5P_LINK_CREATE))) - HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a link creation property list") - - if(H5L_move(src_loc_p, src_name, dst_loc_p, dst_name, - FALSE, lcpl_id, lapl_id, H5AC_dxpl_id) < 0) + /* Move the link */ + if(H5L_move(src_loc_p, src_name, dst_loc_p, dst_name, FALSE, lcpl_id, + lapl_id, H5AC_dxpl_id) < 0) HGOTO_ERROR(H5E_LINK, H5E_CANTMOVE, FAIL, "unable to move link") done: FUNC_LEAVE_API(ret_value) -} +} /* end H5Lmove() */ /*------------------------------------------------------------------------- @@ -423,7 +298,7 @@ done: */ herr_t H5Lcopy(hid_t src_loc_id, const char *src_name, hid_t dst_loc_id, - const char *dst_name, hid_t lcpl_id, hid_t lapl_id) + const char *dst_name, hid_t lcpl_id, hid_t lapl_id) { H5G_loc_t src_loc, *src_loc_p; H5G_loc_t dst_loc, *dst_loc_p; @@ -434,6 +309,8 @@ H5Lcopy(hid_t src_loc_id, const char *src_name, hid_t dst_loc_id, lapl_id); /* Check arguments */ + if(src_loc_id == H5L_SAME_LOC && dst_loc_id == H5L_SAME_LOC) + HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "source and destination should not both be H5L_SAME_LOC") if(src_loc_id != H5L_SAME_LOC && H5G_loc(src_loc_id, &src_loc) < 0) HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location") if(dst_loc_id != H5L_SAME_LOC && H5G_loc(dst_loc_id, &dst_loc) < 0) @@ -442,27 +319,25 @@ H5Lcopy(hid_t src_loc_id, const char *src_name, hid_t dst_loc_id, HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no current name specified") if(!dst_name || !*dst_name) HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no destination name specified") + if(lcpl_id != H5P_DEFAULT && (TRUE != H5P_isa_class(lcpl_id, H5P_LINK_CREATE))) + HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a link creation property list") /* Set up src & dst location pointers */ src_loc_p = &src_loc; dst_loc_p = &dst_loc; - if(src_loc_id == H5L_SAME_LOC && dst_loc_id == H5L_SAME_LOC) - HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "source and destination should not both be H5L_SAME_LOC") - else if(src_loc_id == H5L_SAME_LOC) + if(src_loc_id == H5L_SAME_LOC) src_loc_p = dst_loc_p; else if(dst_loc_id == H5L_SAME_LOC) dst_loc_p = src_loc_p; - if(lcpl_id != H5P_DEFAULT && (TRUE != H5P_isa_class(lcpl_id, H5P_LINK_CREATE))) - HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a link creation property list") - + /* Copy the link */ if(H5L_move(src_loc_p, src_name, dst_loc_p, dst_name, TRUE, lcpl_id, lapl_id, H5AC_dxpl_id) < 0) HGOTO_ERROR(H5E_LINK, H5E_CANTMOVE, FAIL, "unable to move link") done: FUNC_LEAVE_API(ret_value) -} +} /* end H5Lcopy() */ /*------------------------------------------------------------------------- @@ -508,10 +383,10 @@ H5Llink(hid_t new_loc_id, const char *new_name, hid_t obj_id, hid_t lcpl_id, HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no name specified") if(HDstrlen(new_name) > H5L_MAX_LINK_NAME_LEN) HGOTO_ERROR(H5E_ARGS, H5E_BADRANGE, FAIL, "name too long") - if(lcpl_id != H5P_DEFAULT && (TRUE != H5P_isa_class(lcpl_id, H5P_LINK_CREATE))) HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a link creation property list") + /* Link to the object */ if(H5L_link(&new_loc, new_name, &obj_loc, lcpl_id, lapl_id, H5AC_dxpl_id) < 0) HGOTO_ERROR(H5E_LINK, H5E_CANTINIT, FAIL, "unable to create link") @@ -540,29 +415,26 @@ done: */ herr_t H5Lcreate_soft(const char *target_path, - hid_t cur_loc, const char *cur_name, hid_t lcpl_id, hid_t lapl_id) + hid_t cur_loc_id, const char *new_name, hid_t lcpl_id, hid_t lapl_id) { - H5G_loc_t new_loc, *new_loc_p; - herr_t ret_value=SUCCEED; /* Return value */ + H5G_loc_t cur_loc; /* Group location for new link */ + herr_t ret_value = SUCCEED; /* Return value */ FUNC_ENTER_API(H5Lcreate_soft, FAIL) - H5TRACE5("e","sisii",target_path,cur_loc,cur_name,lcpl_id,lapl_id); + H5TRACE5("e","sisii",target_path,cur_loc_id,new_name,lcpl_id,lapl_id); /* Check arguments */ - if(H5G_loc(cur_loc, &new_loc) < 0) + if(H5G_loc(cur_loc_id, &cur_loc) < 0) HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location") if(!target_path || !*target_path) HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no target specified") - if(!cur_name || !*cur_name) + if(!new_name || !*new_name) HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no new name specified") - if(lcpl_id != H5P_DEFAULT && (TRUE != H5P_isa_class(lcpl_id, H5P_LINK_CREATE))) HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a link creation property list") - new_loc_p = &new_loc; - - if(H5L_create_soft(target_path, new_loc_p, cur_name, - lcpl_id, lapl_id, H5AC_dxpl_id) < 0) + /* Create the link */ + if(H5L_create_soft(target_path, &cur_loc, new_name, lcpl_id, lapl_id, H5AC_dxpl_id) < 0) HGOTO_ERROR(H5E_LINK, H5E_CANTINIT, FAIL, "unable to create link") done: @@ -588,17 +460,19 @@ done: */ herr_t H5Lcreate_hard(hid_t cur_loc_id, const char *cur_name, - hid_t new_loc_id, const char *new_name, hid_t lcpl_id, hid_t lapl_id) + hid_t new_loc_id, const char *new_name, hid_t lcpl_id, hid_t lapl_id) { H5G_loc_t cur_loc, *cur_loc_p; H5G_loc_t new_loc, *new_loc_p; - herr_t ret_value=SUCCEED; /* Return value */ + herr_t ret_value = SUCCEED; /* Return value */ FUNC_ENTER_API(H5Lcreate_hard, FAIL) H5TRACE6("e","isisii",cur_loc_id,cur_name,new_loc_id,new_name,lcpl_id, lapl_id); /* Check arguments */ + if(cur_loc_id == H5L_SAME_LOC && new_loc_id == H5L_SAME_LOC) + HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "source and destination should not be both H5L_SAME_LOC") if(cur_loc_id != H5L_SAME_LOC && H5G_loc(cur_loc_id, &cur_loc) < 0) HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location") if(new_loc_id != H5L_SAME_LOC && H5G_loc(new_loc_id, &new_loc) < 0) @@ -607,22 +481,20 @@ H5Lcreate_hard(hid_t cur_loc_id, const char *cur_name, HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no current name specified") if(!new_name || !*new_name) HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no new name specified") - if(lcpl_id != H5P_DEFAULT && (TRUE != H5P_isa_class(lcpl_id, H5P_LINK_CREATE))) HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a link creation property list") /* Set up current & new location pointers */ cur_loc_p = &cur_loc; new_loc_p = &new_loc; - if(cur_loc_id == H5L_SAME_LOC && new_loc_id == H5L_SAME_LOC) - HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "source and destination should not be both H5L_SAME_LOC") - else if(cur_loc_id == H5L_SAME_LOC) + if(cur_loc_id == H5L_SAME_LOC) cur_loc_p = new_loc_p; else if(new_loc_id == H5L_SAME_LOC) new_loc_p = cur_loc_p; else if(cur_loc_p->oloc->file != new_loc_p->oloc->file) HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "source and destination should be in the same file.") + /* Create the link */ if(H5L_create_hard(cur_loc_p, cur_name, new_loc_p, new_name, lcpl_id, lapl_id, H5AC_dxpl_id) < 0) HGOTO_ERROR(H5E_LINK, H5E_CANTINIT, FAIL, "unable to create link") @@ -680,7 +552,7 @@ H5Lcreate_ud(hid_t link_loc_id, const char *link_name, H5L_type_t link_type, done: FUNC_LEAVE_API(ret_value); -} /* end H5Lcreate_ud */ +} /* end H5Lcreate_ud() */ /*------------------------------------------------------------------------- @@ -717,7 +589,7 @@ H5Ldelete(hid_t loc_id, const char *name, hid_t lapl_id) /* Unlink */ if(H5L_delete(&loc, name, lapl_id, H5AC_dxpl_id) < 0) - HGOTO_ERROR(H5E_LINK, H5E_CANTDELETE, FAIL, "unable to delet link") + HGOTO_ERROR(H5E_LINK, H5E_CANTDELETE, FAIL, "unable to delete link") done: FUNC_LEAVE_API(ret_value) @@ -745,7 +617,7 @@ done: */ herr_t H5Lget_val(hid_t loc_id, const char *name, size_t size, void *buf/*out*/, - hid_t lapl_id) + hid_t lapl_id) { H5G_loc_t loc; herr_t ret_value = SUCCEED; /* Return value */ @@ -804,7 +676,58 @@ H5Lget_info(hid_t loc_id, const char *name, H5L_info_t *linkbuf /*out*/, done: FUNC_LEAVE_API(ret_value) -} +} /* end H5Gget_info() */ + + +/*------------------------------------------------------------------------- + * Function: H5Lregister + * + * Purpose: Registers a class of user-defined links, or changes the + * behavior of an existing class. + * + * The link class passed in will override any existing link + * class for the specified link class ID. It must at least + * include a H5L_class_t version (which should be + * H5L_LINK_CLASS_T_VERS), a link class ID, and a traversal + * function. + * + * Return: Non-negative on success/Negative on failure + * + * Programmer: James Laird + * Monday, July 10, 2006 + * + *------------------------------------------------------------------------- + */ +herr_t +H5Lregister(const H5L_class_t *cls) +{ + herr_t ret_value = SUCCEED; /* Return value */ + + FUNC_ENTER_API(H5Lregister, FAIL) + H5TRACE1("e","*x",cls); + + /* Check args */ + if(cls == NULL) + HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid link class") + + /* Check H5L_class_t version number; this is where a function to convert + * from an outdated version should be called. + */ + if(cls->version != H5L_LINK_CLASS_T_VERS) + HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid H5L_class_t version number") + + if (cls->id < H5L_TYPE_UD_MIN || cls->id > H5L_TYPE_MAX) + HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid link identification number") + if (cls->trav_func == NULL) + HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no traversal function specified") + + /* Do it */ + if(H5L_register(cls) < 0) + HGOTO_ERROR(H5E_LINK, H5E_NOTREGISTERED, FAIL, "unable to register link type") + +done: + FUNC_LEAVE_API(ret_value) +} /* end H5Lregister() */ /*------------------------------------------------------------------------- @@ -831,12 +754,12 @@ H5Lunregister(H5L_type_t id) H5TRACE1("e","Ll",id); /* Check args */ - if (id<0 || id>H5L_TYPE_MAX) - HGOTO_ERROR (H5E_ARGS, H5E_BADVALUE, FAIL, "invalid link type") + if(id < 0 || id > H5L_TYPE_MAX) + HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid link type") /* Do it */ - if (H5L_unregister (id)<0) - HGOTO_ERROR (H5E_LINK, H5E_NOTREGISTERED, FAIL, "unable to unregister link type") + if(H5L_unregister(id) < 0) + HGOTO_ERROR(H5E_LINK, H5E_NOTREGISTERED, FAIL, "unable to unregister link type") done: FUNC_LEAVE_API(ret_value) @@ -888,6 +811,73 @@ done: *------------------------------------------------------------------------- *------------------------------------------------------------------------- */ + + +/*------------------------------------------------------------------------- + * Function: H5L_find_class_idx + * + * Purpose: Given a link class ID, return the offset in the global array + * that holds all the registered link classes. + * + * Return: Success: Non-negative index of entry in global + * link class table. + * Failure: Negative + * + * Programmer: James Laird + * Monday, July 10, 2006 + * + *------------------------------------------------------------------------- + */ +static int +H5L_find_class_idx(H5L_type_t id) +{ + size_t i; /* Local index variable */ + int ret_value=FAIL; /* Return value */ + + FUNC_ENTER_NOAPI_NOINIT_NOFUNC(H5L_find_class_idx) + + for (i=0; i<H5L_table_used_g; i++) + if (H5L_table_g[i].id == id) + HGOTO_DONE((int)i) + +done: + FUNC_LEAVE_NOAPI(ret_value) +} /* end H5L_find_class_idx */ + + +/*------------------------------------------------------------------------- + * Function: H5L_find_class + * + * Purpose: Given a link class ID return a pointer to a global struct that + * defines the link class. + * + * Return: Success: Ptr to entry in global link class table. + * Failure: NULL + * + * Programmer: James Laird + * Monday, July 10, 2006 + * + *------------------------------------------------------------------------- + */ +const H5L_class_t * +H5L_find_class(H5L_type_t id) +{ + int idx; /* Filter index in global table */ + H5L_class_t *ret_value=NULL; /* Return value */ + + FUNC_ENTER_NOAPI(H5L_find_class, NULL) + + /* Get the index in the global table */ + if((idx=H5L_find_class_idx(id))<0) + HGOTO_ERROR(H5E_LINK, H5E_NOTREGISTERED, NULL, "unable to find link class") + + /* Set return value */ + ret_value=H5L_table_g+idx; + +done: + FUNC_LEAVE_NOAPI(ret_value) +} /* end H5L_find_class */ + /*------------------------------------------------------------------------- * Function: H5L_register @@ -1253,7 +1243,7 @@ done: * *------------------------------------------------------------------------- */ -static herr_t +herr_t H5L_create_hard(H5G_loc_t *cur_loc, const char *cur_name, H5G_loc_t *link_loc, const char *link_name, hid_t lcpl_id, hid_t lapl_id, hid_t dxpl_id) @@ -1267,7 +1257,7 @@ H5L_create_hard(H5G_loc_t *cur_loc, const char *cur_name, hbool_t loc_valid = FALSE; herr_t ret_value = SUCCEED; /* Return value */ - FUNC_ENTER_NOAPI_NOINIT(H5L_create_hard) + FUNC_ENTER_NOAPI(H5L_create_hard, FAIL) /* Check args */ HDassert(cur_loc); @@ -1320,7 +1310,7 @@ done: /*------------------------------------------------------------------------- * Function: H5L_create_soft * - * Purpose: Creates a soft link from NEW_NAME to CUR_NAME. + * Purpose: Creates a soft link from LINK_NAME to TARGET_PATH. * * Return: Non-negative on success/Negative on failure * @@ -1329,15 +1319,15 @@ done: * *------------------------------------------------------------------------- */ -static herr_t -H5L_create_soft( const char *target_path, H5G_loc_t *link_loc, - const char *link_name, hid_t lcpl_id, hid_t lapl_id, hid_t dxpl_id) +herr_t +H5L_create_soft(const char *target_path, H5G_loc_t *link_loc, + const char *link_name, hid_t lcpl_id, hid_t lapl_id, hid_t dxpl_id) { char *norm_target = NULL; /* Pointer to normalized current name */ H5O_link_t lnk; /* Link to insert */ herr_t ret_value = SUCCEED; /* Return value */ - FUNC_ENTER_NOAPI_NOINIT(H5L_create_soft) + FUNC_ENTER_NOAPI(H5L_create_soft, FAIL) /* Check args */ HDassert(link_loc); @@ -1835,7 +1825,7 @@ H5L_move_cb(H5G_loc_t *grp_loc/*in*/, const char *name, const H5O_link_t *lnk, /* Set up user data for move_dest_cb */ if((udata_out.lnk = H5O_copy(H5O_LINK_ID, lnk, NULL)) == NULL) - HGOTO_ERROR(H5E_LINK, H5E_CANTCOPY, FAIL, "unable to copy link to be moved"); + HGOTO_ERROR(H5E_LINK, H5E_CANTCOPY, FAIL, "unable to copy link to be moved") /* In this special case, the link's name is going to be replaced at its * destination, so we should free it here. */ @@ -1915,10 +1905,10 @@ done: * *------------------------------------------------------------------------- */ -static herr_t +herr_t H5L_move(H5G_loc_t *src_loc, const char *src_name, H5G_loc_t *dst_loc, - const char *dst_name, hbool_t copy_flag, hid_t lcpl_id, - hid_t lapl_id, hid_t dxpl_id) + const char *dst_name, hbool_t copy_flag, hid_t lcpl_id, hid_t lapl_id, + hid_t dxpl_id) { unsigned target_flags = H5G_TARGET_MOUNT|H5G_TARGET_SLINK|H5G_TARGET_UDLINK; H5T_cset_t char_encoding = H5F_DEFAULT_CSET; /* Character encoding for link */ @@ -1939,36 +1929,34 @@ H5L_move(H5G_loc_t *src_loc, const char *src_name, H5G_loc_t *dst_loc, /* Check for flags present in creation property list */ if(lcpl_id != H5P_DEFAULT) { - unsigned crt_intmd_group; + unsigned crt_intmd_group; - if(NULL == (lc_plist = H5I_object(lcpl_id))) - HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a property list") + if(NULL == (lc_plist = H5I_object(lcpl_id))) + HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a property list") - /* Get intermediate group creation property */ - if(H5P_get(lc_plist, H5L_CRT_INTERMEDIATE_GROUP_NAME, &crt_intmd_group) < -0) - HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get property value for creating missing groups") + /* Get intermediate group creation property */ + if(H5P_get(lc_plist, H5L_CRT_INTERMEDIATE_GROUP_NAME, &crt_intmd_group) < 0) + HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get property value for creating missing groups") - if (crt_intmd_group > 0) - target_flags |= H5G_CRT_INTMD_GROUP; + if(crt_intmd_group > 0) + target_flags |= H5G_CRT_INTMD_GROUP; - /* Get character encoding property */ - if(H5P_get(lc_plist, H5P_STRCRT_CHAR_ENCODING_NAME, &char_encoding) < 0) - HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get property value for character encoding") + /* Get character encoding property */ + if(H5P_get(lc_plist, H5P_STRCRT_CHAR_ENCODING_NAME, &char_encoding) < 0) + HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get property value for character encoding") } /* end if */ /* Copy the link access property list because traversing UD links will * decrease the NLINKS property. HDF5 should have NLINKS traversals to * get to the source and NLINKS more to get to the destination. */ - if(lapl_id == H5P_DEFAULT) { + if(lapl_id == H5P_DEFAULT) lapl_copy = lapl_id; - } else { - if (NULL==(la_plist=H5I_object(lapl_id))) + if(NULL == (la_plist = H5I_object(lapl_id))) HGOTO_ERROR(H5E_PLIST, H5E_BADTYPE, FAIL, "not a valid access PL") - if((lapl_copy=H5P_copy_plist(la_plist)) < 0) + if((lapl_copy = H5P_copy_plist(la_plist)) < 0) HGOTO_ERROR(H5E_PLIST, H5E_CANTINIT, FAIL, "unable to copy access properties") - } + } /* end else */ /* Set up user data */ udata.dst_loc = dst_loc; diff --git a/src/H5Lprivate.h b/src/H5Lprivate.h index 2ce5e48..197287c 100644 --- a/src/H5Lprivate.h +++ b/src/H5Lprivate.h @@ -58,7 +58,15 @@ H5_DLL herr_t H5L_init(void); H5_DLL herr_t H5L_link(H5G_loc_t *new_loc, const char *new_name, H5G_loc_t *obj_loc, hid_t lcpl_id, hid_t lapl_id, hid_t dxpl_id); +H5_DLL herr_t H5L_create_hard(H5G_loc_t *cur_loc, const char *cur_name, + H5G_loc_t *link_loc, const char *link_name, hid_t lcpl_id, + hid_t lapl_id, hid_t dxpl_id); +H5_DLL herr_t H5L_create_soft(const char *target_path, H5G_loc_t *cur_loc, + const char *cur_name, hid_t lcpl_id, hid_t lapl_id, hid_t dxpl_id); H5_DLL hid_t H5L_get_default_lcpl(void); +H5_DLL herr_t H5L_move(H5G_loc_t *src_loc, const char *src_name, + H5G_loc_t *dst_loc, const char *dst_name, hbool_t copy_flag, + hid_t lcpl_id, hid_t lapl_id, hid_t dxpl_id); H5_DLL herr_t H5L_get_info(const H5G_loc_t *loc, const char *name, H5L_info_t *linkbuf/*out*/, hid_t lapl_id, hid_t dxpl_id); H5_DLL herr_t H5L_delete(H5G_loc_t *loc, const char *name, hid_t lapl_id, |