diff options
Diffstat (limited to 'src/H5D.c')
-rw-r--r-- | src/H5D.c | 1553 |
1 files changed, 750 insertions, 803 deletions
@@ -1,70 +1,69 @@ /**************************************************************************** -* NCSA HDF * -* Software Development Group * -* National Center for Supercomputing Applications * -* University of Illinois at Urbana-Champaign * -* 605 E. Springfield, Champaign IL 61820 * -* * -* For conditions of distribution and use, see the accompanying * -* hdf/COPYING file. * -* * +* NCSA HDF * +* Software Development Group * +* National Center for Supercomputing Applications * +* University of Illinois at Urbana-Champaign * +* 605 E. Springfield, Champaign IL 61820 * +* * +* For conditions of distribution and use, see the accompanying * +* hdf/COPYING file. * +* * ****************************************************************************/ #ifdef RCSID -static char RcsId[] = "@(#)$Revision$"; +static char RcsId[] = "@(#)$Revision$"; #endif /* $Id$ */ - -#include <H5private.h> /* Generic Functions */ -#include <H5Aprivate.h> /* Atoms */ -#include <H5ACprivate.h> /* Cache */ -#include <H5Cprivate.h> /* Templates */ -#include <H5Dprivate.h> /* Dataset functions */ -#include <H5Eprivate.h> /* Error handling */ -#include <H5Gprivate.h> /* Group headers */ -#include <H5Mprivate.h> /* Meta data */ -#include <H5MFprivate.h> /* File space allocation header */ -#include <H5MMprivate.h> /* Memory management */ -#include <H5Mprivate.h> /* Meta-Object API */ -#include <H5Oprivate.h> /* Object headers */ - -#define PABLO_MASK H5D_mask +#include <H5private.h> /* Generic Functions */ +#include <H5Aprivate.h> /* Atoms */ +#include <H5ACprivate.h> /* Cache */ +#include <H5Cprivate.h> /* Templates */ +#include <H5Dprivate.h> /* Dataset functions */ +#include <H5Eprivate.h> /* Error handling */ +#include <H5Gprivate.h> /* Group headers */ +#include <H5Mprivate.h> /* Meta data */ +#include <H5MFprivate.h> /* File space allocation header */ +#include <H5MMprivate.h> /* Memory management */ +#include <H5Mprivate.h> /* Meta-Object API */ +#include <H5Oprivate.h> /* Object headers */ + +#define PABLO_MASK H5D_mask /* * A dataset is the following struct. */ struct H5D_t { - H5G_entry_t ent; /*cached object header stuff */ - H5T_t *type; /*datatype of this dataset */ - H5P_t *space; /*dataspace of this dataset */ - H5D_create_t create_parms; /*creation parameters */ - H5O_layout_t layout; /*data layout */ + H5G_entry_t ent; /*cached object header stuff */ + H5T_t *type; /*datatype of this dataset */ + H5P_t *space; /*dataspace of this dataset */ + H5D_create_t create_parms; /*creation parameters */ + H5O_layout_t layout; /*data layout */ }; /* Default dataset creation template */ -const H5D_create_t H5D_create_dflt = { - H5D_CONTIGUOUS, /* Layout */ - 1, /* Chunk dimensions */ - {1, 1, 1, 1, 1, 1, 1, 1, /* Chunk size. These default values....*/ - 1, 1, 1, 1, 1, 1, 1, 1, /*...are quite useless. Larger chunks..*/ - 1, 1, 1, 1, 1, 1, 1, 1, /*...produce fewer, but larger I/O......*/ - 1, 1, 1, 1, 1, 1, 1, 1}, /*...requests. */ +const H5D_create_t H5D_create_dflt = +{ + H5D_CONTIGUOUS, /* Layout */ + 1, /* Chunk dimensions */ + {1, 1, 1, 1, 1, 1, 1, 1, /* Chunk size. These default values.... */ + 1, 1, 1, 1, 1, 1, 1, 1, /*...are quite useless. Larger chunks.. */ + 1, 1, 1, 1, 1, 1, 1, 1, /*...produce fewer, but larger I/O...... */ + 1, 1, 1, 1, 1, 1, 1, 1}, /*...requests. */ }; /* Default dataset transfer template */ -const H5D_xfer_t H5D_xfer_dflt = { - 0, /* Place holder - remove this later */ +const H5D_xfer_t H5D_xfer_dflt = +{ + 0, /* Place holder - remove this later */ }; - /* Interface initialization? */ -static hbool_t interface_initialize_g = FALSE; +static hbool_t interface_initialize_g = FALSE; #define INTERFACE_INIT H5D_init_interface -static herr_t H5D_init_interface(void); -static void H5D_term_interface (void); - +static herr_t H5D_init_interface(void); +static void H5D_term_interface(void); /*-------------------------------------------------------------------------- NAME @@ -79,19 +78,18 @@ DESCRIPTION --------------------------------------------------------------------------*/ static herr_t -H5D_init_interface (void) +H5D_init_interface(void) { - herr_t ret_value = SUCCEED; - FUNC_ENTER (H5D_init_interface, FAIL); - - /* Initialize the atom group for the dataset IDs */ - if ((ret_value=H5Ainit_group (H5_DATASET, H5A_DATASETID_HASHSIZE, - H5D_RESERVED_ATOMS, - (herr_t (*)(void*))H5D_close))!=FAIL) { - ret_value = H5_add_exit (H5D_term_interface); - } - - FUNC_LEAVE (ret_value); + herr_t ret_value = SUCCEED; + FUNC_ENTER(H5D_init_interface, FAIL); + + /* Initialize the atom group for the dataset IDs */ + if ((ret_value = H5Ainit_group(H5_DATASET, H5A_DATASETID_HASHSIZE, + H5D_RESERVED_ATOMS, + (herr_t (*)(void *)) H5D_close)) != FAIL) { + ret_value = H5_add_exit(H5D_term_interface); + } + FUNC_LEAVE(ret_value); } /*-------------------------------------------------------------------------- @@ -112,126 +110,122 @@ H5D_init_interface (void) REVISION LOG --------------------------------------------------------------------------*/ static void -H5D_term_interface (void) +H5D_term_interface(void) { - H5Adestroy_group (H5_DATASET); + H5Adestroy_group(H5_DATASET); } - /*------------------------------------------------------------------------- - * Function: H5Dcreate + * Function: H5Dcreate * - * Purpose: Creates a new dataset named NAME in file FILE_ID, opens the - * dataset for access, and associates with that dataset constant - * and initial persistent properties including the type of each - * datapoint as stored in the file (TYPE_ID), the size of the - * dataset (SPACE_ID), and other initial miscellaneous - * properties (CREATE_PARMS_ID). + * Purpose: Creates a new dataset named NAME in file FILE_ID, opens the + * dataset for access, and associates with that dataset constant + * and initial persistent properties including the type of each + * datapoint as stored in the file (TYPE_ID), the size of the + * dataset (SPACE_ID), and other initial miscellaneous + * properties (CREATE_PARMS_ID). * - * All arguments are copied into the dataset, so the caller is - * allowed to derive new types, data spaces, and creation - * parameters from the old ones and reuse them in calls to - * create other datasets. + * All arguments are copied into the dataset, so the caller is + * allowed to derive new types, data spaces, and creation + * parameters from the old ones and reuse them in calls to + * create other datasets. * - * Return: Success: The object ID of the new dataset. At this - * point, the dataset is ready to receive its - * raw data. Attempting to read raw data from - * the dataset will probably return the fill - * value. The dataset should be closed when - * the caller is no longer interested in it. + * Return: Success: The object ID of the new dataset. At this + * point, the dataset is ready to receive its + * raw data. Attempting to read raw data from + * the dataset will probably return the fill + * value. The dataset should be closed when + * the caller is no longer interested in it. * - * Failure: FAIL + * Failure: FAIL * * Errors: - * ARGS BADTYPE Not a data space. - * ARGS BADTYPE Not a dataset creation template. - * ARGS BADTYPE Not a file. - * ARGS BADTYPE Not a type. - * ARGS BADVALUE No name. - * DATASET CANTINIT Can't create dataset. - * DATASET CANTREGISTER Can't register dataset. + * ARGS BADTYPE Not a data space. + * ARGS BADTYPE Not a dataset creation template. + * ARGS BADTYPE Not a file. + * ARGS BADTYPE Not a type. + * ARGS BADVALUE No name. + * DATASET CANTINIT Can't create dataset. + * DATASET CANTREGISTER Can't register dataset. * - * Programmer: Robb Matzke - * Wednesday, December 3, 1997 + * Programmer: Robb Matzke + * Wednesday, December 3, 1997 * * Modifications: * *------------------------------------------------------------------------- */ hid_t -H5Dcreate (hid_t file_id, const char *name, hid_t type_id, hid_t space_id, - hid_t create_parms_id) +H5Dcreate(hid_t file_id, const char *name, hid_t type_id, hid_t space_id, + hid_t create_parms_id) { - H5F_t *f = NULL; - H5T_t *type = NULL; - H5P_t *space = NULL; - H5D_t *new_dset = NULL; - hid_t ret_value = FAIL; - const H5D_create_t *create_parms = NULL; - - FUNC_ENTER (H5Dcreate, FAIL); - H5ECLEAR; - - /* check arguments */ - if (H5_FILE!=H5Aatom_group (file_id) || - NULL==(f=H5Aatom_object (file_id))) { - HRETURN_ERROR (H5E_ARGS, H5E_BADTYPE, FAIL, "not a file"); - } - if (!name || !*name) { - HRETURN_ERROR (H5E_ARGS, H5E_BADVALUE, FAIL, "no name"); - } - if (H5_DATATYPE!=H5Aatom_group (type_id) || - NULL==(type=H5Aatom_object (type_id))) { - HRETURN_ERROR (H5E_ARGS, H5E_BADTYPE, FAIL, "not a type"); - } - if (H5_DATASPACE!=H5Aatom_group (space_id) || - NULL==(space=H5Aatom_object (space_id))) { - HRETURN_ERROR (H5E_ARGS, H5E_BADTYPE, FAIL, "not a data space"); - } - if (create_parms_id>=0) { - if (H5C_DATASET_CREATE!=H5Cget_class (create_parms_id) || - NULL==(create_parms=H5Aatom_object (create_parms_id))) { - HRETURN_ERROR (H5E_ARGS, H5E_BADTYPE, FAIL, - "not a dataset creation template"); - } - } else { - create_parms = &H5D_create_dflt; - } - - /* build and open the new dataset */ - if (NULL==(new_dset=H5D_create (f, name, type, space, create_parms))) { - HRETURN_ERROR (H5E_DATASET, H5E_CANTINIT, FAIL, "can't create dataset"); - } - - /* Register the new datatype and get an ID for it */ - if ((ret_value=H5Aregister_atom (H5_DATASET, new_dset))<0) { - H5D_close (new_dset); - HRETURN_ERROR (H5E_DATASET, H5E_CANTREGISTER, FAIL, - "can't register dataset"); - } - - FUNC_LEAVE (ret_value); + H5F_t *f = NULL; + H5T_t *type = NULL; + H5P_t *space = NULL; + H5D_t *new_dset = NULL; + hid_t ret_value = FAIL; + const H5D_create_t *create_parms = NULL; + + FUNC_ENTER(H5Dcreate, FAIL); + H5ECLEAR; + + /* check arguments */ + if (H5_FILE != H5Aatom_group(file_id) || + NULL == (f = H5Aatom_object(file_id))) { + HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a file"); + } + if (!name || !*name) { + HRETURN_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no name"); + } + if (H5_DATATYPE != H5Aatom_group(type_id) || + NULL == (type = H5Aatom_object(type_id))) { + HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a type"); + } + if (H5_DATASPACE != H5Aatom_group(space_id) || + NULL == (space = H5Aatom_object(space_id))) { + HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a data space"); + } + if (create_parms_id >= 0) { + if (H5C_DATASET_CREATE != H5Cget_class(create_parms_id) || + NULL == (create_parms = H5Aatom_object(create_parms_id))) { + HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, + "not a dataset creation template"); + } + } else { + create_parms = &H5D_create_dflt; + } + + /* build and open the new dataset */ + if (NULL == (new_dset = H5D_create(f, name, type, space, create_parms))) { + HRETURN_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "can't create dataset"); + } + /* Register the new datatype and get an ID for it */ + if ((ret_value = H5Aregister_atom(H5_DATASET, new_dset)) < 0) { + H5D_close(new_dset); + HRETURN_ERROR(H5E_DATASET, H5E_CANTREGISTER, FAIL, + "can't register dataset"); + } + FUNC_LEAVE(ret_value); } - /*------------------------------------------------------------------------- - * Function: H5Dopen + * Function: H5Dopen * - * Purpose: Finds a dataset named NAME in file FILE_ID, opens it, and - * returns its ID. The dataset should be close when the caller - * is no longer interested in it. + * Purpose: Finds a dataset named NAME in file FILE_ID, opens it, and + * returns its ID. The dataset should be close when the caller + * is no longer interested in it. * - * Return: Success: A new dataset ID + * Return: Success: A new dataset ID * - * Failure: FAIL + * Failure: FAIL * * Errors: - * ARGS BADTYPE Not a file. - * ARGS BADVALUE No name. - * DATASET CANTREGISTER Can't register dataset. - * DATASET NOTFOUND Dataset not found. + * ARGS BADTYPE Not a file. + * ARGS BADVALUE No name. + * DATASET CANTREGISTER Can't register dataset. + * DATASET NOTFOUND Dataset not found. * - * Programmer: Robb Matzke + * Programmer: Robb Matzke * Thursday, December 4, 1997 * * Modifications: @@ -239,56 +233,52 @@ H5Dcreate (hid_t file_id, const char *name, hid_t type_id, hid_t space_id, *------------------------------------------------------------------------- */ hid_t -H5Dopen (hid_t file_id, const char *name) +H5Dopen(hid_t file_id, const char *name) { - H5F_t *file = NULL; /*file holding the dataset */ - H5D_t *dataset = NULL; /*the dataset */ - hid_t ret_value = FAIL; - - FUNC_ENTER (H5Dopen, FAIL); - H5ECLEAR; - - /* Check args */ - if (H5_FILE!=H5Aatom_group (file_id) || - NULL==(file=H5Aatom_object (file_id))) { - HRETURN_ERROR (H5E_ARGS, H5E_BADTYPE, FAIL, "not a file"); - } - if (!name || !*name) { - HRETURN_ERROR (H5E_ARGS, H5E_BADVALUE, FAIL, "no name"); - } - - /* Find the dataset */ - if (NULL==(dataset=H5D_open (file, name))) { - HRETURN_ERROR (H5E_DATASET, H5E_NOTFOUND, FAIL, "dataset not found"); - } - - /* Create an atom for the dataset */ - if ((ret_value=H5Aregister_atom (H5_DATASET, dataset))<0) { - H5D_close (dataset); - HRETURN_ERROR (H5E_DATASET, H5E_CANTREGISTER, FAIL, - "can't register dataset"); - } - - FUNC_LEAVE (ret_value); + H5F_t *file = NULL; /*file holding the dataset */ + H5D_t *dataset = NULL; /*the dataset */ + hid_t ret_value = FAIL; + + FUNC_ENTER(H5Dopen, FAIL); + H5ECLEAR; + + /* Check args */ + if (H5_FILE != H5Aatom_group(file_id) || + NULL == (file = H5Aatom_object(file_id))) { + HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a file"); + } + if (!name || !*name) { + HRETURN_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no name"); + } + /* Find the dataset */ + if (NULL == (dataset = H5D_open(file, name))) { + HRETURN_ERROR(H5E_DATASET, H5E_NOTFOUND, FAIL, "dataset not found"); + } + /* Create an atom for the dataset */ + if ((ret_value = H5Aregister_atom(H5_DATASET, dataset)) < 0) { + H5D_close(dataset); + HRETURN_ERROR(H5E_DATASET, H5E_CANTREGISTER, FAIL, + "can't register dataset"); + } + FUNC_LEAVE(ret_value); } - /*------------------------------------------------------------------------- - * Function: H5Dclose + * Function: H5Dclose * - * Purpose: Closes access to a dataset (DATASET_ID) and releases - * resources used by it. It is illegal to subsequently use that - * same dataset ID in calls to other dataset functions. + * Purpose: Closes access to a dataset (DATASET_ID) and releases + * resources used by it. It is illegal to subsequently use that + * same dataset ID in calls to other dataset functions. * - * Return: Success: SUCCEED + * Return: Success: SUCCEED * - * Failure: FAIL + * Failure: FAIL * * Errors: - * ARGS BADTYPE Not a dataset. - * DATASET CANTINIT Can't free. + * ARGS BADTYPE Not a dataset. + * DATASET CANTINIT Can't free. * - * Programmer: Robb Matzke + * Programmer: Robb Matzke * Thursday, December 4, 1997 * * Modifications: @@ -296,68 +286,65 @@ H5Dopen (hid_t file_id, const char *name) *------------------------------------------------------------------------- */ herr_t -H5Dclose (hid_t dataset_id) +H5Dclose(hid_t dataset_id) { - H5D_t *dataset = NULL; /* dataset object to release */ - - FUNC_ENTER (H5Dclose, FAIL); - H5ECLEAR; - - /* Check args */ - if (H5_DATASET!=H5Aatom_group (dataset_id) || - NULL==(dataset=H5Aatom_object (dataset_id)) || - NULL==dataset->ent.file) { - HRETURN_ERROR (H5E_ARGS, H5E_BADTYPE, FAIL, "not a dataset"); - } - - /* - * Decrement the counter on the dataset. It will be freed if the count - * reaches zero. - */ - if (H5A_dec_ref (dataset_id)<0) { - HRETURN_ERROR (H5E_DATASET, H5E_CANTINIT, FAIL, "can't free"); - } - - FUNC_LEAVE (SUCCEED); + H5D_t *dataset = NULL; /* dataset object to release */ + + FUNC_ENTER(H5Dclose, FAIL); + H5ECLEAR; + + /* Check args */ + if (H5_DATASET != H5Aatom_group(dataset_id) || + NULL == (dataset = H5Aatom_object(dataset_id)) || + NULL == dataset->ent.file) { + HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a dataset"); + } + /* + * Decrement the counter on the dataset. It will be freed if the count + * reaches zero. + */ + if (H5A_dec_ref(dataset_id) < 0) { + HRETURN_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "can't free"); + } + FUNC_LEAVE(SUCCEED); } - /*------------------------------------------------------------------------- - * Function: H5Dread + * Function: H5Dread * - * Purpose: Reads (part of) a DATASET from the file into application - * memory BUF. The part of the dataset to read is defined with - * MEM_SPACE_ID and FILE_SPACE_ID. The data points are - * converted from their file type to the MEM_TYPE_ID specified. - * Additional miscellaneous data transfer properties can be - * passed to this function with the XFER_PARMS_ID argument. + * Purpose: Reads (part of) a DATASET from the file into application + * memory BUF. The part of the dataset to read is defined with + * MEM_SPACE_ID and FILE_SPACE_ID. The data points are + * converted from their file type to the MEM_TYPE_ID specified. + * Additional miscellaneous data transfer properties can be + * passed to this function with the XFER_PARMS_ID argument. * - * The FILE_SPACE_ID can be the constant H5P_ALL which indicates - * that the entire file data space is to be referenced. + * The FILE_SPACE_ID can be the constant H5P_ALL which indicates + * that the entire file data space is to be referenced. * - * The MEM_SPACE_ID can be the constant H5P_ALL in which case - * the memory data space is the same as the file data space - * defined when the dataset was created. + * The MEM_SPACE_ID can be the constant H5P_ALL in which case + * the memory data space is the same as the file data space + * defined when the dataset was created. * - * The number of elements in the memory data space must match - * the number of elements in the file data space. + * The number of elements in the memory data space must match + * the number of elements in the file data space. * - * The XFER_PARMS_ID can be the constant H5C_DEFAULT in which - * case the default data transfer properties are used. + * The XFER_PARMS_ID can be the constant H5C_DEFAULT in which + * case the default data transfer properties are used. * - * Return: Success: SUCCEED + * Return: Success: SUCCEED * - * Failure: FAIL + * Failure: FAIL * * Errors: - * ARGS BADTYPE Not a data space. - * ARGS BADTYPE Not a data type. - * ARGS BADTYPE Not a dataset. - * ARGS BADTYPE Not xfer parms. - * ARGS BADVALUE No output buffer. - * DATASET READERROR Can't read data. - * - * Programmer: Robb Matzke + * ARGS BADTYPE Not a data space. + * ARGS BADTYPE Not a data type. + * ARGS BADTYPE Not a dataset. + * ARGS BADTYPE Not xfer parms. + * ARGS BADVALUE No output buffer. + * DATASET READERROR Can't read data. + * + * Programmer: Robb Matzke * Thursday, December 4, 1997 * * Modifications: @@ -365,91 +352,88 @@ H5Dclose (hid_t dataset_id) *------------------------------------------------------------------------- */ herr_t -H5Dread (hid_t dataset_id, hid_t mem_type_id, hid_t mem_space_id, - hid_t file_space_id, hid_t xfer_parms_id, void *buf/*out*/) +H5Dread(hid_t dataset_id, hid_t mem_type_id, hid_t mem_space_id, + hid_t file_space_id, hid_t xfer_parms_id, void *buf /*out */ ) { - H5D_t *dataset = NULL; - const H5T_t *mem_type = NULL; - const H5P_t *mem_space = NULL; - const H5P_t *file_space = NULL; - const H5D_xfer_t *xfer_parms = NULL; - - FUNC_ENTER (H5Dread, FAIL); - H5ECLEAR; - - /* check arguments */ - if (H5_DATASET!=H5Aatom_group (dataset_id) || - NULL==(dataset=H5Aatom_object (dataset_id)) || - NULL==dataset->ent.file) { - HRETURN_ERROR (H5E_ARGS, H5E_BADTYPE, FAIL, "not a dataset"); - } - if (H5_DATATYPE!=H5Aatom_group (mem_type_id) || - NULL==(mem_type=H5Aatom_object (mem_type_id))) { - HRETURN_ERROR (H5E_ARGS, H5E_BADTYPE, FAIL, "not a data type"); - } - if (H5P_ALL!=mem_space_id) { - if (H5_DATASPACE!=H5Aatom_group (mem_space_id) || - NULL==(mem_space=H5Aatom_object (mem_space_id))) { - HRETURN_ERROR (H5E_ARGS, H5E_BADTYPE, FAIL, "not a data space"); - } - } - if (H5P_ALL!=file_space_id) { - if (H5_DATASPACE!=H5Aatom_group (file_space_id) || - NULL==(file_space=H5Aatom_object (file_space_id))) { - HRETURN_ERROR (H5E_ARGS, H5E_BADTYPE, FAIL, "not a data space"); - } - } - if (H5C_DEFAULT==xfer_parms_id) { - xfer_parms = &H5D_xfer_dflt; - } else if (H5C_DATASET_XFER!=H5Cget_class (xfer_parms_id) || - NULL==(xfer_parms=H5Aatom_object (xfer_parms_id))) { - HRETURN_ERROR (H5E_ARGS, H5E_BADTYPE, FAIL, "not xfer parms"); - } - if (!buf) { - HRETURN_ERROR (H5E_ARGS, H5E_BADVALUE, FAIL, "no output buffer"); - } - - /* read raw data */ - if (H5D_read (dataset, mem_type, mem_space, file_space, xfer_parms, - buf/*out*/)<0) { - HRETURN_ERROR (H5E_DATASET, H5E_READERROR, FAIL, "can't read data"); - } - - FUNC_LEAVE (SUCCEED); + H5D_t *dataset = NULL; + const H5T_t *mem_type = NULL; + const H5P_t *mem_space = NULL; + const H5P_t *file_space = NULL; + const H5D_xfer_t *xfer_parms = NULL; + + FUNC_ENTER(H5Dread, FAIL); + H5ECLEAR; + + /* check arguments */ + if (H5_DATASET != H5Aatom_group(dataset_id) || + NULL == (dataset = H5Aatom_object(dataset_id)) || + NULL == dataset->ent.file) { + HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a dataset"); + } + if (H5_DATATYPE != H5Aatom_group(mem_type_id) || + NULL == (mem_type = H5Aatom_object(mem_type_id))) { + HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a data type"); + } + if (H5P_ALL != mem_space_id) { + if (H5_DATASPACE != H5Aatom_group(mem_space_id) || + NULL == (mem_space = H5Aatom_object(mem_space_id))) { + HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a data space"); + } + } + if (H5P_ALL != file_space_id) { + if (H5_DATASPACE != H5Aatom_group(file_space_id) || + NULL == (file_space = H5Aatom_object(file_space_id))) { + HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a data space"); + } + } + if (H5C_DEFAULT == xfer_parms_id) { + xfer_parms = &H5D_xfer_dflt; + } else if (H5C_DATASET_XFER != H5Cget_class(xfer_parms_id) || + NULL == (xfer_parms = H5Aatom_object(xfer_parms_id))) { + HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not xfer parms"); + } + if (!buf) { + HRETURN_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no output buffer"); + } + /* read raw data */ + if (H5D_read(dataset, mem_type, mem_space, file_space, xfer_parms, + buf /*out */ ) < 0) { + HRETURN_ERROR(H5E_DATASET, H5E_READERROR, FAIL, "can't read data"); + } + FUNC_LEAVE(SUCCEED); } - /*------------------------------------------------------------------------- - * Function: H5Dwrite + * Function: H5Dwrite * - * Purpose: Writes (part of) a DATASET from application memory BUF to the - * file. The part of the dataset to write is defined with the - * MEM_SPACE_ID and FILE_SPACE_ID arguments. The data points - * are converted from their current type (MEM_TYPE_ID) to their - * file data type. Additional miscellaneous data transfer - * properties can be passed to this function with the - * XFER_PARMS_ID argument. + * Purpose: Writes (part of) a DATASET from application memory BUF to the + * file. The part of the dataset to write is defined with the + * MEM_SPACE_ID and FILE_SPACE_ID arguments. The data points + * are converted from their current type (MEM_TYPE_ID) to their + * file data type. Additional miscellaneous data transfer + * properties can be passed to this function with the + * XFER_PARMS_ID argument. * - * The FILE_SPACE_ID can be the constant H5P_ALL which indicates - * that the entire file data space is to be referenced. + * The FILE_SPACE_ID can be the constant H5P_ALL which indicates + * that the entire file data space is to be referenced. * - * The MEM_SPACE_ID can be the constant H5P_ALL in which case - * the memory data space is the same as the file data space - * defined when the dataset was created. + * The MEM_SPACE_ID can be the constant H5P_ALL in which case + * the memory data space is the same as the file data space + * defined when the dataset was created. * - * The number of elements in the memory data space must match - * the number of elements in the file data space. + * The number of elements in the memory data space must match + * the number of elements in the file data space. * - * The XFER_PARMS_ID can be the constant H5C_DEFAULT in which - * case the default data transfer properties are used. + * The XFER_PARMS_ID can be the constant H5C_DEFAULT in which + * case the default data transfer properties are used. * - * Return: Success: SUCCEED + * Return: Success: SUCCEED * - * Failure: FAIL + * Failure: FAIL * * Errors: * - * Programmer: Robb Matzke + * Programmer: Robb Matzke * Thursday, December 4, 1997 * * Modifications: @@ -457,79 +441,71 @@ H5Dread (hid_t dataset_id, hid_t mem_type_id, hid_t mem_space_id, *------------------------------------------------------------------------- */ herr_t -H5Dwrite (hid_t dataset_id, hid_t mem_type_id, hid_t mem_space_id, - hid_t file_space_id, hid_t xfer_parms_id, const void *buf) +H5Dwrite(hid_t dataset_id, hid_t mem_type_id, hid_t mem_space_id, + hid_t file_space_id, hid_t xfer_parms_id, const void *buf) { - H5D_t *dataset = NULL; - const H5T_t *mem_type = NULL; - const H5P_t *mem_space = NULL; - const H5P_t *file_space = NULL; - const H5D_xfer_t *xfer_parms = NULL; - - FUNC_ENTER (H5Dwrite, FAIL); - H5ECLEAR; - - /* check arguments */ - if (H5_DATASET!=H5Aatom_group (dataset_id) || - NULL==(dataset=H5Aatom_object (dataset_id)) || - NULL==dataset->ent.file) { - HRETURN_ERROR (H5E_ARGS, H5E_BADTYPE, FAIL, "not a dataset"); - } - if (H5_DATATYPE!=H5Aatom_group (mem_type_id) || - NULL==(mem_type=H5Aatom_object (mem_type_id))) { - HRETURN_ERROR (H5E_ARGS, H5E_BADTYPE, FAIL, "not a data type"); - } - if (H5P_ALL!=mem_space_id) { - if (H5_DATASPACE!=H5Aatom_group (mem_space_id) || - NULL==(mem_space=H5Aatom_object (mem_space_id))) { - HRETURN_ERROR (H5E_ARGS, H5E_BADTYPE, FAIL, "not a data space"); - } - } - if (H5P_ALL!=file_space_id) { - if (H5_DATASPACE!=H5Aatom_group (file_space_id) || - NULL==(file_space=H5Aatom_object (file_space_id))) { - HRETURN_ERROR (H5E_ARGS, H5E_BADTYPE, FAIL, "not a data space"); - } - } - if (H5C_DEFAULT==xfer_parms_id) { - xfer_parms = &H5D_xfer_dflt; - } else if (H5C_DATASET_XFER!=H5Cget_class (xfer_parms_id) || - NULL==(xfer_parms=H5Aatom_object (xfer_parms_id))) { - HRETURN_ERROR (H5E_ARGS, H5E_BADTYPE, FAIL, "not xfer parms"); - } - if (!buf) { - HRETURN_ERROR (H5E_ARGS, H5E_BADVALUE, FAIL, "no output buffer"); - } - - /* write raw data */ - if (H5D_write (dataset, mem_type, mem_space, file_space, xfer_parms, - buf)<0) { - HRETURN_ERROR (H5E_DATASET, H5E_READERROR, FAIL, "can't write data"); - } - - FUNC_LEAVE (SUCCEED); + H5D_t *dataset = NULL; + const H5T_t *mem_type = NULL; + const H5P_t *mem_space = NULL; + const H5P_t *file_space = NULL; + const H5D_xfer_t *xfer_parms = NULL; + + FUNC_ENTER(H5Dwrite, FAIL); + H5ECLEAR; + + /* check arguments */ + if (H5_DATASET != H5Aatom_group(dataset_id) || + NULL == (dataset = H5Aatom_object(dataset_id)) || + NULL == dataset->ent.file) { + HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a dataset"); + } + if (H5_DATATYPE != H5Aatom_group(mem_type_id) || + NULL == (mem_type = H5Aatom_object(mem_type_id))) { + HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a data type"); + } + if (H5P_ALL != mem_space_id) { + if (H5_DATASPACE != H5Aatom_group(mem_space_id) || + NULL == (mem_space = H5Aatom_object(mem_space_id))) { + HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a data space"); + } + } + if (H5P_ALL != file_space_id) { + if (H5_DATASPACE != H5Aatom_group(file_space_id) || + NULL == (file_space = H5Aatom_object(file_space_id))) { + HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a data space"); + } + } + if (H5C_DEFAULT == xfer_parms_id) { + xfer_parms = &H5D_xfer_dflt; + } else if (H5C_DATASET_XFER != H5Cget_class(xfer_parms_id) || + NULL == (xfer_parms = H5Aatom_object(xfer_parms_id))) { + HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not xfer parms"); + } + if (!buf) { + HRETURN_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no output buffer"); + } + /* write raw data */ + if (H5D_write(dataset, mem_type, mem_space, file_space, xfer_parms, + buf) < 0) { + HRETURN_ERROR(H5E_DATASET, H5E_READERROR, FAIL, "can't write data"); + } + FUNC_LEAVE(SUCCEED); } - - - - - - /*------------------------------------------------------------------------- - * Function: H5D_find_name + * Function: H5D_find_name * - * Purpose: This is a callback for H5Mfind_name(). It does the same - * thing as H5Dopen() except it takes an extra argument which - * isn't used. + * Purpose: This is a callback for H5Mfind_name(). It does the same + * thing as H5Dopen() except it takes an extra argument which + * isn't used. * - * Return: Success: SUCCEED + * Return: Success: SUCCEED * - * Failure: FAIL + * Failure: FAIL * * Errors: * - * Programmer: Robb Matzke + * Programmer: Robb Matzke * Thursday, December 4, 1997 * * Modifications: @@ -537,267 +513,251 @@ H5Dwrite (hid_t dataset_id, hid_t mem_type_id, hid_t mem_space_id, *------------------------------------------------------------------------- */ hid_t -H5D_find_name (hid_t file_id, group_t UNUSED, const char *name) +H5D_find_name(hid_t file_id, group_t UNUSED, const char *name) { - return H5Dopen (file_id, name); + return H5Dopen(file_id, name); } - - - - - - - - /*------------------------------------------------------------------------- - * Function: H5D_create + * Function: H5D_create * - * Purpose: Creates a new dataset with name NAME in file F and associates - * with it a datatype TYPE for each element as stored in the - * file, dimensionality information or dataspace SPACE, and - * other miscellaneous properties CREATE_PARMS. All arguments - * are deep-copied before being associated with the new dataset, - * so the caller is free to subsequently modify them without - * affecting the dataset. + * Purpose: Creates a new dataset with name NAME in file F and associates + * with it a datatype TYPE for each element as stored in the + * file, dimensionality information or dataspace SPACE, and + * other miscellaneous properties CREATE_PARMS. All arguments + * are deep-copied before being associated with the new dataset, + * so the caller is free to subsequently modify them without + * affecting the dataset. * - * Return: Success: Pointer to a new dataset + * Return: Success: Pointer to a new dataset * - * Failure: NULL + * Failure: NULL * * Errors: - * DATASET CANTINIT Can't update dataset header. - * DATASET CANTINIT Problem with the dataset name. + * DATASET CANTINIT Can't update dataset header. + * DATASET CANTINIT Problem with the dataset name. * - * Programmer: Robb Matzke + * Programmer: Robb Matzke * Thursday, December 4, 1997 * * Modifications: * *------------------------------------------------------------------------- */ -H5D_t * -H5D_create (H5F_t *f, const char *name, const H5T_t *type, const H5P_t *space, - const H5D_create_t *create_parms) +H5D_t * +H5D_create(H5F_t *f, const char *name, const H5T_t *type, const H5P_t *space, + const H5D_create_t *create_parms) { - H5D_t *new_dset = NULL; - H5D_t *ret_value = NULL; - size_t nbytes; - intn i; - - FUNC_ENTER (H5D_create, NULL); - - /* check args */ - assert (f); - assert (name && *name); - assert (type); - assert (space); - assert (create_parms); - - /* Initialize the dataset object */ - new_dset = H5MM_xcalloc (1, sizeof(H5D_t)); - H5F_addr_undef (&(new_dset->ent.header)); - new_dset->type = H5T_copy (type); - new_dset->space = H5P_copy (space); - new_dset->create_parms = *create_parms; - - /* - * Create (open for write access) an object header. - */ - if (H5O_create (f, 0, &(new_dset->ent))<0) { - HGOTO_ERROR (H5E_DATASET, H5E_CANTINIT, NULL, - "unable to create dataset object header"); - } - - /* Update the type and space header messages */ - if (H5O_modify (&(new_dset->ent), H5O_DTYPE, 0, 0, new_dset->type)<0 || - H5P_modify (f, &(new_dset->ent), new_dset->space)<0) { - HGOTO_ERROR (H5E_DATASET, H5E_CANTINIT, NULL, - "can't update type or space header messages"); - } - - /* Total raw data size */ - nbytes = H5T_get_size (type) * H5P_get_npoints (space); - new_dset->layout.type = new_dset->create_parms.layout; - new_dset->layout.ndims = H5P_get_ndims (space) + 1; - assert (new_dset->layout.ndims<=NELMTS (new_dset->layout.dim)); - new_dset->layout.dim[new_dset->layout.ndims-1] = H5T_get_size (type); - - switch (new_dset->create_parms.layout) { - case H5D_CONTIGUOUS: - if (H5P_get_dims (space, new_dset->layout.dim)<0) { - HGOTO_ERROR (H5E_DATASET, H5E_CANTINIT, NULL, - "unable to initialize contiguous storage"); - } - break; - - case H5D_CHUNKED: - if (new_dset->create_parms.chunk_ndims != H5P_get_ndims (space)) { - HGOTO_ERROR (H5E_DATASET, H5E_BADVALUE, NULL, - "dimensionality of chunks doesn't match the data space"); - } - for (i=0; i<new_dset->layout.ndims-1; i++) { - new_dset->layout.dim[i] = new_dset->create_parms.chunk_size[i]; - } - break; - - default: - HGOTO_ERROR (H5E_DATASET, H5E_UNSUPPORTED, NULL, "not implemented yet"); - } - - /* - * Initialize storage - */ - if (H5F_arr_create (f, &(new_dset->layout))<0 || - H5O_modify (&(new_dset->ent), H5O_LAYOUT, 0, 0, - &(new_dset->layout))<0) { - HGOTO_ERROR (H5E_DATASET, H5E_CANTINIT, NULL, - "unable to initialize storage"); - } - - /* Give the dataset a name */ - if (H5G_insert (name, &(new_dset->ent))<0) { - HGOTO_ERROR (H5E_DATASET, H5E_CANTINIT, NULL, "unable to name dataset"); - } - - /* Success */ - ret_value = new_dset; - - - done: - if (!ret_value && new_dset) { - if (new_dset->type) H5T_close (new_dset->type); - if (new_dset->space) H5P_close (new_dset->space); - if (H5F_addr_defined (&(new_dset->ent.header))) { - H5O_close (&(new_dset->ent)); - } - new_dset->ent.file = NULL; - H5MM_xfree (new_dset); - } - - FUNC_LEAVE (ret_value); + H5D_t *new_dset = NULL; + H5D_t *ret_value = NULL; + size_t nbytes; + intn i; + + FUNC_ENTER(H5D_create, NULL); + + /* check args */ + assert(f); + assert(name && *name); + assert(type); + assert(space); + assert(create_parms); + + /* Initialize the dataset object */ + new_dset = H5MM_xcalloc(1, sizeof(H5D_t)); + H5F_addr_undef(&(new_dset->ent.header)); + new_dset->type = H5T_copy(type); + new_dset->space = H5P_copy(space); + new_dset->create_parms = *create_parms; + + /* + * Create (open for write access) an object header. + */ + if (H5O_create(f, 0, &(new_dset->ent)) < 0) { + HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, NULL, + "unable to create dataset object header"); + } + /* Update the type and space header messages */ + if (H5O_modify(&(new_dset->ent), H5O_DTYPE, 0, 0, new_dset->type) < 0 || + H5P_modify(f, &(new_dset->ent), new_dset->space) < 0) { + HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, NULL, + "can't update type or space header messages"); + } + /* Total raw data size */ + nbytes = H5T_get_size(type) * H5P_get_npoints(space); + new_dset->layout.type = new_dset->create_parms.layout; + new_dset->layout.ndims = H5P_get_ndims(space) + 1; + assert(new_dset->layout.ndims <= NELMTS(new_dset->layout.dim)); + new_dset->layout.dim[new_dset->layout.ndims - 1] = H5T_get_size(type); + + switch (new_dset->create_parms.layout) { + case H5D_CONTIGUOUS: + if (H5P_get_dims(space, new_dset->layout.dim) < 0) { + HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, NULL, + "unable to initialize contiguous storage"); + } + break; + + case H5D_CHUNKED: + if (new_dset->create_parms.chunk_ndims != H5P_get_ndims(space)) { + HGOTO_ERROR(H5E_DATASET, H5E_BADVALUE, NULL, + "dimensionality of chunks doesn't match the data space"); + } + for (i = 0; i < new_dset->layout.ndims - 1; i++) { + new_dset->layout.dim[i] = new_dset->create_parms.chunk_size[i]; + } + break; + + default: + HGOTO_ERROR(H5E_DATASET, H5E_UNSUPPORTED, NULL, "not implemented yet"); + } + + /* + * Initialize storage + */ + if (H5F_arr_create(f, &(new_dset->layout)) < 0 || + H5O_modify(&(new_dset->ent), H5O_LAYOUT, 0, 0, + &(new_dset->layout)) < 0) { + HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, NULL, + "unable to initialize storage"); + } + /* Give the dataset a name */ + if (H5G_insert(name, &(new_dset->ent)) < 0) { + HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, NULL, "unable to name dataset"); + } + /* Success */ + ret_value = new_dset; + + done: + if (!ret_value && new_dset) { + if (new_dset->type) + H5T_close(new_dset->type); + if (new_dset->space) + H5P_close(new_dset->space); + if (H5F_addr_defined(&(new_dset->ent.header))) { + H5O_close(&(new_dset->ent)); + } + new_dset->ent.file = NULL; + H5MM_xfree(new_dset); + } + FUNC_LEAVE(ret_value); } - /*------------------------------------------------------------------------- - * Function: H5D_open + * Function: H5D_open * - * Purpose: Finds a dataset named NAME in file F and builds a descriptor - * for it, opening it for access. + * Purpose: Finds a dataset named NAME in file F and builds a descriptor + * for it, opening it for access. * - * Return: Success: Pointer to a new dataset descriptor. + * Return: Success: Pointer to a new dataset descriptor. * - * Failure: NULL + * Failure: NULL * * Errors: * - * Programmer: Robb Matzke + * Programmer: Robb Matzke * Thursday, December 4, 1997 * * Modifications: * *------------------------------------------------------------------------- */ -H5D_t * -H5D_open (H5F_t *f, const char *name) +H5D_t * +H5D_open(H5F_t *f, const char *name) { - H5D_t *dataset = NULL; /*the dataset which was found */ - H5D_t *ret_value = NULL; /*return value */ - intn i; - - FUNC_ENTER (H5D_open, NULL); - - /* check args */ - assert (f); - assert (name && *name); - - dataset = H5MM_xcalloc (1, sizeof(H5D_t)); - dataset->create_parms = H5D_create_dflt; - H5F_addr_undef (&(dataset->ent.header)); - - /* Open the dataset object */ - if (H5G_find (f, name, NULL, &(dataset->ent))<0) { - HGOTO_ERROR (H5E_DATASET, H5E_NOTFOUND, NULL, "not found"); - } - if (H5O_open (f, &(dataset->ent))<0) { - HGOTO_ERROR (H5E_DATASET, H5E_CANTOPENOBJ, NULL, "unable to open"); - } - - /* Get the type and space */ - if (NULL==(dataset->type=H5O_read (&(dataset->ent), H5O_DTYPE, 0, NULL)) || - NULL==(dataset->space=H5P_read (f, &(dataset->ent)))) { - HGOTO_ERROR (H5E_DATASET, H5E_CANTINIT, NULL, - "can't load type of space info from dataset header"); - } - - /* - * Get the raw data layout info. It's actually stored in two locations: - * the storage message of the dataset (dataset->storage) and certain - * values are copied to the dataset create template so the user can query - * them. - */ - if (H5O_read (&(dataset->ent), H5O_LAYOUT, 0, &(dataset->layout))<0) { - HGOTO_ERROR (H5E_DATASET, H5E_CANTINIT, NULL, - "unable to read data layout message"); - } - switch (dataset->layout.type) { - case H5D_CONTIGUOUS: - dataset->create_parms.layout = H5D_CONTIGUOUS; - break; - - case H5D_CHUNKED: - /* - * Chunked storage. The creation template's dimension is one less than - * the chunk dimension because the chunk includes a dimension for the - * individual bytes of the data type. - */ - dataset->create_parms.layout = H5D_CHUNKED; - dataset->create_parms.chunk_ndims = dataset->layout.ndims - 1; - for (i=0; i<dataset->layout.ndims-1; i++) { - dataset->create_parms.chunk_size[i] = dataset->layout.dim[i]; - } - break; - - default: - assert ("not implemented yet" && 0); - HGOTO_ERROR (H5E_DATASET, H5E_UNSUPPORTED, NULL, "not implemented yet"); - } - - /* Success */ - ret_value = dataset; - - - done: - if (!ret_value && dataset) { - if (H5F_addr_defined (&(dataset->ent.header))) { - H5O_close (&(dataset->ent)); - } - if (dataset->type) H5T_close (dataset->type); - if (dataset->space) H5P_close (dataset->space); - dataset->ent.file = NULL; - H5MM_xfree (dataset); - } - - FUNC_LEAVE (ret_value); + H5D_t *dataset = NULL; /*the dataset which was found */ + H5D_t *ret_value = NULL; /*return value */ + intn i; + + FUNC_ENTER(H5D_open, NULL); + + /* check args */ + assert(f); + assert(name && *name); + + dataset = H5MM_xcalloc(1, sizeof(H5D_t)); + dataset->create_parms = H5D_create_dflt; + H5F_addr_undef(&(dataset->ent.header)); + + /* Open the dataset object */ + if (H5G_find(f, name, NULL, &(dataset->ent)) < 0) { + HGOTO_ERROR(H5E_DATASET, H5E_NOTFOUND, NULL, "not found"); + } + if (H5O_open(f, &(dataset->ent)) < 0) { + HGOTO_ERROR(H5E_DATASET, H5E_CANTOPENOBJ, NULL, "unable to open"); + } + /* Get the type and space */ + if (NULL == (dataset->type = H5O_read(&(dataset->ent), H5O_DTYPE, 0, NULL)) || + NULL == (dataset->space = H5P_read(f, &(dataset->ent)))) { + HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, NULL, + "can't load type of space info from dataset header"); + } + /* + * Get the raw data layout info. It's actually stored in two locations: + * the storage message of the dataset (dataset->storage) and certain + * values are copied to the dataset create template so the user can query + * them. + */ + if (H5O_read(&(dataset->ent), H5O_LAYOUT, 0, &(dataset->layout)) < 0) { + HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, NULL, + "unable to read data layout message"); + } + switch (dataset->layout.type) { + case H5D_CONTIGUOUS: + dataset->create_parms.layout = H5D_CONTIGUOUS; + break; + + case H5D_CHUNKED: + /* + * Chunked storage. The creation template's dimension is one less than + * the chunk dimension because the chunk includes a dimension for the + * individual bytes of the data type. + */ + dataset->create_parms.layout = H5D_CHUNKED; + dataset->create_parms.chunk_ndims = dataset->layout.ndims - 1; + for (i = 0; i < dataset->layout.ndims - 1; i++) { + dataset->create_parms.chunk_size[i] = dataset->layout.dim[i]; + } + break; + + default: + assert("not implemented yet" && 0); + HGOTO_ERROR(H5E_DATASET, H5E_UNSUPPORTED, NULL, "not implemented yet"); + } + + /* Success */ + ret_value = dataset; + + done: + if (!ret_value && dataset) { + if (H5F_addr_defined(&(dataset->ent.header))) { + H5O_close(&(dataset->ent)); + } + if (dataset->type) + H5T_close(dataset->type); + if (dataset->space) + H5P_close(dataset->space); + dataset->ent.file = NULL; + H5MM_xfree(dataset); + } + FUNC_LEAVE(ret_value); } - /*------------------------------------------------------------------------- - * Function: H5D_close + * Function: H5D_close * - * Purpose: Insures that all data has been saved to the file, closes the - * dataset object header, and frees all resources used by the - * descriptor. + * Purpose: Insures that all data has been saved to the file, closes the + * dataset object header, and frees all resources used by the + * descriptor. * - * Return: Success: SUCCEED + * Return: Success: SUCCEED * - * Failure: FAIL + * Failure: FAIL * * Errors: - * DATASET CANTINIT Couldn't free the type or space, - * but the dataset was freed anyway. + * DATASET CANTINIT Couldn't free the type or space, + * but the dataset was freed anyway. * - * Programmer: Robb Matzke + * Programmer: Robb Matzke * Thursday, December 4, 1997 * * Modifications: @@ -805,55 +765,53 @@ H5D_open (H5F_t *f, const char *name) *------------------------------------------------------------------------- */ herr_t -H5D_close (H5D_t *dataset) +H5D_close(H5D_t *dataset) { - hbool_t free_failed; - - FUNC_ENTER (H5D_close, FAIL); - - /* check args */ - assert (dataset && dataset->ent.file); - - /* Close the dataset object */ - H5O_close (&(dataset->ent)); - - /* - * Release dataset type and space - there isn't much we can do if one of - * these fails, so we just continue. - */ - free_failed = (H5T_close (dataset->type)<0 || - H5P_close (dataset->space)<0); - - /* - * Free memory. Before freeing the memory set the file pointer to NULL. - * We always check for a null file pointer in other H5D functions to be - * sure we're not accessing an already freed dataset (see the assert() - * above). - */ - dataset->ent.file = NULL; - H5MM_xfree (dataset); - - if (free_failed) { - HRETURN_ERROR (H5E_DATASET, H5E_CANTINIT, FAIL, - "couldn't free the type or space, but the dataset was " - "freed anyway."); - } - - FUNC_LEAVE (SUCCEED); + hbool_t free_failed; + + FUNC_ENTER(H5D_close, FAIL); + + /* check args */ + assert(dataset && dataset->ent.file); + + /* Close the dataset object */ + H5O_close(&(dataset->ent)); + + /* + * Release dataset type and space - there isn't much we can do if one of + * these fails, so we just continue. + */ + free_failed = (H5T_close(dataset->type) < 0 || + H5P_close(dataset->space) < 0); + + /* + * Free memory. Before freeing the memory set the file pointer to NULL. + * We always check for a null file pointer in other H5D functions to be + * sure we're not accessing an already freed dataset (see the assert() + * above). + */ + dataset->ent.file = NULL; + H5MM_xfree(dataset); + + if (free_failed) { + HRETURN_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, + "couldn't free the type or space, but the dataset was " + "freed anyway."); + } + FUNC_LEAVE(SUCCEED); } - /*------------------------------------------------------------------------- - * Function: H5D_read + * Function: H5D_read * - * Purpose: Reads (part of) a DATASET into application memory BUF. See - * H5Dread() for complete details. + * Purpose: Reads (part of) a DATASET into application memory BUF. See + * H5Dread() for complete details. * - * Return: Success: SUCCEED + * Return: Success: SUCCEED * - * Failure: FAIL + * Failure: FAIL * - * Programmer: Robb Matzke + * Programmer: Robb Matzke * Thursday, December 4, 1997 * * Modifications: @@ -861,100 +819,95 @@ H5D_close (H5D_t *dataset) *------------------------------------------------------------------------- */ herr_t -H5D_read (H5D_t *dataset, const H5T_t *mem_type, const H5P_t *mem_space, - const H5P_t *file_space, const H5D_xfer_t *xfer_parms, - void *buf/*out*/) +H5D_read(H5D_t *dataset, const H5T_t *mem_type, const H5P_t *mem_space, + const H5P_t *file_space, const H5D_xfer_t *xfer_parms, + void *buf /*out */ ) { - size_t nelmts, src_size, dst_size; - size_t offset[H5O_LAYOUT_NDIMS]; - size_t size[H5O_LAYOUT_NDIMS]; - intn i; - herr_t ret_value = FAIL; - uint8 *conv_buf = NULL; /*data type conv buffer */ - H5T_conv_t conv_func = NULL; /*conversion function */ - hid_t src_id=-1, dst_id=-1; /*temporary type atoms */ - - FUNC_ENTER (H5D_read, FAIL); - - /* check args */ - assert (dataset && dataset->ent.file); - assert (mem_type); - assert (xfer_parms); - assert (buf); - - if ((mem_space && H5P_cmp (mem_space, dataset->space)) || - (file_space && H5P_cmp (file_space, dataset->space))) { - HGOTO_ERROR (H5E_DATASET, H5E_UNSUPPORTED, FAIL, - "space conversion not supported yet"); - } - - - /* - * Convert data types to atoms because the conversion functions are - * application-level functions. - */ - if ((src_id=H5Aregister_atom (H5_DATATYPE, H5T_copy (dataset->type)))<0 || - (dst_id=H5Aregister_atom (H5_DATATYPE, H5T_copy (mem_type)))<0) { - HGOTO_ERROR (H5E_DATASET, H5E_CANTREGISTER, FAIL, - "unable to register types for conversion"); - } - - /* Compute the size of the request and allocate scratch buffers */ - nelmts = H5P_get_npoints (dataset->space); - src_size = nelmts * H5T_get_size (dataset->type); - dst_size = nelmts * H5T_get_size (mem_type); - conv_buf = H5MM_xmalloc (MAX (src_size, dst_size)); - if (NULL==(conv_func=H5T_find (dataset->type, mem_type))) { - HGOTO_ERROR (H5E_DATASET, H5E_UNSUPPORTED, FAIL, - "unable to convert between src and dest data types"); - } - - /* - * Read data into the data type conversion buffer. - * (We only support complete reads currently) - */ - for (i=0; i<dataset->layout.ndims; i++) { - offset[i] = 0; - size[i] = dataset->layout.dim[i]; - } - if (H5F_arr_read (dataset->ent.file, &(dataset->layout), offset, size, - conv_buf)<0) { - HGOTO_ERROR (H5E_IO, H5E_READERROR, FAIL, "read failed"); - } - - /* - * Perform data type conversion. - */ - if ((conv_func)(src_id, dst_id, nelmts, conv_buf, NULL)<0) { - HGOTO_ERROR (H5E_DATASET, H5E_CANTINIT, FAIL, - "data type conversion failed"); - } - - /* - * Copy conversion buffer into destination. - */ - HDmemcpy (buf, conv_buf, dst_size); - - ret_value = SUCCEED; - done: - if (src_id>=0) H5A_dec_ref (src_id); - if (dst_id>=0) H5A_dec_ref (dst_id); - conv_buf = H5MM_xfree (conv_buf); - FUNC_LEAVE (ret_value); + size_t nelmts, src_size, dst_size; + size_t offset[H5O_LAYOUT_NDIMS]; + size_t size[H5O_LAYOUT_NDIMS]; + intn i; + herr_t ret_value = FAIL; + uint8 *conv_buf = NULL; /*data type conv buffer */ + H5T_conv_t conv_func = NULL; /*conversion function */ + hid_t src_id = -1, dst_id = -1; /*temporary type atoms */ + + FUNC_ENTER(H5D_read, FAIL); + + /* check args */ + assert(dataset && dataset->ent.file); + assert(mem_type); + assert(xfer_parms); + assert(buf); + + if ((mem_space && H5P_cmp(mem_space, dataset->space)) || + (file_space && H5P_cmp(file_space, dataset->space))) { + HGOTO_ERROR(H5E_DATASET, H5E_UNSUPPORTED, FAIL, + "space conversion not supported yet"); + } + /* + * Convert data types to atoms because the conversion functions are + * application-level functions. + */ + if ((src_id = H5Aregister_atom(H5_DATATYPE, H5T_copy(dataset->type))) < 0 || + (dst_id = H5Aregister_atom(H5_DATATYPE, H5T_copy(mem_type))) < 0) { + HGOTO_ERROR(H5E_DATASET, H5E_CANTREGISTER, FAIL, + "unable to register types for conversion"); + } + /* Compute the size of the request and allocate scratch buffers */ + nelmts = H5P_get_npoints(dataset->space); + src_size = nelmts * H5T_get_size(dataset->type); + dst_size = nelmts * H5T_get_size(mem_type); + conv_buf = H5MM_xmalloc(MAX(src_size, dst_size)); + if (NULL == (conv_func = H5T_find(dataset->type, mem_type))) { + HGOTO_ERROR(H5E_DATASET, H5E_UNSUPPORTED, FAIL, + "unable to convert between src and dest data types"); + } + /* + * Read data into the data type conversion buffer. + * (We only support complete reads currently) + */ + for (i = 0; i < dataset->layout.ndims; i++) { + offset[i] = 0; + size[i] = dataset->layout.dim[i]; + } + if (H5F_arr_read(dataset->ent.file, &(dataset->layout), offset, size, + conv_buf) < 0) { + HGOTO_ERROR(H5E_IO, H5E_READERROR, FAIL, "read failed"); + } + /* + * Perform data type conversion. + */ + if ((conv_func) (src_id, dst_id, nelmts, conv_buf, NULL) < 0) { + HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, + "data type conversion failed"); + } + /* + * Copy conversion buffer into destination. + */ + HDmemcpy(buf, conv_buf, dst_size); + + ret_value = SUCCEED; + done: + if (src_id >= 0) + H5A_dec_ref(src_id); + if (dst_id >= 0) + H5A_dec_ref(dst_id); + conv_buf = H5MM_xfree(conv_buf); + FUNC_LEAVE(ret_value); } - /*------------------------------------------------------------------------- - * Function: H5D_write + * Function: H5D_write * - * Purpose: Writes (part of) a DATASET to a file from application memory - * BUF. See H5Dwrite() for complete details. + * Purpose: Writes (part of) a DATASET to a file from application memory + * BUF. See H5Dwrite() for complete details. * - * Return: Success: SUCCEED + * Return: Success: SUCCEED * - * Failure: FAIL + * Failure: FAIL * - * Programmer: Robb Matzke + * Programmer: Robb Matzke * Thursday, December 4, 1997 * * Modifications: @@ -962,90 +915,84 @@ H5D_read (H5D_t *dataset, const H5T_t *mem_type, const H5P_t *mem_space, *------------------------------------------------------------------------- */ herr_t -H5D_write (H5D_t *dataset, const H5T_t *mem_type, const H5P_t *mem_space, - const H5P_t *file_space, const H5D_xfer_t *xfer_parms, - const void *buf) +H5D_write(H5D_t *dataset, const H5T_t *mem_type, const H5P_t *mem_space, + const H5P_t *file_space, const H5D_xfer_t *xfer_parms, + const void *buf) { - size_t nelmts, src_size, dst_size; - size_t offset[H5O_LAYOUT_NDIMS]; - size_t size[H5O_LAYOUT_NDIMS]; - intn i; - herr_t ret_value = FAIL; - uint8 *conv_buf = NULL; /*data type conversion buffer */ - H5T_conv_t conv_func = NULL; /*data type conversion function */ - hid_t src_id=-1, dst_id=-1; /*temporary type atoms */ - - FUNC_ENTER (H5D_write, FAIL); - - /* check args */ - assert (dataset && dataset->ent.file); - assert (mem_type); - assert (xfer_parms); - assert (buf); - - if (H5D_CONTIGUOUS!=dataset->create_parms.layout) { - HRETURN_ERROR (H5E_DATASET, H5E_UNSUPPORTED, FAIL, - "layout is not supported yet"); - } - if ((mem_space && H5P_cmp (mem_space, dataset->space)) || - (file_space && H5P_cmp (file_space, dataset->space))) { - HRETURN_ERROR (H5E_DATASET, H5E_UNSUPPORTED, FAIL, - "space conversion not supported yet"); - } - - /* - * Convert data types to atoms because the conversion functions are - * application-level functions. - */ - if ((src_id=H5Aregister_atom (H5_DATATYPE, H5T_copy (mem_type)))<0 || - (dst_id=H5Aregister_atom (H5_DATATYPE, H5T_copy (dataset->type)))<0) { - HGOTO_ERROR (H5E_DATASET, H5E_CANTREGISTER, FAIL, - "unable to register types for conversion"); - } - - - /* Compute the size of the request and allocate scratch buffers */ - nelmts = H5P_get_npoints (dataset->space); - src_size = nelmts * H5T_get_size (mem_type); - dst_size = nelmts * H5T_get_size (dataset->type); - conv_buf = H5MM_xmalloc (MAX (src_size, dst_size)); - if (NULL==(conv_func=H5T_find (mem_type, dataset->type))) { - HGOTO_ERROR (H5E_DATASET, H5E_UNSUPPORTED, FAIL, - "unable to convert between src and dest data types"); - } - - - /* - * Read data into the data type conversion buffer. - */ - HDmemcpy (conv_buf, buf, src_size); - - /* - * Perform data type conversion. - */ - if ((conv_func)(src_id, dst_id, nelmts, conv_buf, NULL)<0) { - HGOTO_ERROR (H5E_DATASET, H5E_CANTINIT, FAIL, - "data type conversion failed"); - } - - /* - * Write data into the file. - * (We only support complete writes currently.) - */ - for (i=0; i<dataset->layout.ndims; i++) { - offset[i] = 0; - size[i] = dataset->layout.dim[i]; - } - if (H5F_arr_write (dataset->ent.file, &(dataset->layout), offset, size, - conv_buf)<0) { - HGOTO_ERROR (H5E_IO, H5E_WRITEERROR, FAIL, "write failed"); - } - - ret_value = SUCCEED; - done: - if (src_id>=0) H5A_dec_ref (src_id); - if (dst_id>=0) H5A_dec_ref (dst_id); - conv_buf = H5MM_xfree (conv_buf); - FUNC_LEAVE (ret_value); + size_t nelmts, src_size, dst_size; + size_t offset[H5O_LAYOUT_NDIMS]; + size_t size[H5O_LAYOUT_NDIMS]; + intn i; + herr_t ret_value = FAIL; + uint8 *conv_buf = NULL; /*data type conversion buffer */ + H5T_conv_t conv_func = NULL; /*data type conversion function */ + hid_t src_id = -1, dst_id = -1; /*temporary type atoms */ + + FUNC_ENTER(H5D_write, FAIL); + + /* check args */ + assert(dataset && dataset->ent.file); + assert(mem_type); + assert(xfer_parms); + assert(buf); + + if (H5D_CONTIGUOUS != dataset->create_parms.layout) { + HRETURN_ERROR(H5E_DATASET, H5E_UNSUPPORTED, FAIL, + "layout is not supported yet"); + } + if ((mem_space && H5P_cmp(mem_space, dataset->space)) || + (file_space && H5P_cmp(file_space, dataset->space))) { + HRETURN_ERROR(H5E_DATASET, H5E_UNSUPPORTED, FAIL, + "space conversion not supported yet"); + } + /* + * Convert data types to atoms because the conversion functions are + * application-level functions. + */ + if ((src_id = H5Aregister_atom(H5_DATATYPE, H5T_copy(mem_type))) < 0 || + (dst_id = H5Aregister_atom(H5_DATATYPE, H5T_copy(dataset->type))) < 0) { + HGOTO_ERROR(H5E_DATASET, H5E_CANTREGISTER, FAIL, + "unable to register types for conversion"); + } + /* Compute the size of the request and allocate scratch buffers */ + nelmts = H5P_get_npoints(dataset->space); + src_size = nelmts * H5T_get_size(mem_type); + dst_size = nelmts * H5T_get_size(dataset->type); + conv_buf = H5MM_xmalloc(MAX(src_size, dst_size)); + if (NULL == (conv_func = H5T_find(mem_type, dataset->type))) { + HGOTO_ERROR(H5E_DATASET, H5E_UNSUPPORTED, FAIL, + "unable to convert between src and dest data types"); + } + /* + * Read data into the data type conversion buffer. + */ + HDmemcpy(conv_buf, buf, src_size); + + /* + * Perform data type conversion. + */ + if ((conv_func) (src_id, dst_id, nelmts, conv_buf, NULL) < 0) { + HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, + "data type conversion failed"); + } + /* + * Write data into the file. + * (We only support complete writes currently.) + */ + for (i = 0; i < dataset->layout.ndims; i++) { + offset[i] = 0; + size[i] = dataset->layout.dim[i]; + } + if (H5F_arr_write(dataset->ent.file, &(dataset->layout), offset, size, + conv_buf) < 0) { + HGOTO_ERROR(H5E_IO, H5E_WRITEERROR, FAIL, "write failed"); + } + ret_value = SUCCEED; + done: + if (src_id >= 0) + H5A_dec_ref(src_id); + if (dst_id >= 0) + H5A_dec_ref(dst_id); + conv_buf = H5MM_xfree(conv_buf); + FUNC_LEAVE(ret_value); } - |