2003-02-17 23:54:15 +08:00
|
|
|
|
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
2007-02-07 22:56:24 +08:00
|
|
|
|
* Copyright by The HDF Group. *
|
2003-02-17 23:54:15 +08:00
|
|
|
|
* Copyright by the Board of Trustees of the University of Illinois. *
|
|
|
|
|
* All rights reserved. *
|
|
|
|
|
* *
|
|
|
|
|
* This file is part of HDF5. The full HDF5 copyright notice, including *
|
|
|
|
|
* terms governing use, modification, and redistribution, is contained in *
|
|
|
|
|
* the files COPYING and Copyright.html. COPYING can be found at the root *
|
|
|
|
|
* of the source code distribution tree; Copyright.html can be found at the *
|
|
|
|
|
* root level of an installed copy of the electronic HDF5 document set and *
|
|
|
|
|
* is linked from the top-level documents page. It can also be found at *
|
2007-02-07 22:56:24 +08:00
|
|
|
|
* http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have *
|
|
|
|
|
* access to either file, you may request a copy from help@hdfgroup.org. *
|
2003-02-17 23:54:15 +08:00
|
|
|
|
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
|
1998-04-24 06:24:38 +08:00
|
|
|
|
|
2006-11-27 22:51:22 +08:00
|
|
|
|
/****************/
|
|
|
|
|
/* Module Setup */
|
|
|
|
|
/****************/
|
|
|
|
|
|
1998-06-06 05:03:49 +08:00
|
|
|
|
#define H5A_PACKAGE /*suppress error about including H5Apkg */
|
2006-12-12 03:02:38 +08:00
|
|
|
|
#define H5O_PACKAGE /*suppress error about including H5Opkg */
|
1998-04-24 06:24:38 +08:00
|
|
|
|
|
2004-06-23 23:36:35 +08:00
|
|
|
|
/* Interface initialization */
|
|
|
|
|
#define H5_INTERFACE_INIT_FUNC H5A_init_interface
|
|
|
|
|
|
2003-07-09 22:34:35 +08:00
|
|
|
|
|
2006-11-27 22:51:22 +08:00
|
|
|
|
/***********/
|
|
|
|
|
/* Headers */
|
|
|
|
|
/***********/
|
2001-04-06 01:29:14 +08:00
|
|
|
|
#include "H5private.h" /* Generic Functions */
|
2003-02-17 23:54:15 +08:00
|
|
|
|
#include "H5Apkg.h" /* Attributes */
|
2006-12-16 05:28:17 +08:00
|
|
|
|
#include "H5Opkg.h" /* Object headers */
|
2001-04-06 01:29:14 +08:00
|
|
|
|
#include "H5Eprivate.h" /* Error handling */
|
2004-11-18 00:53:38 +08:00
|
|
|
|
#include "H5FLprivate.h" /* Free Lists */
|
2003-02-17 23:54:15 +08:00
|
|
|
|
#include "H5Iprivate.h" /* IDs */
|
2001-04-06 01:29:14 +08:00
|
|
|
|
#include "H5MMprivate.h" /* Memory management */
|
2004-12-29 22:26:20 +08:00
|
|
|
|
#include "H5Sprivate.h" /* Dataspace functions */
|
2006-11-14 04:41:36 +08:00
|
|
|
|
#include "H5SMprivate.h" /* Shared Object Header Messages */
|
1998-04-24 06:24:38 +08:00
|
|
|
|
|
2006-11-27 22:51:22 +08:00
|
|
|
|
/****************/
|
|
|
|
|
/* Local Macros */
|
|
|
|
|
/****************/
|
|
|
|
|
|
|
|
|
|
/* The number of reserved IDs in dataset ID group */
|
|
|
|
|
#define H5A_RESERVED_ATOMS 0
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/******************/
|
|
|
|
|
/* Local Typedefs */
|
|
|
|
|
/******************/
|
|
|
|
|
|
|
|
|
|
/* Object header iterator callbacks */
|
|
|
|
|
/* Data structure for callback for locating the index by name */
|
|
|
|
|
typedef struct H5A_iter_cb1 {
|
|
|
|
|
const char *name;
|
|
|
|
|
int idx;
|
|
|
|
|
} H5A_iter_cb1;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/********************/
|
|
|
|
|
/* Package Typedefs */
|
|
|
|
|
/********************/
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/********************/
|
|
|
|
|
/* Local Prototypes */
|
|
|
|
|
/********************/
|
|
|
|
|
|
2005-11-15 10:55:39 +08:00
|
|
|
|
static hid_t H5A_create(const H5G_loc_t *loc, const char *name,
|
2006-12-12 03:02:38 +08:00
|
|
|
|
const H5T_t *type, const H5S_t *space, hid_t acpl_id, hid_t dxpl_id);
|
2006-12-19 09:59:28 +08:00
|
|
|
|
static herr_t H5A_open_common(const H5G_loc_t *loc, H5A_t *attr);
|
2007-02-15 03:32:01 +08:00
|
|
|
|
static H5A_t *H5A_open_by_idx(const H5G_loc_t *loc, const char *obj_name,
|
|
|
|
|
H5_index_t idx_type, H5_iter_order_t order, hsize_t n, hid_t lapl_id, hid_t dxpl_id);
|
2007-02-20 10:28:41 +08:00
|
|
|
|
static H5A_t *H5A_open_by_name(const H5G_loc_t *loc, const char *obj_name,
|
|
|
|
|
const char *attr_name, hid_t lapl_id, hid_t dxpl_id);
|
2003-02-11 01:26:09 +08:00
|
|
|
|
static herr_t H5A_write(H5A_t *attr, const H5T_t *mem_type, const void *buf, hid_t dxpl_id);
|
2003-07-09 05:05:27 +08:00
|
|
|
|
static herr_t H5A_read(const H5A_t *attr, const H5T_t *mem_type, void *buf, hid_t dxpl_id);
|
|
|
|
|
static hsize_t H5A_get_storage_size(const H5A_t *attr);
|
2007-02-07 04:03:06 +08:00
|
|
|
|
static herr_t H5A_get_info(const H5A_t *attr, H5A_info_t *ainfo);
|
2004-11-23 01:14:11 +08:00
|
|
|
|
|
2006-11-27 22:51:22 +08:00
|
|
|
|
|
|
|
|
|
/*********************/
|
|
|
|
|
/* Package Variables */
|
|
|
|
|
/*********************/
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*****************************/
|
|
|
|
|
/* Library Private Variables */
|
|
|
|
|
/*****************************/
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*******************/
|
|
|
|
|
/* Local Variables */
|
|
|
|
|
/*******************/
|
2003-05-09 04:09:07 +08:00
|
|
|
|
|
2004-11-18 00:53:38 +08:00
|
|
|
|
/* Declare the free lists for H5A_t's */
|
|
|
|
|
H5FL_DEFINE(H5A_t);
|
|
|
|
|
|
2004-11-23 03:53:17 +08:00
|
|
|
|
/* Declare a free list to manage blocks of type conversion data */
|
|
|
|
|
H5FL_BLK_DEFINE(attr_buf);
|
|
|
|
|
|
2006-11-27 22:51:22 +08:00
|
|
|
|
|
|
|
|
|
/*-------------------------------------------------------------------------
|
|
|
|
|
* Function: H5A_init
|
|
|
|
|
*
|
|
|
|
|
* Purpose: Initialize the interface from some other package.
|
|
|
|
|
*
|
|
|
|
|
* Return: Success: non-negative
|
|
|
|
|
* Failure: negative
|
|
|
|
|
*
|
|
|
|
|
* Programmer: Quincey Koziol
|
|
|
|
|
* Monday, November 27, 2006
|
|
|
|
|
*
|
|
|
|
|
*-------------------------------------------------------------------------
|
|
|
|
|
*/
|
|
|
|
|
herr_t
|
|
|
|
|
H5A_init(void)
|
|
|
|
|
{
|
|
|
|
|
herr_t ret_value = SUCCEED; /* Return value */
|
|
|
|
|
|
|
|
|
|
FUNC_ENTER_NOAPI(H5A_init, FAIL)
|
|
|
|
|
/* FUNC_ENTER() does all the work */
|
|
|
|
|
|
|
|
|
|
done:
|
|
|
|
|
FUNC_LEAVE_NOAPI(ret_value)
|
|
|
|
|
} /* end H5A_init() */
|
|
|
|
|
|
1998-04-24 06:24:38 +08:00
|
|
|
|
|
|
|
|
|
/*--------------------------------------------------------------------------
|
|
|
|
|
NAME
|
|
|
|
|
H5A_init_interface -- Initialize interface-specific information
|
|
|
|
|
USAGE
|
|
|
|
|
herr_t H5A_init_interface()
|
2005-08-14 04:53:35 +08:00
|
|
|
|
|
1998-04-24 06:24:38 +08:00
|
|
|
|
RETURNS
|
1998-10-27 05:18:54 +08:00
|
|
|
|
Non-negative on success/Negative on failure
|
1998-04-24 06:24:38 +08:00
|
|
|
|
DESCRIPTION
|
|
|
|
|
Initializes any interface-specific data or routines.
|
|
|
|
|
|
|
|
|
|
--------------------------------------------------------------------------*/
|
|
|
|
|
static herr_t
|
|
|
|
|
H5A_init_interface(void)
|
|
|
|
|
{
|
2005-11-15 10:55:39 +08:00
|
|
|
|
herr_t ret_value = SUCCEED; /* Return value */
|
2002-08-09 00:52:55 +08:00
|
|
|
|
|
2003-12-07 04:38:31 +08:00
|
|
|
|
FUNC_ENTER_NOAPI_NOINIT(H5A_init_interface)
|
1998-04-24 06:24:38 +08:00
|
|
|
|
|
|
|
|
|
/*
|
2006-01-03 03:20:19 +08:00
|
|
|
|
* Create attribute ID type.
|
1998-04-24 06:24:38 +08:00
|
|
|
|
*/
|
2005-11-15 10:55:39 +08:00
|
|
|
|
if(H5I_register_type(H5I_ATTR, (size_t)H5I_ATTRID_HASHSIZE, H5A_RESERVED_ATOMS, (H5I_free_t)H5A_close) < H5I_FILE)
|
2003-07-09 05:05:27 +08:00
|
|
|
|
HGOTO_ERROR(H5E_INTERNAL, H5E_CANTINIT, FAIL, "unable to initialize interface")
|
2005-08-14 04:53:35 +08:00
|
|
|
|
|
2002-08-09 00:52:55 +08:00
|
|
|
|
done:
|
2003-07-09 05:05:27 +08:00
|
|
|
|
FUNC_LEAVE_NOAPI(ret_value)
|
2006-11-02 12:54:19 +08:00
|
|
|
|
} /* end H5A_init_interface() */
|
1998-04-24 06:24:38 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*--------------------------------------------------------------------------
|
|
|
|
|
NAME
|
|
|
|
|
H5A_term_interface
|
|
|
|
|
PURPOSE
|
|
|
|
|
Terminate various H5A objects
|
|
|
|
|
USAGE
|
|
|
|
|
void H5A_term_interface()
|
|
|
|
|
RETURNS
|
|
|
|
|
DESCRIPTION
|
|
|
|
|
Release any other resources allocated.
|
|
|
|
|
GLOBAL VARIABLES
|
|
|
|
|
COMMENTS, BUGS, ASSUMPTIONS
|
|
|
|
|
Can't report errors...
|
|
|
|
|
EXAMPLES
|
|
|
|
|
REVISION LOG
|
|
|
|
|
--------------------------------------------------------------------------*/
|
2001-08-15 06:09:56 +08:00
|
|
|
|
int
|
1999-03-30 19:38:34 +08:00
|
|
|
|
H5A_term_interface(void)
|
1998-04-24 06:24:38 +08:00
|
|
|
|
{
|
2006-12-12 08:57:10 +08:00
|
|
|
|
int n = 0;
|
2002-05-29 02:17:12 +08:00
|
|
|
|
|
2003-12-07 04:38:31 +08:00
|
|
|
|
FUNC_ENTER_NOAPI_NOINIT_NOFUNC(H5A_term_interface)
|
2005-08-14 04:53:35 +08:00
|
|
|
|
|
2005-11-15 10:55:39 +08:00
|
|
|
|
if(H5_interface_initialize_g) {
|
|
|
|
|
if((n = H5I_nmembers(H5I_ATTR))>0) {
|
2004-12-29 22:26:20 +08:00
|
|
|
|
(void)H5I_clear_type(H5I_ATTR, FALSE);
|
1999-03-30 19:38:34 +08:00
|
|
|
|
} else {
|
2004-12-29 22:26:20 +08:00
|
|
|
|
(void)H5I_dec_type_ref(H5I_ATTR);
|
2004-06-23 23:36:35 +08:00
|
|
|
|
H5_interface_initialize_g = 0;
|
1999-03-30 19:38:34 +08:00
|
|
|
|
n = 1;
|
|
|
|
|
}
|
1998-11-21 11:36:51 +08:00
|
|
|
|
}
|
2003-07-09 05:05:27 +08:00
|
|
|
|
FUNC_LEAVE_NOAPI(n)
|
2006-12-12 08:57:10 +08:00
|
|
|
|
} /* H5A_term_interface() */
|
1998-04-24 06:24:38 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*--------------------------------------------------------------------------
|
|
|
|
|
NAME
|
|
|
|
|
H5Acreate
|
|
|
|
|
PURPOSE
|
|
|
|
|
Creates a dataset as an attribute of another dataset or group
|
|
|
|
|
USAGE
|
[svn-r529] Changes since 19980722
----------------------
./src/H5.c
Handle hid_t of type H5_TEMPBUF, arguments usually called tbuf_id.
Added array tracing where the array rank is stored in a simple
data space. Just use the name of the data space argument when
declaring the array argument:
herr_t
H5Sselect_hyperslab (hid_t space_id, H5S_seloper_t op,
const hssize_t start[/*space_id*/],
const hsize_t _stride[/*space_id*/],
const hsize_t count[/*space_id*/],
const hsize_t _block[/*space_id*/])
and when the program runs you'll see array values printed:
H5Sselect_hyperslab(space=218103813, op=H5S_SELECT_SET,
start=0xbfffef4c {0}, _stride=NULL,
count=0xbfffef44 {64},
_block=NULL) = SUCCEED;
Added more symbolic data types to the tracing output.
./src/H5A.c
./src/H5Apublic.h
./src/H5D.c
./src/H5Dpublic.h
./src/H5F.c
./src/H5Fpublic.h
./src/H5G.c
./src/H5Gpublic.h
./src/H5P.c
./src/H5Ppublic.h
./src/H5S.c
./src/H5Sall.c
./src/H5Shyper.c
./src/H5Spoint.c
./src/H5Spublic.h
./src/H5Sselect.c
./src/H5Ssimp.c
./src/H5TB.c
./src/H5V.c
Changed some API argument names to be more consistent with
other API functions and to produce better tracing output.
Reformatted some long lines. Indented printf statements.
./tools/h5ls.c
Fixed warnings about unsigned vs. signed comparisons.
1998-07-23 02:45:46 +08:00
|
|
|
|
hid_t H5Acreate (loc_id, name, type_id, space_id, plist_id)
|
1998-04-24 06:24:38 +08:00
|
|
|
|
hid_t loc_id; IN: Object (dataset or group) to be attached to
|
|
|
|
|
const char *name; IN: Name of attribute to create
|
[svn-r529] Changes since 19980722
----------------------
./src/H5.c
Handle hid_t of type H5_TEMPBUF, arguments usually called tbuf_id.
Added array tracing where the array rank is stored in a simple
data space. Just use the name of the data space argument when
declaring the array argument:
herr_t
H5Sselect_hyperslab (hid_t space_id, H5S_seloper_t op,
const hssize_t start[/*space_id*/],
const hsize_t _stride[/*space_id*/],
const hsize_t count[/*space_id*/],
const hsize_t _block[/*space_id*/])
and when the program runs you'll see array values printed:
H5Sselect_hyperslab(space=218103813, op=H5S_SELECT_SET,
start=0xbfffef4c {0}, _stride=NULL,
count=0xbfffef44 {64},
_block=NULL) = SUCCEED;
Added more symbolic data types to the tracing output.
./src/H5A.c
./src/H5Apublic.h
./src/H5D.c
./src/H5Dpublic.h
./src/H5F.c
./src/H5Fpublic.h
./src/H5G.c
./src/H5Gpublic.h
./src/H5P.c
./src/H5Ppublic.h
./src/H5S.c
./src/H5Sall.c
./src/H5Shyper.c
./src/H5Spoint.c
./src/H5Spublic.h
./src/H5Sselect.c
./src/H5Ssimp.c
./src/H5TB.c
./src/H5V.c
Changed some API argument names to be more consistent with
other API functions and to produce better tracing output.
Reformatted some long lines. Indented printf statements.
./tools/h5ls.c
Fixed warnings about unsigned vs. signed comparisons.
1998-07-23 02:45:46 +08:00
|
|
|
|
hid_t type_id; IN: ID of datatype for attribute
|
|
|
|
|
hid_t space_id; IN: ID of dataspace for attribute
|
|
|
|
|
hid_t plist_id; IN: ID of creation property list (currently not used)
|
1998-04-24 06:24:38 +08:00
|
|
|
|
RETURNS
|
1998-10-27 05:18:54 +08:00
|
|
|
|
Non-negative on success/Negative on failure
|
2005-08-14 04:53:35 +08:00
|
|
|
|
|
1998-04-24 06:24:38 +08:00
|
|
|
|
DESCRIPTION
|
|
|
|
|
This function creates an attribute which is attached to the object
|
|
|
|
|
specified with 'location_id'. The name specified with 'name' for each
|
|
|
|
|
attribute for an object must be unique for that object. The 'type_id'
|
|
|
|
|
and 'space_id' are created with the H5T and H5S interfaces respectively.
|
|
|
|
|
Currently only simple dataspaces are allowed for attribute dataspaces.
|
[svn-r529] Changes since 19980722
----------------------
./src/H5.c
Handle hid_t of type H5_TEMPBUF, arguments usually called tbuf_id.
Added array tracing where the array rank is stored in a simple
data space. Just use the name of the data space argument when
declaring the array argument:
herr_t
H5Sselect_hyperslab (hid_t space_id, H5S_seloper_t op,
const hssize_t start[/*space_id*/],
const hsize_t _stride[/*space_id*/],
const hsize_t count[/*space_id*/],
const hsize_t _block[/*space_id*/])
and when the program runs you'll see array values printed:
H5Sselect_hyperslab(space=218103813, op=H5S_SELECT_SET,
start=0xbfffef4c {0}, _stride=NULL,
count=0xbfffef44 {64},
_block=NULL) = SUCCEED;
Added more symbolic data types to the tracing output.
./src/H5A.c
./src/H5Apublic.h
./src/H5D.c
./src/H5Dpublic.h
./src/H5F.c
./src/H5Fpublic.h
./src/H5G.c
./src/H5Gpublic.h
./src/H5P.c
./src/H5Ppublic.h
./src/H5S.c
./src/H5Sall.c
./src/H5Shyper.c
./src/H5Spoint.c
./src/H5Spublic.h
./src/H5Sselect.c
./src/H5Ssimp.c
./src/H5TB.c
./src/H5V.c
Changed some API argument names to be more consistent with
other API functions and to produce better tracing output.
Reformatted some long lines. Indented printf statements.
./tools/h5ls.c
Fixed warnings about unsigned vs. signed comparisons.
1998-07-23 02:45:46 +08:00
|
|
|
|
The 'plist_id' property list is currently un-used, but will be
|
1998-04-24 06:24:38 +08:00
|
|
|
|
used int the future for optional properties of attributes. The attribute
|
|
|
|
|
ID returned from this function must be released with H5Aclose or resource
|
|
|
|
|
leaks will develop.
|
|
|
|
|
The link created (see H5G API documentation for more information on
|
|
|
|
|
link types) is a hard link, so the attribute may be shared among datasets
|
|
|
|
|
and will not be removed from the file until the reference count for the
|
|
|
|
|
attribute is reduced to zero.
|
|
|
|
|
The location object may be either a group or a dataset, both of
|
|
|
|
|
which may have any sort of attribute.
|
2005-11-15 10:55:39 +08:00
|
|
|
|
|
1998-04-24 06:24:38 +08:00
|
|
|
|
--------------------------------------------------------------------------*/
|
2003-08-19 22:44:45 +08:00
|
|
|
|
/* ARGSUSED */
|
1998-04-24 06:24:38 +08:00
|
|
|
|
hid_t
|
1998-08-28 00:48:50 +08:00
|
|
|
|
H5Acreate(hid_t loc_id, const char *name, hid_t type_id, hid_t space_id,
|
2006-01-03 03:20:19 +08:00
|
|
|
|
hid_t plist_id)
|
1998-04-24 06:24:38 +08:00
|
|
|
|
{
|
2005-11-15 10:55:39 +08:00
|
|
|
|
H5G_loc_t loc; /* Object location */
|
2006-12-12 08:57:10 +08:00
|
|
|
|
H5T_t *type; /* Datatype to use for attribute */
|
|
|
|
|
H5S_t *space; /* Dataspace to use for attribute */
|
|
|
|
|
hid_t ret_value; /* Return value */
|
1998-04-24 06:24:38 +08:00
|
|
|
|
|
2003-07-09 05:05:27 +08:00
|
|
|
|
FUNC_ENTER_API(H5Acreate, FAIL)
|
2006-12-19 03:16:17 +08:00
|
|
|
|
H5TRACE5("i", "isiii", loc_id, name, type_id, space_id, plist_id);
|
1998-04-24 06:24:38 +08:00
|
|
|
|
|
|
|
|
|
/* check arguments */
|
2007-02-09 23:32:51 +08:00
|
|
|
|
if(H5I_ATTR == H5I_get_type(loc_id))
|
2003-07-09 05:05:27 +08:00
|
|
|
|
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "location is not valid for an attribute")
|
2005-11-15 10:55:39 +08:00
|
|
|
|
if(H5G_loc(loc_id, &loc) < 0)
|
2003-07-09 05:05:27 +08:00
|
|
|
|
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location")
|
2006-12-09 06:05:52 +08:00
|
|
|
|
if(0 == (H5F_INTENT(loc.oloc->file) & H5F_ACC_RDWR))
|
|
|
|
|
HGOTO_ERROR(H5E_ARGS, H5E_WRITEERROR, FAIL, "no write intent on file")
|
2005-11-15 10:55:39 +08:00
|
|
|
|
if(!name || !*name)
|
2003-07-09 05:05:27 +08:00
|
|
|
|
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no name")
|
2006-01-03 03:59:11 +08:00
|
|
|
|
if(NULL == (type = (H5T_t *)H5I_object_verify(type_id, H5I_DATATYPE)))
|
2003-07-09 05:05:27 +08:00
|
|
|
|
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a type")
|
2006-01-03 03:59:11 +08:00
|
|
|
|
if(NULL == (space = (H5S_t *)H5I_object_verify(space_id, H5I_DATASPACE)))
|
2003-07-09 05:05:27 +08:00
|
|
|
|
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a data space")
|
1998-04-24 06:24:38 +08:00
|
|
|
|
|
|
|
|
|
/* Go do the real work for attaching the attribute to the dataset */
|
2006-12-07 06:19:52 +08:00
|
|
|
|
if((ret_value = H5A_create(&loc, name, type, space, plist_id, H5AC_dxpl_id)) < 0)
|
|
|
|
|
HGOTO_ERROR(H5E_ATTR, H5E_CANTINIT, FAIL, "unable to create attribute")
|
1998-04-24 06:24:38 +08:00
|
|
|
|
|
2002-08-09 00:52:55 +08:00
|
|
|
|
done:
|
2003-07-09 05:05:27 +08:00
|
|
|
|
FUNC_LEAVE_API(ret_value)
|
2003-08-19 22:44:45 +08:00
|
|
|
|
} /* H5Acreate() */
|
1998-04-24 06:24:38 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*-------------------------------------------------------------------------
|
|
|
|
|
* Function: H5A_create
|
|
|
|
|
*
|
2005-08-14 04:53:35 +08:00
|
|
|
|
* Purpose:
|
1998-04-24 06:24:38 +08:00
|
|
|
|
* This is the guts of the H5Acreate function.
|
|
|
|
|
* Usage:
|
|
|
|
|
* hid_t H5A_create (ent, name, type, space)
|
|
|
|
|
* const H5G_entry_t *ent; IN: Pointer to symbol table entry for object to attribute
|
|
|
|
|
* const char *name; IN: Name of attribute
|
|
|
|
|
* H5T_t *type; IN: Datatype of attribute
|
|
|
|
|
* H5S_t *space; IN: Dataspace of attribute
|
2006-01-03 03:20:19 +08:00
|
|
|
|
* hid_t acpl_id IN: Attribute creation property list
|
1998-04-24 06:24:38 +08:00
|
|
|
|
*
|
1998-10-27 05:18:54 +08:00
|
|
|
|
* Return: Non-negative on success/Negative on failure
|
1998-04-24 06:24:38 +08:00
|
|
|
|
*
|
|
|
|
|
* Programmer: Quincey Koziol
|
|
|
|
|
* April 2, 1998
|
|
|
|
|
*
|
2006-01-03 03:20:19 +08:00
|
|
|
|
* Modifications:
|
|
|
|
|
*
|
|
|
|
|
* Pedro Vicente, <pvn@ncsa.uiuc.edu> 22 Aug 2002
|
|
|
|
|
* Added a deep copy of the symbol table entry
|
|
|
|
|
*
|
|
|
|
|
* James Laird, <jlaird@ncsa.uiuc.edu> 9 Nov 2005
|
|
|
|
|
* Added Attribute Creation Property List
|
|
|
|
|
*
|
1998-04-24 06:24:38 +08:00
|
|
|
|
*-------------------------------------------------------------------------
|
|
|
|
|
*/
|
|
|
|
|
static hid_t
|
2005-11-15 10:55:39 +08:00
|
|
|
|
H5A_create(const H5G_loc_t *loc, const char *name, const H5T_t *type,
|
2006-12-12 09:49:59 +08:00
|
|
|
|
const H5S_t *space, hid_t acpl_id, hid_t dxpl_id)
|
1998-04-24 06:24:38 +08:00
|
|
|
|
{
|
2006-01-03 03:20:19 +08:00
|
|
|
|
H5A_t *attr = NULL;
|
2006-12-12 09:49:59 +08:00
|
|
|
|
htri_t tri_ret; /* htri_t return value */
|
|
|
|
|
hid_t ret_value; /* Return value */
|
1998-04-24 06:24:38 +08:00
|
|
|
|
|
2003-12-07 04:38:31 +08:00
|
|
|
|
FUNC_ENTER_NOAPI_NOINIT(H5A_create)
|
1998-04-24 06:24:38 +08:00
|
|
|
|
|
|
|
|
|
/* check args */
|
2005-11-15 10:55:39 +08:00
|
|
|
|
HDassert(loc);
|
|
|
|
|
HDassert(name);
|
|
|
|
|
HDassert(type);
|
|
|
|
|
HDassert(space);
|
1998-04-24 06:24:38 +08:00
|
|
|
|
|
2006-12-12 09:49:59 +08:00
|
|
|
|
/* Check for existing attribute with same name */
|
|
|
|
|
/* (technically, the "attribute create" operation will fail for a duplicated
|
|
|
|
|
* name, but it's going to be hard to unwind all the special cases on
|
|
|
|
|
* failure, so just check first, for now - QAK)
|
|
|
|
|
*/
|
|
|
|
|
if((tri_ret = H5O_attr_exists(loc->oloc, name, H5AC_ind_dxpl_id)) < 0)
|
|
|
|
|
HGOTO_ERROR(H5E_ATTR, H5E_NOTFOUND, FAIL, "error checking attributes")
|
|
|
|
|
else if(tri_ret > 0)
|
2004-11-23 01:14:11 +08:00
|
|
|
|
HGOTO_ERROR(H5E_ATTR, H5E_ALREADYEXISTS, FAIL, "attribute already exists")
|
|
|
|
|
|
2004-07-28 00:55:19 +08:00
|
|
|
|
/* Check if the dataspace has an extent set (or is NULL) */
|
2005-11-15 10:55:39 +08:00
|
|
|
|
if(!(H5S_has_extent(space)))
|
2004-07-28 00:55:19 +08:00
|
|
|
|
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "dataspace extent has not been set")
|
|
|
|
|
|
1998-04-24 06:24:38 +08:00
|
|
|
|
/* Build the attribute information */
|
2005-11-15 10:55:39 +08:00
|
|
|
|
if((attr = H5FL_CALLOC(H5A_t)) == NULL)
|
2003-07-09 05:05:27 +08:00
|
|
|
|
HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed for attribute info")
|
2002-08-09 00:52:55 +08:00
|
|
|
|
|
2006-01-03 03:20:19 +08:00
|
|
|
|
/* If the creation property list is H5P_DEFAULT, use the default character encoding */
|
|
|
|
|
if(acpl_id == H5P_DEFAULT)
|
2006-11-03 02:38:22 +08:00
|
|
|
|
attr->encoding = H5F_DEFAULT_CSET;
|
2006-12-09 06:05:52 +08:00
|
|
|
|
else {
|
2006-12-12 09:49:59 +08:00
|
|
|
|
H5P_genplist_t *ac_plist; /* ACPL Property list */
|
|
|
|
|
|
2006-10-11 04:36:33 +08:00
|
|
|
|
/* Get a local copy of the attribute creation property list */
|
2007-01-04 03:34:15 +08:00
|
|
|
|
if(NULL == (ac_plist = (H5P_genplist_t *)H5I_object(acpl_id)))
|
2006-10-11 04:36:33 +08:00
|
|
|
|
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a property list")
|
2006-01-03 03:20:19 +08:00
|
|
|
|
|
2006-11-03 02:38:22 +08:00
|
|
|
|
if(H5P_get(ac_plist, H5P_STRCRT_CHAR_ENCODING_NAME, &(attr->encoding)) < 0)
|
2006-10-11 04:36:33 +08:00
|
|
|
|
HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get character encoding flag")
|
|
|
|
|
} /* end else */
|
2006-01-03 03:20:19 +08:00
|
|
|
|
|
2002-08-09 00:52:55 +08:00
|
|
|
|
/* Copy the attribute name */
|
2006-09-12 23:30:32 +08:00
|
|
|
|
attr->name = H5MM_xstrdup(name);
|
2002-08-09 00:52:55 +08:00
|
|
|
|
|
|
|
|
|
/* Copy the attribute's datatype */
|
2005-11-15 10:55:39 +08:00
|
|
|
|
attr->dt = H5T_copy(type, H5T_COPY_ALL);
|
2002-08-09 00:52:55 +08:00
|
|
|
|
|
2003-08-11 20:43:04 +08:00
|
|
|
|
/* Mark any datatypes as being on disk now */
|
2005-11-15 10:55:39 +08:00
|
|
|
|
if(H5T_set_loc(attr->dt, loc->oloc->file, H5T_LOC_DISK) < 0)
|
2003-08-11 20:43:04 +08:00
|
|
|
|
HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "invalid datatype location")
|
2002-08-09 00:52:55 +08:00
|
|
|
|
|
|
|
|
|
/* Copy the dataspace for the attribute */
|
2005-11-15 10:55:39 +08:00
|
|
|
|
attr->ds = H5S_copy(space, FALSE);
|
2002-08-09 00:52:55 +08:00
|
|
|
|
|
|
|
|
|
/* Mark it initially set to initialized */
|
1998-05-01 13:16:50 +08:00
|
|
|
|
attr->initialized = TRUE; /*for now, set to false later*/
|
1998-04-24 06:24:38 +08:00
|
|
|
|
|
2005-11-15 10:55:39 +08:00
|
|
|
|
/* Copy the object header information */
|
2005-12-26 13:28:18 +08:00
|
|
|
|
if(H5O_loc_copy(&(attr->oloc), loc->oloc, H5_COPY_DEEP) < 0)
|
2003-07-09 05:05:27 +08:00
|
|
|
|
HGOTO_ERROR(H5E_ATTR, H5E_CANTOPENOBJ, FAIL, "unable to copy entry")
|
1998-04-24 06:24:38 +08:00
|
|
|
|
|
2005-11-15 10:55:39 +08:00
|
|
|
|
/* Deep copy of the group hierarchy path */
|
2005-12-26 13:28:18 +08:00
|
|
|
|
if(H5G_name_copy(&(attr->path), loc->path, H5_COPY_DEEP) < 0)
|
2005-11-15 10:55:39 +08:00
|
|
|
|
HGOTO_ERROR(H5E_ATTR, H5E_CANTOPENOBJ, FAIL, "unable to copy path")
|
|
|
|
|
|
2006-11-14 04:41:36 +08:00
|
|
|
|
/* Check if any of the pieces should be (or are already) shared in the
|
2007-01-31 09:48:28 +08:00
|
|
|
|
* SOHM table
|
|
|
|
|
*/
|
2007-01-09 07:29:49 +08:00
|
|
|
|
if(H5SM_try_share(attr->oloc.file, dxpl_id, H5O_DTYPE_ID, attr->dt) < 0)
|
2006-12-07 06:19:52 +08:00
|
|
|
|
HGOTO_ERROR(H5E_OHDR, H5E_BADMESG, FAIL, "trying to share datatype failed")
|
2007-01-09 07:29:49 +08:00
|
|
|
|
if(H5SM_try_share(attr->oloc.file, dxpl_id, H5O_SDSPACE_ID, attr->ds) < 0)
|
2006-12-07 06:19:52 +08:00
|
|
|
|
HGOTO_ERROR(H5E_OHDR, H5E_BADMESG, FAIL, "trying to share dataspace failed")
|
2003-10-06 05:12:26 +08:00
|
|
|
|
|
|
|
|
|
|
2007-01-31 02:43:28 +08:00
|
|
|
|
/* Check whether datatype is committed & increment ref count
|
|
|
|
|
* (to maintain ref. count incr/decr similarity with "shared message"
|
|
|
|
|
* type of datatype sharing)
|
|
|
|
|
*/
|
|
|
|
|
if(H5T_committed(attr->dt)) {
|
|
|
|
|
/* Increment the reference count on the shared datatype */
|
|
|
|
|
if(H5T_link(attr->dt, 1, dxpl_id) < 0)
|
|
|
|
|
HGOTO_ERROR(H5E_OHDR, H5E_LINKCOUNT, FAIL, "unable to adjust shared datatype link count")
|
|
|
|
|
} /* end if */
|
|
|
|
|
|
2006-11-14 04:41:36 +08:00
|
|
|
|
/* Compute the size of pieces on disk. This is either the size of the
|
|
|
|
|
* datatype and dataspace messages themselves, or the size of the "shared"
|
|
|
|
|
* messages if either or both of them are shared.
|
|
|
|
|
*/
|
2007-01-31 02:43:28 +08:00
|
|
|
|
attr->dt_size = H5O_msg_raw_size(attr->oloc.file, H5O_DTYPE_ID, FALSE, attr->dt);
|
|
|
|
|
attr->ds_size = H5O_msg_raw_size(attr->oloc.file, H5O_SDSPACE_ID, FALSE, attr->ds);
|
2006-11-14 04:41:36 +08:00
|
|
|
|
|
2005-11-15 10:55:39 +08:00
|
|
|
|
HDassert(attr->dt_size > 0);
|
|
|
|
|
HDassert(attr->ds_size > 0);
|
|
|
|
|
H5_ASSIGN_OVERFLOW(attr->data_size, H5S_GET_EXTENT_NPOINTS(attr->ds) * H5T_get_size(attr->dt), hssize_t, size_t);
|
1998-04-24 06:24:38 +08:00
|
|
|
|
|
|
|
|
|
/* Hold the symbol table entry (and file) open */
|
2005-11-15 10:55:39 +08:00
|
|
|
|
if(H5O_open(&(attr->oloc)) < 0)
|
2003-07-09 05:05:27 +08:00
|
|
|
|
HGOTO_ERROR(H5E_ATTR, H5E_CANTOPENOBJ, FAIL, "unable to open")
|
2005-11-15 10:55:39 +08:00
|
|
|
|
attr->obj_opened = TRUE;
|
1998-04-24 06:24:38 +08:00
|
|
|
|
|
2007-01-19 22:54:46 +08:00
|
|
|
|
/* Insert the attribute into the object header */
|
2006-12-09 06:05:52 +08:00
|
|
|
|
if(H5O_attr_create(&(attr->oloc), dxpl_id, attr) < 0)
|
|
|
|
|
HGOTO_ERROR(H5E_ATTR, H5E_CANTINSERT, FAIL, "unable to create attribute in object header")
|
1998-04-24 06:24:38 +08:00
|
|
|
|
|
|
|
|
|
/* Register the new attribute and get an ID for it */
|
2005-11-15 10:55:39 +08:00
|
|
|
|
if((ret_value = H5I_register(H5I_ATTR, attr)) < 0)
|
2003-07-09 05:05:27 +08:00
|
|
|
|
HGOTO_ERROR(H5E_ATOM, H5E_CANTREGISTER, FAIL, "unable to register attribute for ID")
|
1998-04-24 06:24:38 +08:00
|
|
|
|
|
1998-05-01 13:16:50 +08:00
|
|
|
|
/* Now it's safe to say it's uninitialized */
|
|
|
|
|
attr->initialized = FALSE;
|
|
|
|
|
|
1998-04-24 06:24:38 +08:00
|
|
|
|
done:
|
2006-12-09 06:05:52 +08:00
|
|
|
|
/* Cleanup on failure */
|
2007-02-15 03:32:01 +08:00
|
|
|
|
if(ret_value < 0)
|
|
|
|
|
if(attr && H5A_close(attr) < 0)
|
|
|
|
|
HDONE_ERROR(H5E_ATTR, H5E_CANTFREE, FAIL, "can't close attribute")
|
1998-04-24 06:24:38 +08:00
|
|
|
|
|
2003-07-09 05:05:27 +08:00
|
|
|
|
FUNC_LEAVE_NOAPI(ret_value)
|
1998-04-24 06:24:38 +08:00
|
|
|
|
} /* H5A_create() */
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*--------------------------------------------------------------------------
|
|
|
|
|
NAME
|
|
|
|
|
H5Aopen_name
|
|
|
|
|
PURPOSE
|
|
|
|
|
Opens an attribute for an object by looking up the attribute name
|
|
|
|
|
USAGE
|
|
|
|
|
hid_t H5Aopen_name (loc_id, name)
|
|
|
|
|
hid_t loc_id; IN: Object (dataset or group) to be attached to
|
|
|
|
|
const char *name; IN: Name of attribute to locate and open
|
|
|
|
|
RETURNS
|
|
|
|
|
ID of attribute on success, negative on failure
|
2005-08-14 04:53:35 +08:00
|
|
|
|
|
1998-04-24 06:24:38 +08:00
|
|
|
|
DESCRIPTION
|
|
|
|
|
This function opens an existing attribute for access. The attribute
|
|
|
|
|
name specified is used to look up the corresponding attribute for the
|
|
|
|
|
object. The attribute ID returned from this function must be released with
|
|
|
|
|
H5Aclose or resource leaks will develop.
|
|
|
|
|
The location object may be either a group or a dataset, both of
|
|
|
|
|
which may have any sort of attribute.
|
|
|
|
|
--------------------------------------------------------------------------*/
|
|
|
|
|
hid_t
|
1998-08-28 00:48:50 +08:00
|
|
|
|
H5Aopen_name(hid_t loc_id, const char *name)
|
1998-04-24 06:24:38 +08:00
|
|
|
|
{
|
2005-11-15 10:55:39 +08:00
|
|
|
|
H5G_loc_t loc; /* Object location */
|
2006-12-12 03:02:38 +08:00
|
|
|
|
H5A_t *attr = NULL; /* Attribute opened */
|
2002-08-09 00:52:55 +08:00
|
|
|
|
hid_t ret_value;
|
1998-04-24 06:24:38 +08:00
|
|
|
|
|
2003-07-09 05:05:27 +08:00
|
|
|
|
FUNC_ENTER_API(H5Aopen_name, FAIL)
|
2006-12-19 03:16:17 +08:00
|
|
|
|
H5TRACE2("i", "is", loc_id, name);
|
1998-04-24 06:24:38 +08:00
|
|
|
|
|
|
|
|
|
/* check arguments */
|
2007-02-09 23:32:51 +08:00
|
|
|
|
if(H5I_ATTR == H5I_get_type(loc_id))
|
2003-07-09 05:05:27 +08:00
|
|
|
|
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "location is not valid for an attribute")
|
2005-11-15 10:55:39 +08:00
|
|
|
|
if(H5G_loc(loc_id, &loc) < 0)
|
2003-07-09 05:05:27 +08:00
|
|
|
|
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location")
|
2005-11-15 10:55:39 +08:00
|
|
|
|
if(!name || !*name)
|
2003-07-09 05:05:27 +08:00
|
|
|
|
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no name")
|
1998-04-24 06:24:38 +08:00
|
|
|
|
|
2006-12-12 03:02:38 +08:00
|
|
|
|
/* Open the attribute on the object header */
|
2007-02-20 10:28:41 +08:00
|
|
|
|
if(NULL == (attr = H5A_open_by_name(&loc, ".", name, H5P_LINK_ACCESS_DEFAULT, H5AC_ind_dxpl_id)))
|
2006-12-12 03:02:38 +08:00
|
|
|
|
HGOTO_ERROR(H5E_ATTR, H5E_CANTOPENOBJ, FAIL, "can't open attribute")
|
1998-04-24 06:24:38 +08:00
|
|
|
|
|
2006-12-12 03:02:38 +08:00
|
|
|
|
/* Register the attribute and get an ID for it */
|
|
|
|
|
if((ret_value = H5I_register(H5I_ATTR, attr)) < 0)
|
|
|
|
|
HGOTO_ERROR(H5E_ATOM, H5E_CANTREGISTER, FAIL, "unable to register attribute for ID")
|
2005-08-14 04:53:35 +08:00
|
|
|
|
|
2002-08-09 00:52:55 +08:00
|
|
|
|
done:
|
2006-12-12 08:57:10 +08:00
|
|
|
|
/* Cleanup on failure */
|
2007-02-15 03:32:01 +08:00
|
|
|
|
if(ret_value < 0)
|
|
|
|
|
if(attr && H5A_close(attr) < 0)
|
|
|
|
|
HDONE_ERROR(H5E_ATTR, H5E_CANTFREE, FAIL, "can't close attribute")
|
2006-12-12 08:57:10 +08:00
|
|
|
|
|
2003-07-09 05:05:27 +08:00
|
|
|
|
FUNC_LEAVE_API(ret_value)
|
1998-04-24 06:24:38 +08:00
|
|
|
|
} /* H5Aopen_name() */
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*--------------------------------------------------------------------------
|
|
|
|
|
NAME
|
|
|
|
|
H5Aopen_idx
|
|
|
|
|
PURPOSE
|
|
|
|
|
Opens the n'th attribute for an object
|
|
|
|
|
USAGE
|
|
|
|
|
hid_t H5Aopen_idx (loc_id, idx)
|
2007-02-15 03:32:01 +08:00
|
|
|
|
hid_t loc_id; IN: Object that attribute is attached to
|
1998-04-24 06:24:38 +08:00
|
|
|
|
unsigned idx; IN: Index (0-based) attribute to open
|
|
|
|
|
RETURNS
|
|
|
|
|
ID of attribute on success, negative on failure
|
2005-08-14 04:53:35 +08:00
|
|
|
|
|
1998-04-24 06:24:38 +08:00
|
|
|
|
DESCRIPTION
|
|
|
|
|
This function opens an existing attribute for access. The attribute
|
|
|
|
|
index specified is used to look up the corresponding attribute for the
|
|
|
|
|
object. The attribute ID returned from this function must be released with
|
|
|
|
|
H5Aclose or resource leaks will develop.
|
|
|
|
|
The location object may be either a group or a dataset, both of
|
|
|
|
|
which may have any sort of attribute.
|
|
|
|
|
--------------------------------------------------------------------------*/
|
|
|
|
|
hid_t
|
1998-08-28 00:48:50 +08:00
|
|
|
|
H5Aopen_idx(hid_t loc_id, unsigned idx)
|
1998-04-24 06:24:38 +08:00
|
|
|
|
{
|
2005-11-15 10:55:39 +08:00
|
|
|
|
H5G_loc_t loc; /* Object location */
|
2006-12-19 09:59:28 +08:00
|
|
|
|
H5A_t *attr = NULL; /* Attribute opened */
|
2002-08-09 00:52:55 +08:00
|
|
|
|
hid_t ret_value;
|
1998-04-24 06:24:38 +08:00
|
|
|
|
|
2003-07-09 05:05:27 +08:00
|
|
|
|
FUNC_ENTER_API(H5Aopen_idx, FAIL)
|
2006-12-19 03:16:17 +08:00
|
|
|
|
H5TRACE2("i", "iIu", loc_id, idx);
|
1998-04-24 06:24:38 +08:00
|
|
|
|
|
|
|
|
|
/* check arguments */
|
2007-02-09 23:32:51 +08:00
|
|
|
|
if(H5I_ATTR == H5I_get_type(loc_id))
|
2003-07-09 05:05:27 +08:00
|
|
|
|
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "location is not valid for an attribute")
|
2005-11-15 10:55:39 +08:00
|
|
|
|
if(H5G_loc(loc_id, &loc) < 0)
|
2003-07-09 05:05:27 +08:00
|
|
|
|
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location")
|
1998-04-24 06:24:38 +08:00
|
|
|
|
|
2006-12-19 09:59:28 +08:00
|
|
|
|
/* Open the attribute in the object header */
|
2007-02-15 03:32:01 +08:00
|
|
|
|
if(NULL == (attr = H5A_open_by_idx(&loc, ".", H5_INDEX_CRT_ORDER, H5_ITER_INC, (hsize_t)idx, H5P_LINK_ACCESS_DEFAULT, H5AC_ind_dxpl_id)))
|
2006-12-19 09:59:28 +08:00
|
|
|
|
HGOTO_ERROR(H5E_ATTR, H5E_CANTOPENOBJ, FAIL, "unable to open attribute")
|
|
|
|
|
|
|
|
|
|
/* Register the attribute and get an ID for it */
|
|
|
|
|
if((ret_value = H5I_register(H5I_ATTR, attr)) < 0)
|
|
|
|
|
HGOTO_ERROR(H5E_ATOM, H5E_CANTREGISTER, FAIL, "unable to register attribute for ID")
|
2005-08-14 04:53:35 +08:00
|
|
|
|
|
2002-08-09 00:52:55 +08:00
|
|
|
|
done:
|
2006-12-19 09:59:28 +08:00
|
|
|
|
/* Cleanup on failure */
|
2007-02-15 03:32:01 +08:00
|
|
|
|
if(ret_value < 0)
|
|
|
|
|
if(attr && H5A_close(attr) < 0)
|
|
|
|
|
HDONE_ERROR(H5E_ATTR, H5E_CANTFREE, FAIL, "can't close attribute")
|
2006-12-19 09:59:28 +08:00
|
|
|
|
|
2003-07-09 05:05:27 +08:00
|
|
|
|
FUNC_LEAVE_API(ret_value)
|
1998-04-24 06:24:38 +08:00
|
|
|
|
} /* H5Aopen_idx() */
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*-------------------------------------------------------------------------
|
2006-12-19 09:59:28 +08:00
|
|
|
|
* Function: H5A_open_common
|
1998-04-24 06:24:38 +08:00
|
|
|
|
*
|
2005-08-14 04:53:35 +08:00
|
|
|
|
* Purpose:
|
2006-12-19 09:59:28 +08:00
|
|
|
|
* Finishes initializing an attributes the open
|
|
|
|
|
*
|
1998-04-24 06:24:38 +08:00
|
|
|
|
* Usage:
|
2006-12-19 09:59:28 +08:00
|
|
|
|
* herr_t H5A_open_common(loc, name, dxpl_id)
|
|
|
|
|
* const H5G_loc_t *loc; IN: Pointer to group location for object
|
|
|
|
|
* H5A_t *attr; IN/OUT: Pointer to attribute to initialize
|
1998-04-24 06:24:38 +08:00
|
|
|
|
*
|
1998-10-27 05:18:54 +08:00
|
|
|
|
* Return: Non-negative on success/Negative on failure
|
1998-04-24 06:24:38 +08:00
|
|
|
|
*
|
|
|
|
|
* Programmer: Quincey Koziol
|
2006-12-19 09:59:28 +08:00
|
|
|
|
* December 18, 2006
|
1998-04-24 06:24:38 +08:00
|
|
|
|
*
|
|
|
|
|
*-------------------------------------------------------------------------
|
|
|
|
|
*/
|
2006-12-19 09:59:28 +08:00
|
|
|
|
static herr_t
|
|
|
|
|
H5A_open_common(const H5G_loc_t *loc, H5A_t *attr)
|
1998-04-24 06:24:38 +08:00
|
|
|
|
{
|
2006-12-19 09:59:28 +08:00
|
|
|
|
herr_t ret_value = SUCCEED; /* Return value */
|
1998-04-24 06:24:38 +08:00
|
|
|
|
|
2006-12-19 09:59:28 +08:00
|
|
|
|
FUNC_ENTER_NOAPI_NOINIT(H5A_open_common)
|
1998-04-24 06:24:38 +08:00
|
|
|
|
|
|
|
|
|
/* check args */
|
2005-11-15 10:55:39 +08:00
|
|
|
|
HDassert(loc);
|
2006-12-19 09:59:28 +08:00
|
|
|
|
HDassert(attr);
|
2005-08-14 04:53:35 +08:00
|
|
|
|
|
2005-12-26 13:28:18 +08:00
|
|
|
|
#if defined(H5_USING_PURIFY) || !defined(NDEBUG)
|
|
|
|
|
/* Clear object location */
|
|
|
|
|
if(H5O_loc_reset(&(attr->oloc)) < 0)
|
|
|
|
|
HGOTO_ERROR(H5E_ATTR, H5E_CANTOPENOBJ, FAIL, "unable to reset location")
|
|
|
|
|
|
|
|
|
|
/* Clear path name */
|
|
|
|
|
if(H5G_name_reset(&(attr->path)) < 0)
|
|
|
|
|
HGOTO_ERROR(H5E_ATTR, H5E_CANTOPENOBJ, FAIL, "unable to reset path")
|
|
|
|
|
#endif /* H5_USING_PURIFY */
|
|
|
|
|
|
2002-09-25 22:50:49 +08:00
|
|
|
|
/* Deep copy of the symbol table entry */
|
2005-12-26 13:28:18 +08:00
|
|
|
|
if(H5O_loc_copy(&(attr->oloc), loc->oloc, H5_COPY_DEEP) < 0)
|
2005-11-15 10:55:39 +08:00
|
|
|
|
HGOTO_ERROR(H5E_ATTR, H5E_CANTOPENOBJ, FAIL, "unable to copy entry")
|
|
|
|
|
|
|
|
|
|
/* Deep copy of the group hier. path */
|
2005-12-26 13:28:18 +08:00
|
|
|
|
if(H5G_name_copy(&(attr->path), loc->path, H5_COPY_DEEP) < 0)
|
2003-07-09 05:05:27 +08:00
|
|
|
|
HGOTO_ERROR(H5E_ATTR, H5E_CANTOPENOBJ, FAIL, "unable to copy entry")
|
1998-04-24 06:24:38 +08:00
|
|
|
|
|
|
|
|
|
/* Hold the symbol table entry (and file) open */
|
2005-11-15 10:55:39 +08:00
|
|
|
|
if(H5O_open(&(attr->oloc)) < 0)
|
2003-07-09 05:05:27 +08:00
|
|
|
|
HGOTO_ERROR(H5E_ATTR, H5E_CANTOPENOBJ, FAIL, "unable to open")
|
2005-11-15 10:55:39 +08:00
|
|
|
|
attr->obj_opened = TRUE;
|
1998-04-24 06:24:38 +08:00
|
|
|
|
|
2006-12-19 09:59:28 +08:00
|
|
|
|
done:
|
|
|
|
|
FUNC_LEAVE_NOAPI(ret_value)
|
|
|
|
|
} /* H5A_open_common() */
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*-------------------------------------------------------------------------
|
|
|
|
|
* Function: H5A_open_by_idx
|
|
|
|
|
*
|
2007-02-15 03:32:01 +08:00
|
|
|
|
* Purpose: Open an attribute according to its index order
|
2006-12-19 09:59:28 +08:00
|
|
|
|
*
|
2007-02-15 03:32:01 +08:00
|
|
|
|
* Return: Non-negative on success/Negative on failure
|
2006-12-19 09:59:28 +08:00
|
|
|
|
*
|
|
|
|
|
* Programmer: Quincey Koziol
|
|
|
|
|
* April 2, 1998
|
|
|
|
|
*
|
|
|
|
|
*-------------------------------------------------------------------------
|
|
|
|
|
*/
|
|
|
|
|
static H5A_t *
|
2007-02-15 03:32:01 +08:00
|
|
|
|
H5A_open_by_idx(const H5G_loc_t *loc, const char *obj_name, H5_index_t idx_type,
|
|
|
|
|
H5_iter_order_t order, hsize_t n, hid_t lapl_id, hid_t dxpl_id)
|
2006-12-19 09:59:28 +08:00
|
|
|
|
{
|
2007-02-15 03:32:01 +08:00
|
|
|
|
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 */
|
2007-02-20 10:28:41 +08:00
|
|
|
|
H5A_t *attr = NULL; /* Attribute from object header */
|
|
|
|
|
H5A_t *ret_value; /* Return value */
|
2006-12-19 09:59:28 +08:00
|
|
|
|
|
|
|
|
|
FUNC_ENTER_NOAPI_NOINIT(H5A_open_by_idx)
|
|
|
|
|
|
|
|
|
|
/* check args */
|
|
|
|
|
HDassert(loc);
|
2007-02-15 03:32:01 +08:00
|
|
|
|
HDassert(obj_name);
|
|
|
|
|
|
|
|
|
|
/* 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, dxpl_id) < 0)
|
|
|
|
|
HGOTO_ERROR(H5E_ATTR, H5E_NOTFOUND, NULL, "object not found")
|
|
|
|
|
loc_found = TRUE;
|
2006-12-19 09:59:28 +08:00
|
|
|
|
|
|
|
|
|
/* Read in attribute from object header */
|
2007-02-15 03:32:01 +08:00
|
|
|
|
if(NULL == (attr = H5O_attr_open_by_idx(obj_loc.oloc, idx_type, order, n, dxpl_id)))
|
2006-12-19 09:59:28 +08:00
|
|
|
|
HGOTO_ERROR(H5E_ATTR, H5E_CANTOPENOBJ, NULL, "unable to load attribute info from object header")
|
|
|
|
|
attr->initialized = TRUE;
|
|
|
|
|
|
|
|
|
|
/* Finish initializing attribute */
|
2007-02-15 03:32:01 +08:00
|
|
|
|
if(H5A_open_common(&obj_loc, attr) < 0)
|
2006-12-19 09:59:28 +08:00
|
|
|
|
HGOTO_ERROR(H5E_ATTR, H5E_CANTINIT, NULL, "unable to initialize attribute")
|
|
|
|
|
|
|
|
|
|
/* Set return value */
|
|
|
|
|
ret_value = attr;
|
1998-04-24 06:24:38 +08:00
|
|
|
|
|
|
|
|
|
done:
|
2007-02-15 03:32:01 +08:00
|
|
|
|
/* Release resources */
|
|
|
|
|
if(loc_found && H5G_loc_free(&obj_loc) < 0)
|
|
|
|
|
HDONE_ERROR(H5E_ATTR, H5E_CANTRELEASE, NULL, "can't free location")
|
|
|
|
|
|
2006-12-09 06:05:52 +08:00
|
|
|
|
/* Cleanup on failure */
|
2007-02-15 03:32:01 +08:00
|
|
|
|
if(ret_value == NULL)
|
|
|
|
|
if(attr && H5A_close(attr) < 0)
|
|
|
|
|
HDONE_ERROR(H5E_ATTR, H5E_CANTFREE, NULL, "can't close attribute")
|
1998-04-24 06:24:38 +08:00
|
|
|
|
|
2003-07-09 05:05:27 +08:00
|
|
|
|
FUNC_LEAVE_NOAPI(ret_value)
|
2006-12-19 09:59:28 +08:00
|
|
|
|
} /* H5A_open_by_idx() */
|
1998-04-24 06:24:38 +08:00
|
|
|
|
|
2006-12-12 03:02:38 +08:00
|
|
|
|
|
|
|
|
|
/*-------------------------------------------------------------------------
|
|
|
|
|
* Function: H5A_open_by_name
|
|
|
|
|
*
|
2007-02-20 10:28:41 +08:00
|
|
|
|
* Purpose: Open an attribute in an object header, according to it's name
|
2006-12-12 03:02:38 +08:00
|
|
|
|
*
|
2007-02-20 10:28:41 +08:00
|
|
|
|
* Return: Non-negative on success/Negative on failure
|
2006-12-12 03:02:38 +08:00
|
|
|
|
*
|
|
|
|
|
* Programmer: Quincey Koziol
|
|
|
|
|
* December 11, 2006
|
|
|
|
|
*
|
|
|
|
|
*-------------------------------------------------------------------------
|
|
|
|
|
*/
|
|
|
|
|
static H5A_t *
|
2007-02-20 10:28:41 +08:00
|
|
|
|
H5A_open_by_name(const H5G_loc_t *loc, const char *obj_name, const char *attr_name,
|
|
|
|
|
hid_t lapl_id, hid_t dxpl_id)
|
2006-12-12 03:02:38 +08:00
|
|
|
|
{
|
2007-02-20 10:28:41 +08:00
|
|
|
|
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 */
|
|
|
|
|
H5A_t *attr = NULL; /* Attribute from object header */
|
|
|
|
|
H5A_t *ret_value; /* Return value */
|
2006-12-12 03:02:38 +08:00
|
|
|
|
|
|
|
|
|
FUNC_ENTER_NOAPI_NOINIT(H5A_open_by_name)
|
|
|
|
|
|
|
|
|
|
/* check args */
|
|
|
|
|
HDassert(loc);
|
2007-02-20 10:28:41 +08:00
|
|
|
|
HDassert(obj_name);
|
|
|
|
|
HDassert(attr_name);
|
|
|
|
|
|
|
|
|
|
/* 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, dxpl_id) < 0)
|
|
|
|
|
HGOTO_ERROR(H5E_ATTR, H5E_NOTFOUND, NULL, "object not found")
|
|
|
|
|
loc_found = TRUE;
|
2006-12-12 03:02:38 +08:00
|
|
|
|
|
|
|
|
|
/* Read in attribute from object header */
|
2007-02-20 10:28:41 +08:00
|
|
|
|
if(NULL == (attr = H5O_attr_open_by_name(obj_loc.oloc, attr_name, dxpl_id)))
|
2006-12-12 03:02:38 +08:00
|
|
|
|
HGOTO_ERROR(H5E_ATTR, H5E_CANTINIT, NULL, "unable to load attribute info from object header")
|
|
|
|
|
attr->initialized = TRUE;
|
|
|
|
|
|
2006-12-19 09:59:28 +08:00
|
|
|
|
/* Finish initializing attribute */
|
|
|
|
|
if(H5A_open_common(loc, attr) < 0)
|
|
|
|
|
HGOTO_ERROR(H5E_ATTR, H5E_CANTINIT, NULL, "unable to initialize attribute")
|
2006-12-12 03:02:38 +08:00
|
|
|
|
|
|
|
|
|
/* Set return value */
|
|
|
|
|
ret_value = attr;
|
|
|
|
|
|
|
|
|
|
done:
|
2007-02-20 10:28:41 +08:00
|
|
|
|
/* Release resources */
|
|
|
|
|
if(loc_found && H5G_loc_free(&obj_loc) < 0)
|
|
|
|
|
HDONE_ERROR(H5E_ATTR, H5E_CANTRELEASE, NULL, "can't free location")
|
|
|
|
|
|
2006-12-12 03:02:38 +08:00
|
|
|
|
/* Cleanup on failure */
|
2007-02-15 03:32:01 +08:00
|
|
|
|
if(ret_value == NULL)
|
|
|
|
|
if(attr && H5A_close(attr) < 0)
|
|
|
|
|
HDONE_ERROR(H5E_ATTR, H5E_CANTFREE, NULL, "can't close attribute")
|
2006-12-12 03:02:38 +08:00
|
|
|
|
|
|
|
|
|
FUNC_LEAVE_NOAPI(ret_value)
|
|
|
|
|
} /* H5A_open_by_name() */
|
|
|
|
|
|
1998-04-24 06:24:38 +08:00
|
|
|
|
|
|
|
|
|
/*--------------------------------------------------------------------------
|
|
|
|
|
NAME
|
|
|
|
|
H5Awrite
|
|
|
|
|
PURPOSE
|
|
|
|
|
Write out data to an attribute
|
|
|
|
|
USAGE
|
2006-12-12 08:57:10 +08:00
|
|
|
|
herr_t H5Awrite (attr_id, dtype_id, buf)
|
1998-04-24 06:24:38 +08:00
|
|
|
|
hid_t attr_id; IN: Attribute to write
|
2006-12-12 08:57:10 +08:00
|
|
|
|
hid_t dtype_id; IN: Memory datatype of buffer
|
2001-04-20 05:48:04 +08:00
|
|
|
|
const void *buf; IN: Buffer of data to write
|
1998-04-24 06:24:38 +08:00
|
|
|
|
RETURNS
|
1998-10-27 05:18:54 +08:00
|
|
|
|
Non-negative on success/Negative on failure
|
2005-08-14 04:53:35 +08:00
|
|
|
|
|
1998-04-24 06:24:38 +08:00
|
|
|
|
DESCRIPTION
|
|
|
|
|
This function writes a complete attribute to disk.
|
|
|
|
|
--------------------------------------------------------------------------*/
|
|
|
|
|
herr_t
|
2006-12-12 08:57:10 +08:00
|
|
|
|
H5Awrite(hid_t attr_id, hid_t dtype_id, const void *buf)
|
1998-04-24 06:24:38 +08:00
|
|
|
|
{
|
2006-12-12 08:57:10 +08:00
|
|
|
|
H5A_t *attr; /* Attribute object for ID */
|
1998-04-24 06:24:38 +08:00
|
|
|
|
const H5T_t *mem_type = NULL;
|
2006-12-12 08:57:10 +08:00
|
|
|
|
herr_t ret_value;
|
1998-04-24 06:24:38 +08:00
|
|
|
|
|
2003-07-09 05:05:27 +08:00
|
|
|
|
FUNC_ENTER_API(H5Awrite, FAIL)
|
2006-12-19 03:16:17 +08:00
|
|
|
|
H5TRACE3("e", "iix", attr_id, dtype_id, buf);
|
1998-04-24 06:24:38 +08:00
|
|
|
|
|
|
|
|
|
/* check arguments */
|
2006-01-03 03:59:11 +08:00
|
|
|
|
if(NULL == (attr = (H5A_t *)H5I_object_verify(attr_id, H5I_ATTR)))
|
2003-07-09 05:05:27 +08:00
|
|
|
|
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not an attribute")
|
2006-12-12 08:57:10 +08:00
|
|
|
|
if(NULL == (mem_type = (H5T_t *)H5I_object_verify(dtype_id, H5I_DATATYPE)))
|
2004-12-29 22:26:20 +08:00
|
|
|
|
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a datatype")
|
2005-11-15 10:55:39 +08:00
|
|
|
|
if(NULL == buf)
|
2003-07-09 05:05:27 +08:00
|
|
|
|
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "null attribute buffer")
|
1998-04-24 06:24:38 +08:00
|
|
|
|
|
|
|
|
|
/* Go write the actual data to the attribute */
|
2006-12-07 06:19:52 +08:00
|
|
|
|
if((ret_value = H5A_write(attr, mem_type, buf, H5AC_dxpl_id)) < 0)
|
2003-07-09 05:05:27 +08:00
|
|
|
|
HGOTO_ERROR(H5E_ATTR, H5E_WRITEERROR, FAIL, "unable to write attribute")
|
1998-04-24 06:24:38 +08:00
|
|
|
|
|
2002-08-09 00:52:55 +08:00
|
|
|
|
done:
|
2003-07-09 05:05:27 +08:00
|
|
|
|
FUNC_LEAVE_API(ret_value)
|
1998-04-24 06:24:38 +08:00
|
|
|
|
} /* H5Awrite() */
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*--------------------------------------------------------------------------
|
|
|
|
|
NAME
|
|
|
|
|
H5A_write
|
|
|
|
|
PURPOSE
|
|
|
|
|
Actually write out data to an attribute
|
|
|
|
|
USAGE
|
|
|
|
|
herr_t H5A_write (attr, mem_type, buf)
|
|
|
|
|
H5A_t *attr; IN: Attribute to write
|
|
|
|
|
const H5T_t *mem_type; IN: Memory datatype of buffer
|
2001-04-20 05:48:04 +08:00
|
|
|
|
const void *buf; IN: Buffer of data to write
|
1998-04-24 06:24:38 +08:00
|
|
|
|
RETURNS
|
1998-10-27 05:18:54 +08:00
|
|
|
|
Non-negative on success/Negative on failure
|
2005-08-14 04:53:35 +08:00
|
|
|
|
|
1998-04-24 06:24:38 +08:00
|
|
|
|
DESCRIPTION
|
|
|
|
|
This function writes a complete attribute to disk.
|
|
|
|
|
--------------------------------------------------------------------------*/
|
|
|
|
|
static herr_t
|
2003-02-11 01:26:09 +08:00
|
|
|
|
H5A_write(H5A_t *attr, const H5T_t *mem_type, const void *buf, hid_t dxpl_id)
|
1998-04-24 06:24:38 +08:00
|
|
|
|
{
|
2004-12-29 22:26:20 +08:00
|
|
|
|
uint8_t *tconv_buf = NULL; /* datatype conv buffer */
|
2006-12-07 06:19:52 +08:00
|
|
|
|
hbool_t tconv_owned = FALSE; /* Whether the datatype conv buffer is owned by attribute */
|
1999-03-30 19:38:34 +08:00
|
|
|
|
uint8_t *bkg_buf = NULL; /* temp conversion buffer */
|
2003-07-09 05:05:27 +08:00
|
|
|
|
hssize_t snelmts; /* elements in attribute */
|
2004-06-15 03:32:02 +08:00
|
|
|
|
size_t nelmts; /* elements in attribute */
|
1998-12-18 03:35:20 +08:00
|
|
|
|
H5T_path_t *tpath = NULL; /* conversion information*/
|
1998-04-24 06:24:38 +08:00
|
|
|
|
hid_t src_id = -1, dst_id = -1;/* temporary type atoms */
|
|
|
|
|
size_t src_type_size; /* size of source type */
|
|
|
|
|
size_t dst_type_size; /* size of destination type*/
|
2001-11-28 00:29:13 +08:00
|
|
|
|
size_t buf_size; /* desired buffer size */
|
2004-11-18 00:53:38 +08:00
|
|
|
|
herr_t ret_value = SUCCEED;
|
1998-04-24 06:24:38 +08:00
|
|
|
|
|
2003-12-07 04:38:31 +08:00
|
|
|
|
FUNC_ENTER_NOAPI_NOINIT(H5A_write)
|
1998-04-24 06:24:38 +08:00
|
|
|
|
|
2005-11-15 10:55:39 +08:00
|
|
|
|
HDassert(attr);
|
|
|
|
|
HDassert(mem_type);
|
|
|
|
|
HDassert(buf);
|
1998-04-24 06:24:38 +08:00
|
|
|
|
|
2006-12-07 06:19:52 +08:00
|
|
|
|
/* Get # of elements for attribute's dataspace */
|
2005-11-15 10:55:39 +08:00
|
|
|
|
if((snelmts = H5S_GET_EXTENT_NPOINTS(attr->ds)) < 0)
|
|
|
|
|
HGOTO_ERROR(H5E_ATTR, H5E_CANTCOUNT, FAIL, "dataspace is invalid")
|
|
|
|
|
H5_ASSIGN_OVERFLOW(nelmts, snelmts, hssize_t, size_t);
|
1998-04-24 06:24:38 +08:00
|
|
|
|
|
2006-12-07 06:19:52 +08:00
|
|
|
|
/* If there's actually data elements for the attribute, make a copy of the data passed in */
|
2005-11-15 10:55:39 +08:00
|
|
|
|
if(nelmts > 0) {
|
2004-04-18 04:31:50 +08:00
|
|
|
|
/* Get the memory and file datatype sizes */
|
|
|
|
|
src_type_size = H5T_get_size(mem_type);
|
|
|
|
|
dst_type_size = H5T_get_size(attr->dt);
|
1998-04-24 06:24:38 +08:00
|
|
|
|
|
2004-04-18 04:31:50 +08:00
|
|
|
|
/* Convert memory buffer into disk buffer */
|
|
|
|
|
/* Set up type conversion function */
|
2005-11-15 10:55:39 +08:00
|
|
|
|
if(NULL == (tpath = H5T_path_find(mem_type, attr->dt, NULL, NULL, dxpl_id, FALSE)))
|
2004-12-29 22:26:20 +08:00
|
|
|
|
HGOTO_ERROR(H5E_ATTR, H5E_UNSUPPORTED, FAIL, "unable to convert between src and dst datatypes")
|
2004-11-18 00:53:38 +08:00
|
|
|
|
|
|
|
|
|
/* Check for type conversion required */
|
2005-11-15 10:55:39 +08:00
|
|
|
|
if(!H5T_path_noop(tpath)) {
|
|
|
|
|
if((src_id = H5I_register(H5I_DATATYPE, H5T_copy(mem_type, H5T_COPY_ALL))) < 0 ||
|
|
|
|
|
(dst_id = H5I_register(H5I_DATATYPE, H5T_copy(attr->dt, H5T_COPY_ALL))) < 0)
|
2004-04-18 04:31:50 +08:00
|
|
|
|
HGOTO_ERROR(H5E_ATTR, H5E_CANTREGISTER, FAIL, "unable to register types for conversion")
|
1998-04-24 06:24:38 +08:00
|
|
|
|
|
2004-11-18 00:53:38 +08:00
|
|
|
|
/* Get the maximum buffer size needed and allocate it */
|
2005-11-15 10:55:39 +08:00
|
|
|
|
buf_size = nelmts * MAX(src_type_size, dst_type_size);
|
|
|
|
|
if(NULL == (tconv_buf = H5FL_BLK_MALLOC (attr_buf, buf_size)) || NULL == (bkg_buf = H5FL_BLK_CALLOC(attr_buf, buf_size)))
|
|
|
|
|
HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed")
|
2004-11-18 00:53:38 +08:00
|
|
|
|
|
|
|
|
|
/* Copy the user's data into the buffer for conversion */
|
2005-11-15 10:55:39 +08:00
|
|
|
|
HDmemcpy(tconv_buf, buf, (src_type_size * nelmts));
|
2004-11-18 00:53:38 +08:00
|
|
|
|
|
2004-12-29 22:26:20 +08:00
|
|
|
|
/* Perform datatype conversion */
|
2005-11-15 10:55:39 +08:00
|
|
|
|
if(H5T_convert(tpath, src_id, dst_id, nelmts, (size_t)0, (size_t)0, tconv_buf, bkg_buf, dxpl_id) < 0)
|
2004-12-29 22:26:20 +08:00
|
|
|
|
HGOTO_ERROR(H5E_ATTR, H5E_CANTENCODE, FAIL, "datatype conversion failed")
|
2004-11-18 00:53:38 +08:00
|
|
|
|
|
|
|
|
|
/* Free the previous attribute data buffer, if there is one */
|
|
|
|
|
if(attr->data)
|
2006-01-03 03:59:11 +08:00
|
|
|
|
attr->data = H5FL_BLK_FREE(attr_buf, attr->data);
|
2004-04-18 04:31:50 +08:00
|
|
|
|
|
2004-11-18 00:53:38 +08:00
|
|
|
|
/* Set the pointer to the attribute data to the converted information */
|
2005-11-15 10:55:39 +08:00
|
|
|
|
attr->data = tconv_buf;
|
2006-12-07 06:19:52 +08:00
|
|
|
|
tconv_owned = TRUE;
|
2004-11-18 00:53:38 +08:00
|
|
|
|
} /* end if */
|
|
|
|
|
/* No type conversion necessary */
|
|
|
|
|
else {
|
2005-11-15 10:55:39 +08:00
|
|
|
|
HDassert(dst_type_size == src_type_size);
|
2004-11-18 00:53:38 +08:00
|
|
|
|
|
2006-12-07 06:19:52 +08:00
|
|
|
|
/* Allocate the attribute buffer, if there isn't one */
|
|
|
|
|
if(attr->data == NULL)
|
|
|
|
|
if(NULL == (attr->data = H5FL_BLK_MALLOC(attr_buf, dst_type_size * nelmts)))
|
|
|
|
|
HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed")
|
2004-11-18 00:53:38 +08:00
|
|
|
|
|
2006-12-07 06:19:52 +08:00
|
|
|
|
/* Copy the attribute data into the user's buffer */
|
|
|
|
|
HDmemcpy(attr->data, buf, (dst_type_size * nelmts));
|
2004-11-18 00:53:38 +08:00
|
|
|
|
} /* end else */
|
2004-04-18 04:31:50 +08:00
|
|
|
|
|
2006-12-07 06:19:52 +08:00
|
|
|
|
/* Modify the attribute in the object header */
|
|
|
|
|
if(H5O_attr_write(&(attr->oloc), dxpl_id, attr) < 0)
|
|
|
|
|
HGOTO_ERROR(H5E_ATTR, H5E_CANTINIT, FAIL, "unable to modify attribute")
|
2004-04-18 04:31:50 +08:00
|
|
|
|
} /* end if */
|
1998-04-24 06:24:38 +08:00
|
|
|
|
|
|
|
|
|
/* Indicate the the attribute doesn't need fill-values */
|
2005-11-15 10:55:39 +08:00
|
|
|
|
attr->initialized = TRUE;
|
1998-04-24 06:24:38 +08:00
|
|
|
|
|
|
|
|
|
done:
|
|
|
|
|
/* Release resources */
|
2005-11-15 10:55:39 +08:00
|
|
|
|
if(src_id >= 0)
|
2003-07-09 05:05:27 +08:00
|
|
|
|
(void)H5I_dec_ref(src_id);
|
2005-11-15 10:55:39 +08:00
|
|
|
|
if(dst_id >= 0)
|
2003-07-09 05:05:27 +08:00
|
|
|
|
(void)H5I_dec_ref(dst_id);
|
2006-12-07 06:19:52 +08:00
|
|
|
|
if(tconv_buf && !tconv_owned)
|
|
|
|
|
tconv_buf = H5FL_BLK_FREE(attr_buf, tconv_buf);
|
2005-11-15 10:55:39 +08:00
|
|
|
|
if(bkg_buf)
|
2006-01-03 03:59:11 +08:00
|
|
|
|
bkg_buf = H5FL_BLK_FREE(attr_buf, bkg_buf);
|
1998-04-24 06:24:38 +08:00
|
|
|
|
|
2003-07-09 05:05:27 +08:00
|
|
|
|
FUNC_LEAVE_NOAPI(ret_value)
|
1998-04-24 06:24:38 +08:00
|
|
|
|
} /* H5A_write() */
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*--------------------------------------------------------------------------
|
|
|
|
|
NAME
|
|
|
|
|
H5Aread
|
|
|
|
|
PURPOSE
|
|
|
|
|
Read in data from an attribute
|
|
|
|
|
USAGE
|
2006-12-12 08:57:10 +08:00
|
|
|
|
herr_t H5Aread (attr_id, dtype_id, buf)
|
1998-04-24 06:24:38 +08:00
|
|
|
|
hid_t attr_id; IN: Attribute to read
|
2006-12-12 08:57:10 +08:00
|
|
|
|
hid_t dtype_id; IN: Memory datatype of buffer
|
1998-04-24 06:24:38 +08:00
|
|
|
|
void *buf; IN: Buffer for data to read
|
|
|
|
|
RETURNS
|
1998-10-27 05:18:54 +08:00
|
|
|
|
Non-negative on success/Negative on failure
|
2005-08-14 04:53:35 +08:00
|
|
|
|
|
1998-04-24 06:24:38 +08:00
|
|
|
|
DESCRIPTION
|
|
|
|
|
This function reads a complete attribute from disk.
|
|
|
|
|
--------------------------------------------------------------------------*/
|
|
|
|
|
herr_t
|
2006-12-12 08:57:10 +08:00
|
|
|
|
H5Aread(hid_t attr_id, hid_t dtype_id, void *buf)
|
1998-04-24 06:24:38 +08:00
|
|
|
|
{
|
2006-12-12 08:57:10 +08:00
|
|
|
|
H5A_t *attr; /* Attribute object for ID */
|
[svn-r529] Changes since 19980722
----------------------
./src/H5.c
Handle hid_t of type H5_TEMPBUF, arguments usually called tbuf_id.
Added array tracing where the array rank is stored in a simple
data space. Just use the name of the data space argument when
declaring the array argument:
herr_t
H5Sselect_hyperslab (hid_t space_id, H5S_seloper_t op,
const hssize_t start[/*space_id*/],
const hsize_t _stride[/*space_id*/],
const hsize_t count[/*space_id*/],
const hsize_t _block[/*space_id*/])
and when the program runs you'll see array values printed:
H5Sselect_hyperslab(space=218103813, op=H5S_SELECT_SET,
start=0xbfffef4c {0}, _stride=NULL,
count=0xbfffef44 {64},
_block=NULL) = SUCCEED;
Added more symbolic data types to the tracing output.
./src/H5A.c
./src/H5Apublic.h
./src/H5D.c
./src/H5Dpublic.h
./src/H5F.c
./src/H5Fpublic.h
./src/H5G.c
./src/H5Gpublic.h
./src/H5P.c
./src/H5Ppublic.h
./src/H5S.c
./src/H5Sall.c
./src/H5Shyper.c
./src/H5Spoint.c
./src/H5Spublic.h
./src/H5Sselect.c
./src/H5Ssimp.c
./src/H5TB.c
./src/H5V.c
Changed some API argument names to be more consistent with
other API functions and to produce better tracing output.
Reformatted some long lines. Indented printf statements.
./tools/h5ls.c
Fixed warnings about unsigned vs. signed comparisons.
1998-07-23 02:45:46 +08:00
|
|
|
|
const H5T_t *mem_type = NULL;
|
2002-08-09 00:52:55 +08:00
|
|
|
|
herr_t ret_value;
|
1998-04-24 06:24:38 +08:00
|
|
|
|
|
2003-07-09 05:05:27 +08:00
|
|
|
|
FUNC_ENTER_API(H5Aread, FAIL)
|
2006-12-19 03:16:17 +08:00
|
|
|
|
H5TRACE3("e", "iix", attr_id, dtype_id, buf);
|
1998-04-24 06:24:38 +08:00
|
|
|
|
|
|
|
|
|
/* check arguments */
|
2006-01-03 03:59:11 +08:00
|
|
|
|
if(NULL == (attr = (H5A_t *)H5I_object_verify(attr_id, H5I_ATTR)))
|
2003-07-09 05:05:27 +08:00
|
|
|
|
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not an attribute")
|
2006-12-12 08:57:10 +08:00
|
|
|
|
if(NULL == (mem_type = (H5T_t *)H5I_object_verify(dtype_id, H5I_DATATYPE)))
|
2004-12-29 22:26:20 +08:00
|
|
|
|
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a datatype")
|
2005-11-15 10:55:39 +08:00
|
|
|
|
if(NULL == buf)
|
2003-07-09 05:05:27 +08:00
|
|
|
|
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "null attribute buffer")
|
1998-04-24 06:24:38 +08:00
|
|
|
|
|
|
|
|
|
/* Go write the actual data to the attribute */
|
2006-12-12 08:57:10 +08:00
|
|
|
|
if((ret_value = H5A_read(attr, mem_type, buf, H5AC_dxpl_id)) < 0)
|
2003-07-09 05:05:27 +08:00
|
|
|
|
HGOTO_ERROR(H5E_ATTR, H5E_READERROR, FAIL, "unable to read attribute")
|
1998-04-24 06:24:38 +08:00
|
|
|
|
|
2002-08-09 00:52:55 +08:00
|
|
|
|
done:
|
2003-07-09 05:05:27 +08:00
|
|
|
|
FUNC_LEAVE_API(ret_value)
|
1998-04-24 06:24:38 +08:00
|
|
|
|
} /* H5Aread() */
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*--------------------------------------------------------------------------
|
|
|
|
|
NAME
|
|
|
|
|
H5A_read
|
|
|
|
|
PURPOSE
|
|
|
|
|
Actually read in data from an attribute
|
|
|
|
|
USAGE
|
|
|
|
|
herr_t H5A_read (attr, mem_type, buf)
|
|
|
|
|
H5A_t *attr; IN: Attribute to read
|
|
|
|
|
const H5T_t *mem_type; IN: Memory datatype of buffer
|
|
|
|
|
void *buf; IN: Buffer for data to read
|
|
|
|
|
RETURNS
|
1998-10-27 05:18:54 +08:00
|
|
|
|
Non-negative on success/Negative on failure
|
2005-08-14 04:53:35 +08:00
|
|
|
|
|
1998-04-24 06:24:38 +08:00
|
|
|
|
DESCRIPTION
|
1999-03-24 05:48:57 +08:00
|
|
|
|
This function reads a complete attribute from disk.
|
1998-04-24 06:24:38 +08:00
|
|
|
|
--------------------------------------------------------------------------*/
|
|
|
|
|
static herr_t
|
2003-07-09 05:05:27 +08:00
|
|
|
|
H5A_read(const H5A_t *attr, const H5T_t *mem_type, void *buf, hid_t dxpl_id)
|
1998-04-24 06:24:38 +08:00
|
|
|
|
{
|
2004-12-29 22:26:20 +08:00
|
|
|
|
uint8_t *tconv_buf = NULL; /* datatype conv buffer*/
|
1999-03-30 19:38:34 +08:00
|
|
|
|
uint8_t *bkg_buf = NULL; /* background buffer */
|
2003-07-09 05:05:27 +08:00
|
|
|
|
hssize_t snelmts; /* elements in attribute */
|
2004-06-15 03:32:02 +08:00
|
|
|
|
size_t nelmts; /* elements in attribute*/
|
1998-12-18 03:35:20 +08:00
|
|
|
|
H5T_path_t *tpath = NULL; /* type conversion info */
|
1998-06-06 05:03:49 +08:00
|
|
|
|
hid_t src_id = -1, dst_id = -1;/* temporary type atoms*/
|
|
|
|
|
size_t src_type_size; /* size of source type */
|
|
|
|
|
size_t dst_type_size; /* size of destination type */
|
2001-11-28 00:29:13 +08:00
|
|
|
|
size_t buf_size; /* desired buffer size */
|
2004-11-18 00:53:38 +08:00
|
|
|
|
herr_t ret_value = SUCCEED;
|
1998-04-24 06:24:38 +08:00
|
|
|
|
|
2003-12-07 04:38:31 +08:00
|
|
|
|
FUNC_ENTER_NOAPI_NOINIT(H5A_read)
|
1998-04-24 06:24:38 +08:00
|
|
|
|
|
2006-12-12 08:57:10 +08:00
|
|
|
|
HDassert(attr);
|
|
|
|
|
HDassert(mem_type);
|
|
|
|
|
HDassert(buf);
|
1998-04-24 06:24:38 +08:00
|
|
|
|
|
|
|
|
|
/* Create buffer for data to store on disk */
|
2005-11-15 10:55:39 +08:00
|
|
|
|
if((snelmts = H5S_GET_EXTENT_NPOINTS(attr->ds)) < 0)
|
|
|
|
|
HGOTO_ERROR(H5E_ATTR, H5E_CANTCOUNT, FAIL, "dataspace is invalid")
|
2006-12-19 05:25:05 +08:00
|
|
|
|
H5_ASSIGN_OVERFLOW(nelmts, snelmts, hssize_t, size_t);
|
1998-04-24 06:24:38 +08:00
|
|
|
|
|
2006-12-19 05:25:05 +08:00
|
|
|
|
if(nelmts > 0) {
|
2004-04-18 04:31:50 +08:00
|
|
|
|
/* Get the memory and file datatype sizes */
|
|
|
|
|
src_type_size = H5T_get_size(attr->dt);
|
|
|
|
|
dst_type_size = H5T_get_size(mem_type);
|
|
|
|
|
|
|
|
|
|
/* Check if the attribute has any data yet, if not, fill with zeroes */
|
2006-12-12 08:57:10 +08:00
|
|
|
|
if(attr->obj_opened && !attr->initialized)
|
|
|
|
|
HDmemset(buf, 0, (dst_type_size * nelmts));
|
2004-04-18 04:31:50 +08:00
|
|
|
|
else { /* Attribute exists and has a value */
|
|
|
|
|
/* Convert memory buffer into disk buffer */
|
|
|
|
|
/* Set up type conversion function */
|
2005-11-15 10:55:39 +08:00
|
|
|
|
if(NULL == (tpath = H5T_path_find(attr->dt, mem_type, NULL, NULL, dxpl_id, FALSE)))
|
2004-12-29 22:26:20 +08:00
|
|
|
|
HGOTO_ERROR(H5E_ATTR, H5E_UNSUPPORTED, FAIL, "unable to convert between src and dst datatypes")
|
2004-11-18 00:53:38 +08:00
|
|
|
|
|
|
|
|
|
/* Check for type conversion required */
|
2005-11-15 10:55:39 +08:00
|
|
|
|
if(!H5T_path_noop(tpath)) {
|
|
|
|
|
if((src_id = H5I_register(H5I_DATATYPE, H5T_copy(attr->dt, H5T_COPY_ALL))) < 0 ||
|
|
|
|
|
(dst_id = H5I_register(H5I_DATATYPE, H5T_copy(mem_type, H5T_COPY_ALL))) < 0)
|
2004-04-18 04:31:50 +08:00
|
|
|
|
HGOTO_ERROR(H5E_ATTR, H5E_CANTREGISTER, FAIL, "unable to register types for conversion")
|
|
|
|
|
|
2004-11-18 00:53:38 +08:00
|
|
|
|
/* Get the maximum buffer size needed and allocate it */
|
2006-12-12 08:57:10 +08:00
|
|
|
|
buf_size = nelmts * MAX(src_type_size, dst_type_size);
|
2005-11-15 10:55:39 +08:00
|
|
|
|
if(NULL == (tconv_buf = H5FL_BLK_MALLOC(attr_buf, buf_size)) || NULL == (bkg_buf = H5FL_BLK_CALLOC(attr_buf, buf_size)))
|
|
|
|
|
HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed")
|
2004-11-18 00:53:38 +08:00
|
|
|
|
|
|
|
|
|
/* Copy the attribute data into the buffer for conversion */
|
2006-12-12 08:57:10 +08:00
|
|
|
|
HDmemcpy(tconv_buf, attr->data, (src_type_size * nelmts));
|
2004-11-18 00:53:38 +08:00
|
|
|
|
|
2004-12-29 22:26:20 +08:00
|
|
|
|
/* Perform datatype conversion. */
|
2005-11-15 10:55:39 +08:00
|
|
|
|
if(H5T_convert(tpath, src_id, dst_id, nelmts, (size_t)0, (size_t)0, tconv_buf, bkg_buf, dxpl_id) < 0)
|
2004-12-29 22:26:20 +08:00
|
|
|
|
HGOTO_ERROR(H5E_ATTR, H5E_CANTENCODE, FAIL, "datatype conversion failed")
|
2004-04-18 04:31:50 +08:00
|
|
|
|
|
2004-11-18 00:53:38 +08:00
|
|
|
|
/* Copy the converted data into the user's buffer */
|
2006-12-12 08:57:10 +08:00
|
|
|
|
HDmemcpy(buf, tconv_buf, (dst_type_size * nelmts));
|
2004-11-18 00:53:38 +08:00
|
|
|
|
} /* end if */
|
|
|
|
|
/* No type conversion necessary */
|
|
|
|
|
else {
|
2005-11-15 10:55:39 +08:00
|
|
|
|
HDassert(dst_type_size == src_type_size);
|
2004-11-18 00:53:38 +08:00
|
|
|
|
|
|
|
|
|
/* Copy the attribute data into the user's buffer */
|
2006-12-12 08:57:10 +08:00
|
|
|
|
HDmemcpy(buf, attr->data, (dst_type_size * nelmts));
|
2004-11-18 00:53:38 +08:00
|
|
|
|
} /* end else */
|
2004-04-18 04:31:50 +08:00
|
|
|
|
} /* end else */
|
|
|
|
|
} /* end if */
|
1998-04-24 06:24:38 +08:00
|
|
|
|
|
|
|
|
|
done:
|
|
|
|
|
/* Release resources */
|
2005-11-15 10:55:39 +08:00
|
|
|
|
if(src_id >= 0)
|
2003-07-09 05:05:27 +08:00
|
|
|
|
(void)H5I_dec_ref(src_id);
|
2005-11-15 10:55:39 +08:00
|
|
|
|
if(dst_id >= 0)
|
2003-07-09 05:05:27 +08:00
|
|
|
|
(void)H5I_dec_ref(dst_id);
|
2005-11-15 10:55:39 +08:00
|
|
|
|
if(tconv_buf)
|
2006-01-03 03:59:11 +08:00
|
|
|
|
tconv_buf = H5FL_BLK_FREE(attr_buf, tconv_buf);
|
2005-11-15 10:55:39 +08:00
|
|
|
|
if(bkg_buf)
|
2006-01-03 03:59:11 +08:00
|
|
|
|
bkg_buf = H5FL_BLK_FREE(attr_buf, bkg_buf);
|
1998-04-24 06:24:38 +08:00
|
|
|
|
|
2003-07-09 05:05:27 +08:00
|
|
|
|
FUNC_LEAVE_NOAPI(ret_value)
|
1998-04-24 06:24:38 +08:00
|
|
|
|
} /* H5A_read() */
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*--------------------------------------------------------------------------
|
|
|
|
|
NAME
|
|
|
|
|
H5Aget_space
|
|
|
|
|
PURPOSE
|
|
|
|
|
Gets a copy of the dataspace for an attribute
|
|
|
|
|
USAGE
|
|
|
|
|
hid_t H5Aget_space (attr_id)
|
|
|
|
|
hid_t attr_id; IN: Attribute to get dataspace of
|
|
|
|
|
RETURNS
|
|
|
|
|
A dataspace ID on success, negative on failure
|
2005-08-14 04:53:35 +08:00
|
|
|
|
|
1998-04-24 06:24:38 +08:00
|
|
|
|
DESCRIPTION
|
|
|
|
|
This function retrieves a copy of the dataspace for an attribute.
|
|
|
|
|
The dataspace ID returned from this function must be released with H5Sclose
|
|
|
|
|
or resource leaks will develop.
|
|
|
|
|
--------------------------------------------------------------------------*/
|
|
|
|
|
hid_t
|
1998-08-28 00:48:50 +08:00
|
|
|
|
H5Aget_space(hid_t attr_id)
|
1998-04-24 06:24:38 +08:00
|
|
|
|
{
|
2006-12-12 08:57:10 +08:00
|
|
|
|
H5A_t *attr; /* Attribute object for ID */
|
|
|
|
|
H5S_t *ds = NULL; /* Copy of dataspace for attribute */
|
2002-08-09 00:52:55 +08:00
|
|
|
|
hid_t ret_value;
|
1998-04-24 06:24:38 +08:00
|
|
|
|
|
2003-07-09 05:05:27 +08:00
|
|
|
|
FUNC_ENTER_API(H5Aget_space, FAIL)
|
2006-12-19 03:16:17 +08:00
|
|
|
|
H5TRACE1("i", "i", attr_id);
|
1998-04-24 06:24:38 +08:00
|
|
|
|
|
|
|
|
|
/* check arguments */
|
2006-01-03 03:59:11 +08:00
|
|
|
|
if(NULL == (attr = (H5A_t *)H5I_object_verify(attr_id, H5I_ATTR)))
|
2003-07-09 05:05:27 +08:00
|
|
|
|
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not an attribute")
|
1998-04-24 06:24:38 +08:00
|
|
|
|
|
|
|
|
|
/* Copy the attribute's dataspace */
|
2006-12-12 08:57:10 +08:00
|
|
|
|
if(NULL == (ds = H5S_copy (attr->ds, FALSE)))
|
2005-11-15 10:55:39 +08:00
|
|
|
|
HGOTO_ERROR(H5E_ATTR, H5E_CANTINIT, FAIL, "unable to copy dataspace")
|
1998-04-24 06:24:38 +08:00
|
|
|
|
|
|
|
|
|
/* Atomize */
|
2006-12-12 08:57:10 +08:00
|
|
|
|
if((ret_value = H5I_register(H5I_DATASPACE, ds)) < 0)
|
2005-11-15 10:55:39 +08:00
|
|
|
|
HGOTO_ERROR(H5E_ATOM, H5E_CANTREGISTER, FAIL, "unable to register dataspace atom")
|
1998-04-24 06:24:38 +08:00
|
|
|
|
|
2002-08-09 00:52:55 +08:00
|
|
|
|
done:
|
2006-12-12 08:57:10 +08:00
|
|
|
|
if(ret_value < 0 && ds)
|
|
|
|
|
(void)H5S_close(ds);
|
|
|
|
|
|
2003-07-09 05:05:27 +08:00
|
|
|
|
FUNC_LEAVE_API(ret_value)
|
1998-04-24 06:24:38 +08:00
|
|
|
|
} /* H5Aget_space() */
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*--------------------------------------------------------------------------
|
|
|
|
|
NAME
|
|
|
|
|
H5Aget_type
|
|
|
|
|
PURPOSE
|
|
|
|
|
Gets a copy of the datatype for an attribute
|
|
|
|
|
USAGE
|
|
|
|
|
hid_t H5Aget_type (attr_id)
|
|
|
|
|
hid_t attr_id; IN: Attribute to get datatype of
|
|
|
|
|
RETURNS
|
|
|
|
|
A datatype ID on success, negative on failure
|
2005-08-14 04:53:35 +08:00
|
|
|
|
|
1998-04-24 06:24:38 +08:00
|
|
|
|
DESCRIPTION
|
|
|
|
|
This function retrieves a copy of the datatype for an attribute.
|
|
|
|
|
The datatype ID returned from this function must be released with H5Tclose
|
|
|
|
|
or resource leaks will develop.
|
|
|
|
|
--------------------------------------------------------------------------*/
|
|
|
|
|
hid_t
|
1998-08-28 00:48:50 +08:00
|
|
|
|
H5Aget_type(hid_t attr_id)
|
1998-04-24 06:24:38 +08:00
|
|
|
|
{
|
2006-12-12 08:57:10 +08:00
|
|
|
|
H5A_t *attr; /* Attribute object for ID */
|
|
|
|
|
H5T_t *dt = NULL; /* Copy of attribute's datatype */
|
2002-08-09 00:52:55 +08:00
|
|
|
|
hid_t ret_value;
|
1998-04-24 06:24:38 +08:00
|
|
|
|
|
2003-07-09 05:05:27 +08:00
|
|
|
|
FUNC_ENTER_API(H5Aget_type, FAIL)
|
2006-12-19 03:16:17 +08:00
|
|
|
|
H5TRACE1("i", "i", attr_id);
|
1998-04-24 06:24:38 +08:00
|
|
|
|
|
|
|
|
|
/* check arguments */
|
2006-01-03 03:59:11 +08:00
|
|
|
|
if(NULL == (attr = (H5A_t *)H5I_object_verify(attr_id, H5I_ATTR)))
|
2003-07-09 05:05:27 +08:00
|
|
|
|
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not an attribute")
|
1998-04-24 06:24:38 +08:00
|
|
|
|
|
1998-06-05 06:27:11 +08:00
|
|
|
|
/*
|
2004-12-29 22:26:20 +08:00
|
|
|
|
* Copy the attribute's datatype. If the type is a named type then
|
1998-06-06 05:03:49 +08:00
|
|
|
|
* reopen the type before returning it to the user. Make the type
|
|
|
|
|
* read-only.
|
1998-06-05 06:27:11 +08:00
|
|
|
|
*/
|
2006-12-12 08:57:10 +08:00
|
|
|
|
if(NULL == (dt = H5T_copy(attr->dt, H5T_COPY_REOPEN)))
|
2003-07-09 05:05:27 +08:00
|
|
|
|
HGOTO_ERROR(H5E_ATTR, H5E_CANTINIT, FAIL, "unable to copy datatype")
|
2002-08-09 00:52:55 +08:00
|
|
|
|
|
2003-08-11 20:43:04 +08:00
|
|
|
|
/* Mark any datatypes as being in memory now */
|
2006-12-12 08:57:10 +08:00
|
|
|
|
if(H5T_set_loc(dt, NULL, H5T_LOC_MEMORY) < 0)
|
2003-08-11 20:43:04 +08:00
|
|
|
|
HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "invalid datatype location")
|
2006-12-12 08:57:10 +08:00
|
|
|
|
if(H5T_lock(dt, FALSE) < 0)
|
2004-12-29 22:26:20 +08:00
|
|
|
|
HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "unable to lock transient datatype")
|
2005-08-14 04:53:35 +08:00
|
|
|
|
|
1998-04-24 06:24:38 +08:00
|
|
|
|
/* Atomize */
|
2006-12-12 08:57:10 +08:00
|
|
|
|
if((ret_value = H5I_register(H5I_DATATYPE, dt)) < 0)
|
2003-07-09 05:05:27 +08:00
|
|
|
|
HGOTO_ERROR(H5E_ATOM, H5E_CANTREGISTER, FAIL, "unable to register datatype atom")
|
2002-08-09 00:52:55 +08:00
|
|
|
|
|
|
|
|
|
done:
|
2006-12-12 08:57:10 +08:00
|
|
|
|
if(ret_value < 0 && dt)
|
|
|
|
|
(void)H5T_close(dt);
|
1998-04-24 06:24:38 +08:00
|
|
|
|
|
2003-07-09 05:05:27 +08:00
|
|
|
|
FUNC_LEAVE_API(ret_value)
|
1998-04-24 06:24:38 +08:00
|
|
|
|
} /* H5Aget_type() */
|
|
|
|
|
|
2006-01-03 03:20:19 +08:00
|
|
|
|
|
|
|
|
|
/*--------------------------------------------------------------------------
|
|
|
|
|
NAME
|
|
|
|
|
H5Aget_create_plist
|
|
|
|
|
PURPOSE
|
|
|
|
|
Gets a copy of the creation property list for an attribute
|
|
|
|
|
USAGE
|
|
|
|
|
hssize_t H5Aget_create_plist (attr_id, buf_size, buf)
|
|
|
|
|
hid_t attr_id; IN: Attribute to get name of
|
|
|
|
|
RETURNS
|
|
|
|
|
This function returns the ID of a copy of the attribute's creation
|
|
|
|
|
property list, or negative on failure.
|
|
|
|
|
|
|
|
|
|
ERRORS
|
|
|
|
|
|
|
|
|
|
DESCRIPTION
|
|
|
|
|
This function returns a copy of the creation property list for
|
|
|
|
|
an attribute. The resulting ID must be closed with H5Pclose() or
|
|
|
|
|
resource leaks will occur.
|
|
|
|
|
--------------------------------------------------------------------------*/
|
|
|
|
|
hid_t
|
|
|
|
|
H5Aget_create_plist(hid_t attr_id)
|
|
|
|
|
{
|
2007-02-07 04:03:06 +08:00
|
|
|
|
H5A_t *attr; /* Attribute object for ID */
|
2006-01-03 03:20:19 +08:00
|
|
|
|
H5P_genplist_t *plist; /* Default property list */
|
|
|
|
|
hid_t new_plist_id; /* ID of ACPL to return */
|
|
|
|
|
H5P_genplist_t *new_plist; /* ACPL to return */
|
|
|
|
|
hid_t ret_value;
|
|
|
|
|
|
|
|
|
|
FUNC_ENTER_API(H5Aget_create_plist, FAIL)
|
2006-12-19 03:16:17 +08:00
|
|
|
|
H5TRACE1("i", "i", attr_id);
|
2006-01-03 03:20:19 +08:00
|
|
|
|
|
2006-12-12 08:57:10 +08:00
|
|
|
|
HDassert(H5P_LST_ATTRIBUTE_CREATE_g != -1);
|
2006-01-03 03:20:19 +08:00
|
|
|
|
|
|
|
|
|
/* Get attribute and default attribute creation property list*/
|
2007-01-04 03:34:15 +08:00
|
|
|
|
if(NULL == (attr = (H5A_t *)H5I_object_verify(attr_id, H5I_ATTR)))
|
2006-01-03 03:20:19 +08:00
|
|
|
|
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not an attribute")
|
2007-01-04 03:34:15 +08:00
|
|
|
|
if(NULL == (plist = (H5P_genplist_t *)H5I_object(H5P_LST_ATTRIBUTE_CREATE_g)))
|
2006-01-03 03:20:19 +08:00
|
|
|
|
HGOTO_ERROR(H5E_PLIST, H5E_BADTYPE, FAIL, "can't get default ACPL")
|
|
|
|
|
|
|
|
|
|
/* Create the property list object to return */
|
2006-12-12 08:57:10 +08:00
|
|
|
|
if((new_plist_id = H5P_copy_plist(plist)) < 0)
|
2006-01-03 03:20:19 +08:00
|
|
|
|
HGOTO_ERROR(H5E_PLIST, H5E_CANTINIT, FAIL, "unable to copy attribute creation properties")
|
2007-01-04 03:34:15 +08:00
|
|
|
|
if(NULL == (new_plist = (H5P_genplist_t *)H5I_object(new_plist_id)))
|
2006-01-03 03:20:19 +08:00
|
|
|
|
HGOTO_ERROR(H5E_PLIST, H5E_BADTYPE, FAIL, "can't get property list")
|
|
|
|
|
|
|
|
|
|
/* Set the character encoding on the new property list */
|
2006-11-03 02:38:22 +08:00
|
|
|
|
if(H5P_set(new_plist, H5P_STRCRT_CHAR_ENCODING_NAME, &(attr->encoding)) < 0)
|
2006-01-03 03:20:19 +08:00
|
|
|
|
HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set character encoding")
|
2006-06-27 22:45:06 +08:00
|
|
|
|
|
2006-01-03 03:20:19 +08:00
|
|
|
|
ret_value = new_plist_id;
|
|
|
|
|
|
|
|
|
|
done:
|
|
|
|
|
FUNC_LEAVE_API(ret_value)
|
2006-10-02 18:24:03 +08:00
|
|
|
|
} /* end H5Aget_create_plist() */
|
2006-04-10 11:03:30 +08:00
|
|
|
|
|
1998-04-24 06:24:38 +08:00
|
|
|
|
|
|
|
|
|
/*--------------------------------------------------------------------------
|
|
|
|
|
NAME
|
|
|
|
|
H5Aget_name
|
|
|
|
|
PURPOSE
|
|
|
|
|
Gets a copy of the name for an attribute
|
|
|
|
|
USAGE
|
1998-10-27 01:25:35 +08:00
|
|
|
|
hssize_t H5Aget_name (attr_id, buf_size, buf)
|
1998-04-24 06:24:38 +08:00
|
|
|
|
hid_t attr_id; IN: Attribute to get name of
|
|
|
|
|
size_t buf_size; IN: The size of the buffer to store the string in.
|
[svn-r537] Changes since 19980722
----------------------
./src/H5A.c
./src/H5Apublic.h
./test/tattr.c
Switched the order of the second and third argument of
H5Aget_name() to make it consistent with other functions that
take buffers and buffer sizes.
./src/H5G.c
./src/H5Gpublic.h
./src/H5Gprivate.h
The H5Gget_comment() function returns the size of the comment
including the null terminator. If the object has no comment
then zero is returned. If an error occurs then a negative
value is returned.
./MANIFEST
./tools/Makefile.in
./tools/h5tools.h [NEW]
./tools/h5dump.c [NEW]
Created a library for printing values of datasets in a way
that looks nice. It's not done yet, but I needed it for
debugging the contents of files from Jim Reus.
./tools/h5ls.c
Added the `-d' and `--dump' options which cause the contents
of a dataset to be printed. Added `-w N' and `--width=N'
options to control how wide the raw data output should be. If
you want single-column output then say `-w1'.
Printing dataset values can now handle datasets of any integer
or floating point atomic type. As a special case, integers
which are one byte wide are treated a character strings for
now.
Sample output:
$ h5ls --dump --width=60 banana.hdf
ARCHIVE 0:0:0:744 Dataset {52/Inf}
Data:
(0) "U struct complex { double R; double I; };\012V"
(43) " double;\012"
U 0:0:0:2500 Dataset {256/512}
Data: printing of compound data types is not implemented yet
V 0:0:0:3928 Dataset {256/512}
Data:
(0) 0, 0.015625, 0.03125, 0.046875, 0.0625,
(5) 0.078125, 0.09375, 0.109375, 0.125, 0.140625,
(10) 0.15625, 0.171875, 0.1875, 0.203125, 0.21875,
(15) 0.234375, 0.25, 0.265625, 0.28125, 0.296875,
...
1998-07-24 05:19:17 +08:00
|
|
|
|
char *buf; IN: Buffer to store name in
|
1998-04-24 06:24:38 +08:00
|
|
|
|
RETURNS
|
|
|
|
|
This function returns the length of the attribute's name (which may be
|
|
|
|
|
longer than 'buf_size') on success or negative for failure.
|
2005-08-14 04:53:35 +08:00
|
|
|
|
|
1998-04-24 06:24:38 +08:00
|
|
|
|
DESCRIPTION
|
|
|
|
|
This function retrieves the name of an attribute for an attribute ID.
|
|
|
|
|
Up to 'buf_size' characters are stored in 'buf' followed by a '\0' string
|
|
|
|
|
terminator. If the name of the attribute is longer than 'buf_size'-1,
|
|
|
|
|
the string terminator is stored in the last position of the buffer to
|
|
|
|
|
properly terminate the string.
|
|
|
|
|
--------------------------------------------------------------------------*/
|
1999-03-13 02:35:04 +08:00
|
|
|
|
ssize_t
|
1998-08-28 00:48:50 +08:00
|
|
|
|
H5Aget_name(hid_t attr_id, size_t buf_size, char *buf)
|
1998-04-24 06:24:38 +08:00
|
|
|
|
{
|
2007-02-07 04:03:06 +08:00
|
|
|
|
H5A_t *attr; /* Attribute object for ID */
|
1999-03-13 02:35:04 +08:00
|
|
|
|
size_t copy_len, nbytes;
|
2002-08-09 00:52:55 +08:00
|
|
|
|
ssize_t ret_value;
|
1998-04-24 06:24:38 +08:00
|
|
|
|
|
2003-07-09 05:05:27 +08:00
|
|
|
|
FUNC_ENTER_API(H5Aget_name, FAIL)
|
2006-12-19 03:16:17 +08:00
|
|
|
|
H5TRACE3("Zs", "izs", attr_id, buf_size, buf);
|
1998-04-24 06:24:38 +08:00
|
|
|
|
|
|
|
|
|
/* check arguments */
|
2006-01-03 03:59:11 +08:00
|
|
|
|
if(NULL == (attr = (H5A_t *)H5I_object_verify(attr_id, H5I_ATTR)))
|
2003-07-09 05:05:27 +08:00
|
|
|
|
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not an attribute")
|
2005-11-15 10:55:39 +08:00
|
|
|
|
if(!buf && buf_size)
|
2003-07-09 05:05:27 +08:00
|
|
|
|
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid buffer")
|
1998-04-24 06:24:38 +08:00
|
|
|
|
|
|
|
|
|
/* get the real attribute length */
|
1999-03-13 02:35:04 +08:00
|
|
|
|
nbytes = HDstrlen(attr->name);
|
2007-02-13 22:50:48 +08:00
|
|
|
|
HDassert((ssize_t)nbytes >= 0); /*overflow, pretty unlikely --rpm*/
|
1998-04-24 06:24:38 +08:00
|
|
|
|
|
|
|
|
|
/* compute the string length which will fit into the user's buffer */
|
2007-02-13 22:50:48 +08:00
|
|
|
|
copy_len = MIN(buf_size - 1, nbytes);
|
1998-04-24 06:24:38 +08:00
|
|
|
|
|
|
|
|
|
/* Copy all/some of the name */
|
2006-12-12 08:57:10 +08:00
|
|
|
|
if(buf && copy_len > 0) {
|
2002-10-30 00:37:49 +08:00
|
|
|
|
HDmemcpy(buf, attr->name, copy_len);
|
1998-04-24 06:24:38 +08:00
|
|
|
|
|
2002-10-30 00:37:49 +08:00
|
|
|
|
/* Terminate the string */
|
|
|
|
|
buf[copy_len]='\0';
|
2006-12-12 03:02:38 +08:00
|
|
|
|
} /* end if */
|
1998-04-24 06:24:38 +08:00
|
|
|
|
|
2002-08-09 00:52:55 +08:00
|
|
|
|
/* Set return value */
|
1999-03-13 02:35:04 +08:00
|
|
|
|
ret_value = (ssize_t)nbytes;
|
2002-08-09 00:52:55 +08:00
|
|
|
|
|
|
|
|
|
done:
|
2003-07-09 05:05:27 +08:00
|
|
|
|
FUNC_LEAVE_API(ret_value)
|
2006-12-12 03:02:38 +08:00
|
|
|
|
} /* H5Aget_name() */
|
1998-04-24 06:24:38 +08:00
|
|
|
|
|
2007-02-13 22:50:48 +08:00
|
|
|
|
|
|
|
|
|
/*-------------------------------------------------------------------------
|
|
|
|
|
* Function: H5Aget_name_by_idx
|
|
|
|
|
*
|
|
|
|
|
* Purpose: Retrieve name of an attribute, according to the
|
|
|
|
|
* order within an index.
|
|
|
|
|
*
|
|
|
|
|
* Same pattern of behavior as H5Iget_name.
|
|
|
|
|
*
|
|
|
|
|
* Return: Success: Non-negative length of name, with information
|
|
|
|
|
* in NAME buffer
|
|
|
|
|
* Failure: Negative
|
|
|
|
|
*
|
|
|
|
|
* Programmer: Quincey Koziol
|
|
|
|
|
* February 8, 2007
|
|
|
|
|
*
|
|
|
|
|
*-------------------------------------------------------------------------
|
|
|
|
|
*/
|
|
|
|
|
ssize_t
|
2007-02-15 03:32:01 +08:00
|
|
|
|
H5Aget_name_by_idx(hid_t loc_id, const char *obj_name, H5_index_t idx_type,
|
|
|
|
|
H5_iter_order_t order, hsize_t n, char *name /*out*/, size_t size,
|
|
|
|
|
hid_t lapl_id)
|
2007-02-13 22:50:48 +08:00
|
|
|
|
{
|
|
|
|
|
H5G_loc_t loc; /* Object location */
|
|
|
|
|
H5A_t *attr = NULL; /* Attribute object for name */
|
|
|
|
|
ssize_t ret_value; /* Return value */
|
|
|
|
|
|
|
|
|
|
FUNC_ENTER_API(H5Aget_name_by_idx, FAIL)
|
|
|
|
|
|
|
|
|
|
/* Check args */
|
|
|
|
|
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")
|
2007-02-15 03:32:01 +08:00
|
|
|
|
if(!obj_name || !*obj_name)
|
|
|
|
|
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no name")
|
2007-02-13 22:50:48 +08:00
|
|
|
|
if(idx_type <= H5_INDEX_UNKNOWN || idx_type >= H5_INDEX_N)
|
|
|
|
|
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid index type specified")
|
|
|
|
|
if(order <= H5_ITER_UNKNOWN || order >= H5_ITER_N)
|
|
|
|
|
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid iteration order specified")
|
2007-02-15 03:32:01 +08:00
|
|
|
|
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")
|
2007-02-13 22:50:48 +08:00
|
|
|
|
|
|
|
|
|
/* Open the attribute on the object header */
|
2007-02-15 03:32:01 +08:00
|
|
|
|
if(NULL == (attr = H5A_open_by_idx(&loc, obj_name, idx_type, order, n, lapl_id, H5AC_ind_dxpl_id)))
|
2007-02-13 22:50:48 +08:00
|
|
|
|
HGOTO_ERROR(H5E_ATTR, H5E_CANTOPENOBJ, FAIL, "can't open attribute")
|
|
|
|
|
|
|
|
|
|
/* Get the length of the name */
|
|
|
|
|
ret_value = (ssize_t)HDstrlen(attr->name);
|
|
|
|
|
|
|
|
|
|
/* Copy the name into the user's buffer, if given */
|
|
|
|
|
if(name) {
|
|
|
|
|
HDstrncpy(name, attr->name, MIN((size_t)(ret_value + 1), size));
|
|
|
|
|
if((size_t)ret_value >= size)
|
|
|
|
|
name[size - 1]='\0';
|
|
|
|
|
} /* end if */
|
|
|
|
|
|
|
|
|
|
done:
|
|
|
|
|
/* Release resources */
|
|
|
|
|
if(attr && H5A_close(attr) < 0)
|
|
|
|
|
HDONE_ERROR(H5E_ATTR, H5E_CANTFREE, FAIL, "can't close attribute")
|
|
|
|
|
|
|
|
|
|
FUNC_LEAVE_API(ret_value)
|
|
|
|
|
} /* end H5Aget_name_by_idx() */
|
|
|
|
|
|
2002-10-30 00:37:49 +08:00
|
|
|
|
|
|
|
|
|
/*-------------------------------------------------------------------------
|
|
|
|
|
* Function: H5Aget_storage_size
|
|
|
|
|
*
|
|
|
|
|
* Purpose: Returns the amount of storage size that is required for this
|
2005-08-14 04:53:35 +08:00
|
|
|
|
* attribute.
|
2002-10-30 00:37:49 +08:00
|
|
|
|
*
|
|
|
|
|
* Return: Success: The amount of storage size allocated for the
|
2005-08-14 04:53:35 +08:00
|
|
|
|
* attribute. The return value may be zero
|
2002-10-30 00:37:49 +08:00
|
|
|
|
* if no data has been stored.
|
|
|
|
|
*
|
|
|
|
|
* Failure: Zero
|
|
|
|
|
*
|
|
|
|
|
* Programmer: Raymond Lu
|
|
|
|
|
* October 23, 2002
|
|
|
|
|
*
|
|
|
|
|
*-------------------------------------------------------------------------
|
|
|
|
|
*/
|
|
|
|
|
hsize_t
|
|
|
|
|
H5Aget_storage_size(hid_t attr_id)
|
|
|
|
|
{
|
2007-02-07 04:03:06 +08:00
|
|
|
|
H5A_t *attr; /* Attribute object for ID */
|
2002-10-30 00:37:49 +08:00
|
|
|
|
hsize_t ret_value; /* Return value */
|
2005-08-14 04:53:35 +08:00
|
|
|
|
|
2003-07-09 05:05:27 +08:00
|
|
|
|
FUNC_ENTER_API(H5Aget_storage_size, 0)
|
2006-12-19 03:16:17 +08:00
|
|
|
|
H5TRACE1("h", "i", attr_id);
|
2002-10-30 00:37:49 +08:00
|
|
|
|
|
|
|
|
|
/* Check args */
|
2006-01-03 03:59:11 +08:00
|
|
|
|
if(NULL == (attr = (H5A_t *)H5I_object_verify(attr_id, H5I_ATTR)))
|
2003-07-09 05:05:27 +08:00
|
|
|
|
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, 0, "not an attribute")
|
2002-10-30 00:37:49 +08:00
|
|
|
|
|
|
|
|
|
/* Set return value */
|
|
|
|
|
ret_value = H5A_get_storage_size(attr);
|
|
|
|
|
|
|
|
|
|
done:
|
2003-07-09 05:05:27 +08:00
|
|
|
|
FUNC_LEAVE_API(ret_value)
|
2006-12-12 08:57:10 +08:00
|
|
|
|
} /* end H5Aget_storage_size() */
|
2002-10-30 00:37:49 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*-------------------------------------------------------------------------
|
|
|
|
|
* Function: H5A_get_storage_size
|
|
|
|
|
*
|
2005-08-14 04:53:35 +08:00
|
|
|
|
* Purpose: Private function for H5Aget_storage_size. Returns the
|
2002-10-30 00:37:49 +08:00
|
|
|
|
* amount of storage size that is required for this
|
2005-08-14 04:53:35 +08:00
|
|
|
|
* attribute.
|
2002-10-30 00:37:49 +08:00
|
|
|
|
*
|
|
|
|
|
* Return: Success: The amount of storage size allocated for the
|
2005-08-14 04:53:35 +08:00
|
|
|
|
* attribute. The return value may be zero
|
2002-10-30 00:37:49 +08:00
|
|
|
|
* if no data has been stored.
|
|
|
|
|
*
|
|
|
|
|
* Failure: Zero
|
|
|
|
|
*
|
|
|
|
|
* Programmer: Raymond Lu
|
|
|
|
|
* October 23, 2002
|
|
|
|
|
*
|
|
|
|
|
*-------------------------------------------------------------------------
|
|
|
|
|
*/
|
2003-02-11 01:26:09 +08:00
|
|
|
|
static hsize_t
|
2003-07-09 05:05:27 +08:00
|
|
|
|
H5A_get_storage_size(const H5A_t *attr)
|
2002-10-30 00:37:49 +08:00
|
|
|
|
{
|
|
|
|
|
hsize_t ret_value; /* Return value */
|
2005-08-14 04:53:35 +08:00
|
|
|
|
|
2003-12-07 04:38:31 +08:00
|
|
|
|
FUNC_ENTER_NOAPI_NOINIT_NOFUNC(H5A_get_storage_size)
|
2002-10-30 00:37:49 +08:00
|
|
|
|
|
|
|
|
|
/* Set return value */
|
|
|
|
|
ret_value = attr->data_size;
|
|
|
|
|
|
2003-07-09 05:05:27 +08:00
|
|
|
|
FUNC_LEAVE_NOAPI(ret_value)
|
2006-12-12 08:57:10 +08:00
|
|
|
|
} /* end H5A_get_storage_size() */
|
2005-08-14 04:53:35 +08:00
|
|
|
|
|
2007-02-07 04:03:06 +08:00
|
|
|
|
|
|
|
|
|
/*-------------------------------------------------------------------------
|
|
|
|
|
* Function: H5Aget_info
|
|
|
|
|
*
|
|
|
|
|
* Purpose: Retrieve information about an attribute.
|
|
|
|
|
*
|
|
|
|
|
* Return: Success: Non-negative
|
|
|
|
|
* Failure: Negative
|
|
|
|
|
*
|
|
|
|
|
* Programmer: Quincey Koziol
|
|
|
|
|
* February 6, 2007
|
|
|
|
|
*
|
|
|
|
|
*-------------------------------------------------------------------------
|
|
|
|
|
*/
|
|
|
|
|
herr_t
|
2007-02-20 10:28:41 +08:00
|
|
|
|
H5Aget_info(hid_t loc_id, const char *obj_name, const char *attr_name,
|
|
|
|
|
H5A_info_t *ainfo, hid_t lapl_id)
|
2007-02-07 04:03:06 +08:00
|
|
|
|
{
|
|
|
|
|
H5G_loc_t loc; /* Object location */
|
|
|
|
|
H5A_t *attr = NULL; /* Attribute object for name */
|
|
|
|
|
herr_t ret_value = SUCCEED; /* Return value */
|
|
|
|
|
|
|
|
|
|
FUNC_ENTER_API(H5Aget_info, FAIL)
|
|
|
|
|
|
|
|
|
|
/* Check args */
|
2007-02-09 23:32:51 +08:00
|
|
|
|
if(H5I_ATTR == H5I_get_type(loc_id))
|
2007-02-07 04:03:06 +08:00
|
|
|
|
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")
|
2007-02-20 10:28:41 +08:00
|
|
|
|
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")
|
2007-02-07 04:03:06 +08:00
|
|
|
|
if(NULL == ainfo)
|
|
|
|
|
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid info pointer")
|
2007-02-20 10:28:41 +08:00
|
|
|
|
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")
|
2007-02-07 04:03:06 +08:00
|
|
|
|
|
|
|
|
|
/* Open the attribute on the object header */
|
2007-02-20 10:28:41 +08:00
|
|
|
|
if(NULL == (attr = H5A_open_by_name(&loc, obj_name, attr_name, lapl_id, H5AC_ind_dxpl_id)))
|
2007-02-07 04:03:06 +08:00
|
|
|
|
HGOTO_ERROR(H5E_ATTR, H5E_CANTOPENOBJ, FAIL, "can't open attribute")
|
|
|
|
|
|
|
|
|
|
/* Get the attribute information */
|
|
|
|
|
if(H5A_get_info(attr, ainfo) < 0)
|
|
|
|
|
HGOTO_ERROR(H5E_ATTR, H5E_CANTGET, FAIL, "unable to get attribute info")
|
|
|
|
|
|
|
|
|
|
done:
|
|
|
|
|
/* Cleanup on failure */
|
|
|
|
|
if(attr && H5A_close(attr) < 0)
|
|
|
|
|
HDONE_ERROR(H5E_ATTR, H5E_CANTFREE, FAIL, "can't close attribute")
|
|
|
|
|
|
|
|
|
|
FUNC_LEAVE_API(ret_value)
|
|
|
|
|
} /* end H5Aget_info() */
|
|
|
|
|
|
2007-02-09 02:50:21 +08:00
|
|
|
|
|
|
|
|
|
/*-------------------------------------------------------------------------
|
|
|
|
|
* Function: H5Aget_info_by_idx
|
|
|
|
|
*
|
|
|
|
|
* Purpose: Retrieve information about an attribute, according to the
|
|
|
|
|
* order within an index.
|
|
|
|
|
*
|
|
|
|
|
* Return: Success: Non-negative with information in AINFO
|
|
|
|
|
* Failure: Negative
|
|
|
|
|
*
|
|
|
|
|
* Programmer: Quincey Koziol
|
|
|
|
|
* February 8, 2007
|
|
|
|
|
*
|
|
|
|
|
*-------------------------------------------------------------------------
|
|
|
|
|
*/
|
|
|
|
|
herr_t
|
2007-02-15 03:32:01 +08:00
|
|
|
|
H5Aget_info_by_idx(hid_t loc_id, const char *obj_name, H5_index_t idx_type,
|
|
|
|
|
H5_iter_order_t order, hsize_t n, H5A_info_t *ainfo, hid_t lapl_id)
|
2007-02-09 02:50:21 +08:00
|
|
|
|
{
|
|
|
|
|
H5G_loc_t loc; /* Object location */
|
|
|
|
|
H5A_t *attr = NULL; /* Attribute object for name */
|
|
|
|
|
herr_t ret_value = SUCCEED; /* Return value */
|
|
|
|
|
|
|
|
|
|
FUNC_ENTER_API(H5Aget_info_by_idx, FAIL)
|
|
|
|
|
|
|
|
|
|
/* Check args */
|
2007-02-09 23:32:51 +08:00
|
|
|
|
if(H5I_ATTR == H5I_get_type(loc_id))
|
2007-02-09 02:50:21 +08:00
|
|
|
|
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")
|
2007-02-15 03:32:01 +08:00
|
|
|
|
if(!obj_name || !*obj_name)
|
|
|
|
|
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no name")
|
2007-02-09 02:50:21 +08:00
|
|
|
|
if(idx_type <= H5_INDEX_UNKNOWN || idx_type >= H5_INDEX_N)
|
|
|
|
|
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid index type specified")
|
|
|
|
|
if(order <= H5_ITER_UNKNOWN || order >= H5_ITER_N)
|
|
|
|
|
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid iteration order specified")
|
|
|
|
|
if(NULL == ainfo)
|
|
|
|
|
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid info pointer")
|
2007-02-15 03:32:01 +08:00
|
|
|
|
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")
|
2007-02-09 02:50:21 +08:00
|
|
|
|
|
|
|
|
|
/* Open the attribute on the object header */
|
2007-02-15 03:32:01 +08:00
|
|
|
|
if(NULL == (attr = H5A_open_by_idx(&loc, obj_name, idx_type, order, n, lapl_id, H5AC_ind_dxpl_id)))
|
2007-02-09 02:50:21 +08:00
|
|
|
|
HGOTO_ERROR(H5E_ATTR, H5E_CANTOPENOBJ, FAIL, "can't open attribute")
|
|
|
|
|
|
|
|
|
|
/* Get the attribute information */
|
|
|
|
|
if(H5A_get_info(attr, ainfo) < 0)
|
|
|
|
|
HGOTO_ERROR(H5E_ATTR, H5E_CANTGET, FAIL, "unable to get attribute info")
|
|
|
|
|
|
|
|
|
|
done:
|
2007-02-13 22:50:48 +08:00
|
|
|
|
/* Release resources */
|
2007-02-09 02:50:21 +08:00
|
|
|
|
if(attr && H5A_close(attr) < 0)
|
|
|
|
|
HDONE_ERROR(H5E_ATTR, H5E_CANTFREE, FAIL, "can't close attribute")
|
|
|
|
|
|
|
|
|
|
FUNC_LEAVE_API(ret_value)
|
|
|
|
|
} /* end H5Aget_info_by_idx() */
|
|
|
|
|
|
2007-02-07 04:03:06 +08:00
|
|
|
|
|
|
|
|
|
/*-------------------------------------------------------------------------
|
|
|
|
|
* Function: H5A_get_info
|
|
|
|
|
*
|
|
|
|
|
* Purpose: Retrieve information about an attribute.
|
|
|
|
|
*
|
|
|
|
|
* Return: Success: Non-negative
|
|
|
|
|
* Failure: Negative
|
|
|
|
|
*
|
|
|
|
|
* Programmer: Quincey Koziol
|
|
|
|
|
* February 6, 2007
|
|
|
|
|
*
|
|
|
|
|
*-------------------------------------------------------------------------
|
|
|
|
|
*/
|
|
|
|
|
static herr_t
|
|
|
|
|
H5A_get_info(const H5A_t *attr, H5A_info_t *ainfo)
|
|
|
|
|
{
|
|
|
|
|
FUNC_ENTER_NOAPI_NOINIT_NOFUNC(H5A_get_info)
|
|
|
|
|
|
|
|
|
|
/* Check args */
|
|
|
|
|
HDassert(attr);
|
|
|
|
|
HDassert(ainfo);
|
|
|
|
|
|
|
|
|
|
/* Set info for attribute */
|
|
|
|
|
ainfo->cset = attr->encoding;
|
|
|
|
|
ainfo->data_size = attr->data_size;
|
|
|
|
|
if(attr->crt_idx == H5O_MAX_CRT_ORDER_IDX) {
|
|
|
|
|
ainfo->corder_valid = FALSE;
|
|
|
|
|
ainfo->corder = 0;
|
|
|
|
|
} /* end if */
|
|
|
|
|
else {
|
|
|
|
|
ainfo->corder_valid = TRUE;
|
|
|
|
|
ainfo->corder = attr->crt_idx;
|
|
|
|
|
} /* end else */
|
|
|
|
|
|
|
|
|
|
FUNC_LEAVE_NOAPI(SUCCEED)
|
|
|
|
|
} /* end H5A_get_info() */
|
|
|
|
|
|
2002-10-30 00:37:49 +08:00
|
|
|
|
|
|
|
|
|
/*-------------------------------------------------------------------------
|
|
|
|
|
* Function: H5Arename
|
|
|
|
|
*
|
2005-08-14 04:53:35 +08:00
|
|
|
|
* Purpose: Rename an attribute
|
2002-10-30 00:37:49 +08:00
|
|
|
|
*
|
2005-08-14 04:53:35 +08:00
|
|
|
|
* Return: Success: Non-negative
|
2002-10-30 00:37:49 +08:00
|
|
|
|
* Failure: Negative
|
|
|
|
|
*
|
|
|
|
|
* Programmer: Raymond Lu
|
|
|
|
|
* October 23, 2002
|
|
|
|
|
*
|
|
|
|
|
*-------------------------------------------------------------------------
|
|
|
|
|
*/
|
|
|
|
|
herr_t
|
2002-11-20 20:52:40 +08:00
|
|
|
|
H5Arename(hid_t loc_id, const char *old_name, const char *new_name)
|
2002-10-30 00:37:49 +08:00
|
|
|
|
{
|
2005-11-15 10:55:39 +08:00
|
|
|
|
H5G_loc_t loc; /* Object location */
|
|
|
|
|
herr_t ret_value = SUCCEED; /* Return value */
|
2005-08-14 04:53:35 +08:00
|
|
|
|
|
2003-07-09 05:05:27 +08:00
|
|
|
|
FUNC_ENTER_API(H5Arename, FAIL)
|
2006-12-19 03:16:17 +08:00
|
|
|
|
H5TRACE3("e", "iss", loc_id, old_name, new_name);
|
2002-10-30 00:37:49 +08:00
|
|
|
|
|
|
|
|
|
/* check arguments */
|
2005-11-15 10:55:39 +08:00
|
|
|
|
if(!old_name || !new_name)
|
2003-07-09 05:05:27 +08:00
|
|
|
|
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "name is nil")
|
2007-02-09 23:32:51 +08:00
|
|
|
|
if(H5I_ATTR == H5I_get_type(loc_id))
|
2003-07-09 05:05:27 +08:00
|
|
|
|
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "location is not valid for an attribute")
|
2005-11-15 10:55:39 +08:00
|
|
|
|
if(H5G_loc(loc_id, & loc) < 0)
|
2003-07-09 05:05:27 +08:00
|
|
|
|
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location")
|
2002-10-30 00:37:49 +08:00
|
|
|
|
|
2007-01-31 09:48:28 +08:00
|
|
|
|
/* Avoid thrashing things if the names are the same */
|
|
|
|
|
if(HDstrcmp(old_name, new_name))
|
|
|
|
|
/* Call attribute rename routine */
|
|
|
|
|
if(H5O_attr_rename(loc.oloc, H5AC_dxpl_id, old_name, new_name) < 0)
|
|
|
|
|
HGOTO_ERROR(H5E_ATTR, H5E_CANTRENAME, FAIL, "can't rename attribute")
|
2002-10-30 00:37:49 +08:00
|
|
|
|
|
|
|
|
|
done:
|
2003-07-09 05:05:27 +08:00
|
|
|
|
FUNC_LEAVE_API(ret_value)
|
2003-02-11 02:44:22 +08:00
|
|
|
|
} /* H5Arename() */
|
2002-10-30 00:37:49 +08:00
|
|
|
|
|
1998-04-24 06:24:38 +08:00
|
|
|
|
|
|
|
|
|
/*--------------------------------------------------------------------------
|
|
|
|
|
NAME
|
|
|
|
|
H5Aiterate
|
|
|
|
|
PURPOSE
|
|
|
|
|
Calls a user's function for each attribute on an object
|
|
|
|
|
USAGE
|
|
|
|
|
herr_t H5Aiterate (loc_id, attr_num, op, data)
|
|
|
|
|
hid_t loc_id; IN: Object (dataset or group) to be iterated over
|
|
|
|
|
unsigned *attr_num; IN/OUT: Starting (IN) & Ending (OUT) attribute number
|
|
|
|
|
H5A_operator_t op; IN: User's function to pass each attribute to
|
|
|
|
|
void *op_data; IN/OUT: User's data to pass through to iterator operator function
|
|
|
|
|
RETURNS
|
|
|
|
|
Returns a negative value if something is wrong, the return value of the
|
|
|
|
|
last operator if it was non-zero, or zero if all attributes were processed.
|
2005-08-14 04:53:35 +08:00
|
|
|
|
|
1998-04-24 06:24:38 +08:00
|
|
|
|
DESCRIPTION
|
|
|
|
|
This function interates over the attributes of dataset or group
|
|
|
|
|
specified with 'loc_id'. For each attribute of the object, the
|
|
|
|
|
'op_data' and some additional information (specified below) are passed
|
|
|
|
|
to the 'op' function. The iteration begins with the '*attr_number'
|
|
|
|
|
object in the group and the next attribute to be processed by the operator
|
|
|
|
|
is returned in '*attr_number'.
|
|
|
|
|
The operation receives the ID for the group or dataset being iterated
|
|
|
|
|
over ('loc_id'), the name of the current attribute about the object
|
|
|
|
|
('attr_name') and the pointer to the operator data passed in to H5Aiterate
|
|
|
|
|
('op_data'). The return values from an operator are:
|
2005-08-14 04:53:35 +08:00
|
|
|
|
A. Zero causes the iterator to continue, returning zero when all
|
1998-04-24 06:24:38 +08:00
|
|
|
|
attributes have been processed.
|
|
|
|
|
B. Positive causes the iterator to immediately return that positive
|
|
|
|
|
value, indicating short-circuit success. The iterator can be
|
|
|
|
|
restarted at the next attribute.
|
|
|
|
|
C. Negative causes the iterator to immediately return that value,
|
|
|
|
|
indicating failure. The iterator can be restarted at the next
|
|
|
|
|
attribute.
|
|
|
|
|
--------------------------------------------------------------------------*/
|
2000-04-13 05:09:38 +08:00
|
|
|
|
herr_t
|
1998-08-28 00:48:50 +08:00
|
|
|
|
H5Aiterate(hid_t loc_id, unsigned *attr_num, H5A_operator_t op, void *op_data)
|
1998-04-24 06:24:38 +08:00
|
|
|
|
{
|
2005-11-15 10:55:39 +08:00
|
|
|
|
H5G_loc_t loc; /* Object location */
|
2006-12-19 09:59:28 +08:00
|
|
|
|
H5A_attr_iter_op_t attr_op; /* Attribute operator */
|
2007-02-13 22:50:48 +08:00
|
|
|
|
hsize_t start_idx; /* Index of attribute to start iterating at */
|
|
|
|
|
hsize_t last_attr; /* Index of last attribute examined */
|
2006-12-07 06:19:52 +08:00
|
|
|
|
herr_t ret_value; /* Return value */
|
1998-04-24 06:24:38 +08:00
|
|
|
|
|
2003-07-09 05:05:27 +08:00
|
|
|
|
FUNC_ENTER_API(H5Aiterate, FAIL)
|
2006-12-19 03:16:17 +08:00
|
|
|
|
H5TRACE4("e", "i*Iuxx", loc_id, attr_num, op, op_data);
|
1998-04-24 06:24:38 +08:00
|
|
|
|
|
|
|
|
|
/* check arguments */
|
2007-02-09 23:32:51 +08:00
|
|
|
|
if(H5I_ATTR == H5I_get_type(loc_id))
|
2003-07-09 05:05:27 +08:00
|
|
|
|
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "location is not valid for an attribute")
|
2005-11-15 10:55:39 +08:00
|
|
|
|
if(H5G_loc(loc_id, &loc) < 0)
|
2003-07-09 05:05:27 +08:00
|
|
|
|
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location")
|
1998-04-24 06:24:38 +08:00
|
|
|
|
|
2006-12-19 09:59:28 +08:00
|
|
|
|
/* Build attribute operator info */
|
|
|
|
|
attr_op.op_type = H5A_ATTR_OP_APP;
|
|
|
|
|
attr_op.u.app_op = op;
|
|
|
|
|
|
2006-12-07 06:19:52 +08:00
|
|
|
|
/* Call attribute iteration routine */
|
2007-02-13 22:50:48 +08:00
|
|
|
|
last_attr = start_idx = (hsize_t)(attr_num ? *attr_num : 0);
|
|
|
|
|
if((ret_value = H5O_attr_iterate(loc_id, loc.oloc, H5AC_ind_dxpl_id, H5_INDEX_CRT_ORDER, H5_ITER_INC, start_idx, &last_attr, &attr_op, op_data)) < 0)
|
2006-12-07 06:19:52 +08:00
|
|
|
|
HERROR(H5E_ATTR, H5E_BADITER, "error iterating over attributes");
|
2002-08-09 00:52:55 +08:00
|
|
|
|
|
2007-02-13 22:50:48 +08:00
|
|
|
|
/* Set the last attribute information */
|
2007-02-14 03:33:33 +08:00
|
|
|
|
if(attr_num)
|
|
|
|
|
*attr_num = (unsigned)last_attr;
|
2007-02-13 22:50:48 +08:00
|
|
|
|
|
2002-08-09 00:52:55 +08:00
|
|
|
|
done:
|
2003-07-09 05:05:27 +08:00
|
|
|
|
FUNC_LEAVE_API(ret_value)
|
1998-04-24 06:24:38 +08:00
|
|
|
|
} /* H5Aiterate() */
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*--------------------------------------------------------------------------
|
|
|
|
|
NAME
|
|
|
|
|
H5Adelete
|
|
|
|
|
PURPOSE
|
|
|
|
|
Deletes an attribute from a location
|
|
|
|
|
USAGE
|
|
|
|
|
herr_t H5Adelete (loc_id, name)
|
|
|
|
|
hid_t loc_id; IN: Object (dataset or group) to have attribute deleted from
|
|
|
|
|
const char *name; IN: Name of attribute to delete
|
|
|
|
|
RETURNS
|
1998-10-27 05:18:54 +08:00
|
|
|
|
Non-negative on success/Negative on failure
|
1998-04-24 06:24:38 +08:00
|
|
|
|
DESCRIPTION
|
|
|
|
|
This function removes the named attribute from a dataset or group.
|
|
|
|
|
This function should not be used when attribute IDs are open on 'loc_id'
|
2005-08-14 04:53:35 +08:00
|
|
|
|
as it may cause the internal indexes of the attributes to change and future
|
1998-04-24 06:24:38 +08:00
|
|
|
|
writes to the open attributes to produce incorrect results.
|
|
|
|
|
--------------------------------------------------------------------------*/
|
|
|
|
|
herr_t
|
1998-08-28 00:48:50 +08:00
|
|
|
|
H5Adelete(hid_t loc_id, const char *name)
|
1998-04-24 06:24:38 +08:00
|
|
|
|
{
|
2005-11-15 10:55:39 +08:00
|
|
|
|
H5G_loc_t loc; /* Object location */
|
2006-12-12 08:42:19 +08:00
|
|
|
|
herr_t ret_value = SUCCEED; /* Return value */
|
1998-04-24 06:24:38 +08:00
|
|
|
|
|
2004-03-31 04:41:45 +08:00
|
|
|
|
FUNC_ENTER_API(H5Adelete, FAIL)
|
2006-12-19 03:16:17 +08:00
|
|
|
|
H5TRACE2("e", "is", loc_id, name);
|
1998-04-24 06:24:38 +08:00
|
|
|
|
|
|
|
|
|
/* check arguments */
|
2007-02-09 23:32:51 +08:00
|
|
|
|
if(H5I_ATTR == H5I_get_type(loc_id))
|
2003-07-09 05:05:27 +08:00
|
|
|
|
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "location is not valid for an attribute")
|
2005-11-15 10:55:39 +08:00
|
|
|
|
if(H5G_loc(loc_id, &loc) < 0)
|
2003-07-09 05:05:27 +08:00
|
|
|
|
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location")
|
2005-11-15 10:55:39 +08:00
|
|
|
|
if(!name || !*name)
|
2003-07-09 05:05:27 +08:00
|
|
|
|
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no name")
|
1998-04-24 06:24:38 +08:00
|
|
|
|
|
|
|
|
|
/* Delete the attribute from the location */
|
2006-12-12 08:42:19 +08:00
|
|
|
|
if(H5O_attr_remove(loc.oloc, name, H5AC_dxpl_id) < 0)
|
|
|
|
|
HGOTO_ERROR(H5E_ATTR, H5E_CANTDELETE, FAIL, "unable to delete attribute")
|
2005-08-14 04:53:35 +08:00
|
|
|
|
|
2002-08-09 00:52:55 +08:00
|
|
|
|
done:
|
2003-07-09 05:05:27 +08:00
|
|
|
|
FUNC_LEAVE_API(ret_value)
|
1998-04-24 06:24:38 +08:00
|
|
|
|
} /* H5Adelete() */
|
|
|
|
|
|
2007-02-20 10:28:41 +08:00
|
|
|
|
|
|
|
|
|
/*--------------------------------------------------------------------------
|
|
|
|
|
NAME
|
|
|
|
|
H5Adelete_by_idx
|
|
|
|
|
PURPOSE
|
|
|
|
|
Deletes an attribute from a location, according to the order within an index
|
|
|
|
|
USAGE
|
|
|
|
|
herr_t H5Adelete_by_idx(loc_id, obj_name, idx_type, order, n, lapl_id)
|
|
|
|
|
hid_t loc_id; IN: Base location for object
|
|
|
|
|
const char *obj_name; IN: Name of object relative to location
|
|
|
|
|
H5_index_t idx_type; IN: Type of index to use
|
|
|
|
|
H5_iter_order_t order; IN: Order to iterate over index
|
|
|
|
|
hsize_t n; IN: Offset within index
|
|
|
|
|
hid_t lapl_id; IN: Link access property list
|
|
|
|
|
RETURNS
|
|
|
|
|
Non-negative on success/Negative on failure
|
|
|
|
|
DESCRIPTION
|
|
|
|
|
This function removes an attribute from an object, using the IDX_TYPE
|
|
|
|
|
index to delete the N'th attribute in ORDER direction in the index. The
|
|
|
|
|
object is specified relative to the LOC_ID with the OBJ_NAME path. To
|
|
|
|
|
remove an attribute on the object specified by LOC_ID, pass in "." for
|
|
|
|
|
OBJ_NAME. The link access property list, LAPL_ID, controls aspects of
|
|
|
|
|
the group hierarchy traversal when using the OBJ_NAME to locate the final
|
|
|
|
|
object to operate on.
|
|
|
|
|
--------------------------------------------------------------------------*/
|
|
|
|
|
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)
|
|
|
|
|
{
|
|
|
|
|
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 */
|
|
|
|
|
herr_t ret_value = SUCCEED; /* Return value */
|
|
|
|
|
|
|
|
|
|
FUNC_ENTER_API(H5Adelete_by_idx, FAIL)
|
|
|
|
|
|
|
|
|
|
/* 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(idx_type <= H5_INDEX_UNKNOWN || idx_type >= H5_INDEX_N)
|
|
|
|
|
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid index type specified")
|
|
|
|
|
if(order <= H5_ITER_UNKNOWN || order >= H5_ITER_N)
|
|
|
|
|
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid iteration order specified")
|
|
|
|
|
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_dxpl_id) < 0)
|
|
|
|
|
HGOTO_ERROR(H5E_ATTR, H5E_NOTFOUND, FAIL, "object not found")
|
|
|
|
|
loc_found = TRUE;
|
|
|
|
|
|
|
|
|
|
/* Delete the attribute from the location */
|
|
|
|
|
if(H5O_attr_remove_by_idx(obj_loc.oloc, idx_type, order, n, H5AC_dxpl_id) < 0)
|
|
|
|
|
HGOTO_ERROR(H5E_ATTR, H5E_CANTDELETE, FAIL, "unable to delete attribute")
|
|
|
|
|
|
|
|
|
|
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)
|
|
|
|
|
} /* H5Adelete_by_idx() */
|
|
|
|
|
|
1998-04-24 06:24:38 +08:00
|
|
|
|
|
|
|
|
|
/*--------------------------------------------------------------------------
|
|
|
|
|
NAME
|
|
|
|
|
H5Aclose
|
|
|
|
|
PURPOSE
|
|
|
|
|
Close an attribute ID
|
|
|
|
|
USAGE
|
|
|
|
|
herr_t H5Aclose (attr_id)
|
|
|
|
|
hid_t attr_id; IN: Attribute to release access to
|
|
|
|
|
RETURNS
|
1998-10-27 05:18:54 +08:00
|
|
|
|
Non-negative on success/Negative on failure
|
2005-08-14 04:53:35 +08:00
|
|
|
|
|
1998-04-24 06:24:38 +08:00
|
|
|
|
DESCRIPTION
|
|
|
|
|
This function releases an attribute from use. Further use of the
|
|
|
|
|
attribute ID will result in undefined behavior.
|
|
|
|
|
--------------------------------------------------------------------------*/
|
|
|
|
|
herr_t
|
1998-08-28 00:48:50 +08:00
|
|
|
|
H5Aclose(hid_t attr_id)
|
1998-04-24 06:24:38 +08:00
|
|
|
|
{
|
2005-11-15 10:55:39 +08:00
|
|
|
|
herr_t ret_value = SUCCEED; /* Return value */
|
2002-08-09 00:52:55 +08:00
|
|
|
|
|
2003-07-09 05:05:27 +08:00
|
|
|
|
FUNC_ENTER_API(H5Aclose, FAIL)
|
2006-12-19 03:16:17 +08:00
|
|
|
|
H5TRACE1("e", "i", attr_id);
|
1998-04-24 06:24:38 +08:00
|
|
|
|
|
|
|
|
|
/* check arguments */
|
2005-11-15 10:55:39 +08:00
|
|
|
|
if(NULL == H5I_object_verify(attr_id, H5I_ATTR))
|
2003-07-09 05:05:27 +08:00
|
|
|
|
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not an attribute")
|
1998-04-24 06:24:38 +08:00
|
|
|
|
|
1998-04-28 21:59:08 +08:00
|
|
|
|
/* Decrement references to that atom (and close it) */
|
2007-02-07 04:03:06 +08:00
|
|
|
|
if(H5I_dec_ref(attr_id) < 0)
|
2003-07-09 05:05:27 +08:00
|
|
|
|
HGOTO_ERROR(H5E_ATTR, H5E_CANTDEC, FAIL, "can't close attribute")
|
2002-08-01 03:17:12 +08:00
|
|
|
|
|
2002-08-09 00:52:55 +08:00
|
|
|
|
done:
|
2003-07-09 05:05:27 +08:00
|
|
|
|
FUNC_LEAVE_API(ret_value)
|
1998-04-24 06:24:38 +08:00
|
|
|
|
} /* H5Aclose() */
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*-------------------------------------------------------------------------
|
|
|
|
|
* Function: H5A_copy
|
|
|
|
|
*
|
|
|
|
|
* Purpose: Copies attribute OLD_ATTR.
|
|
|
|
|
*
|
|
|
|
|
* Return: Success: Pointer to a new copy of the OLD_ATTR argument.
|
|
|
|
|
*
|
|
|
|
|
* Failure: NULL
|
|
|
|
|
*
|
|
|
|
|
* Programmer: Robb Matzke
|
|
|
|
|
* Thursday, December 4, 1997
|
|
|
|
|
*
|
|
|
|
|
*-------------------------------------------------------------------------
|
|
|
|
|
*/
|
|
|
|
|
H5A_t *
|
2006-12-07 06:19:52 +08:00
|
|
|
|
H5A_copy(H5A_t *_new_attr, const H5A_t *old_attr)
|
1998-04-24 06:24:38 +08:00
|
|
|
|
{
|
2005-11-15 10:55:39 +08:00
|
|
|
|
H5A_t *new_attr = NULL;
|
|
|
|
|
hbool_t allocated_attr = FALSE; /* Whether the attribute was allocated */
|
|
|
|
|
H5A_t *ret_value = NULL; /* Return value */
|
1998-04-24 06:24:38 +08:00
|
|
|
|
|
2003-07-09 05:05:27 +08:00
|
|
|
|
FUNC_ENTER_NOAPI(H5A_copy, NULL)
|
1998-04-24 06:24:38 +08:00
|
|
|
|
|
|
|
|
|
/* check args */
|
2006-12-07 06:19:52 +08:00
|
|
|
|
HDassert(old_attr);
|
1998-04-24 06:24:38 +08:00
|
|
|
|
|
2006-12-07 06:19:52 +08:00
|
|
|
|
/* Allocate attribute structure */
|
2005-11-15 10:55:39 +08:00
|
|
|
|
if(_new_attr == NULL) {
|
2007-01-03 12:42:13 +08:00
|
|
|
|
if(NULL == (new_attr = H5FL_MALLOC(H5A_t)))
|
2005-11-15 10:55:39 +08:00
|
|
|
|
HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
|
|
|
|
|
allocated_attr = TRUE;
|
2004-11-18 00:53:38 +08:00
|
|
|
|
} /* end if */
|
|
|
|
|
else
|
2006-12-07 06:19:52 +08:00
|
|
|
|
new_attr = _new_attr;
|
1998-04-24 06:24:38 +08:00
|
|
|
|
|
2006-12-07 06:19:52 +08:00
|
|
|
|
/* Copy the top level of the attribute */
|
|
|
|
|
*new_attr = *old_attr;
|
1998-04-24 06:24:38 +08:00
|
|
|
|
|
2006-12-07 06:19:52 +08:00
|
|
|
|
/* Don't open the object header for a copy */
|
|
|
|
|
new_attr->obj_opened = FALSE;
|
1998-04-24 06:24:38 +08:00
|
|
|
|
|
2006-12-07 06:19:52 +08:00
|
|
|
|
/* Copy the guts of the attribute */
|
2006-12-12 03:02:38 +08:00
|
|
|
|
if(NULL == (new_attr->name = H5MM_xstrdup(old_attr->name)))
|
|
|
|
|
HGOTO_ERROR(H5E_ATTR, H5E_CANTCOPY, NULL, "unable to copy attribute name")
|
|
|
|
|
if(NULL == (new_attr->dt = H5T_copy(old_attr->dt, H5T_COPY_ALL)))
|
|
|
|
|
HGOTO_ERROR(H5E_ATTR, H5E_CANTCOPY, NULL, "unable to copy attribute datatype")
|
|
|
|
|
if(NULL == (new_attr->ds = H5S_copy(old_attr->ds, FALSE)))
|
|
|
|
|
HGOTO_ERROR(H5E_ATTR, H5E_CANTCOPY, NULL, "unable to copy attribute dataspace")
|
2006-12-12 08:42:19 +08:00
|
|
|
|
/* XXX: Copy the object location and group path? -QAK */
|
2006-12-07 06:19:52 +08:00
|
|
|
|
|
|
|
|
|
/* Copy the attribute data, if there is any */
|
1998-04-24 06:24:38 +08:00
|
|
|
|
if(old_attr->data) {
|
2006-12-07 06:19:52 +08:00
|
|
|
|
/* Allocate data buffer for new attribute */
|
|
|
|
|
if(NULL == (new_attr->data = H5FL_BLK_MALLOC(attr_buf, old_attr->data_size)))
|
|
|
|
|
HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
|
|
|
|
|
|
|
|
|
|
/* Copy the attribute data */
|
|
|
|
|
HDmemcpy(new_attr->data, old_attr->data, old_attr->data_size);
|
1998-04-24 06:24:38 +08:00
|
|
|
|
} /* end if */
|
|
|
|
|
|
2002-08-09 00:52:55 +08:00
|
|
|
|
/* Set the return value */
|
2005-11-15 10:55:39 +08:00
|
|
|
|
ret_value = new_attr;
|
2005-08-14 04:53:35 +08:00
|
|
|
|
|
2002-08-09 00:52:55 +08:00
|
|
|
|
done:
|
2006-12-12 03:02:38 +08:00
|
|
|
|
if(ret_value == NULL)
|
2007-02-15 03:32:01 +08:00
|
|
|
|
if(allocated_attr && new_attr && H5A_close(new_attr) < 0)
|
|
|
|
|
HDONE_ERROR(H5E_ATTR, H5E_CANTFREE, NULL, "can't close attribute")
|
2002-08-09 00:52:55 +08:00
|
|
|
|
|
2003-07-09 05:05:27 +08:00
|
|
|
|
FUNC_LEAVE_NOAPI(ret_value)
|
2006-12-07 06:19:52 +08:00
|
|
|
|
} /* end H5A_copy() */
|
1998-04-24 06:24:38 +08:00
|
|
|
|
|
2004-11-18 00:53:38 +08:00
|
|
|
|
|
|
|
|
|
/*-------------------------------------------------------------------------
|
|
|
|
|
* Function: H5A_free
|
|
|
|
|
*
|
|
|
|
|
* Purpose: Frees all memory associated with an attribute, but does not
|
|
|
|
|
* free the H5A_t structure (which should be done in H5T_close).
|
|
|
|
|
*
|
|
|
|
|
* Return: Non-negative on success/Negative on failure
|
|
|
|
|
*
|
|
|
|
|
* Programmer: Quincey Koziol
|
|
|
|
|
* Monday, November 15, 2004
|
|
|
|
|
*
|
|
|
|
|
* Modifications:
|
|
|
|
|
*
|
|
|
|
|
*-------------------------------------------------------------------------
|
|
|
|
|
*/
|
|
|
|
|
herr_t
|
|
|
|
|
H5A_free(H5A_t *attr)
|
|
|
|
|
{
|
2005-11-15 10:55:39 +08:00
|
|
|
|
herr_t ret_value = SUCCEED; /* Return value */
|
2004-11-18 00:53:38 +08:00
|
|
|
|
|
|
|
|
|
FUNC_ENTER_NOAPI(H5A_free, FAIL)
|
|
|
|
|
|
2006-12-12 08:42:19 +08:00
|
|
|
|
HDassert(attr);
|
2004-11-18 00:53:38 +08:00
|
|
|
|
|
|
|
|
|
/* Free dynamicly allocated items */
|
|
|
|
|
if(attr->name)
|
|
|
|
|
H5MM_xfree(attr->name);
|
|
|
|
|
if(attr->dt)
|
2005-11-15 10:55:39 +08:00
|
|
|
|
if(H5T_close(attr->dt) < 0)
|
2004-11-18 00:53:38 +08:00
|
|
|
|
HGOTO_ERROR(H5E_ATTR, H5E_CANTRELEASE, FAIL, "can't release datatype info")
|
|
|
|
|
if(attr->ds)
|
2005-11-15 10:55:39 +08:00
|
|
|
|
if(H5S_close(attr->ds) < 0)
|
2004-11-18 00:53:38 +08:00
|
|
|
|
HGOTO_ERROR(H5E_ATTR, H5E_CANTRELEASE, FAIL, "can't release dataspace info")
|
|
|
|
|
if(attr->data)
|
2006-01-03 03:59:11 +08:00
|
|
|
|
attr->data = H5FL_BLK_FREE(attr_buf, attr->data);
|
2004-11-18 00:53:38 +08:00
|
|
|
|
|
|
|
|
|
done:
|
|
|
|
|
FUNC_LEAVE_NOAPI(ret_value)
|
|
|
|
|
} /* end H5A_free() */
|
|
|
|
|
|
1998-04-24 06:24:38 +08:00
|
|
|
|
|
|
|
|
|
/*-------------------------------------------------------------------------
|
|
|
|
|
* Function: H5A_close
|
|
|
|
|
*
|
2005-08-14 04:53:35 +08:00
|
|
|
|
* Purpose: Frees an attribute and all associated memory.
|
1998-04-24 06:24:38 +08:00
|
|
|
|
*
|
1998-10-27 05:18:54 +08:00
|
|
|
|
* Return: Non-negative on success/Negative on failure
|
1998-04-24 06:24:38 +08:00
|
|
|
|
*
|
|
|
|
|
* Programmer: Robb Matzke
|
|
|
|
|
* Monday, December 8, 1997
|
|
|
|
|
*
|
|
|
|
|
* Modifications:
|
|
|
|
|
*
|
|
|
|
|
*-------------------------------------------------------------------------
|
|
|
|
|
*/
|
|
|
|
|
herr_t
|
|
|
|
|
H5A_close(H5A_t *attr)
|
|
|
|
|
{
|
2005-11-15 10:55:39 +08:00
|
|
|
|
herr_t ret_value = SUCCEED; /* Return value */
|
2002-08-09 00:52:55 +08:00
|
|
|
|
|
2003-07-09 05:05:27 +08:00
|
|
|
|
FUNC_ENTER_NOAPI(H5A_close, FAIL)
|
1998-04-24 06:24:38 +08:00
|
|
|
|
|
2005-11-15 10:55:39 +08:00
|
|
|
|
HDassert(attr);
|
1998-04-24 06:24:38 +08:00
|
|
|
|
|
1998-04-28 21:59:08 +08:00
|
|
|
|
/* Check if the attribute has any data yet, if not, fill with zeroes */
|
2005-11-15 10:55:39 +08:00
|
|
|
|
if(attr->obj_opened && !attr->initialized) {
|
|
|
|
|
uint8_t *tmp_buf = H5FL_BLK_CALLOC(attr_buf, attr->data_size);
|
|
|
|
|
if(NULL == tmp_buf)
|
2003-07-09 05:05:27 +08:00
|
|
|
|
HGOTO_ERROR(H5E_ATTR, H5E_NOSPACE, FAIL, "memory allocation failed for attribute fill-value")
|
1998-04-28 21:59:08 +08:00
|
|
|
|
|
|
|
|
|
/* Go write the fill data to the attribute */
|
2005-11-15 10:55:39 +08:00
|
|
|
|
if(H5A_write(attr, attr->dt, tmp_buf, H5AC_dxpl_id) < 0)
|
2003-07-09 05:05:27 +08:00
|
|
|
|
HGOTO_ERROR(H5E_ATTR, H5E_WRITEERROR, FAIL, "unable to write attribute")
|
1998-04-28 21:59:08 +08:00
|
|
|
|
|
|
|
|
|
/* Free temporary buffer */
|
2006-01-03 03:59:11 +08:00
|
|
|
|
tmp_buf = H5FL_BLK_FREE(attr_buf, tmp_buf);
|
1998-04-28 21:59:08 +08:00
|
|
|
|
} /* end if */
|
2006-06-27 22:45:06 +08:00
|
|
|
|
|
1998-04-24 06:24:38 +08:00
|
|
|
|
/* Free dynamicly allocated items */
|
2005-11-15 10:55:39 +08:00
|
|
|
|
if(H5A_free(attr) < 0)
|
2004-11-18 00:53:38 +08:00
|
|
|
|
HGOTO_ERROR(H5E_ATTR, H5E_CANTRELEASE, FAIL, "can't release attribute info")
|
1998-04-24 06:24:38 +08:00
|
|
|
|
|
|
|
|
|
/* Close the object's symbol-table entry */
|
2005-11-15 10:55:39 +08:00
|
|
|
|
if(attr->obj_opened)
|
|
|
|
|
if(H5O_close(&(attr->oloc)) < 0)
|
2003-07-09 05:05:27 +08:00
|
|
|
|
HGOTO_ERROR(H5E_ATTR, H5E_CANTRELEASE, FAIL, "can't release object header info")
|
1998-04-24 06:24:38 +08:00
|
|
|
|
|
2005-11-15 10:55:39 +08:00
|
|
|
|
/* Release the group hier. path for the object the attribute is on */
|
|
|
|
|
if(H5G_name_free(&(attr->path)) < 0)
|
|
|
|
|
HGOTO_ERROR(H5E_ATTR, H5E_CANTRELEASE, FAIL, "can't release group hier. path")
|
|
|
|
|
|
2004-11-18 00:53:38 +08:00
|
|
|
|
H5FL_FREE(H5A_t, attr);
|
2005-08-14 04:53:35 +08:00
|
|
|
|
|
2002-08-09 00:52:55 +08:00
|
|
|
|
done:
|
2003-07-09 05:05:27 +08:00
|
|
|
|
FUNC_LEAVE_NOAPI(ret_value)
|
2004-11-18 00:53:38 +08:00
|
|
|
|
} /* end H5A_close() */
|
1998-04-24 06:24:38 +08:00
|
|
|
|
|
1998-08-07 05:32:33 +08:00
|
|
|
|
|
|
|
|
|
/*-------------------------------------------------------------------------
|
2005-11-15 10:55:39 +08:00
|
|
|
|
* Function: H5A_oloc
|
1998-08-07 05:32:33 +08:00
|
|
|
|
*
|
2005-11-15 10:55:39 +08:00
|
|
|
|
* Purpose: Return the object location for an attribute. It's the
|
|
|
|
|
* object location for the object to which the attribute
|
1998-08-07 05:32:33 +08:00
|
|
|
|
* belongs, not the attribute itself.
|
|
|
|
|
*
|
|
|
|
|
* Return: Success: Ptr to entry
|
|
|
|
|
* Failure: NULL
|
|
|
|
|
*
|
|
|
|
|
* Programmer: Robb Matzke
|
|
|
|
|
* Thursday, August 6, 1998
|
|
|
|
|
*
|
2005-11-15 10:55:39 +08:00
|
|
|
|
*-------------------------------------------------------------------------
|
|
|
|
|
*/
|
|
|
|
|
H5O_loc_t *
|
|
|
|
|
H5A_oloc(H5A_t *attr)
|
|
|
|
|
{
|
|
|
|
|
H5O_loc_t *ret_value; /* Return value */
|
|
|
|
|
|
|
|
|
|
FUNC_ENTER_NOAPI(H5A_oloc, NULL)
|
|
|
|
|
|
|
|
|
|
HDassert(attr);
|
|
|
|
|
|
|
|
|
|
/* Set return value */
|
|
|
|
|
ret_value = &(attr->oloc);
|
|
|
|
|
|
|
|
|
|
done:
|
|
|
|
|
FUNC_LEAVE_NOAPI(ret_value)
|
|
|
|
|
} /* end H5A_oloc() */
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*-------------------------------------------------------------------------
|
|
|
|
|
* Function: H5A_nameof
|
|
|
|
|
*
|
|
|
|
|
* Purpose: Return the group hier. path for an attribute. It's the
|
|
|
|
|
* group hier. path for the object to which the attribute
|
|
|
|
|
* belongs, not the attribute itself.
|
|
|
|
|
*
|
|
|
|
|
* Return: Success: Ptr to entry
|
|
|
|
|
* Failure: NULL
|
|
|
|
|
*
|
|
|
|
|
* Programmer: Quincey Koziol
|
|
|
|
|
* Monday, September 12, 2005
|
1998-08-07 05:32:33 +08:00
|
|
|
|
*
|
|
|
|
|
*-------------------------------------------------------------------------
|
|
|
|
|
*/
|
2005-11-15 10:55:39 +08:00
|
|
|
|
H5G_name_t *
|
|
|
|
|
H5A_nameof(H5A_t *attr)
|
1998-08-07 05:32:33 +08:00
|
|
|
|
{
|
2005-11-15 10:55:39 +08:00
|
|
|
|
H5G_name_t *ret_value; /* Return value */
|
2002-08-10 04:48:23 +08:00
|
|
|
|
|
2005-11-15 10:55:39 +08:00
|
|
|
|
FUNC_ENTER_NOAPI(H5A_nameof, NULL)
|
|
|
|
|
|
|
|
|
|
HDassert(attr);
|
2002-08-10 04:48:23 +08:00
|
|
|
|
|
|
|
|
|
/* Set return value */
|
2005-11-15 10:55:39 +08:00
|
|
|
|
ret_value=&(attr->path);
|
2002-08-10 04:48:23 +08:00
|
|
|
|
|
|
|
|
|
done:
|
2003-07-09 05:05:27 +08:00
|
|
|
|
FUNC_LEAVE_NOAPI(ret_value)
|
2005-11-15 10:55:39 +08:00
|
|
|
|
} /* end H5A_nameof() */
|
|
|
|
|
|