diff options
author | Quincey Koziol <koziol@hdfgroup.org> | 1998-11-13 00:28:29 (GMT) |
---|---|---|
committer | Quincey Koziol <koziol@hdfgroup.org> | 1998-11-13 00:28:29 (GMT) |
commit | 8f810273bb66f682f5c01d5694d5fde24dcf6200 (patch) | |
tree | 0e4c8c5df32e4c6c530b8e5633543d12d5416c09 /src/H5Spoint.c | |
parent | e7f7a9ff2f911cba4902496ec156664589414998 (diff) | |
download | hdf5-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.c | 114 |
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() */ |