mirror of
https://github.com/HDFGroup/hdf5.git
synced 2025-03-31 17:10:47 +08:00
[svn-r12708] Description:
Add the "use the latest version of the format" support to datatype messages. And a regression test to check that it's working. Also, found that we have been over-allocating space for compound datatype messages (when they have array datatypes or can use the latest version of the format) and trimmed the size back. Clean up datatype & dataspace encode/decode routines by having them allocate & release "fake" file structures, which gets them out of needing to "know" about the internals of file structures. Other minor whitespace/formatting cleanups, etc. Tested on: Linux/32 2.6 (chicago) Linux/64 2.6 (chicago2)
This commit is contained in:
parent
84a4166e72
commit
e9ea7e8eaf
1
MANIFEST
1
MANIFEST
@ -456,6 +456,7 @@
|
||||
./src/H5Eterm.h
|
||||
./src/H5F.c
|
||||
./src/H5Fdbg.c
|
||||
./src/H5Ffake.c
|
||||
./src/H5Fmount.c
|
||||
./src/H5Fsfile.c
|
||||
./src/H5Fsuper.c
|
||||
|
56
src/H5F.c
56
src/H5F.c
@ -26,7 +26,6 @@
|
||||
#include "H5Eprivate.h" /* Error handling */
|
||||
#include "H5Fpkg.h" /* File access */
|
||||
#include "H5FDprivate.h" /* File drivers */
|
||||
#include "H5FLprivate.h" /* Free lists */
|
||||
#include "H5Gprivate.h" /* Groups */
|
||||
#include "H5Iprivate.h" /* IDs */
|
||||
#include "H5MMprivate.h" /* Memory management */
|
||||
@ -73,10 +72,10 @@ static herr_t H5F_flush(H5F_t *f, hid_t dxpl_id, H5F_scope_t scope, unsigned fla
|
||||
static herr_t H5F_close(H5F_t *f);
|
||||
|
||||
/* Declare a free list to manage the H5F_t struct */
|
||||
H5FL_DEFINE_STATIC(H5F_t);
|
||||
H5FL_DEFINE(H5F_t);
|
||||
|
||||
/* Declare a free list to manage the H5F_file_t struct */
|
||||
H5FL_DEFINE_STATIC(H5F_file_t);
|
||||
H5FL_DEFINE(H5F_file_t);
|
||||
|
||||
|
||||
/*-------------------------------------------------------------------------
|
||||
@ -1450,7 +1449,7 @@ H5F_new(H5F_file_t *shared, hid_t fcpl_id, hid_t fapl_id, H5FD_t *lf)
|
||||
FUNC_ENTER_NOAPI_NOINIT(H5F_new)
|
||||
|
||||
if(NULL == (f = H5FL_CALLOC(H5F_t)))
|
||||
HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
|
||||
HGOTO_ERROR(H5E_FILE, H5E_NOSPACE, NULL, "can't allocate top file structure")
|
||||
f->file_id = -1;
|
||||
|
||||
if(shared) {
|
||||
@ -1459,7 +1458,8 @@ H5F_new(H5F_file_t *shared, hid_t fcpl_id, hid_t fapl_id, H5FD_t *lf)
|
||||
} /* end if */
|
||||
else {
|
||||
HDassert(lf != NULL);
|
||||
f->shared = H5FL_CALLOC(H5F_file_t);
|
||||
if(NULL == (f->shared = H5FL_CALLOC(H5F_file_t)))
|
||||
HGOTO_ERROR(H5E_FILE, H5E_NOSPACE, NULL, "can't allocate shared file structure")
|
||||
f->shared->super_addr = HADDR_UNDEF;
|
||||
f->shared->base_addr = HADDR_UNDEF;
|
||||
f->shared->freespace_addr = HADDR_UNDEF;
|
||||
@ -2856,11 +2856,6 @@ H5F_sizeof_addr(const H5F_t *f)
|
||||
* Programmer: Quincey Koziol <koziol@ncsa.uiuc.edu>
|
||||
* September 29, 2000
|
||||
*
|
||||
* Modifications:
|
||||
*
|
||||
* Raymond Lu, Oct 14, 2001
|
||||
* Changed to the new generic property list.
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
size_t
|
||||
@ -2873,7 +2868,7 @@ H5F_sizeof_size(const H5F_t *f)
|
||||
assert(f->shared);
|
||||
|
||||
FUNC_LEAVE_NOAPI(f->shared->sizeof_size)
|
||||
}
|
||||
} /* H5F_sizeof_size() */
|
||||
|
||||
|
||||
/*-------------------------------------------------------------------------
|
||||
@ -2892,9 +2887,6 @@ H5F_sizeof_size(const H5F_t *f)
|
||||
* slu@ncsa.uiuc.edu
|
||||
* Oct 14 2001
|
||||
*
|
||||
* Modifications:
|
||||
* Quincey Koziol, 2001-10-15
|
||||
* Added this header and removed unused ret_value variable.
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
unsigned
|
||||
@ -2907,7 +2899,7 @@ H5F_sym_leaf_k(const H5F_t *f)
|
||||
assert(f->shared);
|
||||
|
||||
FUNC_LEAVE_NOAPI(f->shared->sym_leaf_k)
|
||||
}
|
||||
} /* end H5F_sym_leaf_k() */
|
||||
|
||||
|
||||
/*-------------------------------------------------------------------------
|
||||
@ -2926,9 +2918,6 @@ H5F_sym_leaf_k(const H5F_t *f)
|
||||
* slu@ncsa.uiuc.edu
|
||||
* Oct 14 2001
|
||||
*
|
||||
* Modifications:
|
||||
* Quincey Koziol, 2001-10-15
|
||||
* Added this header and removed unused ret_value variable.
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
unsigned
|
||||
@ -3455,8 +3444,6 @@ H5F_gc_ref(const H5F_t *f)
|
||||
* koziol@ncsa.uiuc.edu
|
||||
* May 25 2005
|
||||
*
|
||||
* Modifications:
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
hid_t
|
||||
@ -3471,6 +3458,35 @@ H5F_get_fcpl(const H5F_t *f)
|
||||
FUNC_LEAVE_NOAPI(f->shared->fcpl_id)
|
||||
} /* end H5F_get_fcpl() */
|
||||
|
||||
|
||||
/*-------------------------------------------------------------------------
|
||||
* Function: H5F_use_latest_format
|
||||
*
|
||||
* Purpose: Retrieve the 'use the latest version of the format' flag for
|
||||
* the file.
|
||||
*
|
||||
* Return: Success: Non-negative, the 'use the latest format' flag
|
||||
*
|
||||
* Failure: (can't happen)
|
||||
*
|
||||
* Programmer: Quincey Koziol
|
||||
* koziol@hdfgroup.org
|
||||
* Oct 2 2006
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
hbool_t
|
||||
H5F_use_latest_format(const H5F_t *f)
|
||||
{
|
||||
/* Use FUNC_ENTER_NOAPI_NOINIT_NOFUNC here to avoid performance issues */
|
||||
FUNC_ENTER_NOAPI_NOINIT_NOFUNC(H5F_use_latest_format)
|
||||
|
||||
HDassert(f);
|
||||
HDassert(f->shared);
|
||||
|
||||
FUNC_LEAVE_NOAPI(f->shared->latest_format)
|
||||
} /* end H5F_use_latest_format() */
|
||||
|
||||
|
||||
/*-------------------------------------------------------------------------
|
||||
* Function: H5F_block_read
|
||||
|
128
src/H5Ffake.c
Normal file
128
src/H5Ffake.c
Normal file
@ -0,0 +1,128 @@
|
||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||
* Copyright by the Board of Trustees of the University of Illinois. *
|
||||
* All rights reserved. *
|
||||
* *
|
||||
* This file is part of HDF5. The full HDF5 copyright notice, including *
|
||||
* terms governing use, modification, and redistribution, is contained in *
|
||||
* the files COPYING and Copyright.html. COPYING can be found at the root *
|
||||
* of the source code distribution tree; Copyright.html can be found at the *
|
||||
* root level of an installed copy of the electronic HDF5 document set and *
|
||||
* is linked from the top-level documents page. It can also be found at *
|
||||
* http://hdf.ncsa.uiuc.edu/HDF5/doc/Copyright.html. If you do not have *
|
||||
* access to either file, you may request a copy from hdfhelp@ncsa.uiuc.edu. *
|
||||
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
|
||||
|
||||
#define H5F_PACKAGE /*suppress error about including H5Fpkg */
|
||||
|
||||
/* Interface initialization */
|
||||
#define H5_INTERFACE_INIT_FUNC H5F_init_fake_interface
|
||||
|
||||
|
||||
/* Packages needed by this file... */
|
||||
#include "H5private.h" /* Generic Functions */
|
||||
#include "H5Eprivate.h" /* Error handling */
|
||||
#include "H5Fpkg.h" /* File access */
|
||||
|
||||
/* PRIVATE PROTOTYPES */
|
||||
|
||||
|
||||
/*--------------------------------------------------------------------------
|
||||
NAME
|
||||
H5F_init_fake_interface -- Initialize interface-specific information
|
||||
USAGE
|
||||
herr_t H5F_init_fake_interface()
|
||||
|
||||
RETURNS
|
||||
Non-negative on success/Negative on failure
|
||||
DESCRIPTION
|
||||
Initializes any interface-specific data or routines. (Just calls
|
||||
H5F_init_iterface currently).
|
||||
|
||||
--------------------------------------------------------------------------*/
|
||||
static herr_t
|
||||
H5F_init_fake_interface(void)
|
||||
{
|
||||
FUNC_ENTER_NOAPI_NOINIT_NOFUNC(H5F_init_fake_interface)
|
||||
|
||||
FUNC_LEAVE_NOAPI(H5F_init())
|
||||
} /* H5F_init_fake_interface() */
|
||||
|
||||
|
||||
/*-------------------------------------------------------------------------
|
||||
* Function: H5F_fake_alloc
|
||||
*
|
||||
* Purpose: Allocate a "fake" file structure, for various routines to
|
||||
* use for encoding/decoding data structures using internal API
|
||||
* routines that need a file structure, but don't ultimately
|
||||
* depend on having a "real" file.
|
||||
*
|
||||
* Return: Success: Pointer to 'faked up' file structure
|
||||
* Failure: NULL
|
||||
*
|
||||
* Programmer: Quincey Koziol
|
||||
* koziol@hdfgroup.org
|
||||
* Oct 2, 2006
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
H5F_t *
|
||||
H5F_fake_alloc(size_t sizeof_size)
|
||||
{
|
||||
H5F_t *f = NULL; /* Pointer to fake file struct */
|
||||
H5F_t *ret_value; /* Return value */
|
||||
|
||||
FUNC_ENTER_NOAPI(H5F_fake_alloc, NULL)
|
||||
|
||||
/* Allocate faked file struct */
|
||||
if(NULL == (f = H5FL_CALLOC(H5F_t)))
|
||||
HGOTO_ERROR(H5E_FILE, H5E_NOSPACE, NULL, "can't allocate top file structure")
|
||||
if(NULL == (f->shared = H5FL_CALLOC(H5F_file_t)))
|
||||
HGOTO_ERROR(H5E_FILE, H5E_NOSPACE, NULL, "can't allocate shared file structure")
|
||||
|
||||
/* Only set fields necessary for clients */
|
||||
if(sizeof_size == 0)
|
||||
f->shared->sizeof_size = H5F_CRT_OBJ_BYTE_NUM_DEF;
|
||||
else
|
||||
f->shared->sizeof_size = sizeof_size;
|
||||
|
||||
/* Set return value */
|
||||
ret_value = f;
|
||||
|
||||
done:
|
||||
if(!ret_value)
|
||||
H5F_fake_free(f);
|
||||
|
||||
FUNC_LEAVE_NOAPI(ret_value)
|
||||
} /* end H5F_fake_alloc() */
|
||||
|
||||
|
||||
/*-------------------------------------------------------------------------
|
||||
* Function: H5F_fake_free
|
||||
*
|
||||
* Purpose: Free a "fake" file structure.
|
||||
*
|
||||
* Return: Success: non-negative
|
||||
* Failure: negative
|
||||
*
|
||||
* Programmer: Quincey Koziol
|
||||
* koziol@hdfgroup.org
|
||||
* Oct 2, 2006
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
herr_t
|
||||
H5F_fake_free(H5F_t *f)
|
||||
{
|
||||
FUNC_ENTER_NOAPI_NOINIT_NOFUNC(H5F_fake_free)
|
||||
|
||||
/* Free faked file struct */
|
||||
if(f) {
|
||||
/* Destroy shared file struct */
|
||||
if(f->shared)
|
||||
f->shared = H5FL_FREE(H5F_file_t, f->shared);
|
||||
H5FL_FREE(H5F_t, f);
|
||||
} /* end if */
|
||||
|
||||
FUNC_LEAVE_NOAPI(SUCCEED)
|
||||
} /* end H5F_fake_free() */
|
||||
|
21
src/H5Fpkg.h
21
src/H5Fpkg.h
@ -35,6 +35,7 @@
|
||||
|
||||
/* Other private headers needed by this file */
|
||||
#include "H5private.h" /* Generic Functions */
|
||||
#include "H5FLprivate.h" /* Free Lists */
|
||||
#include "H5FOprivate.h" /* File objects */
|
||||
#include "H5Gprivate.h" /* Groups */
|
||||
#include "H5RCprivate.h" /* Reference counted object functions */
|
||||
@ -155,12 +156,22 @@ struct H5F_t {
|
||||
H5F_mtab_t mtab; /* File mount table */
|
||||
};
|
||||
|
||||
/* Forward declarations for prototype arguments */
|
||||
struct H5D_dxpl_cache_t;
|
||||
struct H5D_dcpl_cache_t;
|
||||
union H5D_storage_t;
|
||||
/*****************************/
|
||||
/* Package Private Variables */
|
||||
/*****************************/
|
||||
|
||||
/* Declare a free list to manage the H5F_t struct */
|
||||
H5FL_EXTERN(H5F_t);
|
||||
|
||||
/* Declare a free list to manage the H5F_file_t struct */
|
||||
H5FL_EXTERN(H5F_file_t);
|
||||
|
||||
|
||||
/******************************/
|
||||
/* Package Private Prototypes */
|
||||
/******************************/
|
||||
|
||||
|
||||
/* Private functions, not part of the publicly documented API */
|
||||
#ifdef NOT_YET
|
||||
H5_DLL void H5F_encode_length_unusual(const H5F_t *f, uint8_t **p, uint8_t *l);
|
||||
#endif /* NOT_YET */
|
||||
|
@ -262,6 +262,7 @@ typedef struct H5F_t H5F_t;
|
||||
/* Sieve buffer size for datasets */
|
||||
#define H5F_SIEVE_BUF_SIZE(F) ((F)->shared->sieve_buf_size)
|
||||
#define H5F_GC_REF(F) ((F)->shared->gc_ref)
|
||||
#define H5F_USE_LATEST_FORMAT(F) ((F)->shared->latest_format)
|
||||
#else /* H5F_PACKAGE */
|
||||
#define H5F_FCPL(F) (H5F_get_fcpl(F))
|
||||
#define H5F_SIZEOF_ADDR(F) (H5F_sizeof_addr(F))
|
||||
@ -276,6 +277,7 @@ typedef struct H5F_t H5F_t;
|
||||
#define H5F_BASE_ADDR(F) (H5F_get_base_addr(F))
|
||||
#define H5F_SIEVE_BUF_SIZE(F) (H5F_sieve_buf_size(F))
|
||||
#define H5F_GC_REF(F) (H5F_gc_ref(F))
|
||||
#define H5F_USE_LATEST_FORMAT(F) (H5F_use_latest_format(F))
|
||||
#endif /* H5F_PACKAGE */
|
||||
|
||||
|
||||
@ -515,6 +517,7 @@ H5_DLL double H5F_rdcc_w0(const H5F_t *f);
|
||||
H5_DLL struct H5RC_t *H5F_grp_btree_shared(const H5F_t *f);
|
||||
H5_DLL size_t H5F_sieve_buf_size(const H5F_t *f);
|
||||
H5_DLL unsigned H5F_gc_ref(const H5F_t *f);
|
||||
H5_DLL hbool_t H5F_use_latest_format(const H5F_t *f);
|
||||
|
||||
/* Functions that operate on blocks of bytes wrt super block */
|
||||
H5_DLL herr_t H5F_block_read(const H5F_t *f, H5FD_mem_t type, haddr_t addr,
|
||||
@ -536,6 +539,10 @@ H5_DLL herr_t H5F_acs_copy(hid_t new_fapl_id, hid_t old_fapl_id,
|
||||
/* Shared file list related routines */
|
||||
H5_DLL herr_t H5F_sfile_assert_num(unsigned n);
|
||||
|
||||
/* Routines for creating & destroying "fake" file structures */
|
||||
H5_DLL H5F_t *H5F_fake_alloc(size_t sizeof_size);
|
||||
H5_DLL herr_t H5F_fake_free(H5F_t *f);
|
||||
|
||||
/* Debugging functions */
|
||||
H5_DLL herr_t H5F_debug(H5F_t *f, hid_t dxpl_id, FILE * stream, int indent, int fwidth);
|
||||
|
||||
|
@ -33,7 +33,7 @@
|
||||
NAME
|
||||
H5F_init_super_interface -- Initialize interface-specific information
|
||||
USAGE
|
||||
herr_t H5T_init_super_interface()
|
||||
herr_t H5F_init_super_interface()
|
||||
|
||||
RETURNS
|
||||
Non-negative on success/Negative on failure
|
||||
@ -96,7 +96,6 @@ H5F_read_superblock(H5F_t *f, hid_t dxpl_id, H5G_loc_t *root_loc, haddr_t addr,
|
||||
H5P_genplist_t *c_plist; /* File creation property list */
|
||||
herr_t ret_value = SUCCEED;
|
||||
|
||||
/* Decoding */
|
||||
FUNC_ENTER_NOAPI(H5F_read_superblock, FAIL)
|
||||
|
||||
/* Short cuts */
|
||||
@ -363,7 +362,7 @@ H5F_read_superblock(H5F_t *f, hid_t dxpl_id, H5G_loc_t *root_loc, haddr_t addr,
|
||||
|
||||
done:
|
||||
FUNC_LEAVE_NOAPI(ret_value)
|
||||
}
|
||||
} /* end H5F_read_superblock() */
|
||||
|
||||
|
||||
/*-------------------------------------------------------------------------
|
||||
@ -395,7 +394,6 @@ H5F_init_superblock(const H5F_t *f, hid_t dxpl_id)
|
||||
H5P_genplist_t *plist; /* Property list */
|
||||
hsize_t ret_value;
|
||||
|
||||
/* Encoding */
|
||||
FUNC_ENTER_NOAPI(H5F_init_superblock, UFAIL)
|
||||
|
||||
/* Get the shared file creation property list */
|
||||
@ -500,7 +498,6 @@ H5F_write_superblock(H5F_t *f, hid_t dxpl_id)
|
||||
H5P_genplist_t *plist; /* Property list */
|
||||
herr_t ret_value = SUCCEED;
|
||||
|
||||
/* Encoding */
|
||||
FUNC_ENTER_NOAPI(H5F_write_superblock, FAIL)
|
||||
|
||||
/* Get the shared file creation property list */
|
||||
|
@ -236,8 +236,8 @@ H5G_obj_create(H5F_t *f, hid_t dxpl_id, const H5O_ginfo_t *ginfo,
|
||||
HDassert(oloc);
|
||||
|
||||
/* Check for using the latest version of the group format */
|
||||
/* XXX: add more checks for creating "new format" groups when needed */
|
||||
if(f->shared->latest_format || ginfo->track_corder)
|
||||
/* (add more checks for creating "new format" groups when needed) */
|
||||
if(H5F_USE_LATEST_FORMAT(f) || ginfo->track_corder)
|
||||
use_latest_format = TRUE;
|
||||
else
|
||||
use_latest_format = FALSE;
|
||||
@ -277,7 +277,7 @@ H5G_obj_create(H5F_t *f, hid_t dxpl_id, const H5O_ginfo_t *ginfo,
|
||||
hdr_size = 4 + 2 * H5F_SIZEOF_ADDR(f);
|
||||
|
||||
/*
|
||||
* Create symbol table object header. It has a zero link count
|
||||
* Create group's object header. It has a zero link count
|
||||
* since nothing refers to it yet. The link count will be
|
||||
* incremented if the object is added to the group directed graph.
|
||||
*/
|
||||
|
@ -3996,6 +3996,7 @@ H5O_encode(H5F_t *f, unsigned char *buf, const void *obj, unsigned type_id)
|
||||
FUNC_ENTER_NOAPI(H5O_encode,FAIL)
|
||||
|
||||
/* check args */
|
||||
HDassert(f);
|
||||
HDassert(type_id < NELMTS(H5O_msg_class_g));
|
||||
type = H5O_msg_class_g[type_id]; /* map the type ID to the actual type object */
|
||||
HDassert(type);
|
||||
@ -4037,6 +4038,7 @@ H5O_decode(H5F_t *f, hid_t dxpl_id, const unsigned char *buf, unsigned type_id)
|
||||
FUNC_ENTER_NOAPI(H5O_decode, NULL)
|
||||
|
||||
/* check args */
|
||||
HDassert(f);
|
||||
HDassert(type_id < NELMTS(H5O_msg_class_g));
|
||||
type = H5O_msg_class_g[type_id]; /* map the type ID to the actual type object */
|
||||
HDassert(type);
|
||||
|
442
src/H5Odtype.c
442
src/H5Odtype.c
@ -18,6 +18,7 @@
|
||||
#include "H5private.h" /* Generic Functions */
|
||||
#include "H5Eprivate.h" /* Error handling */
|
||||
#include "H5FLprivate.h" /* Free Lists */
|
||||
#include "H5Fprivate.h" /* Files */
|
||||
#include "H5Gprivate.h" /* Groups */
|
||||
#include "H5MMprivate.h" /* Memory management */
|
||||
#include "H5Opkg.h" /* Object headers */
|
||||
@ -25,19 +26,19 @@
|
||||
|
||||
|
||||
/* PRIVATE PROTOTYPES */
|
||||
static herr_t H5O_dtype_encode (H5F_t *f, uint8_t *p, const void *mesg);
|
||||
static void *H5O_dtype_decode (H5F_t *f, hid_t dxpl_id, const uint8_t *p);
|
||||
static void *H5O_dtype_copy (const void *_mesg, void *_dest, unsigned update_flags);
|
||||
static size_t H5O_dtype_size (const H5F_t *f, const void *_mesg);
|
||||
static herr_t H5O_dtype_reset (void *_mesg);
|
||||
static herr_t H5O_dtype_free (void *_mesg);
|
||||
static herr_t H5O_dtype_get_share (H5F_t *f, const void *_mesg,
|
||||
static herr_t H5O_dtype_encode(H5F_t *f, uint8_t *p, const void *mesg);
|
||||
static void *H5O_dtype_decode(H5F_t *f, hid_t dxpl_id, const uint8_t *p);
|
||||
static void *H5O_dtype_copy(const void *_mesg, void *_dest, unsigned update_flags);
|
||||
static size_t H5O_dtype_size(const H5F_t *f, const void *_mesg);
|
||||
static herr_t H5O_dtype_reset(void *_mesg);
|
||||
static herr_t H5O_dtype_free(void *_mesg);
|
||||
static herr_t H5O_dtype_get_share(H5F_t *f, const void *_mesg,
|
||||
H5O_shared_t *sh);
|
||||
static herr_t H5O_dtype_set_share (H5F_t *f, void *_mesg,
|
||||
static herr_t H5O_dtype_set_share(H5F_t *f, void *_mesg,
|
||||
const H5O_shared_t *sh);
|
||||
static herr_t H5O_dtype_pre_copy_file(H5F_t *file_src, const H5O_msg_class_t *type,
|
||||
void *mesg_src, hbool_t *deleted, const H5O_copy_t *cpy_info, void *_udata);
|
||||
static herr_t H5O_dtype_debug (H5F_t *f, hid_t dxpl_id, const void *_mesg,
|
||||
static herr_t H5O_dtype_debug(H5F_t *f, hid_t dxpl_id, const void *_mesg,
|
||||
FILE * stream, int indent, int fwidth);
|
||||
|
||||
/* This message derives from H5O message class */
|
||||
@ -80,6 +81,10 @@ const H5O_msg_class_t H5O_MSG_DTYPE[1] = {{
|
||||
*/
|
||||
#define H5O_DTYPE_VERSION_3 3
|
||||
|
||||
/* The latest version of the format. Look through the 'encode helper' routine
|
||||
* and 'size' callback for places to change when updating this. */
|
||||
#define H5O_DTYPE_VERSION_LATEST H5O_DTYPE_VERSION_3
|
||||
|
||||
|
||||
/*-------------------------------------------------------------------------
|
||||
* Function: H5O_dtype_decode_helper
|
||||
@ -102,16 +107,16 @@ const H5O_msg_class_t H5O_MSG_DTYPE[1] = {{
|
||||
static herr_t
|
||||
H5O_dtype_decode_helper(H5F_t *f, const uint8_t **pp, H5T_t *dt)
|
||||
{
|
||||
unsigned flags, version;
|
||||
unsigned i, j;
|
||||
size_t z;
|
||||
herr_t ret_value=SUCCEED; /* Return value */
|
||||
unsigned flags, version;
|
||||
unsigned i, j;
|
||||
size_t z;
|
||||
herr_t ret_value = SUCCEED; /* Return value */
|
||||
|
||||
FUNC_ENTER_NOAPI_NOINIT(H5O_dtype_decode_helper);
|
||||
FUNC_ENTER_NOAPI_NOINIT(H5O_dtype_decode_helper)
|
||||
|
||||
/* check args */
|
||||
assert(pp && *pp);
|
||||
assert(dt && dt->shared);
|
||||
HDassert(pp && *pp);
|
||||
HDassert(dt && dt->shared);
|
||||
|
||||
/* decode */
|
||||
UINT32DECODE(*pp, flags);
|
||||
@ -122,7 +127,7 @@ H5O_dtype_decode_helper(H5F_t *f, const uint8_t **pp, H5T_t *dt)
|
||||
flags >>= 8;
|
||||
UINT32DECODE(*pp, dt->shared->size);
|
||||
|
||||
switch (dt->shared->type) {
|
||||
switch(dt->shared->type) {
|
||||
case H5T_INTEGER:
|
||||
/*
|
||||
* Integer types...
|
||||
@ -151,9 +156,9 @@ H5O_dtype_decode_helper(H5F_t *f, const uint8_t **pp, H5T_t *dt)
|
||||
* Opaque types...
|
||||
*/
|
||||
z = flags & (H5T_OPAQUE_TAG_MAX - 1);
|
||||
assert(0==(z&0x7)); /*must be aligned*/
|
||||
if (NULL==(dt->shared->u.opaque.tag=H5MM_malloc(z+1)))
|
||||
HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed");
|
||||
HDassert(0==(z&0x7)); /*must be aligned*/
|
||||
if(NULL == (dt->shared->u.opaque.tag = H5MM_malloc(z + 1)))
|
||||
HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed")
|
||||
HDmemcpy(dt->shared->u.opaque.tag, *pp, z);
|
||||
dt->shared->u.opaque.tag[z] = '\0';
|
||||
*pp += z;
|
||||
@ -165,39 +170,42 @@ H5O_dtype_decode_helper(H5F_t *f, const uint8_t **pp, H5T_t *dt)
|
||||
*/
|
||||
dt->shared->u.atomic.order = (flags & 0x1) ? H5T_ORDER_BE : H5T_ORDER_LE;
|
||||
if(version == H5O_DTYPE_VERSION_3) {
|
||||
/*Unsupported byte order*/
|
||||
/* Unsupported byte order*/
|
||||
if((flags & 0x40) && !(flags & 0x1))
|
||||
HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "bad byte order for datatype message");
|
||||
HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "bad byte order for datatype message")
|
||||
|
||||
/*VAX order if both 1st and 6th bits are turned on*/
|
||||
/* VAX order if both 1st and 6th bits are turned on*/
|
||||
if(flags & 0x40)
|
||||
dt->shared->u.atomic.order = H5T_ORDER_VAX;
|
||||
}
|
||||
} /* end if */
|
||||
dt->shared->u.atomic.lsb_pad = (flags & 0x2) ? H5T_PAD_ONE : H5T_PAD_ZERO;
|
||||
dt->shared->u.atomic.msb_pad = (flags & 0x4) ? H5T_PAD_ONE : H5T_PAD_ZERO;
|
||||
dt->shared->u.atomic.u.f.pad = (flags & 0x8) ? H5T_PAD_ONE : H5T_PAD_ZERO;
|
||||
switch ((flags >> 4) & 0x03) {
|
||||
switch((flags >> 4) & 0x03) {
|
||||
case 0:
|
||||
dt->shared->u.atomic.u.f.norm = H5T_NORM_NONE;
|
||||
break;
|
||||
|
||||
case 1:
|
||||
dt->shared->u.atomic.u.f.norm = H5T_NORM_MSBSET;
|
||||
break;
|
||||
|
||||
case 2:
|
||||
dt->shared->u.atomic.u.f.norm = H5T_NORM_IMPLIED;
|
||||
break;
|
||||
|
||||
default:
|
||||
HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "unknown floating-point normalization");
|
||||
}
|
||||
HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "unknown floating-point normalization")
|
||||
} /* end switch */
|
||||
dt->shared->u.atomic.u.f.sign = (flags >> 8) & 0xff;
|
||||
UINT16DECODE(*pp, dt->shared->u.atomic.offset);
|
||||
UINT16DECODE(*pp, dt->shared->u.atomic.prec);
|
||||
dt->shared->u.atomic.u.f.epos = *(*pp)++;
|
||||
dt->shared->u.atomic.u.f.esize = *(*pp)++;
|
||||
assert(dt->shared->u.atomic.u.f.esize > 0);
|
||||
HDassert(dt->shared->u.atomic.u.f.esize > 0);
|
||||
dt->shared->u.atomic.u.f.mpos = *(*pp)++;
|
||||
dt->shared->u.atomic.u.f.msize = *(*pp)++;
|
||||
assert(dt->shared->u.atomic.u.f.msize > 0);
|
||||
HDassert(dt->shared->u.atomic.u.f.msize > 0);
|
||||
UINT32DECODE(*pp, dt->shared->u.atomic.u.f.ebias);
|
||||
break;
|
||||
|
||||
@ -206,24 +214,23 @@ H5O_dtype_decode_helper(H5F_t *f, const uint8_t **pp, H5T_t *dt)
|
||||
* Compound datatypes...
|
||||
*/
|
||||
dt->shared->u.compnd.nmembs = flags & 0xffff;
|
||||
assert(dt->shared->u.compnd.nmembs > 0);
|
||||
HDassert(dt->shared->u.compnd.nmembs > 0);
|
||||
dt->shared->u.compnd.packed = TRUE; /* Start off packed */
|
||||
dt->shared->u.compnd.nalloc = dt->shared->u.compnd.nmembs;
|
||||
dt->shared->u.compnd.memb = H5MM_calloc(dt->shared->u.compnd.nalloc*
|
||||
sizeof(H5T_cmemb_t));
|
||||
if (NULL==dt->shared->u.compnd.memb)
|
||||
HGOTO_ERROR (H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed");
|
||||
for (i = 0; i < dt->shared->u.compnd.nmembs; i++) {
|
||||
unsigned ndims=0; /* Number of dimensions of the array field */
|
||||
dt->shared->u.compnd.memb = H5MM_calloc(dt->shared->u.compnd.nalloc * sizeof(H5T_cmemb_t));
|
||||
if(NULL == dt->shared->u.compnd.memb)
|
||||
HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed")
|
||||
for(i = 0; i < dt->shared->u.compnd.nmembs; i++) {
|
||||
unsigned ndims = 0; /* Number of dimensions of the array field */
|
||||
hsize_t dim[H5O_LAYOUT_NDIMS]; /* Dimensions of the array */
|
||||
int perm[H5O_LAYOUT_NDIMS]; /* Dimension permutations */
|
||||
unsigned perm_word=0; /* Dimension permutation information */
|
||||
unsigned perm_word = 0; /* Dimension permutation information */
|
||||
H5T_t *array_dt; /* Temporary pointer to the array datatype */
|
||||
H5T_t *temp_type; /* Temporary pointer to the field's datatype */
|
||||
|
||||
/* Decode the field name */
|
||||
dt->shared->u.compnd.memb[i].name = H5MM_xstrdup((const char *)*pp);
|
||||
/*multiple of 8 w/ null terminator */
|
||||
/* multiple of 8 w/ null terminator */
|
||||
*pp += ((HDstrlen((const char *)*pp) + 8) / 8) * 8;
|
||||
|
||||
/* Decode the field offset */
|
||||
@ -235,7 +242,7 @@ H5O_dtype_decode_helper(H5F_t *f, const uint8_t **pp, H5T_t *dt)
|
||||
if(version == H5O_DTYPE_VERSION_1) {
|
||||
/* Decode the number of dimensions */
|
||||
ndims = *(*pp)++;
|
||||
assert(ndims <= 4);
|
||||
HDassert(ndims <= 4);
|
||||
*pp += 3; /*reserved bytes */
|
||||
|
||||
/* Decode dimension permutation (unused currently) */
|
||||
@ -245,43 +252,43 @@ H5O_dtype_decode_helper(H5F_t *f, const uint8_t **pp, H5T_t *dt)
|
||||
*pp += 4;
|
||||
|
||||
/* Decode array dimension sizes */
|
||||
for (j=0; j<4; j++)
|
||||
for(j = 0; j < 4; j++)
|
||||
UINT32DECODE(*pp, dim[j]);
|
||||
} /* end if */
|
||||
|
||||
/* Allocate space for the field's datatype */
|
||||
if(NULL == (temp_type = H5T_alloc()))
|
||||
HGOTO_ERROR (H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed")
|
||||
HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed")
|
||||
|
||||
/* Decode the field's datatype information */
|
||||
if (H5O_dtype_decode_helper(f, pp, temp_type)<0) {
|
||||
for (j=0; j<=i; j++)
|
||||
if(H5O_dtype_decode_helper(f, pp, temp_type) < 0) {
|
||||
for(j = 0; j <= i; j++)
|
||||
H5MM_xfree(dt->shared->u.compnd.memb[j].name);
|
||||
H5MM_xfree(dt->shared->u.compnd.memb);
|
||||
HGOTO_ERROR(H5E_DATATYPE, H5E_CANTDECODE, FAIL, "unable to decode member type");
|
||||
}
|
||||
HGOTO_ERROR(H5E_DATATYPE, H5E_CANTDECODE, FAIL, "unable to decode member type")
|
||||
} /* end if */
|
||||
|
||||
/* Go create the array datatype now, for older versions of the datatype message */
|
||||
if(version == H5O_DTYPE_VERSION_1) {
|
||||
/* Check if this member is an array field */
|
||||
if(ndims>0) {
|
||||
if(ndims > 0) {
|
||||
/* Set up the permutation vector for the array create */
|
||||
for (j=0; j<ndims; j++)
|
||||
perm[j]=(perm_word>>(j*8))&0xff;
|
||||
for(j = 0; j < ndims; j++)
|
||||
perm[j]=(perm_word >> (j * 8)) & 0xff;
|
||||
|
||||
/* Create the array datatype for the field */
|
||||
if ((array_dt=H5T_array_create(temp_type,(int)ndims,dim,perm))==NULL) {
|
||||
for (j=0; j<=i; j++)
|
||||
if((array_dt = H5T_array_create(temp_type, (int)ndims, dim, perm)) == NULL) {
|
||||
for(j = 0; j <= i; j++)
|
||||
H5MM_xfree(dt->shared->u.compnd.memb[j].name);
|
||||
H5MM_xfree(dt->shared->u.compnd.memb);
|
||||
HGOTO_ERROR(H5E_DATATYPE, H5E_CANTREGISTER, FAIL, "unable to create array datatype");
|
||||
}
|
||||
HGOTO_ERROR(H5E_DATATYPE, H5E_CANTREGISTER, FAIL, "unable to create array datatype")
|
||||
} /* end if */
|
||||
|
||||
/* Close the base type for the array */
|
||||
H5T_close(temp_type);
|
||||
|
||||
/* Make the array type the type that is set for the field */
|
||||
temp_type=array_dt;
|
||||
temp_type = array_dt;
|
||||
} /* end if */
|
||||
} /* end if */
|
||||
|
||||
@ -289,38 +296,38 @@ H5O_dtype_decode_helper(H5F_t *f, const uint8_t **pp, H5T_t *dt)
|
||||
* Set the "force conversion" flag if VL datatype fields exist in this
|
||||
* type or any component types
|
||||
*/
|
||||
if(temp_type->shared->force_conv==TRUE)
|
||||
dt->shared->force_conv=TRUE;
|
||||
if(temp_type->shared->force_conv == TRUE)
|
||||
dt->shared->force_conv = TRUE;
|
||||
|
||||
/* Member size */
|
||||
dt->shared->u.compnd.memb[i].size = temp_type->shared->size;
|
||||
|
||||
/* Set the field datatype (finally :-) */
|
||||
dt->shared->u.compnd.memb[i].type=temp_type;
|
||||
dt->shared->u.compnd.memb[i].type = temp_type;
|
||||
|
||||
/* Check if the datatype stayed packed */
|
||||
if(dt->shared->u.compnd.packed) {
|
||||
/* Check if the member type is packed */
|
||||
if(H5T_is_packed(temp_type)>0) {
|
||||
if(i==0) {
|
||||
if(H5T_is_packed(temp_type) > 0) {
|
||||
if(i == 0) {
|
||||
/* If the is the first member, the datatype is not packed
|
||||
* if the first member isn't at offset 0
|
||||
*/
|
||||
if(dt->shared->u.compnd.memb[i].offset>0)
|
||||
dt->shared->u.compnd.packed=FALSE;
|
||||
if(dt->shared->u.compnd.memb[i].offset > 0)
|
||||
dt->shared->u.compnd.packed = FALSE;
|
||||
} /* end if */
|
||||
else {
|
||||
/* If the is not the first member, the datatype is not
|
||||
* packed if the new member isn't adjoining the previous member
|
||||
*/
|
||||
if(dt->shared->u.compnd.memb[i].offset!=(dt->shared->u.compnd.memb[i-1].offset+dt->shared->u.compnd.memb[i-1].size))
|
||||
dt->shared->u.compnd.packed=FALSE;
|
||||
if(dt->shared->u.compnd.memb[i].offset != (dt->shared->u.compnd.memb[i - 1].offset + dt->shared->u.compnd.memb[i - 1].size))
|
||||
dt->shared->u.compnd.packed = FALSE;
|
||||
} /* end else */
|
||||
} /* end if */
|
||||
else
|
||||
dt->shared->u.compnd.packed=FALSE;
|
||||
dt->shared->u.compnd.packed = FALSE;
|
||||
} /* end if */
|
||||
}
|
||||
} /* end for */
|
||||
break;
|
||||
|
||||
case H5T_ENUM:
|
||||
@ -330,22 +337,21 @@ H5O_dtype_decode_helper(H5F_t *f, const uint8_t **pp, H5T_t *dt)
|
||||
dt->shared->u.enumer.nmembs = dt->shared->u.enumer.nalloc = flags & 0xffff;
|
||||
if(NULL == (dt->shared->parent = H5T_alloc()))
|
||||
HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed")
|
||||
if (H5O_dtype_decode_helper(f, pp, dt->shared->parent)<0)
|
||||
HGOTO_ERROR(H5E_DATATYPE, H5E_CANTDECODE, FAIL, "unable to decode parent datatype");
|
||||
if (NULL==(dt->shared->u.enumer.name=H5MM_calloc(dt->shared->u.enumer.nalloc * sizeof(char*))) ||
|
||||
NULL==(dt->shared->u.enumer.value=H5MM_calloc(dt->shared->u.enumer.nalloc *
|
||||
dt->shared->parent->shared->size)))
|
||||
HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed");
|
||||
if(H5O_dtype_decode_helper(f, pp, dt->shared->parent) < 0)
|
||||
HGOTO_ERROR(H5E_DATATYPE, H5E_CANTDECODE, FAIL, "unable to decode parent datatype")
|
||||
if(NULL == (dt->shared->u.enumer.name = H5MM_calloc(dt->shared->u.enumer.nalloc * sizeof(char*))) ||
|
||||
NULL == (dt->shared->u.enumer.value = H5MM_calloc(dt->shared->u.enumer.nalloc * dt->shared->parent->shared->size)))
|
||||
HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed")
|
||||
|
||||
/* Names, each a multiple of 8 with null termination */
|
||||
for (i=0; i<dt->shared->u.enumer.nmembs; i++) {
|
||||
for(i = 0; i < dt->shared->u.enumer.nmembs; i++) {
|
||||
dt->shared->u.enumer.name[i] = H5MM_xstrdup((const char*)*pp);
|
||||
*pp += ((HDstrlen((const char*)*pp)+8)/8)*8;
|
||||
}
|
||||
*pp += ((HDstrlen((const char*)*pp) + 8) / 8) * 8;
|
||||
} /* end for */
|
||||
|
||||
/* Values */
|
||||
HDmemcpy(dt->shared->u.enumer.value, *pp,
|
||||
dt->shared->u.enumer.nmembs * dt->shared->parent->shared->size);
|
||||
dt->shared->u.enumer.nmembs * dt->shared->parent->shared->size);
|
||||
*pp += dt->shared->u.enumer.nmembs * dt->shared->parent->shared->size;
|
||||
break;
|
||||
|
||||
@ -360,12 +366,12 @@ H5O_dtype_decode_helper(H5F_t *f, const uint8_t **pp, H5T_t *dt)
|
||||
dt->shared->u.atomic.u.r.rtype = (H5R_type_t)(flags & 0x0f);
|
||||
|
||||
/* Set extra information for object references, so the hobj_ref_t gets swizzled correctly */
|
||||
if(dt->shared->u.atomic.u.r.rtype==H5R_OBJECT) {
|
||||
if(dt->shared->u.atomic.u.r.rtype == H5R_OBJECT) {
|
||||
/* This type is on disk */
|
||||
dt->shared->u.atomic.u.r.loc = H5T_LOC_DISK;
|
||||
|
||||
/* This type needs conversion */
|
||||
dt->shared->force_conv=TRUE;
|
||||
dt->shared->force_conv = TRUE;
|
||||
} /* end if */
|
||||
break;
|
||||
|
||||
@ -380,27 +386,27 @@ H5O_dtype_decode_helper(H5F_t *f, const uint8_t **pp, H5T_t *dt)
|
||||
dt->shared->u.atomic.msb_pad = H5T_PAD_ZERO;
|
||||
|
||||
dt->shared->u.atomic.u.s.pad = (H5T_str_t)(flags & 0x0f);
|
||||
dt->shared->u.atomic.u.s.cset = (H5T_cset_t)((flags>>4) & 0x0f);
|
||||
dt->shared->u.atomic.u.s.cset = (H5T_cset_t)((flags >> 4) & 0x0f);
|
||||
break;
|
||||
|
||||
case H5T_VLEN: /* Variable length datatypes... */
|
||||
/* Set the type of VL information, either sequence or string */
|
||||
dt->shared->u.vlen.type = (H5T_vlen_type_t)(flags & 0x0f);
|
||||
if(dt->shared->u.vlen.type == H5T_VLEN_STRING) {
|
||||
dt->shared->u.vlen.pad = (H5T_str_t)((flags>>4) & 0x0f);
|
||||
dt->shared->u.vlen.cset = (H5T_cset_t)((flags>>8) & 0x0f);
|
||||
dt->shared->u.vlen.pad = (H5T_str_t)((flags >> 4) & 0x0f);
|
||||
dt->shared->u.vlen.cset = (H5T_cset_t)((flags >> 8) & 0x0f);
|
||||
} /* end if */
|
||||
|
||||
/* Decode base type of VL information */
|
||||
if(NULL == (dt->shared->parent = H5T_alloc()))
|
||||
HGOTO_ERROR (H5E_DATATYPE, H5E_NOSPACE, FAIL, "memory allocation failed")
|
||||
if (H5O_dtype_decode_helper(f, pp, dt->shared->parent)<0)
|
||||
HGOTO_ERROR(H5E_DATATYPE, H5E_CANTDECODE, FAIL, "unable to decode VL parent type");
|
||||
HGOTO_ERROR(H5E_DATATYPE, H5E_NOSPACE, FAIL, "memory allocation failed")
|
||||
if(H5O_dtype_decode_helper(f, pp, dt->shared->parent) < 0)
|
||||
HGOTO_ERROR(H5E_DATATYPE, H5E_CANTDECODE, FAIL, "unable to decode VL parent type")
|
||||
|
||||
dt->shared->force_conv=TRUE;
|
||||
/* Mark this type as on disk */
|
||||
if (H5T_set_loc(dt, f, H5T_LOC_DISK)<0)
|
||||
HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "invalid datatype location");
|
||||
if(H5T_set_loc(dt, f, H5T_LOC_DISK) < 0)
|
||||
HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "invalid datatype location")
|
||||
break;
|
||||
|
||||
case H5T_TIME: /* Time datatypes */
|
||||
@ -419,44 +425,44 @@ H5O_dtype_decode_helper(H5F_t *f, const uint8_t **pp, H5T_t *dt)
|
||||
*pp += 3;
|
||||
|
||||
/* Decode array dimension sizes & compute number of elements */
|
||||
for (j=0, dt->shared->u.array.nelem=1; j<(unsigned)dt->shared->u.array.ndims; j++) {
|
||||
for(j = 0, dt->shared->u.array.nelem = 1; j < (unsigned)dt->shared->u.array.ndims; j++) {
|
||||
UINT32DECODE(*pp, dt->shared->u.array.dim[j]);
|
||||
dt->shared->u.array.nelem *= dt->shared->u.array.dim[j];
|
||||
} /* end for */
|
||||
|
||||
/* Decode array dimension permutations (even though they are unused currently) */
|
||||
for (j=0; j<(unsigned)dt->shared->u.array.ndims; j++)
|
||||
for(j = 0; j < (unsigned)dt->shared->u.array.ndims; j++)
|
||||
UINT32DECODE(*pp, dt->shared->u.array.perm[j]);
|
||||
|
||||
/* Decode base type of array */
|
||||
if(NULL == (dt->shared->parent = H5T_alloc()))
|
||||
HGOTO_ERROR (H5E_DATATYPE, H5E_NOSPACE, FAIL, "memory allocation failed")
|
||||
if (H5O_dtype_decode_helper(f, pp, dt->shared->parent)<0)
|
||||
HGOTO_ERROR(H5E_DATATYPE, H5E_CANTDECODE, FAIL, "unable to decode VL parent type");
|
||||
HGOTO_ERROR(H5E_DATATYPE, H5E_NOSPACE, FAIL, "memory allocation failed")
|
||||
if(H5O_dtype_decode_helper(f, pp, dt->shared->parent) < 0)
|
||||
HGOTO_ERROR(H5E_DATATYPE, H5E_CANTDECODE, FAIL, "unable to decode VL parent type")
|
||||
|
||||
/*
|
||||
* Set the "force conversion" flag if a VL base datatype is used or
|
||||
* or if any components of the base datatype are VL types.
|
||||
*/
|
||||
if(dt->shared->parent->shared->force_conv==TRUE)
|
||||
dt->shared->force_conv=TRUE;
|
||||
if(dt->shared->parent->shared->force_conv == TRUE)
|
||||
dt->shared->force_conv = TRUE;
|
||||
break;
|
||||
|
||||
default:
|
||||
HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "unknown datatype class found");
|
||||
}
|
||||
HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "unknown datatype class found")
|
||||
} /* end switch */
|
||||
|
||||
done:
|
||||
if(ret_value <0)
|
||||
{
|
||||
if(ret_value < 0) {
|
||||
if(dt != NULL) {
|
||||
if(dt->shared != NULL)
|
||||
H5FL_FREE(H5T_shared_t, dt->shared);
|
||||
H5FL_FREE(H5T_t, dt);
|
||||
} /* end if */
|
||||
}
|
||||
FUNC_LEAVE_NOAPI(ret_value);
|
||||
}
|
||||
} /* end if */
|
||||
|
||||
FUNC_LEAVE_NOAPI(ret_value)
|
||||
} /* end H5O_dtype_decode_helper() */
|
||||
|
||||
|
||||
/*-------------------------------------------------------------------------
|
||||
@ -469,37 +475,35 @@ done:
|
||||
* Programmer: Robb Matzke
|
||||
* Monday, December 8, 1997
|
||||
*
|
||||
* Modifications:
|
||||
* Robb Matzke, Thursday, May 20, 1999
|
||||
* Added support for bitfields and opaque types.
|
||||
*
|
||||
* Raymond Lu. Monday, Mar 13, 2006
|
||||
* Added support for VAX floating-point types.
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
static herr_t
|
||||
H5O_dtype_encode_helper(uint8_t **pp, const H5T_t *dt)
|
||||
H5O_dtype_encode_helper(const H5F_t *f, uint8_t **pp, const H5T_t *dt)
|
||||
{
|
||||
htri_t has_array = FALSE; /* Whether a compound datatype has an array inside it */
|
||||
hbool_t has_vax = FALSE; /* Whether VAX floating number exists */
|
||||
unsigned flags = 0;
|
||||
char *hdr = (char *)*pp;
|
||||
unsigned i, j;
|
||||
size_t n, z, aligned;
|
||||
uint8_t version; /* version number */
|
||||
herr_t ret_value=SUCCEED; /* Return value */
|
||||
htri_t has_array = FALSE; /* Whether a compound datatype has an array inside it */
|
||||
hbool_t has_vax = FALSE; /* Whether VAX floating number exists */
|
||||
unsigned flags = 0;
|
||||
char *hdr = (char *)*pp;
|
||||
unsigned i;
|
||||
size_t n, z;
|
||||
uint8_t version; /* version number */
|
||||
hbool_t use_latest_format; /* Flag indicating the new group format should be used */
|
||||
herr_t ret_value = SUCCEED; /* Return value */
|
||||
|
||||
FUNC_ENTER_NOAPI_NOINIT(H5O_dtype_encode_helper);
|
||||
FUNC_ENTER_NOAPI_NOINIT(H5O_dtype_encode_helper)
|
||||
|
||||
/* check args */
|
||||
assert(pp && *pp);
|
||||
assert(dt);
|
||||
HDassert(pp && *pp);
|
||||
HDassert(dt);
|
||||
|
||||
/* Get the file's 'use the latest version of the format' flag */
|
||||
use_latest_format = H5F_USE_LATEST_FORMAT(f);
|
||||
|
||||
/* skip the type and class bit-field for now */
|
||||
*pp += 4;
|
||||
UINT32ENCODE(*pp, dt->shared->size);
|
||||
|
||||
switch (dt->shared->type) {
|
||||
switch(dt->shared->type) {
|
||||
case H5T_INTEGER:
|
||||
/*
|
||||
* Integer datatypes...
|
||||
@ -511,7 +515,7 @@ H5O_dtype_encode_helper(uint8_t **pp, const H5T_t *dt)
|
||||
flags |= 0x01;
|
||||
break;
|
||||
default:
|
||||
HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "byte order is not supported in file format yet");
|
||||
HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "byte order is not supported in file format yet")
|
||||
}
|
||||
|
||||
switch (dt->shared->u.atomic.lsb_pad) {
|
||||
@ -521,7 +525,7 @@ H5O_dtype_encode_helper(uint8_t **pp, const H5T_t *dt)
|
||||
flags |= 0x02;
|
||||
break;
|
||||
default:
|
||||
HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "bit padding is not supported in file format yet");
|
||||
HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "bit padding is not supported in file format yet")
|
||||
}
|
||||
|
||||
switch (dt->shared->u.atomic.msb_pad) {
|
||||
@ -531,7 +535,7 @@ H5O_dtype_encode_helper(uint8_t **pp, const H5T_t *dt)
|
||||
flags |= 0x04;
|
||||
break;
|
||||
default:
|
||||
HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "bit padding is not supported in file format yet");
|
||||
HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "bit padding is not supported in file format yet")
|
||||
}
|
||||
|
||||
switch (dt->shared->u.atomic.u.i.sign) {
|
||||
@ -541,7 +545,7 @@ H5O_dtype_encode_helper(uint8_t **pp, const H5T_t *dt)
|
||||
flags |= 0x08;
|
||||
break;
|
||||
default:
|
||||
HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "sign scheme is not supported in file format yet");
|
||||
HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "sign scheme is not supported in file format yet")
|
||||
}
|
||||
|
||||
UINT16ENCODE(*pp, dt->shared->u.atomic.offset);
|
||||
@ -559,7 +563,7 @@ H5O_dtype_encode_helper(uint8_t **pp, const H5T_t *dt)
|
||||
flags |= 0x01;
|
||||
break;
|
||||
default:
|
||||
HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "byte order is not supported in file format yet");
|
||||
HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "byte order is not supported in file format yet")
|
||||
}
|
||||
|
||||
switch (dt->shared->u.atomic.lsb_pad) {
|
||||
@ -569,7 +573,7 @@ H5O_dtype_encode_helper(uint8_t **pp, const H5T_t *dt)
|
||||
flags |= 0x02;
|
||||
break;
|
||||
default:
|
||||
HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "bit padding is not supported in file format yet");
|
||||
HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "bit padding is not supported in file format yet")
|
||||
}
|
||||
|
||||
switch (dt->shared->u.atomic.msb_pad) {
|
||||
@ -579,7 +583,7 @@ H5O_dtype_encode_helper(uint8_t **pp, const H5T_t *dt)
|
||||
flags |= 0x04;
|
||||
break;
|
||||
default:
|
||||
HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "bit padding is not supported in file format yet");
|
||||
HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "bit padding is not supported in file format yet")
|
||||
}
|
||||
|
||||
UINT16ENCODE(*pp, dt->shared->u.atomic.offset);
|
||||
@ -592,12 +596,17 @@ H5O_dtype_encode_helper(uint8_t **pp, const H5T_t *dt)
|
||||
* multiple of eight characters and null padded (not necessarily
|
||||
* null terminated).
|
||||
*/
|
||||
z = HDstrlen(dt->shared->u.opaque.tag);
|
||||
aligned = (z+7) & (H5T_OPAQUE_TAG_MAX - 8);
|
||||
flags |= aligned;
|
||||
HDmemcpy(*pp, dt->shared->u.opaque.tag, MIN(z,aligned));
|
||||
for (n=MIN(z,aligned); n<aligned; n++) (*pp)[n] = 0;
|
||||
*pp += aligned;
|
||||
{
|
||||
size_t aligned;
|
||||
|
||||
z = HDstrlen(dt->shared->u.opaque.tag);
|
||||
aligned = (z + 7) & (H5T_OPAQUE_TAG_MAX - 8);
|
||||
flags |= aligned;
|
||||
HDmemcpy(*pp, dt->shared->u.opaque.tag, MIN(z,aligned));
|
||||
for(n = MIN(z, aligned); n < aligned; n++)
|
||||
(*pp)[n] = 0;
|
||||
*pp += aligned;
|
||||
}
|
||||
break;
|
||||
|
||||
case H5T_FLOAT:
|
||||
@ -615,7 +624,7 @@ H5O_dtype_encode_helper(uint8_t **pp, const H5T_t *dt)
|
||||
has_vax = TRUE;
|
||||
break;
|
||||
default:
|
||||
HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "byte order is not supported in file format yet");
|
||||
HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "byte order is not supported in file format yet")
|
||||
}
|
||||
|
||||
switch (dt->shared->u.atomic.lsb_pad) {
|
||||
@ -625,7 +634,7 @@ H5O_dtype_encode_helper(uint8_t **pp, const H5T_t *dt)
|
||||
flags |= 0x02;
|
||||
break;
|
||||
default:
|
||||
HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "bit padding is not supported in file format yet");
|
||||
HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "bit padding is not supported in file format yet")
|
||||
}
|
||||
|
||||
switch (dt->shared->u.atomic.msb_pad) {
|
||||
@ -635,7 +644,7 @@ H5O_dtype_encode_helper(uint8_t **pp, const H5T_t *dt)
|
||||
flags |= 0x04;
|
||||
break;
|
||||
default:
|
||||
HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "bit padding is not supported in file format yet");
|
||||
HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "bit padding is not supported in file format yet")
|
||||
}
|
||||
|
||||
switch (dt->shared->u.atomic.u.f.pad) {
|
||||
@ -645,7 +654,7 @@ H5O_dtype_encode_helper(uint8_t **pp, const H5T_t *dt)
|
||||
flags |= 0x08;
|
||||
break;
|
||||
default:
|
||||
HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "bit padding is not supported in file format yet");
|
||||
HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "bit padding is not supported in file format yet")
|
||||
}
|
||||
|
||||
switch (dt->shared->u.atomic.u.f.norm) {
|
||||
@ -658,7 +667,7 @@ H5O_dtype_encode_helper(uint8_t **pp, const H5T_t *dt)
|
||||
flags |= 0x20;
|
||||
break;
|
||||
default:
|
||||
HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "normalization scheme is not supported in file format yet");
|
||||
HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "normalization scheme is not supported in file format yet")
|
||||
}
|
||||
|
||||
flags |= (dt->shared->u.atomic.u.f.sign << 8) & 0xff00;
|
||||
@ -677,19 +686,18 @@ H5O_dtype_encode_helper(uint8_t **pp, const H5T_t *dt)
|
||||
|
||||
case H5T_COMPOUND:
|
||||
/* Check for an array datatype somewhere within the compound type */
|
||||
if((has_array=H5T_detect_class(dt,H5T_ARRAY))<0)
|
||||
HGOTO_ERROR(H5E_DATATYPE, H5E_CANTENCODE, FAIL, "can't detect array class");
|
||||
if((has_array = H5T_detect_class(dt, H5T_ARRAY)) < 0)
|
||||
HGOTO_ERROR(H5E_DATATYPE, H5E_CANTENCODE, FAIL, "can't detect array class")
|
||||
|
||||
/*
|
||||
* Compound datatypes...
|
||||
*/
|
||||
flags = dt->shared->u.compnd.nmembs & 0xffff;
|
||||
for (i=0; i<dt->shared->u.compnd.nmembs; i++) {
|
||||
|
||||
for(i = 0; i < dt->shared->u.compnd.nmembs; i++) {
|
||||
/* Name, multiple of eight bytes */
|
||||
HDstrcpy((char*)(*pp), dt->shared->u.compnd.memb[i].name);
|
||||
n = HDstrlen(dt->shared->u.compnd.memb[i].name);
|
||||
for (z=n+1; z%8; z++)
|
||||
for(z = n + 1; z % 8; z++)
|
||||
(*pp)[z] = '\0';
|
||||
*pp += z;
|
||||
|
||||
@ -700,7 +708,9 @@ H5O_dtype_encode_helper(uint8_t **pp, const H5T_t *dt)
|
||||
* member information, for better backward compatibility
|
||||
* Write out all zeros for the array information, though...
|
||||
*/
|
||||
if(!has_array) {
|
||||
if(!has_array && !use_latest_format) {
|
||||
unsigned j;
|
||||
|
||||
/* Dimensionality */
|
||||
*(*pp)++ = 0;
|
||||
|
||||
@ -716,14 +726,14 @@ H5O_dtype_encode_helper(uint8_t **pp, const H5T_t *dt)
|
||||
UINT32ENCODE(*pp, 0);
|
||||
|
||||
/* Dimensions */
|
||||
for (j=0; j<4; j++)
|
||||
for(j = 0; j < 4; j++)
|
||||
UINT32ENCODE(*pp, 0);
|
||||
} /* end if */
|
||||
|
||||
/* Subtype */
|
||||
if (H5O_dtype_encode_helper(pp, dt->shared->u.compnd.memb[i].type)<0)
|
||||
HGOTO_ERROR(H5E_DATATYPE, H5E_CANTENCODE, FAIL, "unable to encode member type");
|
||||
}
|
||||
if(H5O_dtype_encode_helper(f, pp, dt->shared->u.compnd.memb[i].type) < 0)
|
||||
HGOTO_ERROR(H5E_DATATYPE, H5E_CANTENCODE, FAIL, "unable to encode member type")
|
||||
} /* end for */
|
||||
break;
|
||||
|
||||
case H5T_ENUM:
|
||||
@ -733,17 +743,17 @@ H5O_dtype_encode_helper(uint8_t **pp, const H5T_t *dt)
|
||||
flags = dt->shared->u.enumer.nmembs & 0xffff;
|
||||
|
||||
/* Parent type */
|
||||
if (H5O_dtype_encode_helper(pp, dt->shared->parent)<0)
|
||||
HGOTO_ERROR(H5E_DATATYPE, H5E_CANTENCODE, FAIL, "unable to encode parent datatype");
|
||||
if(H5O_dtype_encode_helper(f, pp, dt->shared->parent) < 0)
|
||||
HGOTO_ERROR(H5E_DATATYPE, H5E_CANTENCODE, FAIL, "unable to encode parent datatype")
|
||||
|
||||
/* Names, each a multiple of eight bytes */
|
||||
for (i=0; i<dt->shared->u.enumer.nmembs; i++) {
|
||||
for(i=0; i<dt->shared->u.enumer.nmembs; i++) {
|
||||
HDstrcpy((char*)(*pp), dt->shared->u.enumer.name[i]);
|
||||
n = HDstrlen(dt->shared->u.enumer.name[i]);
|
||||
for (z=n+1; z%8; z++)
|
||||
for(z = n + 1; z % 8; z++)
|
||||
(*pp)[z] = '\0';
|
||||
*pp += z;
|
||||
}
|
||||
} /* end for */
|
||||
|
||||
/* Values */
|
||||
HDmemcpy(*pp, dt->shared->u.enumer.value, dt->shared->u.enumer.nmembs * dt->shared->parent->shared->size);
|
||||
@ -776,8 +786,8 @@ H5O_dtype_encode_helper(uint8_t **pp, const H5T_t *dt)
|
||||
} /* end if */
|
||||
|
||||
/* Encode base type of VL information */
|
||||
if (H5O_dtype_encode_helper(pp, dt->shared->parent)<0)
|
||||
HGOTO_ERROR(H5E_DATATYPE, H5E_CANTENCODE, FAIL, "unable to encode VL parent type");
|
||||
if(H5O_dtype_encode_helper(f, pp, dt->shared->parent) < 0)
|
||||
HGOTO_ERROR(H5E_DATATYPE, H5E_CANTENCODE, FAIL, "unable to encode VL parent type")
|
||||
break;
|
||||
|
||||
case H5T_TIME: /* Time datatypes... */
|
||||
@ -788,7 +798,7 @@ H5O_dtype_encode_helper(uint8_t **pp, const H5T_t *dt)
|
||||
flags |= 0x01;
|
||||
break;
|
||||
default:
|
||||
HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "byte order is not supported in file format yet");
|
||||
HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "byte order is not supported in file format yet")
|
||||
}
|
||||
UINT16ENCODE(*pp, dt->shared->u.atomic.prec);
|
||||
break;
|
||||
@ -806,16 +816,16 @@ H5O_dtype_encode_helper(uint8_t **pp, const H5T_t *dt)
|
||||
*(*pp)++ = '\0';
|
||||
|
||||
/* Encode array dimensions */
|
||||
for (j=0; j<(unsigned)dt->shared->u.array.ndims; j++)
|
||||
UINT32ENCODE(*pp, dt->shared->u.array.dim[j]);
|
||||
for (i=0; i<(unsigned)dt->shared->u.array.ndims; i++)
|
||||
UINT32ENCODE(*pp, dt->shared->u.array.dim[i]);
|
||||
|
||||
/* Encode array dimension permutations */
|
||||
for (j=0; j<(unsigned)dt->shared->u.array.ndims; j++)
|
||||
UINT32ENCODE(*pp, dt->shared->u.array.perm[j]);
|
||||
for (i=0; i<(unsigned)dt->shared->u.array.ndims; i++)
|
||||
UINT32ENCODE(*pp, dt->shared->u.array.perm[i]);
|
||||
|
||||
/* Encode base type of array's information */
|
||||
if (H5O_dtype_encode_helper(pp, dt->shared->parent)<0)
|
||||
HGOTO_ERROR(H5E_DATATYPE, H5E_CANTENCODE, FAIL, "unable to encode VL parent type");
|
||||
if(H5O_dtype_encode_helper(f, pp, dt->shared->parent) < 0)
|
||||
HGOTO_ERROR(H5E_DATATYPE, H5E_CANTENCODE, FAIL, "unable to encode VL parent type")
|
||||
break;
|
||||
|
||||
default:
|
||||
@ -824,10 +834,15 @@ H5O_dtype_encode_helper(uint8_t **pp, const H5T_t *dt)
|
||||
}
|
||||
|
||||
/* Set version #, based on actual features used for datatype */
|
||||
if(has_vax)
|
||||
version = H5O_DTYPE_VERSION_3;
|
||||
else
|
||||
version = (dt->shared->type == H5T_COMPOUND && has_array) ? H5O_DTYPE_VERSION_2 : H5O_DTYPE_VERSION_1;
|
||||
/* (unless the "use the latest format" flag is set) */
|
||||
if(use_latest_format)
|
||||
version = H5O_DTYPE_VERSION_LATEST;
|
||||
else {
|
||||
if(has_vax)
|
||||
version = H5O_DTYPE_VERSION_3;
|
||||
else
|
||||
version = (dt->shared->type == H5T_COMPOUND && has_array) ? H5O_DTYPE_VERSION_2 : H5O_DTYPE_VERSION_1;
|
||||
} /* end else */
|
||||
|
||||
/* Encode the type's class, version and bit field */
|
||||
*hdr++ = ((unsigned)(dt->shared->type) & 0x0f) | (version << 4);
|
||||
@ -836,8 +851,8 @@ H5O_dtype_encode_helper(uint8_t **pp, const H5T_t *dt)
|
||||
*hdr++ = (flags >> 16) & 0xff;
|
||||
|
||||
done:
|
||||
FUNC_LEAVE_NOAPI(ret_value);
|
||||
}
|
||||
FUNC_LEAVE_NOAPI(ret_value)
|
||||
} /* end H5O_dtype_encode_helper() */
|
||||
|
||||
|
||||
/*--------------------------------------------------------------------------
|
||||
@ -870,7 +885,7 @@ H5O_dtype_decode(H5F_t *f, hid_t UNUSED dxpl_id, const uint8_t *p)
|
||||
assert(p);
|
||||
|
||||
if(NULL == (dt = H5T_alloc()))
|
||||
HGOTO_ERROR (H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
|
||||
HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
|
||||
|
||||
if (H5O_dtype_decode_helper(f, &p, dt) < 0)
|
||||
HGOTO_ERROR(H5E_DATATYPE, H5E_CANTDECODE, NULL, "can't decode type");
|
||||
@ -909,25 +924,25 @@ done:
|
||||
message in the "raw" disk form.
|
||||
--------------------------------------------------------------------------*/
|
||||
static herr_t
|
||||
H5O_dtype_encode(H5F_t UNUSED *f, uint8_t *p, const void *mesg)
|
||||
H5O_dtype_encode(H5F_t *f, uint8_t *p, const void *mesg)
|
||||
{
|
||||
const H5T_t *dt = (const H5T_t *) mesg;
|
||||
herr_t ret_value=SUCCEED; /* Return value */
|
||||
const H5T_t *dt = (const H5T_t *) mesg;
|
||||
herr_t ret_value = SUCCEED; /* Return value */
|
||||
|
||||
FUNC_ENTER_NOAPI_NOINIT(H5O_dtype_encode);
|
||||
FUNC_ENTER_NOAPI_NOINIT(H5O_dtype_encode)
|
||||
|
||||
/* check args */
|
||||
assert(f);
|
||||
assert(p);
|
||||
assert(dt);
|
||||
HDassert(f);
|
||||
HDassert(p);
|
||||
HDassert(dt);
|
||||
|
||||
/* encode */
|
||||
if (H5O_dtype_encode_helper(&p, dt) < 0)
|
||||
HGOTO_ERROR(H5E_DATATYPE, H5E_CANTENCODE, FAIL, "can't encode type");
|
||||
if(H5O_dtype_encode_helper(f, &p, dt) < 0)
|
||||
HGOTO_ERROR(H5E_DATATYPE, H5E_CANTENCODE, FAIL, "can't encode type")
|
||||
|
||||
done:
|
||||
FUNC_LEAVE_NOAPI(ret_value);
|
||||
}
|
||||
FUNC_LEAVE_NOAPI(ret_value)
|
||||
} /* end H5O_dtype_encode() */
|
||||
|
||||
|
||||
/*--------------------------------------------------------------------------
|
||||
@ -961,7 +976,7 @@ H5O_dtype_copy(const void *_src, void *_dst, unsigned UNUSED update_flags)
|
||||
|
||||
/* copy */
|
||||
if (NULL == (dst = H5T_copy(src, H5T_COPY_ALL)))
|
||||
HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, NULL, "can't copy type");
|
||||
HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, NULL, "can't copy type")
|
||||
|
||||
/* was result already allocated? */
|
||||
if (_dst) {
|
||||
@ -998,18 +1013,23 @@ done:
|
||||
sized "properties" field.
|
||||
--------------------------------------------------------------------------*/
|
||||
static size_t
|
||||
H5O_dtype_size(const H5F_t *f, const void *mesg)
|
||||
H5O_dtype_size(const H5F_t *f, const void *_mesg)
|
||||
{
|
||||
unsigned i;
|
||||
size_t ret_value = 8;
|
||||
const H5T_t *dt = (const H5T_t *) mesg;
|
||||
const H5T_t *dt = (const H5T_t *)_mesg;
|
||||
unsigned i; /* Local index variable */
|
||||
size_t ret_value;
|
||||
|
||||
FUNC_ENTER_NOAPI_NOINIT_NOFUNC(H5O_dtype_size);
|
||||
FUNC_ENTER_NOAPI_NOINIT_NOFUNC(H5O_dtype_size)
|
||||
|
||||
assert(mesg);
|
||||
HDassert(f);
|
||||
HDassert(dt);
|
||||
|
||||
/* Set the common size information */
|
||||
ret_value = 4 + /* Type, class & flags */
|
||||
4; /* Size of datatype */
|
||||
|
||||
/* Add in the property field length for each datatype class */
|
||||
switch (dt->shared->type) {
|
||||
switch(dt->shared->type) {
|
||||
case H5T_INTEGER:
|
||||
ret_value += 4;
|
||||
break;
|
||||
@ -1019,7 +1039,7 @@ H5O_dtype_size(const H5F_t *f, const void *mesg)
|
||||
break;
|
||||
|
||||
case H5T_OPAQUE:
|
||||
ret_value += (HDstrlen(dt->shared->u.opaque.tag)+7) & (H5T_OPAQUE_TAG_MAX - 8);
|
||||
ret_value += (HDstrlen(dt->shared->u.opaque.tag) + 7) & (H5T_OPAQUE_TAG_MAX - 8);
|
||||
break;
|
||||
|
||||
case H5T_FLOAT:
|
||||
@ -1027,22 +1047,40 @@ H5O_dtype_size(const H5F_t *f, const void *mesg)
|
||||
break;
|
||||
|
||||
case H5T_COMPOUND:
|
||||
for (i=0; i<dt->shared->u.compnd.nmembs; i++) {
|
||||
ret_value += ((HDstrlen(dt->shared->u.compnd.memb[i].name) + 8) / 8) * 8;
|
||||
ret_value += 4 + /*member offset*/
|
||||
1 + /*dimensionality*/
|
||||
3 + /*reserved*/
|
||||
4 + /*permutation*/
|
||||
4 + /*reserved*/
|
||||
16; /*dimensions*/
|
||||
ret_value += H5O_dtype_size(f, dt->shared->u.compnd.memb[i].type);
|
||||
{
|
||||
htri_t has_array; /* Whether a compound datatype has an array inside it */
|
||||
hbool_t use_latest_format; /* Flag indicating the new group format should be used */
|
||||
|
||||
/* Check for an array datatype somewhere within the compound type */
|
||||
has_array = H5T_detect_class(dt, H5T_ARRAY);
|
||||
HDassert(has_array >= 0);
|
||||
|
||||
/* Get the file's 'use the latest version of the format' flag */
|
||||
use_latest_format = H5F_USE_LATEST_FORMAT(f);
|
||||
|
||||
/* Compute the total size needed to encode compound datatype */
|
||||
for(i = 0; i < dt->shared->u.compnd.nmembs; i++) {
|
||||
ret_value += ((HDstrlen(dt->shared->u.compnd.memb[i].name) + 8) / 8) * 8;
|
||||
|
||||
/* Check for encoding array datatype or using the latest file format */
|
||||
if(has_array || use_latest_format)
|
||||
ret_value += 4; /*member offset*/
|
||||
else
|
||||
ret_value += 4 + /*member offset*/
|
||||
1 + /*dimensionality*/
|
||||
3 + /*reserved*/
|
||||
4 + /*permutation*/
|
||||
4 + /*reserved*/
|
||||
16; /*dimensions*/
|
||||
ret_value += H5O_dtype_size(f, dt->shared->u.compnd.memb[i].type);
|
||||
} /* end for */
|
||||
}
|
||||
break;
|
||||
|
||||
case H5T_ENUM:
|
||||
ret_value += H5O_dtype_size(f, dt->shared->parent);
|
||||
for (i=0; i<dt->shared->u.enumer.nmembs; i++)
|
||||
ret_value += ((HDstrlen(dt->shared->u.enumer.name[i])+8)/8)*8;
|
||||
for(i = 0; i < dt->shared->u.enumer.nmembs; i++)
|
||||
ret_value += ((HDstrlen(dt->shared->u.enumer.name[i]) + 8) / 8) * 8;
|
||||
ret_value += dt->shared->u.enumer.nmembs * dt->shared->parent->shared->size;
|
||||
break;
|
||||
|
||||
@ -1056,18 +1094,18 @@ H5O_dtype_size(const H5F_t *f, const void *mesg)
|
||||
|
||||
case H5T_ARRAY:
|
||||
ret_value += 4; /* ndims & reserved bytes*/
|
||||
ret_value += 4*dt->shared->u.array.ndims; /* dimensions */
|
||||
ret_value += 4*dt->shared->u.array.ndims; /* dimension permutations */
|
||||
ret_value += 4 * dt->shared->u.array.ndims; /* dimensions */
|
||||
ret_value += 4 * dt->shared->u.array.ndims; /* dimension permutations */
|
||||
ret_value += H5O_dtype_size(f, dt->shared->parent);
|
||||
break;
|
||||
|
||||
default:
|
||||
/*no properties */
|
||||
break;
|
||||
}
|
||||
} /* end switch */
|
||||
|
||||
FUNC_LEAVE_NOAPI(ret_value);
|
||||
}
|
||||
FUNC_LEAVE_NOAPI(ret_value)
|
||||
} /* H5O_dtype_size() */
|
||||
|
||||
|
||||
/*-------------------------------------------------------------------------
|
||||
|
85
src/H5S.c
85
src/H5S.c
@ -13,7 +13,6 @@
|
||||
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
|
||||
|
||||
#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
|
||||
@ -22,7 +21,7 @@
|
||||
#define _H5S_IN_H5S_C
|
||||
#include "H5private.h" /* Generic Functions */
|
||||
#include "H5Eprivate.h" /* Error handling */
|
||||
#include "H5Fpkg.h" /* File access */
|
||||
#include "H5Fprivate.h" /* Files */
|
||||
#include "H5FLprivate.h" /* Free lists */
|
||||
#include "H5Iprivate.h" /* IDs */
|
||||
#include "H5MMprivate.h" /* Memory management */
|
||||
@ -1701,15 +1700,12 @@ done:
|
||||
* in a buffer.
|
||||
*
|
||||
* Return: Success: non-negative
|
||||
*
|
||||
* Failure: negative
|
||||
*
|
||||
* Programmer: Raymond Lu
|
||||
* slu@ncsa.uiuc.edu
|
||||
* July 14, 2004
|
||||
*
|
||||
* Modifications:
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
static herr_t
|
||||
@ -1718,55 +1714,55 @@ H5S_encode(H5S_t *obj, unsigned char *buf, size_t *nalloc)
|
||||
size_t extent_size; /* Size of serialized dataspace extent */
|
||||
hssize_t sselect_size; /* Signed size of serialized dataspace selection */
|
||||
size_t select_size; /* Size of serialized dataspace selection */
|
||||
H5F_t f; /* Fake file structure*/
|
||||
H5F_t *f = NULL; /* Fake file structure*/
|
||||
herr_t ret_value = SUCCEED;
|
||||
|
||||
FUNC_ENTER_NOAPI(H5S_encode, FAIL);
|
||||
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));
|
||||
HDassert(f.shared);
|
||||
f.shared->sizeof_size = H5F_CRT_OBJ_BYTE_NUM_DEF;
|
||||
/* Allocate "fake" file structure */
|
||||
if(NULL == (f = H5F_fake_alloc(0)))
|
||||
HGOTO_ERROR(H5E_DATASPACE, H5E_CANTALLOC, FAIL, "can't allocate fake file struct")
|
||||
|
||||
/* Find out the size of buffer needed for extent */
|
||||
if((extent_size = H5O_raw_size(H5O_SDSPACE_ID, &f, obj)) == 0)
|
||||
if((extent_size = H5O_raw_size(H5O_SDSPACE_ID, f, obj)) == 0)
|
||||
HGOTO_ERROR(H5E_DATASPACE, H5E_BADSIZE, FAIL, "can't find dataspace size")
|
||||
|
||||
/* Find out the size of buffer needed for selection */
|
||||
if((sselect_size = H5S_SELECT_SERIAL_SIZE(obj)) < 0)
|
||||
HGOTO_ERROR(H5E_DATASPACE, H5E_BADSIZE, FAIL, "can't find dataspace selection size")
|
||||
H5_ASSIGN_OVERFLOW(select_size, sselect_size, hssize_t, size_t);
|
||||
|
||||
/* 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 + 1 + 1 + 1 + 4)) {
|
||||
if(!buf || *nalloc < (extent_size + select_size + 1 + 1 + 1 + 4))
|
||||
*nalloc = extent_size + select_size + 1 + 1 + 1 + 4;
|
||||
HGOTO_DONE(ret_value)
|
||||
} /* end if */
|
||||
else {
|
||||
/* Encode the type of the information */
|
||||
*buf++ = H5O_SDSPACE_ID;
|
||||
|
||||
/* Encode the type of the information */
|
||||
*buf++ = H5O_SDSPACE_ID;
|
||||
/* Encode the version of the dataspace information */
|
||||
*buf++ = H5S_ENCODE_VERSION;
|
||||
|
||||
/* Encode the version of the dataspace information */
|
||||
*buf++ = H5S_ENCODE_VERSION;
|
||||
/* Encode the "size of size" information */
|
||||
*buf++ = (unsigned char)H5F_SIZEOF_SIZE(f);
|
||||
|
||||
/* Encode the "size of size" information */
|
||||
*buf++ = (unsigned char)f.shared->sizeof_size;
|
||||
/* Encode size of extent information. Pointer is actually moved in this macro. */
|
||||
UINT32ENCODE(buf, extent_size);
|
||||
|
||||
/* Encode size of extent information. Pointer is actually moved in this macro. */
|
||||
UINT32ENCODE(buf, extent_size);
|
||||
/* Encode the extent part of dataspace */
|
||||
if(H5O_encode(f, buf, obj, H5O_SDSPACE_ID) < 0)
|
||||
HGOTO_ERROR(H5E_DATASPACE, H5E_CANTENCODE, FAIL, "can't encode extent space")
|
||||
buf += extent_size;
|
||||
|
||||
/* Encode the extent part of dataspace */
|
||||
if(H5O_encode(&f, buf, obj, H5O_SDSPACE_ID) < 0)
|
||||
HGOTO_ERROR(H5E_DATASPACE, H5E_CANTENCODE, FAIL, "can't encode extent space")
|
||||
buf += extent_size;
|
||||
|
||||
/* Encode the selection part of dataspace. */
|
||||
if(H5S_SELECT_SERIALIZE(obj, buf) < 0)
|
||||
HGOTO_ERROR(H5E_DATASPACE, H5E_CANTENCODE, FAIL, "can't encode select space")
|
||||
/* Encode the selection part of dataspace. */
|
||||
if(H5S_SELECT_SERIALIZE(obj, buf) < 0)
|
||||
HGOTO_ERROR(H5E_DATASPACE, H5E_CANTENCODE, FAIL, "can't encode select space")
|
||||
} /* end else */
|
||||
|
||||
done:
|
||||
if(f.shared)
|
||||
H5MM_free(f.shared);
|
||||
/* Release fake file structure */
|
||||
if(f && H5F_fake_free(f) < 0)
|
||||
HDONE_ERROR(H5E_DATASPACE, H5E_CANTRELEASE, FAIL, "unable to release fake file struct")
|
||||
|
||||
FUNC_LEAVE_NOAPI(ret_value)
|
||||
} /* end H5S_encode() */
|
||||
@ -1833,15 +1829,13 @@ H5S_decode(const unsigned char *buf)
|
||||
{
|
||||
H5S_t *ds;
|
||||
H5S_extent_t *extent;
|
||||
size_t extent_size; /* size of the extent message*/
|
||||
H5F_t f; /* fake file structure*/
|
||||
size_t extent_size; /* size of the extent message*/
|
||||
H5F_t *f = NULL; /* Fake file structure*/
|
||||
size_t sizeof_size; /* 'Size of sizes' for file */
|
||||
H5S_t *ret_value;
|
||||
|
||||
FUNC_ENTER_NOAPI(H5S_decode, NULL)
|
||||
|
||||
/* Initialize this before anything goes bad... */
|
||||
f.shared = NULL;
|
||||
|
||||
/* Decode the type of the information */
|
||||
if(*buf++ != H5O_SDSPACE_ID)
|
||||
HGOTO_ERROR(H5E_DATASPACE, H5E_BADMESG, NULL, "not an encoded dataspace");
|
||||
@ -1850,18 +1844,19 @@ H5S_decode(const unsigned char *buf)
|
||||
if(*buf++ != H5S_ENCODE_VERSION)
|
||||
HGOTO_ERROR(H5E_DATASPACE, H5E_VERSION, NULL, "unknown version of encoded dataspace");
|
||||
|
||||
/* Fake file structure, used only for header message operation */
|
||||
f.shared = (H5F_file_t*)H5MM_calloc(sizeof(H5F_file_t));
|
||||
|
||||
/* Decode the "size of size" information */
|
||||
f.shared->sizeof_size = *buf++;
|
||||
sizeof_size = *buf++;
|
||||
|
||||
/* Allocate "fake" file structure */
|
||||
if(NULL == (f = H5F_fake_alloc(sizeof_size)))
|
||||
HGOTO_ERROR(H5E_DATASPACE, H5E_CANTALLOC, NULL, "can't allocate fake file struct")
|
||||
|
||||
/* Decode size of extent information */
|
||||
UINT32DECODE(buf, extent_size);
|
||||
|
||||
/* Decode the extent part of dataspace */
|
||||
/* (pass mostly bogus file pointer and bogus DXPL) */
|
||||
if((extent = H5O_decode(&f, H5P_DEFAULT, buf, H5O_SDSPACE_ID))==NULL)
|
||||
if((extent = H5O_decode(f, H5P_DEFAULT, buf, H5O_SDSPACE_ID))==NULL)
|
||||
HGOTO_ERROR(H5E_DATASPACE, H5E_CANTDECODE, NULL, "can't decode object")
|
||||
buf += extent_size;
|
||||
|
||||
@ -1886,7 +1881,9 @@ H5S_decode(const unsigned char *buf)
|
||||
ret_value = ds;
|
||||
|
||||
done:
|
||||
H5MM_xfree(f.shared);
|
||||
/* Release fake file structure */
|
||||
if(f && H5F_fake_free(f) < 0)
|
||||
HDONE_ERROR(H5E_DATASPACE, H5E_CANTRELEASE, NULL, "unable to release fake file struct")
|
||||
|
||||
FUNC_LEAVE_NOAPI(ret_value)
|
||||
} /* end H5S_decode() */
|
||||
|
82
src/H5T.c
82
src/H5T.c
@ -20,7 +20,6 @@
|
||||
*/
|
||||
|
||||
#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
|
||||
@ -29,7 +28,7 @@
|
||||
#include "H5private.h" /*generic functions */
|
||||
#include "H5Dprivate.h" /*datasets (for H5Tcopy) */
|
||||
#include "H5Eprivate.h" /*error handling */
|
||||
#include "H5Fpkg.h" /* File */
|
||||
#include "H5Fprivate.h" /* Files */
|
||||
#include "H5FLprivate.h" /* Free Lists */
|
||||
#include "H5FOprivate.h" /* File objects */
|
||||
#include "H5Gprivate.h" /*groups */
|
||||
@ -2764,23 +2763,24 @@ herr_t
|
||||
H5Tencode(hid_t obj_id, void *buf, size_t *nalloc)
|
||||
{
|
||||
H5T_t *dtype;
|
||||
herr_t ret_value=SUCCEED;
|
||||
herr_t ret_value = SUCCEED;
|
||||
|
||||
FUNC_ENTER_API (H5Tencode, FAIL);
|
||||
FUNC_ENTER_API (H5Tencode, FAIL)
|
||||
H5TRACE3("e","ix*z",obj_id,buf,nalloc);
|
||||
|
||||
/* Check argument and retrieve object */
|
||||
if (NULL==(dtype=H5I_object_verify(obj_id, H5I_DATATYPE)))
|
||||
HGOTO_ERROR (H5E_ARGS, H5E_BADTYPE, FAIL, "not a datatype")
|
||||
if (nalloc==NULL)
|
||||
HGOTO_ERROR (H5E_ARGS, H5E_BADVALUE, FAIL, "NULL pointer for buffer size")
|
||||
if(NULL == (dtype = H5I_object_verify(obj_id, H5I_DATATYPE)))
|
||||
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a datatype")
|
||||
if(nalloc == NULL)
|
||||
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "NULL pointer for buffer size")
|
||||
|
||||
if(H5T_encode(dtype, buf, nalloc)<0)
|
||||
HGOTO_ERROR(H5E_DATATYPE, H5E_CANTENCODE, FAIL, "can't encode datatype");
|
||||
/* Go encode the datatype */
|
||||
if(H5T_encode(dtype, buf, nalloc) < 0)
|
||||
HGOTO_ERROR(H5E_DATATYPE, H5E_CANTENCODE, FAIL, "can't encode datatype")
|
||||
|
||||
done:
|
||||
FUNC_LEAVE_API(ret_value);
|
||||
}
|
||||
FUNC_LEAVE_API(ret_value)
|
||||
} /* end H5Tencode() */
|
||||
|
||||
|
||||
/*-------------------------------------------------------------------------
|
||||
@ -2842,41 +2842,47 @@ done:
|
||||
* slu@ncsa.uiuc.edu
|
||||
* July 14, 2004
|
||||
*
|
||||
* Modifications:
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
static herr_t
|
||||
H5T_encode(H5T_t *obj, unsigned char *buf, size_t *nalloc)
|
||||
{
|
||||
size_t buf_size;
|
||||
H5F_t f;
|
||||
size_t buf_size; /* Encoded size of datatype */
|
||||
H5F_t *f = NULL; /* Fake file structure*/
|
||||
herr_t ret_value = SUCCEED;
|
||||
|
||||
FUNC_ENTER_NOAPI(H5T_encode, FAIL);
|
||||
FUNC_ENTER_NOAPI(H5T_encode, FAIL)
|
||||
|
||||
/* Allocate "fake" file structure */
|
||||
if(NULL == (f = H5F_fake_alloc(0)))
|
||||
HGOTO_ERROR(H5E_DATATYPE, H5E_CANTALLOC, FAIL, "can't allocate fake file struct")
|
||||
|
||||
/* 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");
|
||||
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+1+1)) {
|
||||
*nalloc = buf_size+1+1;
|
||||
HGOTO_DONE(ret_value);
|
||||
}
|
||||
if(!buf || *nalloc < (buf_size + 1 + 1))
|
||||
*nalloc = buf_size + 1 + 1;
|
||||
else {
|
||||
/* Encode the type of the information */
|
||||
*buf++ = H5O_DTYPE_ID;
|
||||
|
||||
/* Encode the type of the information */
|
||||
*buf++ = H5O_DTYPE_ID;
|
||||
/* Encode the version of the dataspace information */
|
||||
*buf++ = H5T_ENCODE_VERSION;
|
||||
|
||||
/* Encode the version of the dataspace information */
|
||||
*buf++ = H5T_ENCODE_VERSION;
|
||||
|
||||
if(H5O_encode(&f, buf, obj, H5O_DTYPE_ID)<0)
|
||||
HGOTO_ERROR(H5E_DATATYPE, H5E_CANTENCODE, FAIL, "can't encode object");
|
||||
/* Encode into user's buffer */
|
||||
if(H5O_encode(f, buf, obj, H5O_DTYPE_ID) < 0)
|
||||
HGOTO_ERROR(H5E_DATATYPE, H5E_CANTENCODE, FAIL, "can't encode object")
|
||||
} /* end else */
|
||||
|
||||
done:
|
||||
FUNC_LEAVE_NOAPI(ret_value);
|
||||
}
|
||||
/* Release fake file structure */
|
||||
if(f && H5F_fake_free(f) < 0)
|
||||
HDONE_ERROR(H5E_DATATYPE, H5E_CANTRELEASE, FAIL, "unable to release fake file struct")
|
||||
|
||||
FUNC_LEAVE_NOAPI(ret_value)
|
||||
} /* end H5T_encode() */
|
||||
|
||||
|
||||
/*-------------------------------------------------------------------------
|
||||
@ -2898,10 +2904,15 @@ done:
|
||||
static H5T_t *
|
||||
H5T_decode(const unsigned char *buf)
|
||||
{
|
||||
H5F_t *f = NULL; /* Fake file structure*/
|
||||
H5T_t *ret_value;
|
||||
|
||||
FUNC_ENTER_NOAPI(H5T_decode, NULL)
|
||||
|
||||
/* Allocate "fake" file structure */
|
||||
if(NULL == (f = H5F_fake_alloc(0)))
|
||||
HGOTO_ERROR(H5E_DATATYPE, H5E_CANTALLOC, NULL, "can't allocate fake file struct")
|
||||
|
||||
/* Decode the type of the information */
|
||||
if(*buf++ != H5O_DTYPE_ID)
|
||||
HGOTO_ERROR(H5E_DATATYPE, H5E_BADMESG, NULL, "not an encoded datatype")
|
||||
@ -2911,11 +2922,14 @@ H5T_decode(const unsigned char *buf)
|
||||
HGOTO_ERROR(H5E_DATATYPE, H5E_VERSION, NULL, "unknown version of encoded datatype")
|
||||
|
||||
/* Decode the serialized datatype message */
|
||||
/* (pass bogus file pointer and DXPL) */
|
||||
if((ret_value = H5O_decode(NULL, H5P_DEFAULT, buf, H5O_DTYPE_ID)) == NULL)
|
||||
if((ret_value = H5O_decode(f, H5AC_dxpl_id, buf, H5O_DTYPE_ID)) == NULL)
|
||||
HGOTO_ERROR(H5E_DATATYPE, H5E_CANTDECODE, NULL, "can't decode object")
|
||||
|
||||
done:
|
||||
/* Release fake file structure */
|
||||
if(f && H5F_fake_free(f) < 0)
|
||||
HDONE_ERROR(H5E_DATATYPE, H5E_CANTRELEASE, NULL, "unable to release fake file struct")
|
||||
|
||||
FUNC_LEAVE_NOAPI(ret_value)
|
||||
} /* end H5T_decode() */
|
||||
|
||||
|
@ -106,7 +106,7 @@ H5Tcommit(hid_t loc_id, const char *name, hid_t type_id)
|
||||
H5G_loc_reset(&insertion_loc);
|
||||
if(H5G_insertion_loc(&loc, name, &insertion_loc, H5AC_dxpl_id) < 0)
|
||||
HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to locate insertion point")
|
||||
insert_loc_valid=TRUE;
|
||||
insert_loc_valid = TRUE;
|
||||
file = insertion_loc.oloc->file;
|
||||
|
||||
/* Record the type's state so that we can revert to it if linking fails */
|
||||
@ -116,25 +116,24 @@ H5Tcommit(hid_t loc_id, const char *name, hid_t type_id)
|
||||
if(H5T_commit(file, type, H5AC_dxpl_id, H5P_DATATYPE_CREATE_DEFAULT, H5P_DEFAULT) < 0)
|
||||
HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "unable to commit datatype")
|
||||
|
||||
/* Get the group location for the newly committed datatype */
|
||||
if(H5G_loc(type_id, &type_loc) < 0)
|
||||
HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "unable to get committed datatype's location")
|
||||
|
||||
/* Link the type into the group hierarchy */
|
||||
if( H5L_link(&loc, name, &type_loc, H5P_DEFAULT, H5P_DEFAULT, H5AC_dxpl_id) < 0)
|
||||
{
|
||||
if(H5L_link(&loc, name, &type_loc, H5P_DEFAULT, H5P_DEFAULT, H5AC_dxpl_id) < 0) {
|
||||
uncommit = TRUE; /* Linking failed, and we need to undo H5T_commit. */
|
||||
HGOTO_ERROR(H5E_LINK, H5E_CANTINIT, FAIL, "unable to create link to type")
|
||||
}
|
||||
HGOTO_ERROR(H5E_LINK, H5E_CANTINIT, FAIL, "unable to create link to type")
|
||||
} /* end if */
|
||||
|
||||
done:
|
||||
if(insert_loc_valid) {
|
||||
if(insert_loc_valid)
|
||||
if(H5G_loc_free(&insertion_loc) < 0)
|
||||
HDONE_ERROR(H5E_OHDR, H5E_CANTRELEASE, FAIL, "unable to free location")
|
||||
}
|
||||
|
||||
/* If the datatype was committed but couldn't be linked, we need to return it to the state it was in
|
||||
* before it was committed. */
|
||||
if(TRUE == uncommit)
|
||||
{
|
||||
if(TRUE == uncommit) {
|
||||
if(type->shared->state == H5T_STATE_OPEN && H5F_addr_defined(type->oloc.addr)) {
|
||||
/* Remove the datatype from the list of opened objects in the file */
|
||||
if(H5FO_top_decr(type->oloc.file, type->oloc.addr) < 0)
|
||||
@ -150,7 +149,9 @@ done:
|
||||
HDONE_ERROR(H5E_DATATYPE, H5E_CANTDELETE, FAIL, "unable to return datatype to memory")
|
||||
type->oloc.addr = HADDR_UNDEF;
|
||||
type->shared->state = old_state;
|
||||
} /* end if */ }
|
||||
} /* end if */
|
||||
} /* end if */
|
||||
|
||||
FUNC_LEAVE_API(ret_value)
|
||||
} /* end H5Tcommit() */
|
||||
|
||||
@ -224,13 +225,12 @@ done:
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
static herr_t
|
||||
H5T_commit(H5F_t *file, H5T_t *type, hid_t dxpl_id,
|
||||
hid_t tcpl_id, hid_t UNUSED tapl_id)
|
||||
H5T_commit(H5F_t *file, H5T_t *type, hid_t dxpl_id, hid_t tcpl_id, hid_t UNUSED tapl_id)
|
||||
{
|
||||
/* H5F_t *file = NULL; */
|
||||
H5P_genplist_t *tc_plist; /* Property list created */
|
||||
H5G_loc_t type_loc; /* Dataset location */
|
||||
herr_t ret_value = SUCCEED; /* Return value */
|
||||
size_t dtype_size; /* Size of the datatype message */
|
||||
herr_t ret_value = SUCCEED; /* Return value */
|
||||
|
||||
FUNC_ENTER_NOAPI_NOINIT(H5T_commit)
|
||||
|
||||
@ -265,11 +265,15 @@ H5T_commit(H5F_t *file, H5T_t *type, hid_t dxpl_id,
|
||||
type_loc.path = &(type->path);
|
||||
H5G_loc_reset(&type_loc);
|
||||
|
||||
/* Calculate message size infomation, for creating object header */
|
||||
dtype_size = H5O_mesg_size(H5O_DTYPE_ID, file, type, (size_t)0);
|
||||
HDassert(dtype_size);
|
||||
|
||||
/*
|
||||
* Create the object header and open it for write access. Insert the data
|
||||
* type message and then give the object header a name.
|
||||
*/
|
||||
if(H5O_create(file, dxpl_id, (size_t)64, &(type->oloc)) < 0)
|
||||
if(H5O_create(file, dxpl_id, dtype_size, &(type->oloc)) < 0)
|
||||
HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "unable to create datatype object header")
|
||||
if(H5O_modify(&(type->oloc), H5O_DTYPE_ID, 0, H5O_FLAG_CONSTANT, H5O_UPDATE_TIME, type, dxpl_id) < 0)
|
||||
HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "unable to update type header message")
|
||||
|
@ -46,7 +46,7 @@ libhdf5_la_SOURCES= H5.c H5checksum.c H5dbg.c H5system.c H5timer.c H5trace.c \
|
||||
H5C.c H5CS.c H5D.c H5Dcompact.c H5Dcontig.c \
|
||||
H5Defl.c H5Dio.c H5Distore.c H5Dmpio.c H5Doh.c H5Dselect.c H5Dtest.c \
|
||||
H5E.c H5F.c \
|
||||
H5Fdbg.c H5Fmount.c H5Fsfile.c H5Fsuper.c H5FD.c H5FDcore.c \
|
||||
H5Fdbg.c H5Ffake.c H5Fmount.c H5Fsfile.c H5Fsuper.c H5FD.c H5FDcore.c \
|
||||
H5FDfamily.c H5FDlog.c H5FDmpi.c H5FDmpio.c \
|
||||
H5FDmpiposix.c H5FDmulti.c H5FDsec2.c H5FDstdio.c \
|
||||
H5FDstream.c H5FL.c H5FO.c H5FS.c H5FScache.c H5FSdbg.c H5FSsection.c \
|
||||
|
@ -87,7 +87,7 @@ am_libhdf5_la_OBJECTS = H5.lo H5checksum.lo H5dbg.lo H5system.lo \
|
||||
H5B2.lo H5B2cache.lo H5B2dbg.lo H5B2int.lo H5B2stat.lo \
|
||||
H5B2test.lo H5C.lo H5CS.lo H5D.lo H5Dcompact.lo H5Dcontig.lo \
|
||||
H5Defl.lo H5Dio.lo H5Distore.lo H5Dmpio.lo H5Doh.lo \
|
||||
H5Dselect.lo H5Dtest.lo H5E.lo H5F.lo H5Fdbg.lo H5Fmount.lo \
|
||||
H5Dselect.lo H5Dtest.lo H5E.lo H5F.lo H5Fdbg.lo H5Ffake.lo H5Fmount.lo \
|
||||
H5Fsfile.lo H5Fsuper.lo H5FD.lo H5FDcore.lo H5FDfamily.lo \
|
||||
H5FDlog.lo H5FDmpi.lo H5FDmpio.lo H5FDmpiposix.lo H5FDmulti.lo \
|
||||
H5FDsec2.lo H5FDstdio.lo H5FDstream.lo H5FL.lo H5FO.lo H5FS.lo \
|
||||
@ -396,7 +396,7 @@ libhdf5_la_SOURCES = H5.c H5checksum.c H5dbg.c H5system.c H5timer.c H5trace.c \
|
||||
H5C.c H5CS.c H5D.c H5Dcompact.c H5Dcontig.c \
|
||||
H5Defl.c H5Dio.c H5Distore.c H5Dmpio.c H5Doh.c H5Dselect.c H5Dtest.c \
|
||||
H5E.c H5F.c \
|
||||
H5Fdbg.c H5Fmount.c H5Fsfile.c H5Fsuper.c H5FD.c H5FDcore.c \
|
||||
H5Fdbg.c H5Ffake.c H5Fmount.c H5Fsfile.c H5Fsuper.c H5FD.c H5FDcore.c \
|
||||
H5FDfamily.c H5FDlog.c H5FDmpi.c H5FDmpio.c \
|
||||
H5FDmpiposix.c H5FDmulti.c H5FDsec2.c H5FDstdio.c \
|
||||
H5FDstream.c H5FL.c H5FO.c H5FS.c H5FScache.c H5FSdbg.c H5FSsection.c \
|
||||
@ -596,6 +596,7 @@ distclean-compile:
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/H5FSdbg.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/H5FSsection.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/H5Fdbg.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/H5Ffake.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/H5Fmount.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/H5Fsfile.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/H5Fsuper.Plo@am__quote@
|
||||
|
139
test/dtypes.c
139
test/dtypes.c
@ -4329,6 +4329,138 @@ test_encode(void)
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
/*-------------------------------------------------------------------------
|
||||
* Function: test_latest
|
||||
*
|
||||
* Purpose: Test encoding datatypes with the "use the latest version of
|
||||
* the file format" flag turned on.
|
||||
*
|
||||
* Return: Success: 0
|
||||
* Failure: number of errors
|
||||
*
|
||||
* Programmer: Quincey Koziol
|
||||
* October 2, 2006
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
static int
|
||||
test_latest(void)
|
||||
{
|
||||
struct s1 {
|
||||
int a;
|
||||
float b;
|
||||
long c;
|
||||
double d;
|
||||
};
|
||||
hid_t file = (-1); /* File ID */
|
||||
hid_t tid = (-1); /* Datatype ID */
|
||||
hid_t fapl = (-1); /* File access property list */
|
||||
H5G_stat_t sb; /* Stat buffer for committed datatype */
|
||||
hsize_t old_dtype_oh_size; /* Size of object header with "old" format */
|
||||
hsize_t new_dtype_oh_size; /* Size of object header with "new" format */
|
||||
char filename[1024]; /* Buffer for filename */
|
||||
const char compnd_type[] = "Compound_type"; /* Name of committed datatype */
|
||||
|
||||
TESTING("encoding datatypes with the 'use the latest format' flag");
|
||||
|
||||
/* Create file using default FAPL */
|
||||
h5_fixname(FILENAME[5], H5P_DEFAULT, filename, sizeof filename);
|
||||
if((file = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT)) < 0)
|
||||
FAIL_STACK_ERROR
|
||||
|
||||
/* Create a compound datatype */
|
||||
if((tid = H5Tcreate(H5T_COMPOUND, sizeof(struct s1))) < 0)
|
||||
FAIL_STACK_ERROR
|
||||
if(H5Tinsert(tid, "a", HOFFSET(struct s1, a), H5T_NATIVE_INT) < 0)
|
||||
FAIL_STACK_ERROR
|
||||
if(H5Tinsert(tid, "b", HOFFSET(struct s1, b), H5T_NATIVE_FLOAT) < 0)
|
||||
FAIL_STACK_ERROR
|
||||
if(H5Tinsert(tid, "c", HOFFSET(struct s1, c), H5T_NATIVE_LONG) < 0)
|
||||
FAIL_STACK_ERROR
|
||||
if(H5Tinsert(tid, "d", HOFFSET(struct s1, d), H5T_NATIVE_DOUBLE) < 0)
|
||||
FAIL_STACK_ERROR
|
||||
|
||||
/* Commit compound datatype */
|
||||
if(H5Tcommit(file, compnd_type, tid) < 0)
|
||||
FAIL_STACK_ERROR
|
||||
|
||||
/* Get information about datatype on disk */
|
||||
if(H5Gget_objinfo(file, compnd_type, TRUE, &sb) < 0)
|
||||
FAIL_STACK_ERROR
|
||||
old_dtype_oh_size = sb.ohdr.size;
|
||||
|
||||
/* Close datatype */
|
||||
if(H5Tclose(tid) < 0)
|
||||
FAIL_STACK_ERROR
|
||||
|
||||
/* Close file */
|
||||
if(H5Fclose(file) < 0)
|
||||
FAIL_STACK_ERROR
|
||||
|
||||
|
||||
/* Set the 'use the latest format' flag in the FAPL */
|
||||
if((fapl = H5Pcreate(H5P_FILE_ACCESS)) < 0)
|
||||
FAIL_STACK_ERROR
|
||||
if(H5Pset_latest_format(fapl, TRUE) < 0)
|
||||
FAIL_STACK_ERROR
|
||||
|
||||
/* Create file using default FAPL */
|
||||
h5_fixname(FILENAME[5], fapl, filename, sizeof filename);
|
||||
if((file = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0)
|
||||
FAIL_STACK_ERROR
|
||||
|
||||
/* Create a compound datatype */
|
||||
if((tid = H5Tcreate(H5T_COMPOUND, sizeof(struct s1))) < 0)
|
||||
FAIL_STACK_ERROR
|
||||
if(H5Tinsert(tid, "a", HOFFSET(struct s1, a), H5T_NATIVE_INT) < 0)
|
||||
FAIL_STACK_ERROR
|
||||
if(H5Tinsert(tid, "b", HOFFSET(struct s1, b), H5T_NATIVE_FLOAT) < 0)
|
||||
FAIL_STACK_ERROR
|
||||
if(H5Tinsert(tid, "c", HOFFSET(struct s1, c), H5T_NATIVE_LONG) < 0)
|
||||
FAIL_STACK_ERROR
|
||||
if(H5Tinsert(tid, "d", HOFFSET(struct s1, d), H5T_NATIVE_DOUBLE) < 0)
|
||||
FAIL_STACK_ERROR
|
||||
|
||||
/* Commit compound datatype */
|
||||
if(H5Tcommit(file, compnd_type, tid) < 0)
|
||||
FAIL_STACK_ERROR
|
||||
|
||||
/* Get information about datatype on disk */
|
||||
if(H5Gget_objinfo(file, compnd_type, TRUE, &sb) < 0)
|
||||
FAIL_STACK_ERROR
|
||||
new_dtype_oh_size = sb.ohdr.size;
|
||||
|
||||
/* Check that the new format is smaller than the old format */
|
||||
if(old_dtype_oh_size <= new_dtype_oh_size)
|
||||
TEST_ERROR
|
||||
|
||||
/* Close datatype */
|
||||
if(H5Tclose(tid) < 0)
|
||||
FAIL_STACK_ERROR
|
||||
|
||||
/* Close file */
|
||||
if(H5Fclose(file) < 0)
|
||||
FAIL_STACK_ERROR
|
||||
|
||||
/* Close FAPL */
|
||||
if(H5Pclose(fapl) < 0)
|
||||
FAIL_STACK_ERROR
|
||||
|
||||
PASSED();
|
||||
|
||||
return 0;
|
||||
|
||||
error:
|
||||
H5E_BEGIN_TRY {
|
||||
H5Tclose(tid);
|
||||
H5Fclose(file);
|
||||
H5Pclose(fapl);
|
||||
} H5E_END_TRY;
|
||||
|
||||
return 1;
|
||||
} /* end test_latest() */
|
||||
|
||||
typedef struct {
|
||||
unsigned num_range_hi; /* Number of H5T_CONV_EXCEPT_RANGE_HI exceptions seen */
|
||||
unsigned num_range_low; /* Number of H5T_CONV_EXCEPT_RANGE_LOW exceptions seen */
|
||||
@ -4529,7 +4661,7 @@ main(void)
|
||||
reset_hdf5();
|
||||
fapl = h5_fileaccess();
|
||||
|
||||
if (ALIGNMENT)
|
||||
if(ALIGNMENT)
|
||||
printf("Testing non-aligned conversions (ALIGNMENT=%d)....\n", ALIGNMENT);
|
||||
|
||||
/* Do the tests */
|
||||
@ -4538,9 +4670,10 @@ main(void)
|
||||
nerrors += test_detect();
|
||||
nerrors += test_compound_1();
|
||||
nerrors += test_query();
|
||||
nerrors += test_transient (fapl);
|
||||
nerrors += test_named (fapl);
|
||||
nerrors += test_transient(fapl);
|
||||
nerrors += test_named(fapl);
|
||||
nerrors += test_encode();
|
||||
nerrors += test_latest();
|
||||
nerrors += test_int_float_except();
|
||||
h5_cleanup(FILENAME, fapl); /*must happen before first reset*/
|
||||
reset_hdf5();
|
||||
|
Loading…
x
Reference in New Issue
Block a user