summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/H5A.c4
-rw-r--r--src/H5O.c4
-rw-r--r--src/H5Oattr.c83
-rw-r--r--src/H5Opkg.h7
-rw-r--r--src/H5Oprivate.h4
-rw-r--r--src/H5Osdspace.c519
-rw-r--r--src/H5S.c70
7 files changed, 143 insertions, 548 deletions
diff --git a/src/H5A.c b/src/H5A.c
index dc2f29d..0ad4992 100644
--- a/src/H5A.c
+++ b/src/H5A.c
@@ -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")
diff --git a/src/H5O.c b/src/H5O.c
index 63b0719..956815c 100644
--- a/src/H5O.c
+++ b/src/H5O.c
@@ -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);
-}
diff --git a/src/H5S.c b/src/H5S.c
index d2feb43..90cd6ef 100644
--- a/src/H5S.c
+++ b/src/H5S.c
@@ -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;