diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/H5FLprivate.h | 2 | ||||
-rw-r--r-- | src/H5MPprivate.h | 2 | ||||
-rw-r--r-- | src/H5O.c | 54 | ||||
-rw-r--r-- | src/H5Oprivate.h | 2 | ||||
-rw-r--r-- | src/H5Osdspace.c | 6 | ||||
-rw-r--r-- | src/H5S.c | 233 | ||||
-rw-r--r-- | src/H5Sprivate.h | 2 | ||||
-rw-r--r-- | src/H5Spublic.h | 2 | ||||
-rw-r--r-- | src/H5T.c | 19 |
9 files changed, 298 insertions, 24 deletions
diff --git a/src/H5FLprivate.h b/src/H5FLprivate.h index c1fbfae..0bac0cf 100644 --- a/src/H5FLprivate.h +++ b/src/H5FLprivate.h @@ -35,7 +35,7 @@ /* Private headers needed by this file */ /* Macros for turning off free lists in the library */ -/* #define H5_NO_FREE_LISTS */ +#define H5_NO_FREE_LISTS #ifdef H5_NO_FREE_LISTS #define H5_NO_REG_FREE_LISTS #define H5_NO_ARR_FREE_LISTS diff --git a/src/H5MPprivate.h b/src/H5MPprivate.h index 771c836..a47a6fe 100644 --- a/src/H5MPprivate.h +++ b/src/H5MPprivate.h @@ -389,6 +389,8 @@ #define color_H5Sset_extent_simple "red" #define color_H5Scopy "red" #define color_H5Sclose "red" +#define color_H5Sencode "red" +#define color_H5Sdecode "red" #define color_H5Sget_simple_extent_npoints "red" #define color_H5Sget_simple_extent_ndims "red" #define color_H5Sget_simple_extent_dims "red" @@ -3444,10 +3444,11 @@ done: *------------------------------------------------------------------------- */ herr_t -H5O_encode(unsigned char *buf, void *obj, size_t *nalloc, unsigned type_id) +H5O_encode(unsigned char *buf, void *obj, hid_t type_id) { const H5O_class_t *type; /* Actual H5O class type for the ID */ - size_t size; /* size of the message*/ + size_t extent_size; /* size of the message*/ + H5F_t f; /* fake file structure*/ herr_t ret_value = SUCCEED; /* Return value */ FUNC_ENTER_NOAPI(H5O_encode,FAIL); @@ -3457,19 +3458,23 @@ H5O_encode(unsigned char *buf, void *obj, size_t *nalloc, unsigned type_id) type=message_type_g[type_id]; /* map the type ID to the actual type object */ assert(type); - /* check buffer size */ - if ((size=(type->raw_size)(NULL, obj))<=0) + if(type_id == H5O_SDSPACE_ID) { + /* Fake file structure, needed for space encoding and decoding. */ + f.shared = (H5F_file_t*)H5MM_calloc(sizeof(H5F_file_t)); + f.shared->sizeof_size = H5F_CRT_OBJ_BYTE_NUM_DEF; + + /* Encode this "size of size" */ + *buf = H5F_CRT_OBJ_BYTE_NUM_DEF; + buf++; + } + + /* Encode */ + if ((type->encode)(&f, buf, obj)<0) HGOTO_ERROR (H5E_OHDR, H5E_CANTENCODE, FAIL, "unable to encode message"); - /* Don't encode if buffer size isn't big enough */ - if(!buf || *nalloc<size) - *nalloc = size; - else { - /* Encode */ - if ((type->encode)(NULL, buf, obj)<0) - HGOTO_ERROR (H5E_OHDR, H5E_CANTENCODE, FAIL, "unable to encode message"); - } /* end else */ - + if(type_id == H5O_SDSPACE_ID) + H5MM_free(f.shared); + done: FUNC_LEAVE_NOAPI(ret_value); } @@ -3481,9 +3486,9 @@ done: * Purpose: Decode a binary object(data type and data space only) * description and return a new object handle. * - * Return: Success: Object ID(non-negative) + * Return: Success: Pointer to object(data type or space) * - * Failure: Negative + * Failure: NULL * * Programmer: Raymond Lu * slu@ncsa.uiuc.edu @@ -3497,7 +3502,8 @@ void* H5O_decode(unsigned char *buf, unsigned type_id) { const H5O_class_t *type; /* Actual H5O class type for the ID */ - void *ret_value; /* Return value */ + H5F_t f; /* fake file structure*/ + void *ret_value=NULL; /* Return value */ FUNC_ENTER_NOAPI(H5O_decode,NULL); @@ -3506,8 +3512,22 @@ H5O_decode(unsigned char *buf, unsigned type_id) type=message_type_g[type_id]; /* map the type ID to the actual type object */ assert(type); + if(type_id == H5O_SDSPACE_ID) { + /* Fake file structure, needed for space encoding and decoding. */ + f.shared = (H5F_file_t*)H5MM_calloc(sizeof(H5F_file_t)); + + /* Decode the "size of size", needed for space encoding and decoding */ + f.shared->sizeof_size = *buf; + buf++; + } + /* decode */ - ret_value = (type->decode)(NULL, 0, buf, NULL); + if((ret_value = (type->decode)(&f, 0, buf, NULL))==NULL) + HGOTO_ERROR (H5E_OHDR, H5E_CANTDECODE, NULL, "unable to decode message"); + + if(type_id == H5O_SDSPACE_ID) { + H5MM_free(f.shared); + } done: FUNC_LEAVE_NOAPI(ret_value); diff --git a/src/H5Oprivate.h b/src/H5Oprivate.h index a18820a..4eb3a3c 100644 --- a/src/H5Oprivate.h +++ b/src/H5Oprivate.h @@ -249,7 +249,7 @@ H5_DLL herr_t H5O_remove(H5G_entry_t *ent, unsigned type_id, int sequence, hid_t dxpl_id); H5_DLL herr_t H5O_reset(unsigned type_id, void *native); H5_DLL void *H5O_free(unsigned type_id, void *mesg); -H5_DLL herr_t H5O_encode(unsigned char *buf, void *obj, size_t *nalloc, unsigned type_id); +H5_DLL herr_t H5O_encode(unsigned char *buf, void *obj, hid_t type_id); H5_DLL void* H5O_decode(unsigned char *buf, unsigned type_id); H5_DLL void *H5O_copy(unsigned type_id, const void *mesg, void *dst); H5_DLL size_t H5O_raw_size(unsigned type_id, H5F_t *f, const void *mesg); diff --git a/src/H5Osdspace.c b/src/H5Osdspace.c index 7c4bb80..8fff4b0 100644 --- a/src/H5Osdspace.c +++ b/src/H5Osdspace.c @@ -108,7 +108,7 @@ H5O_sdspace_decode(H5F_t *f, hid_t UNUSED dxpl_id, const uint8_t *p, H5O_shared_ FUNC_ENTER_NOAPI_NOINIT(H5O_sdspace_decode); /* check args */ - assert(f); + /*assert(f);*/ assert(p); assert (!sh); @@ -210,7 +210,7 @@ done: --------------------------------------------------------------------------*/ static herr_t -H5O_sdspace_encode(H5F_t UNUSED *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 */ @@ -219,7 +219,7 @@ H5O_sdspace_encode(H5F_t UNUSED *f, uint8_t *p, const void *mesg) FUNC_ENTER_NOAPI_NOINIT_NOFUNC(H5O_sdspace_encode); /* check args */ - /*assert(f);*/ + assert(f); assert(p); assert(sdim); @@ -13,6 +13,7 @@ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ #define H5S_PACKAGE /*suppress error about including H5Spkg */ +#define H5F_PACKAGE /*suppress error about including H5Fpkg */ /* Interface initialization */ #define H5_INTERFACE_INIT_FUNC H5S_init_interface @@ -26,6 +27,7 @@ #include "H5Eprivate.h" /* Error handling */ #include "H5Iprivate.h" /* ID Functions */ #include "H5FLprivate.h" /* Free Lists */ +#include "H5Fpkg.h" /* Dataspace functions */ #include "H5MMprivate.h" /* Memory Management functions */ #include "H5Oprivate.h" /* object headers */ #include "H5Spkg.h" /* Dataspace functions */ @@ -1743,6 +1745,237 @@ done: /*------------------------------------------------------------------------- + * Function: H5Sencode + * + * Purpose: Given a dataspace ID, converts the object description + * (including selection) into binary in a buffer. + * + * Return: Success: non-negative + * + * Failure: negative + * + * Programmer: Raymond Lu + * slu@ncsa.uiuc.edu + * July 14, 2004 + * + * Modifications: + * + *------------------------------------------------------------------------- + */ +herr_t +H5Sencode(hid_t obj_id, unsigned char* buf, size_t* nalloc) +{ + H5S_t *dspace; + herr_t ret_value; + + FUNC_ENTER_API (H5Sencode, FAIL); + + /* Check argument and retrieve object */ + if (NULL==(dspace=H5I_object_verify(obj_id, H5I_DATASPACE))) + HGOTO_ERROR (H5E_ARGS, H5E_BADTYPE, FAIL, "not a dataspace") + + ret_value = H5S_encode(dspace, buf, nalloc); + +done: + FUNC_LEAVE_API(ret_value); +} + + +/*------------------------------------------------------------------------- + * Function: H5S_encode + * + * Purpose: Private function for H5Sencode. Converts an object + * description for data space and its selection into binary + * in a buffer. + * + * Return: Success: non-negative + * + * Failure: negative + * + * Programmer: Raymond Lu + * slu@ncsa.uiuc.edu + * July 14, 2004 + * + * Modifications: + * + *------------------------------------------------------------------------- + */ +herr_t +H5S_encode(H5S_t *obj, unsigned char *buf, size_t *nalloc) +{ + size_t extent_size = 0; + hssize_t select_size = 0; + H5S_class_t space_type; + uint8_t *size_buf; + uint8_t *extent_buf; + uint8_t *select_buf; + H5F_t f; /* fake file structure*/ + herr_t ret_value = SUCCEED; + + FUNC_ENTER_NOAPI(H5S_encode, FAIL); + + /* Fake file structure, used only for header message operation */ + f.shared = (H5F_file_t*)H5MM_calloc(sizeof(H5F_file_t)); + f.shared->sizeof_size = H5F_CRT_OBJ_BYTE_NUM_DEF; + + /* Find out the size of buffer needed for extent */ + if((extent_size=H5O_raw_size(H5O_SDSPACE_ID, &f, obj))==0) + HGOTO_ERROR(H5E_DATASPACE, H5E_BADSIZE, FAIL, "can't find dataspace size"); + + H5MM_free(f.shared); + + /* Make it 1 byte bigger to encode the f.shared->sizeof_size(8 bytes). The + * actual encoding happens in the level below(H5O_encode). */ + extent_size++; + + /* Get space type */ + space_type = H5S_GET_EXTENT_TYPE(obj); + + if((H5S_SIMPLE==space_type) && (select_size=H5S_SELECT_SERIAL_SIZE(obj))<0) + HGOTO_ERROR(H5E_DATASPACE, H5E_BADSIZE, FAIL, "can't find dataspace selection size"); + + /* Verify the size of buffer. If it's not big enough, simply return the + * right size without filling the buffer. */ + if(!buf || *nalloc<(extent_size+select_size+2)) { + *nalloc = extent_size+select_size+2; + HGOTO_DONE(ret_value); + } + + /* Encode size of extent information. Pointer is actually moved in this macro. */ + size_buf = buf; + UINT16ENCODE(size_buf, (uint8_t)extent_size); + + /* Encode the extent part of dataspace */ + extent_buf = buf + 2; /* This 2 bytes come from UINT16ENCODE above */ + if(H5O_encode(extent_buf, obj, H5O_SDSPACE_ID)<0) + HGOTO_ERROR(H5E_DATASPACE, H5E_CANTENCODE, FAIL, "can't encode extent space"); + + /* Encode the selection part of dataspace. I believe the size is always greater + * than 0 */ + if(space_type==H5S_SIMPLE && select_size>0) { + select_buf = buf + 2 + extent_size; + if(H5S_SELECT_SERIALIZE(obj, select_buf) <0) + HGOTO_ERROR(H5E_DATASPACE, H5E_CANTENCODE, FAIL, "can't encode select space"); + } + +done: + FUNC_LEAVE_NOAPI(ret_value); +} + + +/*------------------------------------------------------------------------- + * Function: H5Sdecode + * + * Purpose: Decode a binary object description of data space and + * return a new object handle. + * + * Return: Success: dataspace ID(non-negative) + * + * Failure: negative + * + * Programmer: Raymond Lu + * slu@ncsa.uiuc.edu + * July 14, 2004 + * + * Modifications: + * + *------------------------------------------------------------------------- + */ +hid_t +H5Sdecode(unsigned char* buf) +{ + H5S_t *ds; + hid_t ret_value; + + FUNC_ENTER_API (H5Sdecode, FAIL); + + if (buf==NULL) + HGOTO_ERROR (H5E_ARGS, H5E_BADVALUE, FAIL, "empty buffer") + + if((ds = H5S_decode(buf))==NULL) + HGOTO_ERROR(H5E_DATASPACE, H5E_CANTDECODE, FAIL, "can't decode object"); + + /* Register the type and return the ID */ + if ((ret_value=H5I_register (H5I_DATASPACE, ds))<0) + HGOTO_ERROR (H5E_DATASPACE, H5E_CANTREGISTER, FAIL, "unable to register dataspace"); + +done: + FUNC_LEAVE_API(ret_value); +} + + +/*------------------------------------------------------------------------- + * Function: H5S_decode + * + * Purpose: Private function for H5Sdecode. Reconstructs a binary + * description of dataspace and returns a new object handle. + * + * Return: Success: dataspace ID(non-negative) + * + * Failure: negative + * + * Programmer: Raymond Lu + * slu@ncsa.uiuc.edu + * July 14, 2004 + * + * Modifications: + * + *------------------------------------------------------------------------- + */ +H5S_t* +H5S_decode(unsigned char *buf) +{ + H5S_t *ds; + H5S_extent_t *extent; + size_t extent_size; /* size of the extent message*/ + uint8_t *size_buf; + uint8_t *extent_buf; + uint8_t *select_buf; + H5S_t *ret_value; + + FUNC_ENTER_NOAPI(H5S_decode, NULL); + + /* Decode size of extent information */ + size_buf = buf; + UINT16DECODE(size_buf, extent_size); + + /* Decode the extent part of dataspace */ + extent_buf = buf+2; /*2 bytes are from the UINT16DECODE above*/ + + if((extent = H5O_decode(extent_buf, H5O_SDSPACE_ID))==NULL) + HGOTO_ERROR(H5E_DATASPACE, H5E_CANTDECODE, NULL, "can't decode object"); + + /* Copy the extent into dataspace structure */ + ds = H5FL_CALLOC(H5S_t); + if(H5O_copy(H5O_SDSPACE_ID, extent, &(ds->extent))==NULL) + HGOTO_ERROR(H5E_DATASPACE, H5E_CANTCOPY, NULL, "can't copy object"); + + H5S_extent_release(extent); + H5FL_FREE(H5S_extent_t,extent); + + /* Initialize to "all" selection. Deserialization seems relying on it. */ + if(H5S_select_all(ds,0)<0) + HGOTO_ERROR (H5E_DATASPACE, H5E_CANTSET, NULL, "unable to set all selection"); + + /* Reset common selection info pointer */ + ds->select.sel_info.hslab=NULL; + + /* Decode the select part of dataspace. I believe this part always exists. */ + if(ds->extent.type == H5S_SIMPLE) { + select_buf = buf + 2 + extent_size; + if(H5S_SELECT_DESERIALIZE(ds, select_buf)<0) + HGOTO_ERROR(H5E_DATASPACE, H5E_CANTDECODE, NULL, "can't decode space selection"); + } + + /* Set return value */ + ret_value=ds; + +done: + FUNC_LEAVE_NOAPI(ret_value); +} + + +/*------------------------------------------------------------------------- * Function: H5S_get_simple_extent_type * * Purpose: Internal function for retrieving the type of extent for a dataspace object diff --git a/src/H5Sprivate.h b/src/H5Sprivate.h index dc42b05..9e4028b 100644 --- a/src/H5Sprivate.h +++ b/src/H5Sprivate.h @@ -206,6 +206,8 @@ typedef struct H5S_conv_t { /* Operations on dataspaces */ H5_DLL H5S_t *H5S_copy(const H5S_t *src, hbool_t share_selection); H5_DLL herr_t H5S_close(H5S_t *ds); +H5_DLL herr_t H5S_encode(H5S_t *obj, unsigned char *buf, size_t *nalloc); +H5_DLL H5S_t *H5S_decode(unsigned char *buf); H5_DLL H5S_conv_t *H5S_find(const H5F_t *file,const H5S_t *mem_space, const H5S_t *file_space, unsigned flags, hbool_t *use_par_opt_io,const H5O_layout_t *layout ); H5_DLL H5S_class_t H5S_get_simple_extent_type(const H5S_t *ds); diff --git a/src/H5Spublic.h b/src/H5Spublic.h index 70958c9..2017727 100644 --- a/src/H5Spublic.h +++ b/src/H5Spublic.h @@ -100,6 +100,8 @@ H5_DLL herr_t H5Sset_extent_simple(hid_t space_id, int rank, const hsize_t max[]); H5_DLL hid_t H5Scopy(hid_t space_id); H5_DLL herr_t H5Sclose(hid_t space_id); +H5_DLL herr_t H5Sencode(hid_t obj_id, unsigned char* buf, size_t* nalloc); +H5_DLL hid_t H5Sdecode(unsigned char* buf); H5_DLL hssize_t H5Sget_simple_extent_npoints(hid_t space_id); H5_DLL int H5Sget_simple_extent_ndims(hid_t space_id); H5_DLL int H5Sget_simple_extent_dims(hid_t space_id, hsize_t dims[], @@ -20,6 +20,7 @@ */ #define H5T_PACKAGE /*suppress error about including H5Tpkg */ +#define H5F_PACKAGE /*suppress error about including H5Fpkg */ /* Interface initialization */ #define H5_INTERFACE_INIT_FUNC H5T_init_interface @@ -32,10 +33,12 @@ #include "H5Dprivate.h" /*datasets (for H5Tcopy) */ #include "H5Eprivate.h" /*error handling */ #include "H5FLprivate.h" /* Free Lists */ +#include "H5Fprivate.h" /* File */ #include "H5Gprivate.h" /*groups */ #include "H5Iprivate.h" /*ID functions */ #include "H5MMprivate.h" /*memory management */ #include "H5Pprivate.h" /* Property Lists */ +#include "H5Fpkg.h" /*file functions */ #include "H5Tpkg.h" /*data-type functions */ /* Check for header needed for SGI floating-point code */ @@ -2618,7 +2621,7 @@ H5Tdecode(unsigned char* buf) FUNC_ENTER_API (H5Tdecode, FAIL); if (buf==NULL) - HGOTO_ERROR (H5E_ARGS, H5E_BADVALUE, FAIL, "NULL pointer for buffer") + HGOTO_ERROR (H5E_ARGS, H5E_BADVALUE, FAIL, "empty buffer") if((dt = H5T_decode(buf))==NULL) HGOTO_ERROR(H5E_DATATYPE, H5E_CANTDECODE, FAIL, "can't decode object"); @@ -2658,11 +2661,23 @@ done: herr_t H5T_encode(H5T_t *obj, unsigned char *buf, size_t *nalloc) { + size_t buf_size = 0; + H5F_t f; herr_t ret_value = SUCCEED; FUNC_ENTER_NOAPI(H5T_encode, FAIL); + + /* Find out the size of buffer needed */ + if((buf_size=H5O_raw_size(H5O_DTYPE_ID, &f, obj))==0) + HGOTO_ERROR(H5E_DATATYPE, H5E_BADSIZE, FAIL, "can't find datatype size"); + + /* Don't encode if buffer size isn't big enough or buffer is empty */ + if(!buf || *nalloc<buf_size) { + *nalloc = buf_size; + HGOTO_DONE(ret_value); + } - if(H5O_encode(buf, obj, nalloc, H5O_DTYPE_ID)<0) + if(H5O_encode(buf, obj, H5O_DTYPE_ID)<0) HGOTO_ERROR(H5E_DATATYPE, H5E_CANTENCODE, FAIL, "can't encode object"); done: |