summaryrefslogtreecommitdiffstats
path: root/src/H5Spoint.c
diff options
context:
space:
mode:
authorQuincey Koziol <koziol@hdfgroup.org>1998-11-13 00:28:29 (GMT)
committerQuincey Koziol <koziol@hdfgroup.org>1998-11-13 00:28:29 (GMT)
commit8f810273bb66f682f5c01d5694d5fde24dcf6200 (patch)
tree0e4c8c5df32e4c6c530b8e5633543d12d5416c09 /src/H5Spoint.c
parente7f7a9ff2f911cba4902496ec156664589414998 (diff)
downloadhdf5-8f810273bb66f682f5c01d5694d5fde24dcf6200.zip
hdf5-8f810273bb66f682f5c01d5694d5fde24dcf6200.tar.gz
hdf5-8f810273bb66f682f5c01d5694d5fde24dcf6200.tar.bz2
[svn-r904] Fixed bug in H5dont_atexit.
Plugged a memory leak in the union of hyperslabs code. Checkpointing dataset region references, which are working, but not stored in file yet.
Diffstat (limited to 'src/H5Spoint.c')
-rw-r--r--src/H5Spoint.c114
1 files changed, 114 insertions, 0 deletions
diff --git a/src/H5Spoint.c b/src/H5Spoint.c
index d0c966a..66f6b8b 100644
--- a/src/H5Spoint.c
+++ b/src/H5Spoint.c
@@ -831,4 +831,118 @@ H5S_point_select_valid (const H5S_t *space)
FUNC_LEAVE (ret_value);
} /* end H5S_point_select_valid() */
+
+/*--------------------------------------------------------------------------
+ NAME
+ H5S_point_select_serial_size
+ PURPOSE
+ Determine the number of bytes needed to store the serialized point selection
+ information.
+ USAGE
+ hssize_t H5S_point_select_serial_size(space)
+ H5S_t *space; IN: Dataspace pointer to query
+ RETURNS
+ The number of bytes required on success, negative on an error.
+ DESCRIPTION
+ Determines the number of bytes required to serialize the current point
+ selection information for storage on disk.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+hssize_t
+H5S_point_select_serial_size (const H5S_t *space)
+{
+ H5S_pnt_node_t *curr; /* Point information nodes */
+ hssize_t ret_value=FAIL; /* return value */
+
+ FUNC_ENTER (H5S_point_select_serial_size, FAIL);
+ assert(space);
+
+ /* Basic number of bytes required to serialize point selection:
+ * <type (4 bytes)> + <version (4 bytes)> + <padding (4 bytes)> +
+ * <length (4 bytes)> + <rank (4 bytes)> + <# of points (4 bytes)> = 24 bytes
+ */
+ ret_value=24;
+
+ /* Count points in selection */
+ curr=space->select.sel_info.pnt_lst->head;
+ while(curr!=NULL) {
+ /* Add 4 bytes times the rank for each element selected */
+ ret_value+=4*space->extent.u.simple.rank;
+ curr=curr->next;
+ } /* end while */
+
+ FUNC_LEAVE (ret_value);
+} /* end H5S_point_select_serial_size() */
+
+/*--------------------------------------------------------------------------
+ NAME
+ H5S_point_select_serialize
+ PURPOSE
+ Serialize the current selection into a user-provided buffer.
+ USAGE
+ herr_t H5S_point_select_serialize(space, buf)
+ H5S_t *space; IN: Dataspace pointer of selection to serialize
+ uint8 *buf; OUT: Buffer to put serialized selection into
+ RETURNS
+ Non-negative on success/Negative on failure
+ DESCRIPTION
+ Serializes the current element selection into a buffer. (Primarily for
+ storing on disk).
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+herr_t
+H5S_point_select_serialize (const H5S_t *space, uint8 *buf)
+{
+ H5S_pnt_node_t *curr; /* Point information nodes */
+ uint8 *lenp; /* pointer to length location for later storage */
+ uint32 len=0; /* number of bytes used */
+ intn i; /* local counting variable */
+ herr_t ret_value=FAIL; /* return value */
+
+ FUNC_ENTER (H5S_point_select_serialize, FAIL);
+
+ assert(space);
+
+ /* Store the preamble information */
+ UINT32ENCODE(buf, (uint32)space->select.type); /* Store the type of selection */
+ UINT32ENCODE(buf, (uint32)1); /* Store the version number */
+ UINT32ENCODE(buf, (uint32)0); /* Store the un-used padding */
+ lenp=buf; /* keep the pointer to the length location for later */
+ buf+=4; /* skip over space for length */
+
+ /* Encode number of dimensions */
+ UINT32ENCODE(buf, (uint32)space->extent.u.simple.rank);
+ len+=4;
+
+ /* Encode number of elements */
+ UINT32ENCODE(buf, (uint32)space->select.num_elem);
+ len+=4;
+
+ /* Encode each point in selection */
+ curr=space->select.sel_info.pnt_lst->head;
+ while(curr!=NULL) {
+ /* Add 4 bytes times the rank for each element selected */
+ len+=4*space->extent.u.simple.rank;
+
+ /* Encode each point */
+ for(i=0; i<space->extent.u.simple.rank; i++)
+ UINT32ENCODE(buf, (uint32)curr->pnt[i]);
+
+ curr=curr->next;
+ } /* end while */
+
+ /* Encode length */
+ UINT32ENCODE(lenp, (uint32)len); /* Store the length of the extra information */
+
+ /* Set success */
+ ret_value=SUCCEED;
+
+ FUNC_LEAVE (ret_value);
+} /* H5S_point_select_serialize() */