summaryrefslogtreecommitdiffstats
path: root/src/H5Osdspace.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/H5Osdspace.c')
-rw-r--r--src/H5Osdspace.c439
1 files changed, 437 insertions, 2 deletions
diff --git a/src/H5Osdspace.c b/src/H5Osdspace.c
index cc24e19..e293d94 100644
--- a/src/H5Osdspace.c
+++ b/src/H5Osdspace.c
@@ -25,7 +25,17 @@
#define PABLO_MASK H5O_sdspace_mask
-/* PRIVATE PROTOTYPES */
+/* 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 */
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);
@@ -35,7 +45,7 @@ static herr_t H5O_sdspace_free (void *_mesg);
static herr_t H5O_sdspace_debug(H5F_t *f, hid_t dxpl_id, const void *_mesg,
FILE * stream, int indent, int fwidth);
-/* This message derives from H5O */
+/* 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 */
@@ -53,7 +63,28 @@ 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 */
+#define H5O_SDSPACE_VERSION_2 2
/* Is the interface initialized? */
static int interface_initialize_g = 0;
@@ -62,12 +93,103 @@ static int interface_initialize_g = 0;
/* 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);
+
/* Declare external the free list for hsize_t arrays */
H5FL_ARR_EXTERN(hsize_t);
/*--------------------------------------------------------------------------
NAME
+ H5O_sdspace_new_decode
+ PURPOSE
+ Decode a extent 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 an extent 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
+--------------------------------------------------------------------------*/
+static void *
+H5O_sdspace_new_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);
+
+ /* check args */
+ assert(f);
+ assert(p);
+ assert (!sh);
+
+ /* decode */
+ if ((sdim = H5FL_CALLOC(H5S_extent_t)) != NULL) {
+ version = *p++;
+ if (version!=H5O_SDSPACE_VERSION && version!=H5O_SDSPACE_VERSION_2)
+ HGOTO_ERROR(H5E_OHDR, H5E_CANTINIT, NULL, "wrong version number in data space message");
+ if(version==H5O_SDSPACE_VERSION_2)
+ sdim->type = *p++;
+ 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");
+ flags = *p++;
+
+ if(version==H5O_SDSPACE_VERSION) {
+ p += 5; /*reserved*/
+ } else if(version==H5O_SDSPACE_VERSION_2) {
+ p += 4; /*reserved*/
+ }
+
+ if (sdim->u.simple.rank > 0) {
+ if (NULL==(sdim->u.simple.size=H5FL_ARR_MALLOC(hsize_t,sdim->u.simple.rank)))
+ HGOTO_ERROR (H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed");
+ for (i = 0; i < sdim->u.simple.rank; i++)
+ H5F_DECODE_LENGTH (f, p, sdim->u.simple.size[i]);
+ if (flags & H5S_VALID_MAX) {
+ if (NULL==(sdim->u.simple.max=H5FL_ARR_MALLOC(hsize_t,sdim->u.simple.rank)))
+ HGOTO_ERROR (H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed");
+ for (i = 0; i < sdim->u.simple.rank; i++)
+ H5F_DECODE_LENGTH (f, p, sdim->u.simple.max[i]);
+ }
+#ifdef LATER
+ if (flags & H5S_VALID_PERM) {
+ if (NULL==(sdim->u.simple.perm=H5FL_ARR_MALLOC(hsize_t,sdim->u.simple.rank)))
+ HGOTO_ERROR (H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed");
+ for (i = 0; i < sdim->u.simple.rank; i++)
+ H5F_DECODE_LENGTH (f, p, sdim->u.simple.perm[i]);
+ }
+#endif /* LATER */
+ }
+ }
+
+ /* Set return value */
+ ret_value = (void*)sdim; /*success*/
+
+done:
+ if (!ret_value && sdim) {
+ H5S_release_extent(sdim);
+ H5FL_FREE(H5S_extent_t,sdim);
+ } /* end if */
+
+ FUNC_LEAVE_NOAPI(ret_value);
+}
+
+
+/*--------------------------------------------------------------------------
+ NAME
H5O_sdspace_decode
PURPOSE
Decode a simple dimensionality message and return a pointer to a memory
@@ -155,6 +277,79 @@ done:
/*--------------------------------------------------------------------------
NAME
+ H5O_sdspace_new_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 extent 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
+
+--------------------------------------------------------------------------*/
+static herr_t
+H5O_sdspace_new_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);
+
+ /* check args */
+ assert(f);
+ assert(p);
+ assert(sdim);
+
+ /* set flags */
+ if (sdim->u.simple.max)
+ flags |= H5S_VALID_MAX;
+#ifdef LATER
+ if (sdim->u.simple.perm)
+ flags |= H5S_VALID_PERM;
+#endif
+
+ /* encode */
+ *p++ = H5O_SDSPACE_VERSION_2;
+ *p++ = sdim->type;
+ *p++ = sdim->u.simple.rank;
+ *p++ = flags;
+ *p++ = 0; /*reserved*/
+ *p++ = 0; /*reserved*/
+ *p++ = 0; /*reserved*/
+ *p++ = 0; /*reserved*/
+
+ if (sdim->u.simple.rank > 0) {
+ for (u = 0; u < sdim->u.simple.rank; u++)
+ H5F_ENCODE_LENGTH (f, p, sdim->u.simple.size[u]);
+ if (flags & H5S_VALID_MAX) {
+ for (u = 0; u < sdim->u.simple.rank; u++)
+ H5F_ENCODE_LENGTH (f, p, sdim->u.simple.max[u]);
+ }
+#ifdef LATER
+ if (flags & H5S_VALID_PERM) {
+ for (u = 0; u < sdim->u.simple.rank; u++)
+ H5F_ENCODE_LENGTH (f, p, sdim->u.simple.perm[u]);
+ }
+#endif
+ }
+
+done:
+ FUNC_LEAVE_NOAPI(ret_value);
+}
+
+
+/*--------------------------------------------------------------------------
+ NAME
H5O_sdspace_encode
PURPOSE
Encode a simple dimensionality message
@@ -233,6 +428,64 @@ done:
/*--------------------------------------------------------------------------
NAME
+ H5O_sdspace_new_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 extent dimensionality struct
+ const void *dest; IN: Pointer to the destination extent dimensionality struct
+ RETURNS
+ Pointer to DEST on success, NULL on failure
+ DESCRIPTION
+ This function copies a native (memory) extent dimensionality message,
+ allocating the destination structure if necessary.
+--------------------------------------------------------------------------*/
+static void *
+H5O_sdspace_new_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);
+
+ /* check args */
+ assert(src);
+ if (!dst && NULL==(dst = H5FL_MALLOC(H5S_extent_t)))
+ HGOTO_ERROR (H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed");
+
+ /* deep copy -- pointed-to values are copied also */
+ HDmemcpy(dst, src, sizeof(H5S_extent_t));
+
+ if (src->u.simple.size) {
+ if (NULL==(dst->u.simple.size = H5FL_ARR_MALLOC(hsize_t,src->u.simple.rank)))
+ HGOTO_ERROR (H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed");
+ HDmemcpy (dst->u.simple.size, src->u.simple.size, src->u.simple.rank*sizeof(src->u.simple.size[0]));
+ }
+ if (src->u.simple.max) {
+ if (NULL==(dst->u.simple.max=H5FL_ARR_MALLOC(hsize_t,src->u.simple.rank)))
+ HGOTO_ERROR (H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed");
+ HDmemcpy (dst->u.simple.max, src->u.simple.max, src->u.simple.rank*sizeof(src->u.simple.max[0]));
+ }
+#ifdef LATER
+ if (src->u.simple.perm) {
+ if (NULL==(dst->u.simple.perm=H5FL_ARR_MALLOC(hsize_t,src->u.simple.rank)))
+ HGOTO_ERROR (H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed");
+ HDmemcpy (dst->u.simple.perm, src->u.simple.perm, src->u.simple.rank*sizeof(src->u.simple.perm[0]));
+ }
+#endif
+
+ /* Set return value */
+ ret_value=dst;
+
+done:
+ FUNC_LEAVE_NOAPI(ret_value);
+}
+
+
+/*--------------------------------------------------------------------------
+ NAME
H5O_sdspace_copy
PURPOSE
Copies a message from MESG to DEST, allocating DEST if necessary.
@@ -291,6 +544,52 @@ done:
/*--------------------------------------------------------------------------
NAME
+ H5O_sdspace_new_size
+ PURPOSE
+ Return the raw message size in bytes
+ USAGE
+ void *H5O_sdspace_new_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
+ Size of message on success, zero on failure
+ DESCRIPTION
+ This function returns the size of the raw extent 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
+--------------------------------------------------------------------------*/
+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
@@ -339,6 +638,36 @@ done:
/*-------------------------------------------------------------------------
+ * Function: H5O_sdspace_new_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: Raymond Lu
+ * Wednesday, March 31, 2004
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+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
@@ -369,6 +698,36 @@ done:
/*-------------------------------------------------------------------------
+ * Function: H5O_sdsdpace_new_free
+ *
+ * Purpose: Free's the message
+ *
+ * Return: Non-negative on success/Negative on failure
+ *
+ * Programmer: Raymond Lu
+ * Wednesday, March 31, 2004
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+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
@@ -400,6 +759,82 @@ done:
/*--------------------------------------------------------------------------
NAME
+ H5O_sdspace_new_debug
+ PURPOSE
+ Prints debugging information for an extent dimensionality message
+ USAGE
+ void *H5O_sdspace_new_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
+ 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_new_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);
+
+ /* 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->u.simple.rank));
+
+ if(sdim->u.simple.rank>0) {
+ HDfprintf(stream, "%*s%-*s {", indent, "", fwidth, "Dim Size:");
+ for (u = 0; u < sdim->u.simple.rank; u++)
+ HDfprintf (stream, "%s%Hu", u?", ":"", sdim->u.simple.size[u]);
+ HDfprintf (stream, "}\n");
+
+ HDfprintf(stream, "%*s%-*s ", indent, "", fwidth, "Dim Max:");
+ if (sdim->u.simple.max) {
+ HDfprintf (stream, "{");
+ for (u = 0; u < sdim->u.simple.rank; u++) {
+ if (H5S_UNLIMITED==sdim->u.simple.max[u]) {
+ HDfprintf (stream, "%sINF", u?", ":"");
+ } else {
+ HDfprintf (stream, "%s%Hu", u?", ":"", sdim->u.simple.max[u]);
+ }
+ }
+ HDfprintf (stream, "}\n");
+ } else {
+ HDfprintf (stream, "CONSTANT\n");
+ }
+
+#ifdef LATER
+ if (sdim->u.simple.perm) {
+ HDfprintf(stream, "%*s%-*s {", indent, "", fwidth, "Dim Perm:");
+ for (u = 0; u < sdim->u.simple.rank; u++) {
+ HDfprintf (stream, "%s%lu", u?", ":"",
+ (unsigned long) (sdim->u.simple.perm[u]));
+ }
+ }
+#endif
+ } /* end if */
+
+done:
+ FUNC_LEAVE_NOAPI(ret_value);
+}
+
+
+/*--------------------------------------------------------------------------
+ NAME
H5O_sdspace_debug
PURPOSE
Prints debugging information for a simple dimensionality message