diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/H5A.c | 4 | ||||
-rw-r--r-- | src/H5O.c | 4 | ||||
-rw-r--r-- | src/H5Oattr.c | 83 | ||||
-rw-r--r-- | src/H5Opkg.h | 7 | ||||
-rw-r--r-- | src/H5Oprivate.h | 4 | ||||
-rw-r--r-- | src/H5Osdspace.c | 519 | ||||
-rw-r--r-- | src/H5S.c | 70 |
7 files changed, 143 insertions, 548 deletions
@@ -267,7 +267,7 @@ H5A_create(const H5G_entry_t *ent, const char *name, const H5T_t *type, else attr->dt_size=H5O_raw_size(H5O_DTYPE_ID,attr->ent.file,type); assert(attr->dt_size>0); - attr->ds_size=H5O_raw_size(H5O_SDSPACE_ID,attr->ent.file,&(space->extent.u.simple)); + attr->ds_size=H5O_raw_size(H5O_SDSPACE_ID,attr->ent.file,&(space->extent)); assert(attr->ds_size>0); H5_ASSIGN_OVERFLOW(attr->data_size,H5S_get_simple_extent_npoints(attr->ds)*H5T_get_size(attr->dt),hssize_t,size_t); @@ -1555,7 +1555,7 @@ H5A_close(H5A_t *attr) assert(attr); /* Check if the attribute has any data yet, if not, fill with zeroes */ - if(attr->ent_opened && !attr->initialized) { + if(attr->ent_opened && !attr->initialized && attr->data_size) { uint8_t *tmp_buf=H5MM_calloc(attr->data_size); if (NULL == tmp_buf) HGOTO_ERROR(H5E_ATTR, H5E_NOSPACE, FAIL, "memory allocation failed for attribute fill-value") @@ -104,8 +104,8 @@ static herr_t H5O_init_interface(void); /* ID to type mapping */ static const H5O_class_t *const message_type_g[] = { H5O_NULL, /*0x0000 Null */ - H5O_SDSPACE, /*0x0001 Simple Dimensionality (old) */ - H5O_SDSPACE_NEW, /*0x0002 Extent Dimensionality (new) */ + H5O_SDSPACE, /*0x0001 Extent Dimensionality */ + NULL, /*0x0002 Not assigned */ H5O_DTYPE, /*0x0003 Data Type */ H5O_FILL, /*0x0004 Old data storage -- fill value */ H5O_FILL_NEW, /*0x0005 New Data storage -- fill value */ diff --git a/src/H5Oattr.c b/src/H5Oattr.c index 8714fdb..7ca18cf 100644 --- a/src/H5Oattr.c +++ b/src/H5Oattr.c @@ -74,8 +74,8 @@ static int interface_initialize_g = 0; /* Declare external the free list for H5S_t's */ H5FL_EXTERN(H5S_t); -/* Declare external the free list for H5S_simple_t's */ -H5FL_EXTERN(H5S_simple_t); +/* Declare external the free list for H5S_extent_t's */ +H5FL_EXTERN(H5S_extent_t); /*-------------------------------------------------------------------------- NAME @@ -101,12 +101,16 @@ H5FL_EXTERN(H5S_simple_t); * * Robb Matzke, 20 Jul 1998 * Added a version number at the beginning. + * + * Raymond Lu, 8 April 2004 + * Changed Dataspace operation on H5S_simple_t to H5S_extent_t. + * --------------------------------------------------------------------------*/ static void * H5O_attr_decode(H5F_t *f, hid_t dxpl_id, const uint8_t *p, H5O_shared_t UNUSED *sh) { H5A_t *attr = NULL; - H5S_simple_t *simple; /*simple dimensionality information */ + H5S_extent_t *extent; /*extent dimensionality information */ size_t name_len; /*attribute name length */ int version; /*message version number*/ unsigned flags=0; /* Attribute flags */ @@ -176,33 +180,49 @@ H5O_attr_decode(H5F_t *f, hid_t dxpl_id, const uint8_t *p, H5O_shared_t UNUSED * /* decode the attribute dataspace */ if (NULL==(attr->ds = H5FL_CALLOC(H5S_t))) HGOTO_ERROR (H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed"); - if((simple=(H5O_SDSPACE->decode)(f,dxpl_id,p,NULL))!=NULL) { - hsize_t nelem; /* Number of elements in extent */ - unsigned u; /* Local index variable */ - - /* Set the dataspace type to be simple or scalar as appropriate */ - if(simple->rank>0) - attr->ds->extent.type = H5S_SIMPLE; - else - attr->ds->extent.type = H5S_SCALAR; + + if((extent=(H5O_SDSPACE->decode)(f,dxpl_id,p,NULL))!=NULL) { + unsigned i; /* Local index variable */ + + if(extent->type != H5S_NO_CLASS) { /* File is new, created by version 1.7 or after */ + /* Compute the number of elements in the extent */ + if(extent->type == H5S_NULL) + extent->nelem = 0; + else { + for(i=0, extent->nelem=1; i<extent->u.simple.rank; i++) + extent->nelem*=extent->u.simple.size[i]; + } + } else { /* File was created by version 1.6 or before, when there was no H5S_NULL */ + /* Set the dataspace type to be simple or scalar as appropriate */ + if(extent->u.simple.rank>0) + extent->type = H5S_SIMPLE; + else + extent->type = H5S_SCALAR; + + /* Compute the number of elements in the extent */ + for(i=0, extent->nelem=1; i<extent->u.simple.rank; i++) + extent->nelem*=extent->u.simple.size[i]; + } /* Copy the extent information */ - HDmemcpy(&(attr->ds->extent.u.simple),simple, sizeof(H5S_simple_t)); + HDmemcpy(&(attr->ds->extent),extent, sizeof(H5S_extent_t)); /* Release temporary extent information */ - H5FL_FREE(H5S_simple_t,simple); - - /* Compute the number of elements in the extent */ - for(u=0, nelem=1; u<attr->ds->extent.u.simple.rank; u++) - nelem*=attr->ds->extent.u.simple.size[u]; - attr->ds->extent.nelem = nelem; + H5FL_FREE(H5S_extent_t,extent); + } else { + attr->ds->extent.type = H5S_NULL; + attr->ds->extent.nelem = 0; + } + + if(attr->ds->extent.type == H5S_NULL) { + if(H5S_select_none(attr->ds)<0) + HGOTO_ERROR (H5E_DATASPACE, H5E_CANTSET, NULL, "unable to set none selection"); } else { - attr->ds->extent.type = H5S_SCALAR; - attr->ds->extent.nelem = 1; + /* Default to entire dataspace being selected */ + if(H5S_select_all(attr->ds,0)<0) + HGOTO_ERROR (H5E_DATASPACE, H5E_CANTSET, NULL, "unable to set all selection"); } - /* Default to entire dataspace being selected */ - if(H5S_select_all(attr->ds,0)<0) - HGOTO_ERROR (H5E_DATASPACE, H5E_CANTSET, NULL, "unable to set all selection"); + if(version < H5O_ATTR_VERSION_NEW) p += H5O_ALIGN(attr->ds_size); else @@ -212,9 +232,11 @@ H5O_attr_decode(H5F_t *f, hid_t dxpl_id, const uint8_t *p, H5O_shared_t UNUSED * H5_ASSIGN_OVERFLOW(attr->data_size,H5S_get_simple_extent_npoints(attr->ds)*H5T_get_size(attr->dt),hsize_t,size_t); /* Go get the data */ - if (NULL==(attr->data = H5MM_malloc(attr->data_size))) - HGOTO_ERROR (H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed"); - HDmemcpy(attr->data,p,attr->data_size); + if(attr->data_size) { + if (NULL==(attr->data = H5MM_malloc(attr->data_size))) + HGOTO_ERROR (H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed"); + HDmemcpy(attr->data,p,attr->data_size); + } /* Indicate that the fill values aren't to be written out */ attr->initialized=1; @@ -249,6 +271,11 @@ done: * * Robb Matzke, 20 Jul 1998 * Added a version number at the beginning. + * + * Raymond Lu, 8 April 2004 + * For data space, changed the operation on H5S_simple_t to + * H5S_extent_t + * --------------------------------------------------------------------------*/ static herr_t H5O_attr_encode(H5F_t *f, uint8_t *p, const void *mesg) @@ -336,7 +363,7 @@ H5O_attr_encode(H5F_t *f, uint8_t *p, const void *mesg) p += attr->dt_size; /* encode the attribute dataspace */ - if((H5O_SDSPACE->encode)(f,p,&(attr->ds->extent.u.simple))<0) + if((H5O_SDSPACE->encode)(f,p,&(attr->ds->extent))<0) HGOTO_ERROR(H5E_ATTR, H5E_CANTENCODE, FAIL, "can't encode attribute dataspace"); if(version < H5O_ATTR_VERSION_NEW) { HDmemset(p+attr->ds_size, 0, H5O_ALIGN(attr->ds_size)-attr->ds_size); diff --git a/src/H5Opkg.h b/src/H5Opkg.h index a92543e..a4867dd 100644 --- a/src/H5Opkg.h +++ b/src/H5Opkg.h @@ -109,16 +109,11 @@ typedef struct H5O_t { H5_DLLVAR const H5O_class_t H5O_NULL[1]; /* - * Old simple Data Space Message. + * Extent Data Space Message. */ H5_DLLVAR const H5O_class_t H5O_SDSPACE[1]; /* - * New Extent Data Space Message. - */ -H5_DLLVAR const H5O_class_t H5O_SDSPACE_NEW[1]; - -/* * Data Type Message. */ H5_DLLVAR const H5O_class_t H5O_DTYPE[1]; diff --git a/src/H5Oprivate.h b/src/H5Oprivate.h index 330d949..a6bd5a3 100644 --- a/src/H5Oprivate.h +++ b/src/H5Oprivate.h @@ -52,8 +52,7 @@ /* Header message IDs */ #define H5O_NULL_ID 0x0000 /* Null Message. */ -#define H5O_SDSPACE_ID 0x0001 /* Simple Dataspace Message.(old) */ -#define H5O_SDSPACE_NEW_ID 0x0002 /* Simple Dataspace Message.(new) */ +#define H5O_SDSPACE_ID 0x0001 /* Extent Dataspace Message.*/ /* Complex dataspace is/was planned for message 0x0002 */ #define H5O_DTYPE_ID 0x0003 /* Datatype Message. */ #define H5O_FILL_ID 0x0004 /* Fill Value Message. (Old) */ @@ -72,7 +71,6 @@ #define H5O_STAB_ID 0x0011 /* Symbol table message. */ #define H5O_MTIME_NEW_ID 0x0012 /* Modification time message. (New) */ - /* * Fill Value Message. (Old) * (Data structure in memory) diff --git a/src/H5Osdspace.c b/src/H5Osdspace.c index e293d94..02b932a 100644 --- a/src/H5Osdspace.c +++ b/src/H5Osdspace.c @@ -25,17 +25,7 @@ #define PABLO_MASK H5O_sdspace_mask -/* new PRIVATE PROTOTYPES */ -static void *H5O_sdspace_new_decode(H5F_t *f, hid_t dxpl_id, const uint8_t *p, H5O_shared_t *sh); -static herr_t H5O_sdspace_new_encode(H5F_t *f, uint8_t *p, const void *_mesg); -static void *H5O_sdspace_new_copy(const void *_mesg, void *_dest); -static size_t H5O_sdspace_new_size(H5F_t *f, const void *_mesg); -static herr_t H5O_sdspace_new_reset(void *_mesg); -static herr_t H5O_sdspace_new_free (void *_mesg); -static herr_t H5O_sdspace_new_debug(H5F_t *f, hid_t dxpl_id, const void *_mesg, - FILE * stream, int indent, int fwidth); - -/* old PRIVATE PROTOTYPES */ +/* PRIVATE PROTOTYPES */ static void *H5O_sdspace_decode(H5F_t *f, hid_t dxpl_id, const uint8_t *p, H5O_shared_t *sh); static herr_t H5O_sdspace_encode(H5F_t *f, uint8_t *p, const void *_mesg); static void *H5O_sdspace_copy(const void *_mesg, void *_dest); @@ -48,8 +38,8 @@ static herr_t H5O_sdspace_debug(H5F_t *f, hid_t dxpl_id, const void *_mesg, /* This message derives from H5O, for old dataspace before version 1.7 */ const H5O_class_t H5O_SDSPACE[1] = {{ H5O_SDSPACE_ID, /* message id number */ - "simple_dspace", /* message name for debugging */ - sizeof(H5S_simple_t), /* native message size */ + "extent_dspace", /* message name for debugging */ + sizeof(H5S_extent_t), /* native message size */ H5O_sdspace_decode, /* decode message */ H5O_sdspace_encode, /* encode message */ H5O_sdspace_copy, /* copy the native value */ @@ -63,24 +53,6 @@ const H5O_class_t H5O_SDSPACE[1] = {{ H5O_sdspace_debug, /* debug the message */ }}; -/* This message derives from H5O, for new dataspace after version 1.6 */ -const H5O_class_t H5O_SDSPACE_NEW[1] = {{ - H5O_SDSPACE_NEW_ID, /* message id number */ - "extent_dataspace", /* message name for debugging */ - sizeof(H5S_extent_t), /* native message size */ - H5O_sdspace_new_decode, /* decode message */ - H5O_sdspace_new_encode, /* encode message */ - H5O_sdspace_new_copy, /* copy the native value */ - H5O_sdspace_new_size, /* size of symbol table entry */ - H5O_sdspace_new_reset, /* default reset method */ - H5O_sdspace_new_free, /* free method */ - NULL, /* file delete method */ - NULL, /* link method */ - NULL, /* get share method */ - NULL, /* set share method */ - H5O_sdspace_new_debug, /* debug the message */ -}}; - /* Initial version of the "old" data space information */ #define H5O_SDSPACE_VERSION 1 /* Initial version of the "new" data space information */ @@ -90,9 +62,6 @@ const H5O_class_t H5O_SDSPACE_NEW[1] = {{ static int interface_initialize_g = 0; #define INTERFACE_INIT NULL -/* Declare external the free list for H5S_simple_t's */ -H5FL_EXTERN(H5S_simple_t); - /* Declare external the free list for H5S_extent_t's */ H5FL_EXTERN(H5S_extent_t); @@ -102,9 +71,9 @@ H5FL_ARR_EXTERN(hsize_t); /*-------------------------------------------------------------------------- NAME - H5O_sdspace_new_decode + H5O_sdspace_decode PURPOSE - Decode a extent dimensionality message and return a pointer to a memory + Decode an extent dimensionality message and return a pointer to a memory struct with the decoded information USAGE void *H5O_sdspace_decode(f, raw_size, p) @@ -119,16 +88,20 @@ H5FL_ARR_EXTERN(hsize_t); within this function using malloc() and is returned to the caller. MODIFICATIONS + Raymond Lu + April 8, 2004 + Added the type of dataspace into this header message using a reserved byte. + --------------------------------------------------------------------------*/ static void * -H5O_sdspace_new_decode(H5F_t *f, hid_t UNUSED dxpl_id, const uint8_t *p, H5O_shared_t UNUSED *sh) +H5O_sdspace_decode(H5F_t *f, hid_t UNUSED dxpl_id, const uint8_t *p, H5O_shared_t UNUSED *sh) { H5S_extent_t *sdim = NULL;/* New extent dimensionality structure */ void *ret_value; unsigned i; /* local counting variable */ unsigned flags, version; - FUNC_ENTER_NOAPI(H5O_sdspace_new_decode, NULL); + FUNC_ENTER_NOAPI(H5O_sdspace_decode, NULL); /* check args */ assert(f); @@ -142,6 +115,8 @@ H5O_sdspace_new_decode(H5F_t *f, hid_t UNUSED dxpl_id, const uint8_t *p, H5O_sha HGOTO_ERROR(H5E_OHDR, H5E_CANTINIT, NULL, "wrong version number in data space message"); if(version==H5O_SDSPACE_VERSION_2) sdim->type = *p++; + else + sdim->type = H5S_NO_CLASS; sdim->u.simple.rank = *p++; if (sdim->u.simple.rank>H5S_MAX_RANK) HGOTO_ERROR(H5E_OHDR, H5E_CANTINIT, NULL, "simple data space dimensionality is too large"); @@ -190,96 +165,9 @@ done: /*-------------------------------------------------------------------------- NAME - H5O_sdspace_decode - PURPOSE - Decode a simple dimensionality message and return a pointer to a memory - struct with the decoded information - USAGE - void *H5O_sdspace_decode(f, raw_size, p) - H5F_t *f; IN: pointer to the HDF5 file struct - size_t raw_size; IN: size of the raw information buffer - const uint8 *p; IN: the raw information buffer - RETURNS - Pointer to the new message in native order on success, NULL on failure - DESCRIPTION - This function decodes the "raw" disk form of a simple dimensionality - message into a struct in memory native format. The struct is allocated - within this function using malloc() and is returned to the caller. - - MODIFICATIONS - Robb Matzke, 1998-04-09 - The current and maximum dimensions are now H5F_SIZEOF_SIZET bytes - instead of just four bytes. - - Robb Matzke, 1998-07-20 - Added a version number and reformatted the message for aligment. ---------------------------------------------------------------------------*/ -static void * -H5O_sdspace_decode(H5F_t *f, hid_t UNUSED dxpl_id, const uint8_t *p, H5O_shared_t UNUSED *sh) -{ - H5S_simple_t *sdim = NULL;/* New simple dimensionality structure */ - void *ret_value; - unsigned u; /* local counting variable */ - unsigned flags, version; - - FUNC_ENTER_NOAPI(H5O_sdspace_decode, NULL); - - /* check args */ - assert(f); - assert(p); - assert (!sh); - - /* decode */ - if ((sdim = H5FL_CALLOC(H5S_simple_t)) != NULL) { - version = *p++; - if (version!=H5O_SDSPACE_VERSION) - HGOTO_ERROR(H5E_OHDR, H5E_CANTINIT, NULL, "wrong version number in data space message"); - sdim->rank = *p++; - if (sdim->rank>H5S_MAX_RANK) - HGOTO_ERROR(H5E_OHDR, H5E_CANTINIT, NULL, "simple data space dimensionality is too large"); - flags = *p++; - p += 5; /*reserved*/ - - if (sdim->rank > 0) { - if (NULL==(sdim->size=H5FL_ARR_MALLOC(hsize_t,sdim->rank))) - HGOTO_ERROR (H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed"); - for (u = 0; u < sdim->rank; u++) - H5F_DECODE_LENGTH (f, p, sdim->size[u]); - if (flags & H5S_VALID_MAX) { - if (NULL==(sdim->max=H5FL_ARR_MALLOC(hsize_t,sdim->rank))) - HGOTO_ERROR (H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed"); - for (u = 0; u < sdim->rank; u++) - H5F_DECODE_LENGTH (f, p, sdim->max[u]); - } -#ifdef LATER - if (flags & H5S_VALID_PERM) { - if (NULL==(sdim->perm=H5FL_ARR_MALLOC(hsize_t,sdim->rank))) - HGOTO_ERROR (H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed"); - for (u = 0; u < sdim->rank; u++) - H5F_DECODE_LENGTH (f, p, sdim->perm[u]); - } -#endif /* LATER */ - } - } - - /* Set return value */ - ret_value = (void*)sdim; /*success*/ - -done: - if (!ret_value && sdim) { - H5S_release_simple(sdim); - H5FL_FREE(H5S_simple_t,sdim); - } /* end if */ - - FUNC_LEAVE_NOAPI(ret_value); -} - - -/*-------------------------------------------------------------------------- - NAME - H5O_sdspace_new_encode + H5O_sdspace_encode PURPOSE - Encode a simple dimensionality message + Encode an extent dimensionality message USAGE herr_t H5O_sdspace_encode(f, raw_size, p, mesg) H5F_t *f; IN: pointer to the HDF5 file struct @@ -293,17 +181,20 @@ done: dimensionality message in the "raw" disk form. MODIFICATIONS + Raymond Lu + April 8, 2004 + Added the type of dataspace into this header message using a reserved byte. --------------------------------------------------------------------------*/ static herr_t -H5O_sdspace_new_encode(H5F_t *f, uint8_t *p, const void *mesg) +H5O_sdspace_encode(H5F_t *f, uint8_t *p, const void *mesg) { const H5S_extent_t *sdim = (const H5S_extent_t *) mesg; unsigned u; /* Local counting variable */ unsigned flags = 0; herr_t ret_value=SUCCEED; /* Return value */ - FUNC_ENTER_NOAPI(H5O_sdspace_new_encode, FAIL); + FUNC_ENTER_NOAPI(H5O_sdspace_encode, FAIL); /* check args */ assert(f); @@ -350,85 +241,7 @@ done: /*-------------------------------------------------------------------------- NAME - H5O_sdspace_encode - PURPOSE - Encode a simple dimensionality message - USAGE - herr_t H5O_sdspace_encode(f, raw_size, p, mesg) - H5F_t *f; IN: pointer to the HDF5 file struct - size_t raw_size; IN: size of the raw information buffer - const uint8 *p; IN: the raw information buffer - const void *mesg; IN: Pointer to the simple dimensionality struct - RETURNS - Non-negative on success/Negative on failure - DESCRIPTION - This function encodes the native memory form of the simple - dimensionality message in the "raw" disk form. - - MODIFICATIONS - Robb Matzke, 1998-04-09 - The current and maximum dimensions are now H5F_SIZEOF_SIZET bytes - instead of just four bytes. - - Robb Matzke, 1998-07-20 - Added a version number and reformatted the message for aligment. ---------------------------------------------------------------------------*/ -static herr_t -H5O_sdspace_encode(H5F_t *f, uint8_t *p, const void *mesg) -{ - const H5S_simple_t *sdim = (const H5S_simple_t *) mesg; - unsigned u; /* Local counting variable */ - unsigned flags = 0; - herr_t ret_value=SUCCEED; /* Return value */ - - FUNC_ENTER_NOAPI(H5O_sdspace_encode, FAIL); - - /* check args */ - assert(f); - assert(p); - assert(sdim); - - /* set flags */ - if (sdim->max) - flags |= H5S_VALID_MAX; -#ifdef LATER - if (sdim->perm) - flags |= H5S_VALID_PERM; -#endif - - /* encode */ - *p++ = H5O_SDSPACE_VERSION; - *p++ = sdim->rank; - *p++ = flags; - *p++ = 0; /*reserved*/ - *p++ = 0; /*reserved*/ - *p++ = 0; /*reserved*/ - *p++ = 0; /*reserved*/ - *p++ = 0; /*reserved*/ - - if (sdim->rank > 0) { - for (u = 0; u < sdim->rank; u++) - H5F_ENCODE_LENGTH (f, p, sdim->size[u]); - if (flags & H5S_VALID_MAX) { - for (u = 0; u < sdim->rank; u++) - H5F_ENCODE_LENGTH (f, p, sdim->max[u]); - } -#ifdef LATER - if (flags & H5S_VALID_PERM) { - for (u = 0; u < sdim->rank; u++) - H5F_ENCODE_LENGTH (f, p, sdim->perm[u]); - } -#endif - } - -done: - FUNC_LEAVE_NOAPI(ret_value); -} - - -/*-------------------------------------------------------------------------- - NAME - H5O_sdspace_new_copy + H5O_sdspace_copy PURPOSE Copies a message from MESG to DEST, allocating DEST if necessary. USAGE @@ -440,15 +253,20 @@ done: DESCRIPTION This function copies a native (memory) extent dimensionality message, allocating the destination structure if necessary. + MODIFICATIONS + Raymond Lu + April 8, 2004 + Changed operation on H5S_simple_t to H5S_extent_t. + --------------------------------------------------------------------------*/ static void * -H5O_sdspace_new_copy(const void *mesg, void *dest) +H5O_sdspace_copy(const void *mesg, void *dest) { const H5S_extent_t *src = (const H5S_extent_t *) mesg; H5S_extent_t *dst = (H5S_extent_t *) dest; void *ret_value; /* Return value */ - FUNC_ENTER_NOAPI(H5O_sdspace_new_copy, NULL); + FUNC_ENTER_NOAPI(H5O_sdspace_copy, NULL); /* check args */ assert(src); @@ -486,69 +304,11 @@ done: /*-------------------------------------------------------------------------- NAME - H5O_sdspace_copy - PURPOSE - Copies a message from MESG to DEST, allocating DEST if necessary. - USAGE - void *H5O_sdspace_copy(mesg, dest) - const void *mesg; IN: Pointer to the source simple dimensionality struct - const void *dest; IN: Pointer to the destination simple dimensionality struct - RETURNS - Pointer to DEST on success, NULL on failure - DESCRIPTION - This function copies a native (memory) simple dimensionality message, - allocating the destination structure if necessary. ---------------------------------------------------------------------------*/ -static void * -H5O_sdspace_copy(const void *mesg, void *dest) -{ - const H5S_simple_t *src = (const H5S_simple_t *) mesg; - H5S_simple_t *dst = (H5S_simple_t *) dest; - void *ret_value; /* Return value */ - - FUNC_ENTER_NOAPI(H5O_sdspace_copy, NULL); - - /* check args */ - assert(src); - if (!dst && NULL==(dst = H5FL_MALLOC(H5S_simple_t))) - HGOTO_ERROR (H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed"); - - /* deep copy -- pointed-to values are copied also */ - HDmemcpy(dst, src, sizeof(H5S_simple_t)); - - if (src->size) { - if (NULL==(dst->size = H5FL_ARR_MALLOC(hsize_t,src->rank))) - HGOTO_ERROR (H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed"); - HDmemcpy (dst->size, src->size, src->rank*sizeof(src->size[0])); - } - if (src->max) { - if (NULL==(dst->max=H5FL_ARR_MALLOC(hsize_t,src->rank))) - HGOTO_ERROR (H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed"); - HDmemcpy (dst->max, src->max, src->rank*sizeof(src->max[0])); - } -#ifdef LATER - if (src->perm) { - if (NULL==(dst->perm=H5FL_ARR_MALLOC(hsize_t,src->rank))) - HGOTO_ERROR (H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed"); - HDmemcpy (dst->perm, src->perm, src->rank*sizeof(src->perm[0])); - } -#endif - - /* Set return value */ - ret_value=dst; - -done: - FUNC_LEAVE_NOAPI(ret_value); -} - - -/*-------------------------------------------------------------------------- - NAME - H5O_sdspace_new_size + H5O_sdspace_size PURPOSE Return the raw message size in bytes USAGE - void *H5O_sdspace_new_size(f, mesg) + void *H5O_sdspace_size(f, mesg) H5F_t *f; IN: pointer to the HDF5 file struct const void *mesg; IN: Pointer to the source extent dimensionality struct RETURNS @@ -561,58 +321,9 @@ done: MODIFICATIONS --------------------------------------------------------------------------*/ static size_t -H5O_sdspace_new_size(H5F_t *f, const void *mesg) -{ - const H5S_extent_t *space = (const H5S_extent_t *) mesg; - - /* - * All dimensionality messages are at least 8 bytes long. - */ - size_t ret_value = 8; - - FUNC_ENTER_NOAPI(H5O_sdspace_new_size, 0); - - /* add in the dimension sizes */ - ret_value += space->u.simple.rank * H5F_SIZEOF_SIZE (f); - - /* add in the space for the maximum dimensions, if they are present */ - ret_value += space->u.simple.max ? space->u.simple.rank * H5F_SIZEOF_SIZE (f) : 0; - -#ifdef LATER - /* add in the space for the dimension permutations, if they are present */ - ret_value += space->u.simple.perm ? space->u.simple.rank * 4 : 0; -#endif - -done: - FUNC_LEAVE_NOAPI(ret_value); -} - - -/*-------------------------------------------------------------------------- - NAME - H5O_sdspace_size - PURPOSE - Return the raw message size in bytes - USAGE - void *H5O_sdspace_copy(f, mesg) - H5F_t *f; IN: pointer to the HDF5 file struct - const void *mesg; IN: Pointer to the source simple dimensionality struct - RETURNS - Size of message on success, zero on failure - DESCRIPTION - This function returns the size of the raw simple dimensionality message on - success. (Not counting the message type or size fields, only the data - portion of the message). It doesn't take into account alignment. - - MODIFICATIONS - Robb Matzke, 1998-04-09 - The current and maximum dimensions are now H5F_SIZEOF_SIZET bytes - instead of just four bytes. ---------------------------------------------------------------------------*/ -static size_t H5O_sdspace_size(H5F_t *f, const void *mesg) { - const H5S_simple_t *space = (const H5S_simple_t *) mesg; + const H5S_extent_t *space = (const H5S_extent_t *) mesg; /* * All dimensionality messages are at least 8 bytes long. @@ -621,16 +332,18 @@ H5O_sdspace_size(H5F_t *f, const void *mesg) FUNC_ENTER_NOAPI(H5O_sdspace_size, 0); - /* add in the dimension sizes */ - ret_value += space->rank * H5F_SIZEOF_SIZE (f); + if(space->type != H5S_NULL) { + /* add in the dimension sizes */ + ret_value += space->u.simple.rank * H5F_SIZEOF_SIZE (f); - /* add in the space for the maximum dimensions, if they are present */ - ret_value += space->max ? space->rank * H5F_SIZEOF_SIZE (f) : 0; + /* add in the space for the maximum dimensions, if they are present */ + ret_value += space->u.simple.max ? space->u.simple.rank * H5F_SIZEOF_SIZE (f) : 0; #ifdef LATER - /* add in the space for the dimension permutations, if they are present */ - ret_value += space->perm ? space->rank * 4 : 0; + /* add in the space for the dimension permutations, if they are present */ + ret_value += space->u.simple.perm ? space->u.simple.rank * 4 : 0; #endif + } done: FUNC_LEAVE_NOAPI(ret_value); @@ -638,7 +351,7 @@ done: /*------------------------------------------------------------------------- - * Function: H5O_sdspace_new_reset + * Function: H5O_sdspace_reset * * Purpose: Frees the inside of a dataspace message and resets it to some * initial value. @@ -653,44 +366,14 @@ done: *------------------------------------------------------------------------- */ static herr_t -H5O_sdspace_new_reset(void *_mesg) -{ - H5S_extent_t *mesg = (H5S_extent_t*)_mesg; - herr_t ret_value=SUCCEED; /* Return value */ - - FUNC_ENTER_NOAPI(H5O_sdspace_new_reset, FAIL); - - H5S_release_extent(mesg); - -done: - FUNC_LEAVE_NOAPI(ret_value); -} - - -/*------------------------------------------------------------------------- - * Function: H5O_sdspace_reset - * - * Purpose: Frees the inside of a dataspace message and resets it to some - * initial value. - * - * Return: Non-negative on success/Negative on failure - * - * Programmer: Robb Matzke - * Thursday, April 30, 1998 - * - * Modifications: - * - *------------------------------------------------------------------------- - */ -static herr_t H5O_sdspace_reset(void *_mesg) { - H5S_simple_t *mesg = (H5S_simple_t*)_mesg; + H5S_extent_t *mesg = (H5S_extent_t*)_mesg; herr_t ret_value=SUCCEED; /* Return value */ FUNC_ENTER_NOAPI(H5O_sdspace_reset, FAIL); - H5S_release_simple(mesg); + H5S_release_extent(mesg); done: FUNC_LEAVE_NOAPI(ret_value); @@ -698,7 +381,7 @@ done: /*------------------------------------------------------------------------- - * Function: H5O_sdsdpace_new_free + * Function: H5O_sdsdpace_free * * Purpose: Free's the message * @@ -712,36 +395,6 @@ done: *------------------------------------------------------------------------- */ static herr_t -H5O_sdspace_new_free (void *mesg) -{ - herr_t ret_value=SUCCEED; /* Return value */ - - FUNC_ENTER_NOAPI(H5O_sdspace_new_free, FAIL); - - assert (mesg); - - H5FL_FREE(H5S_extent_t,mesg); - -done: - FUNC_LEAVE_NOAPI(ret_value); -} - - -/*------------------------------------------------------------------------- - * Function: H5O_sdsdpace_free - * - * Purpose: Free's the message - * - * Return: Non-negative on success/Negative on failure - * - * Programmer: Quincey Koziol - * Thursday, March 30, 2000 - * - * Modifications: - * - *------------------------------------------------------------------------- - */ -static herr_t H5O_sdspace_free (void *mesg) { herr_t ret_value=SUCCEED; /* Return value */ @@ -750,7 +403,7 @@ H5O_sdspace_free (void *mesg) assert (mesg); - H5FL_FREE(H5S_simple_t,mesg); + H5FL_FREE(H5S_extent_t,mesg); done: FUNC_LEAVE_NOAPI(ret_value); @@ -759,11 +412,11 @@ done: /*-------------------------------------------------------------------------- NAME - H5O_sdspace_new_debug + H5O_sdspace_debug PURPOSE Prints debugging information for an extent dimensionality message USAGE - void *H5O_sdspace_new_debug(f, mesg, stream, indent, fwidth) + void *H5O_sdspace_debug(f, mesg, stream, indent, fwidth) H5F_t *f; IN: pointer to the HDF5 file struct const void *mesg; IN: Pointer to the source extent dimensionality struct FILE *stream; IN: Pointer to the stream for output data @@ -776,14 +429,14 @@ done: parameter. --------------------------------------------------------------------------*/ static herr_t -H5O_sdspace_new_debug(H5F_t UNUSED *f, hid_t UNUSED dxpl_id, const void *mesg, +H5O_sdspace_debug(H5F_t UNUSED *f, hid_t UNUSED dxpl_id, const void *mesg, FILE * stream, int indent, int fwidth) { const H5S_extent_t *sdim = (const H5S_extent_t *) mesg; unsigned u; /* local counting variable */ herr_t ret_value=SUCCEED; /* Return value */ - FUNC_ENTER_NOAPI(H5O_sdspace_new_debug, FAIL); + FUNC_ENTER_NOAPI(H5O_sdspace_debug, FAIL); /* check args */ assert(f); @@ -831,79 +484,3 @@ H5O_sdspace_new_debug(H5F_t UNUSED *f, hid_t UNUSED dxpl_id, const void *mesg, done: FUNC_LEAVE_NOAPI(ret_value); } - - -/*-------------------------------------------------------------------------- - NAME - H5O_sdspace_debug - PURPOSE - Prints debugging information for a simple dimensionality message - USAGE - void *H5O_sdspace_debug(f, mesg, stream, indent, fwidth) - H5F_t *f; IN: pointer to the HDF5 file struct - const void *mesg; IN: Pointer to the source simple dimensionality struct - FILE *stream; IN: Pointer to the stream for output data - int indent; IN: Amount to indent information by - int fwidth; IN: Field width (?) - RETURNS - Non-negative on success/Negative on failure - DESCRIPTION - This function prints debugging output to the stream passed as a - parameter. ---------------------------------------------------------------------------*/ -static herr_t -H5O_sdspace_debug(H5F_t UNUSED *f, hid_t UNUSED dxpl_id, const void *mesg, - FILE * stream, int indent, int fwidth) -{ - const H5S_simple_t *sdim = (const H5S_simple_t *) mesg; - unsigned u; /* local counting variable */ - herr_t ret_value=SUCCEED; /* Return value */ - - FUNC_ENTER_NOAPI(H5O_sdspace_debug, FAIL); - - /* check args */ - assert(f); - assert(sdim); - assert(stream); - assert(indent >= 0); - assert(fwidth >= 0); - - HDfprintf(stream, "%*s%-*s %lu\n", indent, "", fwidth, - "Rank:", - (unsigned long) (sdim->rank)); - - if(sdim->rank>0) { - HDfprintf(stream, "%*s%-*s {", indent, "", fwidth, "Dim Size:"); - for (u = 0; u < sdim->rank; u++) - HDfprintf (stream, "%s%Hu", u?", ":"", sdim->size[u]); - HDfprintf (stream, "}\n"); - - HDfprintf(stream, "%*s%-*s ", indent, "", fwidth, "Dim Max:"); - if (sdim->max) { - HDfprintf (stream, "{"); - for (u = 0; u < sdim->rank; u++) { - if (H5S_UNLIMITED==sdim->max[u]) { - HDfprintf (stream, "%sINF", u?", ":""); - } else { - HDfprintf (stream, "%s%Hu", u?", ":"", sdim->max[u]); - } - } - HDfprintf (stream, "}\n"); - } else { - HDfprintf (stream, "CONSTANT\n"); - } - -#ifdef LATER - if (sdim->perm) { - HDfprintf(stream, "%*s%-*s {", indent, "", fwidth, "Dim Perm:"); - for (u = 0; u < sdim->rank; u++) { - HDfprintf (stream, "%s%lu", u?", ":"", - (unsigned long) (sdim->perm[u])); - } - } -#endif - } /* end if */ - -done: - FUNC_LEAVE_NOAPI(ret_value); -} @@ -1138,7 +1138,7 @@ H5S_modify(H5G_entry_t *ent, const H5S_t *ds, hbool_t update_time, hid_t dxpl_id case H5S_NULL: case H5S_SCALAR: case H5S_SIMPLE: - if (H5O_modify(ent, H5O_SDSPACE_NEW_ID, 0, 0, update_time, &(ds->extent), dxpl_id)<0) + if (H5O_modify(ent, H5O_SDSPACE_ID, 0, 0, update_time, &(ds->extent), dxpl_id)<0) HGOTO_ERROR(H5E_DATASPACE, H5E_CANTINIT, FAIL, "can't update simple data space message"); break; @@ -1185,7 +1185,7 @@ H5S_append(H5F_t *f, hid_t dxpl_id, struct H5O_t *oh, const H5S_t *ds) case H5S_NULL: case H5S_SCALAR: case H5S_SIMPLE: - if (H5O_append(f, dxpl_id, oh, H5O_SDSPACE_NEW_ID, 0, &(ds->extent))<0) + if (H5O_append(f, dxpl_id, oh, H5O_SDSPACE_ID, 0, &(ds->extent))<0) HGOTO_ERROR(H5E_DATASPACE, H5E_CANTINIT, FAIL, "can't update simple data space message"); break; @@ -1234,7 +1234,36 @@ H5S_read(H5G_entry_t *ent, hid_t dxpl_id) if (NULL==(ds = H5FL_CALLOC(H5S_t))) HGOTO_ERROR (H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed"); - if (H5O_read(ent, H5O_SDSPACE_NEW_ID, 0, &(ds->extent), dxpl_id) != NULL) { /* New data space header message */ + if (H5O_read(ent, H5O_SDSPACE_ID, 0, &(ds->extent), dxpl_id) == NULL) + HGOTO_ERROR(H5E_DATASPACE, H5E_CANTINIT, NULL, "unable to load dataspace info from dataset header"); + + if (ds->extent.type == H5S_NO_CLASS) { /* For backward compatibility, if file is created by version 1.6 or before. */ + if(ds->extent.u.simple.rank != 0) { + hsize_t nelem; /* Number of elements in extent */ + unsigned u; /* Local index variable */ + + ds->extent.type = H5S_SIMPLE; + + /* Compute the number of elements in the extent */ + for(u=0, nelem=1; u<ds->extent.u.simple.rank; u++) + nelem*=ds->extent.u.simple.size[u]; + ds->extent.nelem = nelem; + } else { + ds->extent.type = H5S_SCALAR; + ds->extent.nelem = 1; + } /* end if */ + + /* Default to entire dataspace being selected */ + if(H5S_select_all(ds,0)<0) + HGOTO_ERROR (H5E_DATASPACE, H5E_CANTSET, NULL, "unable to set all selection"); + + /* Allocate space for the offset and set it to zeros */ + if(ds->extent.u.simple.rank>0) { + if (NULL==(ds->select.offset = H5FL_ARR_CALLOC(hssize_t,ds->extent.u.simple.rank))) + HGOTO_ERROR (H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed"); + } else + ds->select.offset = NULL; + } else { /* If file is new, created by version 1.7 or after */ switch(ds->extent.type) { case H5S_NULL: ds->extent.nelem = 0; @@ -1273,36 +1302,7 @@ H5S_read(H5G_entry_t *ent, hid_t dxpl_id) default: HGOTO_ERROR (H5E_DATASPACE, H5E_CANTSET, NULL, "unknown data space type"); } - } else { /* For backward compatibility, if file is created by version 1.6 or before. */ - if (H5O_read(ent, H5O_SDSPACE_ID, 0, &(ds->extent.u.simple), dxpl_id) == NULL) - HGOTO_ERROR(H5E_DATASPACE, H5E_CANTINIT, NULL, "unable to load dataspace info from dataset header"); - - if(ds->extent.u.simple.rank != 0) { - hsize_t nelem; /* Number of elements in extent */ - unsigned u; /* Local index variable */ - - ds->extent.type = H5S_SIMPLE; - - /* Compute the number of elements in the extent */ - for(u=0, nelem=1; u<ds->extent.u.simple.rank; u++) - nelem*=ds->extent.u.simple.size[u]; - ds->extent.nelem = nelem; - } else { - ds->extent.type = H5S_SCALAR; - ds->extent.nelem = 1; - } /* end if */ - - /* Default to entire dataspace being selected */ - if(H5S_select_all(ds,0)<0) - HGOTO_ERROR (H5E_DATASPACE, H5E_CANTSET, NULL, "unable to set all selection"); - - /* Allocate space for the offset and set it to zeros */ - if(ds->extent.u.simple.rank>0) { - if (NULL==(ds->select.offset = H5FL_ARR_CALLOC(hssize_t,ds->extent.u.simple.rank))) - HGOTO_ERROR (H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed"); - } else - ds->select.offset = NULL; - } /* end if */ + } /* Set the value for successful return */ ret_value=ds; @@ -2165,9 +2165,7 @@ H5S_debug(H5F_t *f, hid_t dxpl_id, const void *_mesg, FILE *stream, int indent, case H5S_SIMPLE: fprintf(stream, "%*s%-*s H5S_SIMPLE\n", indent, "", fwidth, "Space class:"); - /*H5O_debug_id(H5O_SDSPACE_ID, f, dxpl_id, &(mesg->extent.u.simple), stream, - indent+3, MAX(0, fwidth-3));*/ - H5O_debug_id(H5O_SDSPACE_NEW_ID, f, dxpl_id, &(mesg->extent), stream, + H5O_debug_id(H5O_SDSPACE_ID, f, dxpl_id, &(mesg->extent), stream, indent+3, MAX(0, fwidth-3)); break; |