diff options
-rw-r--r-- | release_docs/RELEASE.txt | 2 | ||||
-rw-r--r-- | src/H5Gdeprec.c | 18 | ||||
-rw-r--r-- | src/H5Gpublic.h | 9 | ||||
-rw-r--r-- | src/H5L.c | 34 | ||||
-rw-r--r-- | src/H5Lprivate.h | 4 | ||||
-rw-r--r-- | src/H5Lpublic.h | 9 | ||||
-rw-r--r-- | test/links.c | 14 | ||||
-rwxr-xr-x | test/objcopy.c | 8 | ||||
-rw-r--r-- | tools/h5dump/h5dump.c | 8 | ||||
-rw-r--r-- | tools/h5ls/h5ls.c | 45 | ||||
-rw-r--r-- | tools/lib/h5diff.c | 8 |
11 files changed, 84 insertions, 75 deletions
diff --git a/release_docs/RELEASE.txt b/release_docs/RELEASE.txt index 6342a4f..3f7b5dd 100644 --- a/release_docs/RELEASE.txt +++ b/release_docs/RELEASE.txt @@ -210,7 +210,7 @@ New Features H5Lcreate_hard - like H5Glink2 for hard links H5Lcreate_soft - like H5Glink2 for soft links H5Lunlink - just like H5Gunlink - H5Lget_linkval - just link H5Gget_linkval + H5Lget_val - just link H5Gget_linkval H5Lget_info - gets link-specific info (like H5Gget_objinfo) In addition, H5Gcreate_expand, H5Tcommit_expand, and H5Dcreate_expand diff --git a/src/H5Gdeprec.c b/src/H5Gdeprec.c index 0612771..9f8a39f 100644 --- a/src/H5Gdeprec.c +++ b/src/H5Gdeprec.c @@ -29,9 +29,7 @@ /* Packages needed by this file... */ #include "H5private.h" /* Generic Functions */ #include "H5Eprivate.h" /* Error handling */ -#include "H5Gpublic.h" /* Public Group APIs */ -#include "H5Lpublic.h" /* Public Link APIs */ -#include "H5Ppublic.h" /* Property lists */ +#include "H5Lprivate.h" /* Links */ /*------------------------------------------------------------------------- @@ -177,19 +175,27 @@ done: * Function: H5Gget_linkval * * Purpose: Retrieve's a soft link's data. The new API is - * H5Lget_linkval. + * H5Lget_val. * *------------------------------------------------------------------------- */ herr_t H5Gget_linkval(hid_t loc_id, const char *name, size_t size, char *buf/*out*/) { - herr_t ret_value; + H5G_loc_t loc; + herr_t ret_value = SUCCEED; FUNC_ENTER_API(H5Gget_linkval, FAIL) H5TRACE4("e","iszx",loc_id,name,size,buf); - if((ret_value = H5Lget_linkval(loc_id, name, size, buf, H5P_DEFAULT)) < 0) + /* Check arguments */ + if(H5G_loc(loc_id, &loc)) + HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location") + if(!name || !*name) + HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no name specified") + + /* Call the new link routine which provides this capability */ + if(H5L_get_val(&loc, name, size, buf, H5P_DEFAULT, H5P_DEFAULT) < 0) HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "couldn't get link info") done: diff --git a/src/H5Gpublic.h b/src/H5Gpublic.h index ada6ca8..2e18d38 100644 --- a/src/H5Gpublic.h +++ b/src/H5Gpublic.h @@ -29,11 +29,10 @@ #include <sys/types.h> /* Public headers needed by this file */ -#include "H5public.h" -#include "H5Ipublic.h" -#include "H5Lpublic.h" -#include "H5Opublic.h" -#include "H5Tpublic.h" +#include "H5public.h" /* Generic Functions */ +#include "H5Lpublic.h" /* Links */ +#include "H5Opublic.h" /* Object headers */ +#include "H5Tpublic.h" /* Datatypes */ /*****************/ /* Public Macros */ @@ -107,11 +107,9 @@ static herr_t H5L_create_hard(H5G_loc_t *cur_loc, const char *cur_name, 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_linkval_cb(H5G_loc_t *grp_loc/*in*/, const char *name, +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_linkval(H5G_loc_t *loc, const char *name, size_t size, - void *buf/*out*/, hid_t lapl_id, hid_t dxpl_id); static herr_t H5L_unlink_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*/); @@ -732,7 +730,7 @@ done: /*------------------------------------------------------------------------- - * Function: H5Lget_linkval + * Function: H5Lget_val * * Purpose: Returns the link value of a link whose name is NAME. For * symbolic links, this is the path to which the link points, @@ -751,13 +749,13 @@ done: *------------------------------------------------------------------------- */ herr_t -H5Lget_linkval(hid_t loc_id, const char *name, size_t size, void *buf/*out*/, +H5Lget_val(hid_t loc_id, const char *name, size_t size, void *buf/*out*/, hid_t lapl_id) { H5G_loc_t loc; herr_t ret_value = SUCCEED; /* Return value */ - FUNC_ENTER_API(H5Lget_linkval, FAIL) + FUNC_ENTER_API(H5Lget_val, FAIL) H5TRACE5("e","iszxi",loc_id,name,size,buf,lapl_id); /* Check arguments */ @@ -767,12 +765,12 @@ H5Lget_linkval(hid_t loc_id, const char *name, size_t size, void *buf/*out*/, HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no name specified") /* Get the link value */ - if(H5L_linkval(&loc, name, size, buf, lapl_id, H5AC_ind_dxpl_id) < 0) + if(H5L_get_val(&loc, name, size, buf, lapl_id, H5AC_ind_dxpl_id) < 0) HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "unable to get link value") done: FUNC_LEAVE_API(ret_value) -} /* end H5Lget_linkval() */ +} /* end H5Lget_val() */ /*------------------------------------------------------------------------- @@ -1438,7 +1436,7 @@ done: /*------------------------------------------------------------------------- - * Function: H5L_linkval_cb + * Function: H5L_get_val_cb * * Purpose: Callback for retrieving link value or udata. * @@ -1450,14 +1448,14 @@ done: *------------------------------------------------------------------------- */ static herr_t -H5L_linkval_cb(H5G_loc_t UNUSED *grp_loc/*in*/, const char UNUSED *name, const H5O_link_t *lnk, +H5L_get_val_cb(H5G_loc_t UNUSED *grp_loc/*in*/, const char UNUSED *name, const H5O_link_t *lnk, H5G_loc_t UNUSED *obj_loc, void *_udata/*in,out*/, H5G_own_loc_t *own_loc/*out*/) { H5L_trav_ud4_t *udata = (H5L_trav_ud4_t *)_udata; /* User data passed in */ const H5L_class_t *link_class; /* User-defined link class */ herr_t ret_value = SUCCEED; /* Return value */ - FUNC_ENTER_NOAPI_NOINIT(H5L_linkval_cb) + FUNC_ENTER_NOAPI_NOINIT(H5L_get_val_cb) /* Check if the name in this group resolved to a valid link */ if(lnk == NULL) @@ -1496,11 +1494,11 @@ done: *own_loc = H5G_OWN_NONE; FUNC_LEAVE_NOAPI(ret_value) -} /* end H5L_linkval_cb() */ +} /* end H5L_get_val_cb() */ /*------------------------------------------------------------------------- - * Function: H5L_linkval + * Function: H5L_get_val * * Purpose: Returns the value of a symbolic link or the udata for a * user-defined link. @@ -1518,25 +1516,25 @@ done: * *------------------------------------------------------------------------- */ -static herr_t -H5L_linkval(H5G_loc_t *loc, const char *name, size_t size, void *buf/*out*/, hid_t lapl_id, hid_t dxpl_id) +herr_t +H5L_get_val(H5G_loc_t *loc, const char *name, size_t size, void *buf/*out*/, hid_t lapl_id, hid_t dxpl_id) { H5L_trav_ud4_t udata; /* User data for callback */ herr_t ret_value = SUCCEED; /* Return value */ - FUNC_ENTER_NOAPI_NOINIT(H5L_linkval) + FUNC_ENTER_NOAPI_NOINIT(H5L_get_val) /* Set up user data for retrieving information */ udata.size = size; udata.buf = buf; /* Traverse the group hierarchy to locate the object to get info about */ - if(H5G_traverse(loc, name, H5G_TARGET_SLINK | H5G_TARGET_UDLINK, H5L_linkval_cb, &udata, lapl_id, dxpl_id) < 0) + if(H5G_traverse(loc, name, H5G_TARGET_SLINK | H5G_TARGET_UDLINK, H5L_get_val_cb, &udata, lapl_id, dxpl_id) < 0) HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "name doesn't exist") done: FUNC_LEAVE_NOAPI(ret_value) -} /* H5L_linkval() */ +} /* H5L_get_val() */ /*------------------------------------------------------------------------- diff --git a/src/H5Lprivate.h b/src/H5Lprivate.h index d41a18a..d70835c 100644 --- a/src/H5Lprivate.h +++ b/src/H5Lprivate.h @@ -55,12 +55,14 @@ /******************************/ /* General operations on links */ +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 hid_t H5L_get_default_lcpl(void); 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_init(void); +H5_DLL herr_t H5L_get_val(H5G_loc_t *loc, const char *name, size_t size, + void *buf/*out*/, hid_t lapl_id, hid_t dxpl_id); H5_DLL herr_t H5L_register_external(void); /* User-defined link functions */ diff --git a/src/H5Lpublic.h b/src/H5Lpublic.h index 12162bf..64955ca 100644 --- a/src/H5Lpublic.h +++ b/src/H5Lpublic.h @@ -26,9 +26,10 @@ #define _H5Lpublic_H /* Public headers needed by this file */ -#include "H5public.h" -#include "H5Ipublic.h" -#include "H5Tpublic.h" +#include "H5public.h" /* Generic Functions */ +#include "H5Ipublic.h" /* IDs */ +#include "H5Ppublic.h" /* Property lists */ +#include "H5Tpublic.h" /* Datatypes */ /*****************/ /* Public Macros */ @@ -139,7 +140,7 @@ H5_DLL herr_t H5Lcreate_hard(hid_t cur_loc, const char *cur_name, H5_DLL herr_t H5Lcreate_soft(const char *target_path, hid_t cur_loc, const char *cur_name, hid_t lcpl_id, hid_t lapl_id); H5_DLL herr_t H5Lunlink(hid_t loc_id, const char *name, hid_t lapl_id); -H5_DLL herr_t H5Lget_linkval(hid_t loc_id, const char *name, size_t size, +H5_DLL herr_t H5Lget_val(hid_t loc_id, const char *name, size_t size, void *buf/*out*/, hid_t lapl_id); H5_DLL herr_t H5Lget_info(hid_t loc_id, const char *name, H5L_info_t *linkbuf /*out*/, hid_t lapl_id); diff --git a/test/links.c b/test/links.c index 6a87637..bf15bc6 100644 --- a/test/links.c +++ b/test/links.c @@ -306,7 +306,7 @@ cklinks(hid_t fapl, hbool_t new_format) puts(" expected file location."); TEST_ERROR } - if (H5Lget_linkval(file, "grp1/soft", sizeof linkval, linkval, H5P_DEFAULT) < 0) TEST_ERROR + if (H5Lget_val(file, "grp1/soft", sizeof linkval, linkval, H5P_DEFAULT) < 0) TEST_ERROR if (HDstrcmp(linkval, "/d1")) { H5_FAILED(); puts(" Soft link test failed. Wrong link value"); @@ -1601,7 +1601,7 @@ external_link_root(hid_t fapl, hbool_t new_format) puts(" Unexpected object type - should have been an external link"); goto error; } - if(H5Lget_linkval(fid, "ext_link", sizeof(objname), objname, H5P_DEFAULT) < 0) TEST_ERROR + if(H5Lget_val(fid, "ext_link", sizeof(objname), objname, H5P_DEFAULT) < 0) TEST_ERROR if(H5Lunpack_elink_val(objname, sb.linklen, &file, &path) < 0) TEST_ERROR if(HDstrcmp(file, filename1)) { @@ -2625,7 +2625,7 @@ external_link_query(hid_t fapl, hbool_t new_format) } /* Get information for external link. It should be two strings right after each other */ - if(H5Lget_linkval(fid, "src", (size_t)NAME_BUF_SIZE, query_buf, H5P_DEFAULT) < 0) TEST_ERROR + if(H5Lget_val(fid, "src", (size_t)NAME_BUF_SIZE, query_buf, H5P_DEFAULT) < 0) TEST_ERROR /* Extract the file and object names from the buffer */ if(H5Lunpack_elink_val(query_buf, li.u.link_size, &file_name, &object_name) < 0) TEST_ERROR @@ -4744,7 +4744,7 @@ ud_link_errors(hid_t fapl, hbool_t new_format) if(li.u.link_size != 0) TEST_ERROR /* ...but fail when we try to write data to the buffer itself*/ H5E_BEGIN_TRY { - if(H5Lget_linkval(fid, "ud_link", (size_t)NAME_BUF_SIZE, query_buf, H5P_DEFAULT) >=0) TEST_ERROR + if(H5Lget_val(fid, "ud_link", (size_t)NAME_BUF_SIZE, query_buf, H5P_DEFAULT) >=0) TEST_ERROR } H5E_END_TRY /* Register a new class */ @@ -4753,7 +4753,7 @@ ud_link_errors(hid_t fapl, hbool_t new_format) /* Now querying should succeed */ if(H5Lget_info(fid, "ud_link", &li, H5P_DEFAULT) < 0) TEST_ERROR if(li.u.link_size != 8) TEST_ERROR - if(H5Lget_linkval(fid, "ud_link", (size_t)NAME_BUF_SIZE, query_buf, H5P_DEFAULT) < 0) TEST_ERROR + if(H5Lget_val(fid, "ud_link", (size_t)NAME_BUF_SIZE, query_buf, H5P_DEFAULT) < 0) TEST_ERROR if(HDstrcmp(query_buf, "succeed") != 0) TEST_ERROR /* Moving and copying should both succeed */ @@ -4926,8 +4926,8 @@ lapl_nlinks(hid_t fapl, hbool_t new_format) /* H5Lunlink */ if(H5Lunlink(fid, "soft17/soft_link", plist) < 0) TEST_ERROR - /* H5Lget_linkval and H5Lget_info */ - if(H5Lget_linkval(fid, "soft17", (size_t)0, NULL, plist) < 0) TEST_ERROR + /* H5Lget_val and H5Lget_info */ + if(H5Lget_val(fid, "soft17", (size_t)0, NULL, plist) < 0) TEST_ERROR if(H5Lget_info(fid, "soft17", NULL, plist) < 0) TEST_ERROR /* H5Lcreate_external and H5Lcreate_ud */ diff --git a/test/objcopy.c b/test/objcopy.c index 8e6dbd2..890aef2 100755 --- a/test/objcopy.c +++ b/test/objcopy.c @@ -1144,8 +1144,8 @@ compare_groups(hid_t gid, hid_t gid2, hid_t pid, int depth) char linkname2[NAME_BUF_SIZE]; /* Link value */ /* Check link values */ - if(H5Lget_linkval(gid, objname, (size_t)NAME_BUF_SIZE, linkname, H5P_DEFAULT) < 0) TEST_ERROR - if(H5Lget_linkval(gid2, objname2, (size_t)NAME_BUF_SIZE, linkname2, H5P_DEFAULT) < 0) TEST_ERROR + if(H5Lget_val(gid, objname, (size_t)NAME_BUF_SIZE, linkname, H5P_DEFAULT) < 0) TEST_ERROR + if(H5Lget_val(gid2, objname2, (size_t)NAME_BUF_SIZE, linkname2, H5P_DEFAULT) < 0) TEST_ERROR if(HDstrcmp(linkname, linkname2)) TEST_ERROR } break; @@ -1199,8 +1199,8 @@ compare_groups(hid_t gid, hid_t gid2, hid_t pid, int depth) if(linfo.u.link_size != linfo2.u.link_size) TEST_ERROR /* Get link udata */ - if(H5Lget_linkval(gid, objname, (size_t)NAME_BUF_SIZE, linkval, H5P_DEFAULT) < 0) TEST_ERROR - if(H5Lget_linkval(gid2, objname2, (size_t)NAME_BUF_SIZE, linkval2, H5P_DEFAULT) < 0) TEST_ERROR + if(H5Lget_val(gid, objname, (size_t)NAME_BUF_SIZE, linkval, H5P_DEFAULT) < 0) TEST_ERROR + if(H5Lget_val(gid2, objname2, (size_t)NAME_BUF_SIZE, linkval2, H5P_DEFAULT) < 0) TEST_ERROR /* Compare link udata */ if(HDmemcmp(linkval, linkval2, objstat.linklen)) TEST_ERROR diff --git a/tools/h5dump/h5dump.c b/tools/h5dump/h5dump.c index 2dc89a6..45e90b7 100644 --- a/tools/h5dump/h5dump.c +++ b/tools/h5dump/h5dump.c @@ -1456,7 +1456,7 @@ dump_all(hid_t group, const char *name, void * op_data) indentation(indent + COL); } - if (H5Lget_linkval(group, name, statbuf.linklen, targbuf, H5P_DEFAULT) < 0) { + if (H5Lget_val(group, name, statbuf.linklen, targbuf, H5P_DEFAULT) < 0) { error_msg(progname, "unable to get link value\n"); d_status = EXIT_FAILURE; ret = FAIL; @@ -1555,7 +1555,7 @@ dump_all(hid_t group, const char *name, void * op_data) begin_obj(dump_header_format->extlinkbegin, name, dump_header_format->extlinkblockbegin); } - if (H5Lget_linkval(group, name, statbuf.linklen, targbuf, H5P_DEFAULT) < 0) { + if (H5Lget_val(group, name, statbuf.linklen, targbuf, H5P_DEFAULT) < 0) { error_msg(progname, "unable to get external link value\n"); d_status = EXIT_FAILURE; ret = FAIL; @@ -3227,7 +3227,7 @@ handle_links(hid_t fid, char *links, void UNUSED * data) dump_header_format->softlinkblockbegin); indentation(COL); - if(H5Lget_linkval(fid, links, statbuf.linklen, buf, H5P_DEFAULT) >= 0) { + if(H5Lget_val(fid, links, statbuf.linklen, buf, H5P_DEFAULT) >= 0) { printf("LINKTARGET \"%s\"\n", buf); } else { error_msg(progname, "h5dump error: unable to get link value for \"%s\"\n", @@ -3247,7 +3247,7 @@ handle_links(hid_t fid, char *links, void UNUSED * data) case H5L_TYPE_EXTERNAL: begin_obj(dump_header_format->extlinkbegin, links, dump_header_format->extlinkblockbegin); - if (H5Lget_linkval(fid, links, statbuf.linklen, buf, H5P_DEFAULT) >= 0) { + if(H5Lget_val(fid, links, statbuf.linklen, buf, H5P_DEFAULT) >= 0) { if(H5Lunpack_elink_val(buf, statbuf.linklen, &elink_file, &elink_path)>=0) { indentation(COL); printf("LINKCLASS %d\n", linfo.type); diff --git a/tools/h5ls/h5ls.c b/tools/h5ls/h5ls.c index effab89..e5117dc 100644 --- a/tools/h5ls/h5ls.c +++ b/tools/h5ls/h5ls.c @@ -1720,11 +1720,11 @@ slink_open(hid_t location, const char *name) { char buf[64]; - if (H5Lget_linkval (location, name, sizeof(buf), buf, H5P_DEFAULT)<0) return -1; - if (NULL==HDmemchr(buf, 0, sizeof(buf))) { - strcpy(buf+sizeof(buf)-4, "..."); - } - fputs(buf, stdout); + if(H5Lget_val(location, name, sizeof(buf), buf, H5P_DEFAULT) < 0) + return -1; + if(NULL == HDmemchr(buf, 0, sizeof(buf))) + HDstrcpy(buf + sizeof(buf) - 4, "..."); + HDfputs(buf, stdout); return 0; } @@ -1755,30 +1755,33 @@ udlink_open(hid_t location, const char *name) char * filename = NULL; char * path = NULL; - if(H5Lget_info(location, name, &linfo, H5P_DEFAULT) < 0) return -1; + if(H5Lget_info(location, name, &linfo, H5P_DEFAULT) < 0) + return -1; switch(linfo.type) { - /* For external links, try to display info for the object it points to */ - case H5L_TYPE_EXTERNAL: - if ((buf = HDmalloc(linfo.u.link_size))==NULL) goto error; - if (H5Lget_linkval (location, name, sizeof(buf), buf, H5P_DEFAULT)<0) goto error; - - if(H5Lunpack_elink_val(buf, linfo.u.link_size, &filename, &path) < 0) goto error; - fputs("file: ", stdout); - fputs(filename, stdout); - fputs(" path: ", stdout); - fputs(path, stdout); - break; - - default: - fputs("cannot follow UD links", stdout); + /* For external links, try to display info for the object it points to */ + case H5L_TYPE_EXTERNAL: + if((buf = HDmalloc(linfo.u.link_size)) == NULL) + goto error; + if(H5Lget_val(location, name, sizeof(buf), buf, H5P_DEFAULT) < 0) + goto error; + + if(H5Lunpack_elink_val(buf, linfo.u.link_size, &filename, &path) < 0) goto error; + HDfputs("file: ", stdout); + HDfputs(filename, stdout); + HDfputs(" path: ", stdout); + HDfputs(path, stdout); + break; + + default: + HDfputs("cannot follow UD links", stdout); } return 0; error: if(buf) - HDfree(buf); + HDfree(buf); return -1; } diff --git a/tools/lib/h5diff.c b/tools/lib/h5diff.c index 5fa88bd..7070898 100644 --- a/tools/lib/h5diff.c +++ b/tools/lib/h5diff.c @@ -1090,12 +1090,12 @@ hsize_t diff (hid_t file1_id, buf1 = HDmalloc (li1.u.link_size); buf2 = HDmalloc (li2.u.link_size); - if (H5Lget_linkval (file1_id, path1, li1.u.link_size, buf1, H5P_DEFAULT) < 0) + if(H5Lget_val(file1_id, path1, li1.u.link_size, buf1, H5P_DEFAULT) < 0) { HDfree (buf1); HDfree (buf2); goto out; } - if (H5Lget_linkval (file2_id, path2, li2.u.link_size, buf2, H5P_DEFAULT) < 0) + if(H5Lget_val(file2_id, path2, li2.u.link_size, buf2, H5P_DEFAULT) < 0) { HDfree (buf1); HDfree (buf2); goto out; @@ -1104,12 +1104,12 @@ hsize_t diff (hid_t file1_id, /* If the buffers are the same size, compare them */ if(li1.u.link_size == li2.u.link_size) { - if (H5Lget_linkval (file1_id, path1, li1.u.link_size, buf1, H5P_DEFAULT) < 0) + if(H5Lget_val(file1_id, path1, li1.u.link_size, buf1, H5P_DEFAULT) < 0) { HDfree (buf1); HDfree (buf2); goto out; } - if (H5Lget_linkval (file2_id, path2, li2.u.link_size, buf2, H5P_DEFAULT) < 0) + if(H5Lget_val(file2_id, path2, li2.u.link_size, buf2, H5P_DEFAULT) < 0) { HDfree (buf1); HDfree (buf2); goto out; |