diff options
Diffstat (limited to 'src/H5S.c')
-rw-r--r-- | src/H5S.c | 813 |
1 files changed, 444 insertions, 369 deletions
@@ -1,34 +1,34 @@ /**************************************************************************** -* 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> /* Atom Functions */ -#include <H5Eprivate.h> /* Error handling */ -#include <H5MMprivate.h> /* Memory Management functions */ -#include <H5Oprivate.h> /*object headers */ -#include <H5Sprivate.h> /* Data-space functions */ +#include <H5private.h> /* Generic Functions */ +#include <H5Aprivate.h> /* Atom Functions */ +#include <H5Eprivate.h> /* Error handling */ +#include <H5MMprivate.h> /* Memory Management functions */ +#include <H5Oprivate.h> /*object headers */ +#include <H5Sprivate.h> /* Data-space functions */ /* Interface initialization */ -#define PABLO_MASK H5S_mask -#define INTERFACE_INIT H5S_init_interface -static intn interface_initialize_g = FALSE; -static herr_t H5S_init_interface(void); -static void H5S_term_interface(void); +#define PABLO_MASK H5S_mask +#define INTERFACE_INIT H5S_init_interface +static intn interface_initialize_g = FALSE; +static herr_t H5S_init_interface(void); +static void H5S_term_interface(void); /*-------------------------------------------------------------------------- @@ -46,14 +46,14 @@ DESCRIPTION static herr_t H5S_init_interface(void) { - herr_t ret_value = SUCCEED; + herr_t ret_value = SUCCEED; FUNC_ENTER(H5S_init_interface, FAIL); /* Initialize the atom group for the file IDs */ if ((ret_value = H5A_init_group(H5_DATASPACE, H5A_DATASPACEID_HASHSIZE, H5S_RESERVED_ATOMS, (herr_t (*)(void *)) H5S_close)) != FAIL) { - ret_value = H5_add_exit(&H5S_term_interface); + ret_value = H5_add_exit(&H5S_term_interface); } FUNC_LEAVE(ret_value); } @@ -83,25 +83,25 @@ H5S_term_interface(void) } /*------------------------------------------------------------------------- - * Function: H5Screate_simple + * Function: H5Screate_simple * - * Purpose: Creates a new simple data space object and opens it for + * Purpose: Creates a new simple data space object and opens it for * access. The DIMS argument is the size of the simple dataset * and the MAXDIMS argument is the upper limit on the size of * the dataset. MAXDIMS may be the null pointer in which case * the upper limit is the same as DIMS. If an element of - * MAXDIMS is zero then the corresponding dimension is unlimited, - * otherwise no element of MAXDIMS should be smaller than the - * corresponding element of DIMS. + * MAXDIMS is H5S_UNLIMITED then the corresponding dimension is + * unlimited, otherwise no element of MAXDIMS should be smaller + * than the corresponding element of DIMS. * - * Return: Success: The ID for the new simple data space object. + * Return: Success: The ID for the new simple data space object. * - * Failure: FAIL + * Failure: FAIL * * Errors: * - * Programmer: Quincey Koziol - * Tuesday, January 27, 1998 + * Programmer: Quincey Koziol + * Tuesday, January 27, 1998 * * Modifications: * @@ -110,8 +110,8 @@ H5S_term_interface(void) hid_t H5Screate_simple(int rank, const size_t *dims, const size_t *maxdims) { - H5S_t *ds = NULL; - hid_t ret_value = FAIL; + H5S_t *ds = NULL; + hid_t ret_value = FAIL; int i; FUNC_ENTER(H5Screate, FAIL); @@ -127,7 +127,7 @@ H5Screate_simple(int rank, const size_t *dims, const size_t *maxdims) } if (maxdims) { for (i=0; i<rank; i++) { - if (maxdims[i] && maxdims[i]<dims[i]) { + if (H5S_UNLIMITED!=maxdims[i] && maxdims[i]<dims[i]) { HRETURN_ERROR (H5E_ARGS, H5E_BADVALUE, FAIL, "maxdims is smaller than dims"); } @@ -137,56 +137,56 @@ H5Screate_simple(int rank, const size_t *dims, const size_t *maxdims) /* Create a new data space */ ds = H5MM_xcalloc(1, sizeof(H5S_t)); #ifdef LATER /* QAK */ - if(rank>0) /* for creating simple dataspace */ + if(rank>0) /* for creating simple dataspace */ { #endif /* LATER */ - ds->type = H5S_SIMPLE; - ds->hslab_def = FALSE; /* no hyperslab defined currently */ + ds->type = H5S_SIMPLE; + ds->hslab_def = FALSE; /* no hyperslab defined currently */ - /* Initialize rank and dimensions */ - ds->u.simple.rank = rank; + /* Initialize rank and dimensions */ + ds->u.simple.rank = rank; - ds->u.simple.size = H5MM_xcalloc(1, rank*sizeof(size_t)); - HDmemcpy(ds->u.simple.size, dims, rank*sizeof(size_t)); + ds->u.simple.size = H5MM_xcalloc(1, rank*sizeof(size_t)); + HDmemcpy(ds->u.simple.size, dims, rank*sizeof(size_t)); - if (maxdims) { - ds->u.simple.max = H5MM_xcalloc(1, rank*sizeof(size_t)); - HDmemcpy (ds->u.simple.max, maxdims, rank*sizeof(size_t)); - } + if (maxdims) { + ds->u.simple.max = H5MM_xcalloc(1, rank*sizeof(size_t)); + HDmemcpy (ds->u.simple.max, maxdims, rank*sizeof(size_t)); + } #ifdef LATER /* QAK */ } /* end if */ else /* rank==0, for scalar data space */ { - ds->type = H5S_SCALAR; + ds->type = H5S_SCALAR; } /* end else */ #endif /* LATER */ /* Register the new data space and get an ID for it */ if ((ret_value = H5A_register(H5_DATASPACE, ds)) < 0) { - HGOTO_ERROR(H5E_ATOM, H5E_CANTREGISTER, FAIL, - "unable to register data space for ID"); + HGOTO_ERROR(H5E_ATOM, H5E_CANTREGISTER, FAIL, + "unable to register data space for ID"); } done: if (ret_value < 0) { - H5MM_xfree(ds); + H5MM_xfree(ds); } FUNC_LEAVE(ret_value); } /*------------------------------------------------------------------------- - * Function: H5Sclose + * Function: H5Sclose * - * Purpose: Release access to a data space object. + * Purpose: Release access to a data space object. * - * Return: Success: SUCCEED + * Return: Success: SUCCEED * - * Failure: FAIL + * Failure: FAIL * * Errors: * - * Programmer: Robb Matzke - * Tuesday, December 9, 1997 + * Programmer: Robb Matzke + * Tuesday, December 9, 1997 * * Modifications: * @@ -199,27 +199,27 @@ H5Sclose(hid_t space_id) /* Check args */ if (H5_DATASPACE != H5A_group(space_id) || - NULL == H5A_object(space_id)) { - HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a data space"); + NULL == H5A_object(space_id)) { + HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a data space"); } /* When the reference count reaches zero the resources are freed */ if (H5A_dec_ref(space_id) < 0) { - HRETURN_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "problem freeing id"); + HRETURN_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "problem freeing id"); } FUNC_LEAVE(SUCCEED); } /*------------------------------------------------------------------------- - * Function: H5S_close + * Function: H5S_close * - * Purpose: Releases all memory associated with a data space. + * Purpose: Releases all memory associated with a data space. * - * Return: Success: SUCCEED + * Return: Success: SUCCEED * - * Failure: FAIL + * Failure: FAIL * - * Programmer: Robb Matzke - * Tuesday, December 9, 1997 + * Programmer: Robb Matzke + * Tuesday, December 9, 1997 * * Modifications: * @@ -234,27 +234,27 @@ H5S_close(H5S_t *ds) switch (ds->type) { case H5S_SCALAR: - /*void */ - break; + /*void */ + break; case H5S_SIMPLE: - H5MM_xfree(ds->u.simple.size); - H5MM_xfree(ds->u.simple.max); - H5MM_xfree(ds->u.simple.perm); - break; + H5MM_xfree(ds->u.simple.size); + H5MM_xfree(ds->u.simple.max); + H5MM_xfree(ds->u.simple.perm); + break; case H5S_COMPLEX: - /* nothing */ - break; + /* nothing */ + break; default: - assert("unknown data space type" && 0); - break; + assert("unknown data space type" && 0); + break; } if(ds->hslab_def==TRUE) { - H5MM_xfree(ds->h.start); - H5MM_xfree(ds->h.count); - H5MM_xfree(ds->h.stride); + H5MM_xfree(ds->h.start); + H5MM_xfree(ds->h.count); + H5MM_xfree(ds->h.stride); } /* end if */ H5MM_xfree(ds); @@ -271,7 +271,7 @@ H5S_close(H5S_t *ds) * Failure: FAIL * * Programmer: Robb Matzke - * Friday, January 30, 1998 + * Friday, January 30, 1998 * * Modifications: * @@ -309,16 +309,16 @@ H5Scopy (hid_t space_id) /*------------------------------------------------------------------------- - * Function: H5S_copy + * Function: H5S_copy * - * Purpose: Copies a data space. + * Purpose: Copies a data space. * - * Return: Success: A pointer to a new copy of SRC + * Return: Success: A pointer to a new copy of SRC * - * Failure: NULL + * Failure: NULL * - * Programmer: Robb Matzke - * Thursday, December 4, 1997 + * Programmer: Robb Matzke + * Thursday, December 4, 1997 * * Modifications: * @@ -327,8 +327,8 @@ H5Scopy (hid_t space_id) H5S_t * H5S_copy(const H5S_t *src) { - H5S_t *dst = NULL; - int i; + H5S_t *dst = NULL; + int i; FUNC_ENTER(H5S_copy, NULL); @@ -337,56 +337,56 @@ H5S_copy(const H5S_t *src) switch (dst->type) { case H5S_SCALAR: - /*void */ - break; + /*void */ + break; case H5S_SIMPLE: - if (dst->u.simple.size) { - dst->u.simple.size = H5MM_xmalloc(dst->u.simple.rank * - sizeof(dst->u.simple.size[0])); - for (i = 0; i < dst->u.simple.rank; i++) { - dst->u.simple.size[i] = src->u.simple.size[i]; - } - } - if (dst->u.simple.max) { - dst->u.simple.max = H5MM_xmalloc(dst->u.simple.rank * - sizeof(dst->u.simple.max[0])); - for (i = 0; i < dst->u.simple.rank; i++) { - dst->u.simple.max[i] = src->u.simple.max[i]; - } - } - if (dst->u.simple.perm) { - dst->u.simple.perm = H5MM_xmalloc(dst->u.simple.rank * - sizeof(dst->u.simple.perm[0])); - for (i = 0; i < dst->u.simple.rank; i++) { - dst->u.simple.perm[i] = src->u.simple.perm[i]; - } - } - break; + if (dst->u.simple.size) { + dst->u.simple.size = H5MM_xmalloc(dst->u.simple.rank * + sizeof(dst->u.simple.size[0])); + for (i = 0; i < dst->u.simple.rank; i++) { + dst->u.simple.size[i] = src->u.simple.size[i]; + } + } + if (dst->u.simple.max) { + dst->u.simple.max = H5MM_xmalloc(dst->u.simple.rank * + sizeof(dst->u.simple.max[0])); + for (i = 0; i < dst->u.simple.rank; i++) { + dst->u.simple.max[i] = src->u.simple.max[i]; + } + } + if (dst->u.simple.perm) { + dst->u.simple.perm = H5MM_xmalloc(dst->u.simple.rank * + sizeof(dst->u.simple.perm[0])); + for (i = 0; i < dst->u.simple.rank; i++) { + dst->u.simple.perm[i] = src->u.simple.perm[i]; + } + } + break; case H5S_COMPLEX: - /*void */ - break; + /*void */ + break; default: - assert("unknown data space type" && 0); - break; + assert("unknown data space type" && 0); + break; } FUNC_LEAVE(dst); } /*------------------------------------------------------------------------- - * Function: H5Sget_npoints + * Function: H5Sget_npoints * - * Purpose: Determines how many data points a data set has. + * Purpose: Determines how many data points a data set has. * - * Return: Success: Number of data points in the data set. + * Return: Success: Number of data points in the data set. * - * Failure: 0 + * Failure: 0 * - * Programmer: Robb Matzke - * Tuesday, December 9, 1997 + * Programmer: Robb Matzke + * Tuesday, December 9, 1997 * * Modifications: * @@ -395,32 +395,33 @@ H5S_copy(const H5S_t *src) size_t H5Sget_npoints(hid_t space_id) { - H5S_t *ds = NULL; - size_t ret_value = 0; + H5S_t *ds = NULL; + size_t ret_value = 0; FUNC_ENTER(H5Sget_npoints, 0); /* Check args */ if (H5_DATASPACE != H5A_group(space_id) || - NULL == (ds = H5A_object(space_id))) { - HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, 0, "not a data space"); + NULL == (ds = H5A_object(space_id))) { + HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, 0, "not a data space"); } ret_value = H5S_get_npoints(ds); FUNC_LEAVE(ret_value); } + /*------------------------------------------------------------------------- - * Function: H5S_get_npoints + * Function: H5S_get_npoints * - * Purpose: Determines how many data points a data set has. + * Purpose: Determines how many data points a data set has. * - * Return: Success: Number of data points in the data set. + * Return: Success: Number of data points in the data set. * - * Failure: 0 + * Failure: 0 * - * Programmer: Robb Matzke - * Tuesday, December 9, 1997 + * Programmer: Robb Matzke + * Tuesday, December 9, 1997 * * Modifications: * @@ -429,8 +430,8 @@ H5Sget_npoints(hid_t space_id) size_t H5S_get_npoints(const H5S_t *ds) { - size_t ret_value = 0; - intn i; + size_t ret_value = 0; + intn i; FUNC_ENTER(H5S_get_npoints, 0); @@ -439,8 +440,8 @@ H5S_get_npoints(const H5S_t *ds) switch (ds->type) { case H5S_SCALAR: - ret_value = 1; - break; + ret_value = 1; + break; case H5S_SIMPLE: /* @@ -455,33 +456,100 @@ H5S_get_npoints(const H5S_t *ds) for (ret_value=1, i=0; i<ds->u.simple.rank; i++) { ret_value *= ds->u.simple.size[i]; } - } - break; + } + break; case H5S_COMPLEX: - HRETURN_ERROR(H5E_DATASPACE, H5E_UNSUPPORTED, 0, - "complex data spaces are not supported yet"); + HRETURN_ERROR(H5E_DATASPACE, H5E_UNSUPPORTED, 0, + "complex data spaces are not supported yet"); default: - assert("unknown data space class" && 0); - HRETURN_ERROR(H5E_DATASPACE, H5E_UNSUPPORTED, 0, - "internal error (unknown data space class)"); + assert("unknown data space class" && 0); + HRETURN_ERROR(H5E_DATASPACE, H5E_UNSUPPORTED, 0, + "internal error (unknown data space class)"); } FUNC_LEAVE(ret_value); } /*------------------------------------------------------------------------- - * Function: H5Sget_ndims + * Function: H5S_get_npoints_max * - * Purpose: Determines the dimensionality of a data space. + * Purpose: Determines the maximum number of data points a data space may + * have. If the `max' array is null then the maximum number of + * data points is the same as the current number of data points + * without regard to the hyperslab. If any element of the `max' + * array is zero then the maximum possible size is returned. * - * Return: Success: The number of dimensions in a data space. + * Return: Success: Maximum number of data points the data space + * may have. * - * Failure: FAIL + * Failure: 0 * - * Programmer: Robb Matzke - * Thursday, December 11, 1997 + * Programmer: Robb Matzke + * Tuesday, December 9, 1997 + * + * Modifications: + * + *------------------------------------------------------------------------- + */ +size_t +H5S_get_npoints_max(const H5S_t *ds) +{ + size_t ret_value = 0; + intn i; + + FUNC_ENTER(H5S_get_npoints_max, 0); + + /* check args */ + assert(ds); + + switch (ds->type) { + case H5S_SCALAR: + ret_value = 1; + break; + + case H5S_SIMPLE: + if (ds->u.simple.max) { + for (ret_value=1, i=0; i<ds->u.simple.rank; i++) { + if (H5S_UNLIMITED==ds->u.simple.max[i]) { + ret_value = (size_t)(-1L); + break; + } else { + ret_value *= ds->u.simple.max[i]; + } + } + } else { + for (ret_value=1, i=0; i<ds->u.simple.rank; i++) { + ret_value *= ds->u.simple.size[i]; + } + } + break; + + case H5S_COMPLEX: + HRETURN_ERROR(H5E_DATASPACE, H5E_UNSUPPORTED, 0, + "complex data spaces are not supported yet"); + + default: + assert("unknown data space class" && 0); + HRETURN_ERROR(H5E_DATASPACE, H5E_UNSUPPORTED, 0, + "internal error (unknown data space class)"); + } + + FUNC_LEAVE(ret_value); +} + +/*------------------------------------------------------------------------- + * Function: H5Sget_ndims + * + * Purpose: Determines the dimensionality of a data space. + * + * Return: Success: The number of dimensions in a data space. + * + * Failure: FAIL + * + * Programmer: Robb Matzke + * Thursday, December 11, 1997 * * Modifications: * @@ -490,15 +558,15 @@ H5S_get_npoints(const H5S_t *ds) int H5Sget_ndims(hid_t space_id) { - H5S_t *ds = NULL; - intn ret_value = 0; + H5S_t *ds = NULL; + intn ret_value = 0; FUNC_ENTER(H5Sget_ndims, FAIL); /* Check args */ if (H5_DATASPACE != H5A_group(space_id) || - NULL == (ds = H5A_object(space_id))) { - HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a data space"); + NULL == (ds = H5A_object(space_id))) { + HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a data space"); } ret_value = H5S_get_ndims(ds); @@ -506,17 +574,17 @@ H5Sget_ndims(hid_t space_id) } /*------------------------------------------------------------------------- - * Function: H5S_get_ndims + * Function: H5S_get_ndims * - * Purpose: Returns the number of dimensions in a data space. + * Purpose: Returns the number of dimensions in a data space. * - * Return: Success: Non-negative number of dimensions. Zero - * implies a scalar. + * Return: Success: Non-negative number of dimensions. Zero + * implies a scalar. * - * Failure: FAIL + * Failure: FAIL * - * Programmer: Robb Matzke - * Thursday, December 11, 1997 + * Programmer: Robb Matzke + * Thursday, December 11, 1997 * * Modifications: * @@ -525,7 +593,7 @@ H5Sget_ndims(hid_t space_id) intn H5S_get_ndims(const H5S_t *ds) { - intn ret_value = FAIL; + intn ret_value = FAIL; FUNC_ENTER(H5S_get_ndims, FAIL); @@ -534,39 +602,39 @@ H5S_get_ndims(const H5S_t *ds) switch (ds->type) { case H5S_SCALAR: - ret_value = 0; - break; + ret_value = 0; + break; case H5S_SIMPLE: - ret_value = ds->u.simple.rank; - break; + ret_value = ds->u.simple.rank; + break; case H5S_COMPLEX: - HRETURN_ERROR(H5E_DATASPACE, H5E_UNSUPPORTED, FAIL, - "complex data spaces are not supported yet"); + HRETURN_ERROR(H5E_DATASPACE, H5E_UNSUPPORTED, FAIL, + "complex data spaces are not supported yet"); default: - assert("unknown data space class" && 0); - HRETURN_ERROR(H5E_DATASPACE, H5E_UNSUPPORTED, FAIL, - "internal error (unknown data space class)"); + assert("unknown data space class" && 0); + HRETURN_ERROR(H5E_DATASPACE, H5E_UNSUPPORTED, FAIL, + "internal error (unknown data space class)"); } FUNC_LEAVE(ret_value); } /*------------------------------------------------------------------------- - * Function: H5Sget_dims + * Function: H5Sget_dims * - * Purpose: Returns the size in each dimension of a data space DS through - * the DIMS argument. + * Purpose: Returns the size in each dimension of a data space DS through + * the DIMS argument. * - * Return: Success: Number of dimensions, the same value as - * returned by H5Sget_ndims(). + * Return: Success: Number of dimensions, the same value as + * returned by H5Sget_ndims(). * - * Failure: FAIL + * Failure: FAIL * - * Programmer: Robb Matzke - * Thursday, December 11, 1997 + * Programmer: Robb Matzke + * Thursday, December 11, 1997 * * Modifications: * @@ -576,46 +644,46 @@ int H5Sget_dims(hid_t space_id, size_t dims[]/*out*/) { - H5S_t *ds = NULL; - intn ret_value = 0; + H5S_t *ds = NULL; + intn ret_value = 0; FUNC_ENTER(H5Sget_dims, FAIL); /* Check args */ if (H5_DATASPACE != H5A_group(space_id) || - NULL == (ds = H5A_object(space_id))) { - HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a data space"); + NULL == (ds = H5A_object(space_id))) { + HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a data space"); } if (!dims) { - HRETURN_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no output buffer"); + HRETURN_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no output buffer"); } - ret_value = H5S_get_dims(ds, dims); + ret_value = H5S_get_dims(ds, dims, NULL); FUNC_LEAVE(ret_value); } /*------------------------------------------------------------------------- - * Function: H5S_get_dims + * Function: H5S_get_dims * - * Purpose: Returns the size in each dimension of a data space. This - * function may not be meaningful for all types of data spaces. + * Purpose: Returns the size in each dimension of a data space. This + * function may not be meaningful for all types of data spaces. * - * Return: Success: Number of dimensions. Zero implies scalar. + * Return: Success: Number of dimensions. Zero implies scalar. * - * Failure: FAIL + * Failure: FAIL * - * Programmer: Robb Matzke - * Thursday, December 11, 1997 + * Programmer: Robb Matzke + * Thursday, December 11, 1997 * * Modifications: * *------------------------------------------------------------------------- */ intn -H5S_get_dims(const H5S_t *ds, size_t dims[]) +H5S_get_dims(const H5S_t *ds, size_t dims[], size_t max_dims[]) { - intn ret_value = FAIL; - intn i; + intn ret_value = FAIL; + intn i; FUNC_ENTER(H5S_get_dims, FAIL); @@ -625,41 +693,48 @@ H5S_get_dims(const H5S_t *ds, size_t dims[]) switch (ds->type) { case H5S_SCALAR: - ret_value = 0; - break; + ret_value = 0; + break; case H5S_SIMPLE: - ret_value = ds->u.simple.rank; - for (i = 0; i < ret_value; i++) { - dims[i] = ds->u.simple.size[i]; - } - break; + ret_value = ds->u.simple.rank; + for (i=0; i<ret_value; i++) { + if (dims) dims[i] = ds->u.simple.size[i]; + if (max_dims) { + if (ds->u.simple.max) { + max_dims[i] = ds->u.simple.max[i]; + } else { + max_dims[i] = ds->u.simple.size[i]; + } + } + } + break; case H5S_COMPLEX: - HRETURN_ERROR(H5E_DATASPACE, H5E_UNSUPPORTED, FAIL, - "complex data spaces are not supported yet"); + HRETURN_ERROR(H5E_DATASPACE, H5E_UNSUPPORTED, FAIL, + "complex data spaces are not supported yet"); default: - assert("unknown data space class" && 0); - HRETURN_ERROR(H5E_DATASPACE, H5E_UNSUPPORTED, FAIL, - "internal error (unknown data space class)"); + assert("unknown data space class" && 0); + HRETURN_ERROR(H5E_DATASPACE, H5E_UNSUPPORTED, FAIL, + "internal error (unknown data space class)"); } FUNC_LEAVE(ret_value); } /*------------------------------------------------------------------------- - * Function: H5S_modify + * Function: H5S_modify * - * Purpose: Updates a data space by writing a message to an object - * header. + * Purpose: Updates a data space by writing a message to an object + * header. * - * Return: Success: SUCCEED + * Return: Success: SUCCEED * - * Failure: FAIL + * Failure: FAIL * - * Programmer: Robb Matzke - * Tuesday, December 9, 1997 + * Programmer: Robb Matzke + * Tuesday, December 9, 1997 * * Modifications: * @@ -675,39 +750,39 @@ H5S_modify(H5G_entry_t *ent, const H5S_t *ds) switch (ds->type) { case H5S_SCALAR: - HRETURN_ERROR(H5E_DATASPACE, H5E_UNSUPPORTED, FAIL, - "scalar data spaces are not implemented yet"); + HRETURN_ERROR(H5E_DATASPACE, H5E_UNSUPPORTED, FAIL, + "scalar data spaces are not implemented yet"); case H5S_SIMPLE: - if (H5O_modify(ent, H5O_SDSPACE, 0, 0, &(ds->u.simple)) < 0) { - HRETURN_ERROR(H5E_DATASPACE, H5E_CANTINIT, FAIL, - "can't update simple data space message"); - } - break; + if (H5O_modify(ent, H5O_SDSPACE, 0, 0, &(ds->u.simple)) < 0) { + HRETURN_ERROR(H5E_DATASPACE, H5E_CANTINIT, FAIL, + "can't update simple data space message"); + } + break; case H5S_COMPLEX: - HRETURN_ERROR(H5E_DATASPACE, H5E_UNSUPPORTED, FAIL, - "complex data spaces are not implemented yet"); + HRETURN_ERROR(H5E_DATASPACE, H5E_UNSUPPORTED, FAIL, + "complex data spaces are not implemented yet"); default: - assert("unknown data space class" && 0); - break; + assert("unknown data space class" && 0); + break; } FUNC_LEAVE(SUCCEED); } /*------------------------------------------------------------------------- - * Function: H5S_read + * Function: H5S_read * - * Purpose: Reads the data space from an object header. + * Purpose: Reads the data space from an object header. * - * Return: Success: Pointer to a new data space. + * Return: Success: Pointer to a new data space. * - * Failure: NULL + * Failure: NULL * - * Programmer: Robb Matzke - * Tuesday, December 9, 1997 + * Programmer: Robb Matzke + * Tuesday, December 9, 1997 * * Modifications: * @@ -716,7 +791,7 @@ H5S_modify(H5G_entry_t *ent, const H5S_t *ds) H5S_t * H5S_read(H5F_t *f, H5G_entry_t *ent) { - H5S_t *ds = NULL; + H5S_t *ds = NULL; FUNC_ENTER(H5S_read, NULL); @@ -727,28 +802,28 @@ H5S_read(H5F_t *f, H5G_entry_t *ent) ds = H5MM_xcalloc(1, sizeof(H5S_t)); if (H5O_read(ent, H5O_SDSPACE, 0, &(ds->u.simple))) { - ds->type = H5S_SIMPLE; + ds->type = H5S_SIMPLE; } else { - ds->type = H5S_SCALAR; + ds->type = H5S_SCALAR; } FUNC_LEAVE(ds); } /*------------------------------------------------------------------------- - * Function: H5S_cmp + * Function: H5S_cmp * - * Purpose: Compares two data spaces. + * Purpose: Compares two data spaces. * - * Return: Success: 0 if DS1 and DS2 are the same. - * <0 if DS1 is less than DS2. - * >0 if DS1 is greater than DS2. + * Return: Success: 0 if DS1 and DS2 are the same. + * <0 if DS1 is less than DS2. + * >0 if DS1 is greater than DS2. * - * Failure: 0, never fails + * Failure: 0, never fails * - * Programmer: Robb Matzke - * Wednesday, December 10, 1997 + * Programmer: Robb Matzke + * Wednesday, December 10, 1997 * * Modifications: * @@ -757,7 +832,7 @@ H5S_read(H5F_t *f, H5G_entry_t *ent) intn H5S_cmp(const H5S_t *ds1, const H5S_t *ds2) { - intn i; + intn i; FUNC_ENTER(H5S_cmp, 0); @@ -767,60 +842,60 @@ H5S_cmp(const H5S_t *ds1, const H5S_t *ds2) /* compare */ if (ds1->type < ds2->type) - HRETURN(-1); + HRETURN(-1); if (ds1->type > ds2->type) - HRETURN(1); + HRETURN(1); switch (ds1->type) { case H5S_SIMPLE: - if (ds1->u.simple.rank < ds2->u.simple.rank) - HRETURN(-1); - if (ds1->u.simple.rank > ds2->u.simple.rank) - HRETURN(1); - - for (i = 0; i < ds1->u.simple.rank; i++) { - if (ds1->u.simple.size[i] < ds2->u.simple.size[i]) - HRETURN(-1); - if (ds1->u.simple.size[i] > ds2->u.simple.size[i]) - HRETURN(1); - } - - /* don't compare max dimensions */ - - for (i = 0; i < ds1->u.simple.rank; i++) { - if ((ds1->u.simple.perm ? ds1->u.simple.perm[i] : i) < - (ds2->u.simple.perm ? ds2->u.simple.perm[i] : i)) - HRETURN(-1); - if ((ds1->u.simple.perm ? ds2->u.simple.perm[i] : i) > - (ds2->u.simple.perm ? ds2->u.simple.perm[i] : i)) - HRETURN(1); - } - - /* Check if we should compare hyperslab definitions */ - if(ds1->hslab_def==TRUE && ds2->hslab_def==TRUE) { - for (i = 0; i < ds1->u.simple.rank; i++) { - if (ds1->h.start[i] < ds2->h.start[i]) - HRETURN(-1); - if (ds1->h.start[i] > ds2->h.start[i]) - HRETURN(1); - if (ds1->h.count[i] < ds2->h.count[i]) - HRETURN(-1); - if (ds1->h.count[i] > ds2->h.count[i]) - HRETURN(1); - if (ds1->h.stride[i] < ds2->h.stride[i]) - HRETURN(-1); - if (ds1->h.stride[i] > ds2->h.stride[i]) - HRETURN(1); - } + if (ds1->u.simple.rank < ds2->u.simple.rank) + HRETURN(-1); + if (ds1->u.simple.rank > ds2->u.simple.rank) + HRETURN(1); + + for (i = 0; i < ds1->u.simple.rank; i++) { + if (ds1->u.simple.size[i] < ds2->u.simple.size[i]) + HRETURN(-1); + if (ds1->u.simple.size[i] > ds2->u.simple.size[i]) + HRETURN(1); + } + + /* don't compare max dimensions */ + + for (i = 0; i < ds1->u.simple.rank; i++) { + if ((ds1->u.simple.perm ? ds1->u.simple.perm[i] : i) < + (ds2->u.simple.perm ? ds2->u.simple.perm[i] : i)) + HRETURN(-1); + if ((ds1->u.simple.perm ? ds2->u.simple.perm[i] : i) > + (ds2->u.simple.perm ? ds2->u.simple.perm[i] : i)) + HRETURN(1); + } + + /* Check if we should compare hyperslab definitions */ + if(ds1->hslab_def==TRUE && ds2->hslab_def==TRUE) { + for (i = 0; i < ds1->u.simple.rank; i++) { + if (ds1->h.start[i] < ds2->h.start[i]) + HRETURN(-1); + if (ds1->h.start[i] > ds2->h.start[i]) + HRETURN(1); + if (ds1->h.count[i] < ds2->h.count[i]) + HRETURN(-1); + if (ds1->h.count[i] > ds2->h.count[i]) + HRETURN(1); + if (ds1->h.stride[i] < ds2->h.stride[i]) + HRETURN(-1); + if (ds1->h.stride[i] > ds2->h.stride[i]) + HRETURN(1); + } } else { - if(ds1->hslab_def!=ds2->hslab_def) - HRETURN(ds1->hslab_def==TRUE ? 1 : -1); + if(ds1->hslab_def!=ds2->hslab_def) + HRETURN(ds1->hslab_def==TRUE ? 1 : -1); } - break; + break; default: - assert("not implemented yet" && 0); + assert("not implemented yet" && 0); } FUNC_LEAVE(0); @@ -834,17 +909,17 @@ H5S_cmp(const H5S_t *ds1, const H5S_t *ds2) Check if a dataspace is simple (internal) USAGE hbool_t H5S_is_simple(sdim) - H5S_t *sdim; IN: Pointer to dataspace object to query + H5S_t *sdim; IN: Pointer to dataspace object to query RETURNS TRUE/FALSE/FAIL DESCRIPTION - This function determines the if a dataspace is "simple". ie. if it + This function determines the if a dataspace is "simple". ie. if it has orthogonal, evenly spaced dimensions. --------------------------------------------------------------------------*/ hbool_t H5S_is_simple(const H5S_t *sdim) { - hbool_t ret_value = FAIL; + hbool_t ret_value = FAIL; FUNC_ENTER(H5S_is_simple, FAIL); @@ -863,31 +938,31 @@ H5S_is_simple(const H5S_t *sdim) Check if a dataspace is simple USAGE hbool_t H5Sis_simple(sid) - hid_t sid; IN: ID of dataspace object to query + hid_t sid; IN: ID of dataspace object to query RETURNS TRUE/FALSE/FAIL DESCRIPTION - This function determines the if a dataspace is "simple". ie. if it + This function determines the if a dataspace is "simple". ie. if it has orthogonal, evenly spaced dimensions. --------------------------------------------------------------------------*/ hbool_t H5Sis_simple(hid_t sid) { - H5S_t *space = NULL; /* dataspace to modify */ - hbool_t ret_value = FAIL; + H5S_t *space = NULL; /* dataspace to modify */ + hbool_t ret_value = FAIL; FUNC_ENTER(H5Sis_simple, FAIL); /* Check args and all the boring stuff. */ if ((space = H5A_object(sid)) == NULL) - HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "not a data space"); + HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "not a data space"); ret_value = H5S_is_simple(space); done: if (ret_value == FAIL) { /* Error condition cleanup */ - } /* end if */ + } /* end if */ /* Normal function cleanup */ FUNC_LEAVE(ret_value); } @@ -900,14 +975,14 @@ H5Sis_simple(hid_t sid) Determine the size of a dataspace USAGE herr_t H5Sset_space(sid, rank, dims) - hid_t sid; IN: Dataspace object to query - intn rank; IN: # of dimensions for the dataspace - const size_t *dims; IN: Size of each dimension for the dataspace + hid_t sid; IN: Dataspace object to query + intn rank; IN: # of dimensions for the dataspace + const size_t *dims; IN: Size of each dimension for the dataspace RETURNS SUCCEED/FAIL DESCRIPTION - This function sets the number and size of each dimension in the - dataspace. Setting RANK to a value of zero allows scalar objects to be + This function sets the number and size of each dimension in the + dataspace. Setting RANK to a value of zero allows scalar objects to be created. Dimensions are specified from slowest to fastest changing in the DIMS array (i.e. 'C' order). Setting the size of a dimension to zero indicates that the dimension is of unlimited size and should be allowed to @@ -917,17 +992,17 @@ H5Sis_simple(hid_t sid) herr_t H5Sset_space(hid_t sid, int rank, const size_t *dims) { - H5S_t *space = NULL; /* dataspace to modify */ - intn u; /* local counting variable */ - herr_t ret_value = SUCCEED; + H5S_t *space = NULL; /* dataspace to modify */ + intn u; /* local counting variable */ + herr_t ret_value = SUCCEED; FUNC_ENTER(H5Sset_space, FAIL); /* Check args */ if ((space = H5A_object(sid)) == NULL) - HRETURN_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "not a data space"); + HRETURN_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "not a data space"); if (rank > 0 && dims == NULL) - HRETURN_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no dimensions specified"); + HRETURN_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no dimensions specified"); if (rank<0) HRETURN_ERROR (H5E_ARGS, H5E_BADVALUE, FAIL, "invalid rank"); if (dims) { @@ -943,52 +1018,52 @@ H5Sset_space(hid_t sid, int rank, const size_t *dims) switch (space->type) { case H5S_SCALAR: case H5S_SIMPLE: - /* do nothing */ - break; + /* do nothing */ + break; case H5S_COMPLEX: - /* - * eventually this will destroy whatever "complex" dataspace info - * is retained, right now it's an error - */ - /* Fall through to report error */ + /* + * eventually this will destroy whatever "complex" dataspace info + * is retained, right now it's an error + */ + /* Fall through to report error */ default: - HRETURN_ERROR(H5E_DATASPACE, H5E_BADVALUE, FAIL, + HRETURN_ERROR(H5E_DATASPACE, H5E_BADVALUE, FAIL, "unknown data space class"); } space->type = H5S_SIMPLE; /* Reset hyperslab definition, if one is defined */ if(space->hslab_def==TRUE) { - H5MM_xfree(space->h.start); - H5MM_xfree(space->h.count); - H5MM_xfree(space->h.stride); - space->hslab_def=FALSE; + H5MM_xfree(space->h.start); + H5MM_xfree(space->h.count); + H5MM_xfree(space->h.stride); + space->hslab_def=FALSE; } - if (rank == 0) { /* scalar variable */ - space->type = H5S_SCALAR; - space->u.simple.rank = 0; /* set to scalar rank */ - if (space->u.simple.size != NULL) - space->u.simple.size = H5MM_xfree(space->u.simple.size); - if (space->u.simple.max != NULL) - space->u.simple.max = H5MM_xfree(space->u.simple.max); - if (space->u.simple.perm != NULL) - space->u.simple.max = H5MM_xfree(space->u.simple.perm); + if (rank == 0) { /* scalar variable */ + space->type = H5S_SCALAR; + space->u.simple.rank = 0; /* set to scalar rank */ + if (space->u.simple.size != NULL) + space->u.simple.size = H5MM_xfree(space->u.simple.size); + if (space->u.simple.max != NULL) + space->u.simple.max = H5MM_xfree(space->u.simple.max); + if (space->u.simple.perm != NULL) + space->u.simple.max = H5MM_xfree(space->u.simple.perm); } else { - /* Free the old space for now */ - if (space->u.simple.size != NULL) - space->u.simple.size = H5MM_xfree(space->u.simple.size); - if (space->u.simple.max != NULL) - space->u.simple.max = H5MM_xfree(space->u.simple.max); - if (space->u.simple.perm != NULL) - space->u.simple.perm = H5MM_xfree(space->u.simple.perm); - - /* Set the rank and copy the dims */ - space->u.simple.rank = rank; - space->u.simple.size = H5MM_xcalloc(rank, sizeof(size_t)); - HDmemcpy(space->u.simple.size, dims, sizeof(size_t) * rank); + /* Free the old space for now */ + if (space->u.simple.size != NULL) + space->u.simple.size = H5MM_xfree(space->u.simple.size); + if (space->u.simple.max != NULL) + space->u.simple.max = H5MM_xfree(space->u.simple.max); + if (space->u.simple.perm != NULL) + space->u.simple.perm = H5MM_xfree(space->u.simple.perm); + + /* Set the rank and copy the dims */ + space->u.simple.rank = rank; + space->u.simple.size = H5MM_xcalloc(rank, sizeof(size_t)); + HDmemcpy(space->u.simple.size, dims, sizeof(size_t) * rank); } FUNC_LEAVE(ret_value); @@ -1001,14 +1076,14 @@ H5Sset_space(hid_t sid, int rank, const size_t *dims) Select a hyperslab from a simple dataspace USAGE herr_t H5Sset_hyperslab(sid, start, count, stride) - hid_t sid; IN: Dataspace object to select hyperslab from - const int *start; IN: Starting location for hyperslab to select - const size_t *count; IN: Number of elements in hyperslab - const size_t *stride; IN: Packing of elements in hyperslab + hid_t sid; IN: Dataspace object to select hyperslab from + const int *start; IN: Starting location for hyperslab to select + const size_t *count; IN: Number of elements in hyperslab + const size_t *stride; IN: Packing of elements in hyperslab RETURNS SUCCEED/FAIL DESCRIPTION - This function selects a hyperslab from a simple dataspace. The stride + This function selects a hyperslab from a simple dataspace. The stride array may be used to sub-sample the hyperslab chosen, a value of 1 in each position of the stride array selects contiguous elements in the array, a value of 2 selects every other element, etc. If the stride parameter is @@ -1019,63 +1094,63 @@ H5Sset_space(hid_t sid, int rank, const size_t *dims) herr_t H5Sset_hyperslab(hid_t sid, const int *start, const size_t *count, const size_t *stride) { - H5S_t *space = NULL; /* dataspace to modify */ - size_t *tmp_stride=NULL; /* temp. copy of stride */ - intn u; /* local counting variable */ - herr_t ret_value = SUCCEED; + H5S_t *space = NULL; /* dataspace to modify */ + size_t *tmp_stride=NULL; /* temp. copy of stride */ + intn u; /* local counting variable */ + herr_t ret_value = SUCCEED; FUNC_ENTER(H5Sset_hyperslab, FAIL); /* Get the object */ if (H5_DATASPACE != H5A_group(sid) || (space = H5A_object(sid)) == NULL) - HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "not a data space"); + HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "not a data space"); if (start == NULL || count==NULL) - HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, + HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid hyperslab selected"); /* We can't modify other types of dataspaces currently, so error out */ if (space->type!=H5S_SIMPLE) - HGOTO_ERROR(H5E_DATASPACE, H5E_BADVALUE, FAIL, + HGOTO_ERROR(H5E_DATASPACE, H5E_BADVALUE, FAIL, "unknown dataspace type"); /* Set up stride values for later use */ tmp_stride= H5MM_xmalloc(space->u.simple.rank*sizeof(tmp_stride[0])); for (u=0; u<space->u.simple.rank; u++) { - tmp_stride[u] = stride ? stride[u] : 1; + tmp_stride[u] = stride ? stride[u] : 1; } /* Range check arguments */ for (u=0; u<space->u.simple.rank; u++) { - if (start[u]<0 || start[u]>=space->u.simple.size[u]) { - HGOTO_ERROR(H5E_DATASPACE, H5E_BADRANGE, FAIL, + if (start[u]<0 || start[u]>=space->u.simple.size[u]) { + HGOTO_ERROR(H5E_DATASPACE, H5E_BADRANGE, FAIL, "hyperslab bounds out of range"); } if (start[u]<0 || start[u]+(count[u]*tmp_stride[u])>space->u.simple.size[u]) { - HGOTO_ERROR(H5E_DATASPACE, H5E_BADRANGE, FAIL, + HGOTO_ERROR(H5E_DATASPACE, H5E_BADRANGE, FAIL, "hyperslab bounds out of range"); } } /* Allocate space for the hyperslab information */ if (NULL==space->h.start) { - space->h.start= H5MM_xcalloc(space->u.simple.rank,sizeof(intn)); - space->h.count= H5MM_xcalloc(space->u.simple.rank,sizeof(size_t)); - space->h.stride= H5MM_xcalloc(space->u.simple.rank,sizeof(size_t)); + space->h.start= H5MM_xcalloc(space->u.simple.rank,sizeof(intn)); + space->h.count= H5MM_xcalloc(space->u.simple.rank,sizeof(size_t)); + space->h.stride= H5MM_xcalloc(space->u.simple.rank,sizeof(size_t)); } /* Build hyperslab */ for(u=0; u<space->u.simple.rank; u++) { - space->h.start[u] = start[u]; - space->h.count[u] = count[u]; - space->h.stride[u] = tmp_stride[u]; + space->h.start[u] = start[u]; + space->h.count[u] = count[u]; + space->h.stride[u] = tmp_stride[u]; } space->hslab_def=TRUE; done: - if (ret_value == FAIL) { /* Error condition cleanup */ + if (ret_value == FAIL) { /* Error condition cleanup */ - } /* end if */ + } /* end if */ /* Normal function cleanup */ H5MM_xfree(tmp_stride); @@ -1086,7 +1161,7 @@ done: * Function: H5Sget_hyperslab * * Purpose: Retrieves information about the hyperslab from a simple data - * space. If no hyperslab has been defined then the hyperslab + * space. If no hyperslab has been defined then the hyperslab * is the same as the entire array. * * Return: Success: Hyperslab dimensionality. @@ -1094,7 +1169,7 @@ done: * Failure: FAIL * * Programmer: Robb Matzke - * Wednesday, January 28, 1998 + * Wednesday, January 28, 1998 * * Modifications: * @@ -1127,7 +1202,7 @@ H5Sget_hyperslab (hid_t sid, int offset[]/*out*/, size_t size[]/*out*/, * Function: H5S_get_hyperslab * * Purpose: Retrieves information about the hyperslab from a simple data - * space. If no hyperslab has been defined then the hyperslab + * space. If no hyperslab has been defined then the hyperslab * is the same as the entire array. * * Return: Success: Hyperslab dimensionality. @@ -1135,7 +1210,7 @@ H5Sget_hyperslab (hid_t sid, int offset[]/*out*/, size_t size[]/*out*/, * Failure: FAIL * * Programmer: Robb Matzke - * Wednesday, January 28, 1998 + * Wednesday, January 28, 1998 * * Modifications: * @@ -1197,7 +1272,7 @@ H5S_get_hyperslab (const H5S_t *ds, int offset[]/*out*/, * Failure: NULL * * Programmer: Robb Matzke - * Wednesday, January 21, 1998 + * Wednesday, January 21, 1998 * * Modifications: * @@ -1207,7 +1282,7 @@ const H5S_conv_t * H5S_find (const H5S_t *mem_space, const H5S_t *file_space) { static H5S_conv_t _conv; - static const H5S_conv_t *conv = NULL; + static const H5S_conv_t *conv = NULL; FUNC_ENTER (H5S_find, NULL); @@ -1251,7 +1326,7 @@ H5S_find (const H5S_t *mem_space, const H5S_t *file_space) * Failure: FAIL * * Programmer: Robb Matzke - * Friday, January 30, 1998 + * Friday, January 30, 1998 * * Modifications: * |