mirror of
https://github.com/HDFGroup/hdf5.git
synced 2025-01-30 15:32:37 +08:00
[svn-r6195]
Purpose: Cleanup H5Tget_native_type code Description: improve code cosmetics. Solution: Platforms tested: modi4, eirene, arabica
This commit is contained in:
parent
f7d295517e
commit
dcd54d7624
229
src/H5T.c
229
src/H5T.c
@ -149,6 +149,11 @@ size_t H5T_NATIVE_FLOAT_COMP_ALIGN_g = 0;
|
|||||||
size_t H5T_NATIVE_DOUBLE_COMP_ALIGN_g = 0;
|
size_t H5T_NATIVE_DOUBLE_COMP_ALIGN_g = 0;
|
||||||
size_t H5T_NATIVE_LDOUBLE_COMP_ALIGN_g = 0;
|
size_t H5T_NATIVE_LDOUBLE_COMP_ALIGN_g = 0;
|
||||||
|
|
||||||
|
size_t H5T_POINTER_COMP_ALIGN_g = 0;
|
||||||
|
size_t H5T_HVL_COMP_ALIGN_g = 0;
|
||||||
|
size_t H5T_HOBJREF_COMP_ALIGN_g = 0;
|
||||||
|
size_t H5T_HDSETREGREF_COMP_ALIGN_g = 0;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Alignment constraints for native types. These are initialized at run time
|
* Alignment constraints for native types. These are initialized at run time
|
||||||
* in H5Tinit.c
|
* in H5Tinit.c
|
||||||
@ -2761,32 +2766,84 @@ H5T_t* H5T_get_native_type(H5T_t *dtype, H5T_direction_t direction, size_t *stru
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case H5T_STRING:
|
case H5T_STRING:
|
||||||
if(H5T_is_variable_str(dtype)) {
|
{
|
||||||
if(NULL==(dt=H5I_object_verify(H5T_C_S1, H5I_DATATYPE)))
|
size_t align;
|
||||||
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "not a data type");
|
size_t pointer_size;
|
||||||
if((ret_value=H5T_copy(dt, H5T_COPY_TRANSIENT))==NULL)
|
|
||||||
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "cannot retrieve float type");
|
if(H5T_is_variable_str(dtype)) {
|
||||||
if(H5T_set_size(ret_value, H5T_VARIABLE)<0)
|
if(NULL==(dt=H5I_object_verify(H5T_C_S1, H5I_DATATYPE)))
|
||||||
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "cannot set size");
|
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "not a data type");
|
||||||
} else {
|
if((ret_value=H5T_copy(dt, H5T_COPY_TRANSIENT))==NULL)
|
||||||
if(NULL==(dt=H5I_object_verify(H5T_NATIVE_UCHAR, H5I_DATATYPE)))
|
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "cannot retrieve float type");
|
||||||
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "not a data type");
|
if(H5T_set_size(ret_value, H5T_VARIABLE)<0)
|
||||||
if((ret_value=H5T_copy(dt, H5T_COPY_TRANSIENT))==NULL)
|
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "cannot set size");
|
||||||
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "cannot retrieve float type");
|
|
||||||
if(H5T_set_size(ret_value, size)<0)
|
/* Update size, offset and compound alignment for parent. */
|
||||||
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "cannot set size");
|
align = H5T_POINTER_COMP_ALIGN_g;
|
||||||
|
pointer_size = sizeof(char*);
|
||||||
|
|
||||||
|
if(H5T_cmp_offset(comp_size, offset, pointer_size, 1, align, struct_align)<0)
|
||||||
|
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "cannot compute compound offset");
|
||||||
|
|
||||||
|
} else {
|
||||||
|
/*size_t char_size;*/
|
||||||
|
|
||||||
|
if(NULL==(dt=H5I_object_verify(H5T_NATIVE_UCHAR, H5I_DATATYPE)))
|
||||||
|
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "not a data type");
|
||||||
|
if((ret_value=H5T_copy(dt, H5T_COPY_TRANSIENT))==NULL)
|
||||||
|
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "cannot retrieve float type");
|
||||||
|
if(H5T_set_size(ret_value, size)<0)
|
||||||
|
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "cannot set size");
|
||||||
|
|
||||||
|
/* Update size, offset and compound alignment for parent. */
|
||||||
|
align = H5T_NATIVE_SCHAR_COMP_ALIGN_g;
|
||||||
|
|
||||||
|
if(H5T_cmp_offset(comp_size, offset, sizeof(char), size, align, struct_align)<0)
|
||||||
|
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "cannot compute compound offset");
|
||||||
|
|
||||||
|
if(H5T_close(dt)<0)
|
||||||
|
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "can't close data type");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
/* These three types don't need to compute compound field information since they
|
||||||
|
* can't be used as field. */
|
||||||
case H5T_TIME:
|
case H5T_TIME:
|
||||||
case H5T_BITFIELD:
|
case H5T_BITFIELD:
|
||||||
case H5T_OPAQUE:
|
case H5T_OPAQUE:
|
||||||
case H5T_REFERENCE:
|
|
||||||
if((ret_value=H5T_copy(dtype, H5T_COPY_TRANSIENT))==NULL)
|
if((ret_value=H5T_copy(dtype, H5T_COPY_TRANSIENT))==NULL)
|
||||||
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "cannot retrieve float type");
|
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "cannot retrieve float type");
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
case H5T_REFERENCE:
|
||||||
|
{
|
||||||
|
size_t align;
|
||||||
|
size_t ref_size;
|
||||||
|
int not_equal;
|
||||||
|
H5T_t *dt;
|
||||||
|
|
||||||
|
if((ret_value=H5T_copy(dtype, H5T_COPY_TRANSIENT))==NULL)
|
||||||
|
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "cannot retrieve float type");
|
||||||
|
|
||||||
|
/* Decide if the data type is object or dataset region reference. */
|
||||||
|
if(NULL==(dt=H5I_object_verify(H5T_STD_REF_OBJ_g, H5I_DATATYPE)))
|
||||||
|
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "not a data type");
|
||||||
|
not_equal = H5T_cmp(ret_value, dt);
|
||||||
|
|
||||||
|
/* Update size, offset and compound alignment for parent. */
|
||||||
|
if(!not_equal) {
|
||||||
|
align = H5T_HOBJREF_COMP_ALIGN_g;
|
||||||
|
ref_size = sizeof(hobj_ref_t);
|
||||||
|
} else {
|
||||||
|
align = H5T_HDSETREGREF_COMP_ALIGN_g;
|
||||||
|
ref_size = sizeof(hdset_reg_ref_t);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(H5T_cmp_offset(comp_size, offset, ref_size, 1, align, struct_align)<0)
|
||||||
|
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "cannot compute compound offset");
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
case H5T_COMPOUND:
|
case H5T_COMPOUND:
|
||||||
{
|
{
|
||||||
@ -2861,14 +2918,15 @@ H5T_t* H5T_get_native_type(H5T_t *dtype, H5T_direction_t direction, size_t *stru
|
|||||||
|
|
||||||
ret_value = new_type;
|
ret_value = new_type;
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case H5T_ENUM:
|
case H5T_ENUM:
|
||||||
{
|
{
|
||||||
char *memb_name; /* Enum's member name */
|
char *memb_name; /* Enum's member name */
|
||||||
void *memb_value; /* Enum's member value */
|
void *memb_value; /* Enum's member value */
|
||||||
|
|
||||||
|
/* Don't need to do anything special for alignment, offset since the ENUM type usually is integer. */
|
||||||
|
|
||||||
/* Retrieve base type for enumarate type */
|
/* Retrieve base type for enumarate type */
|
||||||
if((super_type=H5T_get_super(dtype))==NULL)
|
if((super_type=H5T_get_super(dtype))==NULL)
|
||||||
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "unable to get base type for enumarate type");
|
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "unable to get base type for enumarate type");
|
||||||
@ -2907,13 +2965,17 @@ H5T_t* H5T_get_native_type(H5T_t *dtype, H5T_direction_t direction, size_t *stru
|
|||||||
|
|
||||||
ret_value = new_type;
|
ret_value = new_type;
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case H5T_ARRAY:
|
case H5T_ARRAY:
|
||||||
{
|
{
|
||||||
int array_rank; /* Array's rank */
|
int array_rank; /* Array's rank */
|
||||||
hsize_t *dims = NULL; /* Dimension sizes for array */
|
hsize_t *dims = NULL; /* Dimension sizes for array */
|
||||||
|
hsize_t nelems = 1;
|
||||||
|
size_t super_offset=0;
|
||||||
|
size_t super_size=0;
|
||||||
|
size_t super_align=0;
|
||||||
|
int i;
|
||||||
|
|
||||||
/* Retrieve dimension information for array data type */
|
/* Retrieve dimension information for array data type */
|
||||||
if((array_rank=H5T_get_array_ndims(dtype))<=0)
|
if((array_rank=H5T_get_array_ndims(dtype))<=0)
|
||||||
@ -2926,7 +2988,8 @@ H5T_t* H5T_get_native_type(H5T_t *dtype, H5T_direction_t direction, size_t *stru
|
|||||||
/* Retrieve base type for array type */
|
/* Retrieve base type for array type */
|
||||||
if((super_type=H5T_get_super(dtype))==NULL)
|
if((super_type=H5T_get_super(dtype))==NULL)
|
||||||
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "unable to get parent type for enumarate type");
|
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "unable to get parent type for enumarate type");
|
||||||
if((nat_super_type = H5T_get_native_type(super_type, direction, struct_align, offset, comp_size))==NULL)
|
if((nat_super_type = H5T_get_native_type(super_type, direction, &super_align,
|
||||||
|
&super_offset, &super_size))==NULL)
|
||||||
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "parent native type retrieval failed");
|
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "parent native type retrieval failed");
|
||||||
|
|
||||||
/* Close super type */
|
/* Close super type */
|
||||||
@ -2940,34 +3003,52 @@ H5T_t* H5T_get_native_type(H5T_t *dtype, H5T_direction_t direction, size_t *stru
|
|||||||
/* Close base type */
|
/* Close base type */
|
||||||
if(H5T_close(nat_super_type)<0)
|
if(H5T_close(nat_super_type)<0)
|
||||||
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "cannot close datatype");
|
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "cannot close datatype");
|
||||||
|
|
||||||
|
for(i=0; i<array_rank; i++)
|
||||||
|
nelems *= dims[i];
|
||||||
|
if(H5T_cmp_offset(comp_size, offset, super_size, nelems, super_align, struct_align)<0)
|
||||||
|
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "cannot compute compound offset");
|
||||||
|
|
||||||
H5MM_xfree(dims);
|
H5MM_xfree(dims);
|
||||||
|
|
||||||
ret_value = new_type;
|
ret_value = new_type;
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case H5T_VLEN:
|
case H5T_VLEN:
|
||||||
/* Retrieve base type for array type */
|
{
|
||||||
if((super_type=H5T_get_super(dtype))==NULL)
|
size_t vl_align = 0;
|
||||||
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "unable to get parent type for enumarate type");
|
size_t vl_size = 0;
|
||||||
if((nat_super_type = H5T_get_native_type(super_type, direction, struct_align, offset, comp_size))==NULL)
|
size_t super_size=0;
|
||||||
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "parent native type retrieval failed");
|
|
||||||
|
|
||||||
/* Close super type */
|
/* Retrieve base type for array type */
|
||||||
if(H5T_close(super_type)<0)
|
if((super_type=H5T_get_super(dtype))==NULL)
|
||||||
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "cannot close datatype");
|
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "unable to get parent type for enumarate type");
|
||||||
|
/* Don't need alignment, offset information if this VL isn't a field of compound type. If it
|
||||||
|
* is, go to a few steps below to compute the information directly. */
|
||||||
|
if((nat_super_type = H5T_get_native_type(super_type, direction, NULL, NULL, &super_size))==NULL)
|
||||||
|
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "parent native type retrieval failed");
|
||||||
|
|
||||||
/* Create a new array type based on native type */
|
/* Close super type */
|
||||||
if((new_type=H5T_vlen_create(nat_super_type))==NULL)
|
if(H5T_close(super_type)<0)
|
||||||
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "unable to create VL type");
|
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "cannot close datatype");
|
||||||
|
|
||||||
|
/* Create a new array type based on native type */
|
||||||
|
if((new_type=H5T_vlen_create(nat_super_type))==NULL)
|
||||||
|
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "unable to create VL type");
|
||||||
|
|
||||||
/* Close base type */
|
/* Close base type */
|
||||||
if(H5T_close(nat_super_type)<0)
|
if(H5T_close(nat_super_type)<0)
|
||||||
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "cannot close datatype");
|
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "cannot close datatype");
|
||||||
|
|
||||||
ret_value = new_type;
|
/* Update size, offset and compound alignment for parent compound type directly. */
|
||||||
|
vl_align = H5T_HVL_COMP_ALIGN_g;
|
||||||
|
vl_size = sizeof(hvl_t);
|
||||||
|
|
||||||
|
if(H5T_cmp_offset(comp_size, offset, vl_size, 1, vl_align, struct_align)<0)
|
||||||
|
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "cannot compute compound offset");
|
||||||
|
|
||||||
|
ret_value = new_type;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
@ -3001,7 +3082,8 @@ done:
|
|||||||
*
|
*
|
||||||
*-------------------------------------------------------------------------
|
*-------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
H5T_t* H5T_get_native_integer(size_t size, H5T_sign_t sign, H5T_direction_t direction, size_t *struct_align, size_t *offset, size_t *comp_size)
|
H5T_t* H5T_get_native_integer(size_t size, H5T_sign_t sign, H5T_direction_t direction,
|
||||||
|
size_t *struct_align, size_t *offset, size_t *comp_size)
|
||||||
{
|
{
|
||||||
H5T_t *dt; /* Appropriate native datatype to copy */
|
H5T_t *dt; /* Appropriate native datatype to copy */
|
||||||
hid_t tid; /* Datatype ID of appropriate native datatype */
|
hid_t tid; /* Datatype ID of appropriate native datatype */
|
||||||
@ -3107,22 +3189,9 @@ H5T_t* H5T_get_native_integer(size_t size, H5T_sign_t sign, H5T_direction_t dire
|
|||||||
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "cannot retrieve float type");
|
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "cannot retrieve float type");
|
||||||
|
|
||||||
/* compute size and offset of compound type member. */
|
/* compute size and offset of compound type member. */
|
||||||
if(offset && comp_size) {
|
if(H5T_cmp_offset(comp_size, offset, size, 1, align, struct_align)<0)
|
||||||
if(align && *comp_size%align) {
|
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "cannot compute compound offset");
|
||||||
/* Add alignment value */
|
|
||||||
*offset = *comp_size + (align - *comp_size%align);
|
|
||||||
size = size + (align - *comp_size%align);
|
|
||||||
} else
|
|
||||||
*offset = *comp_size;
|
|
||||||
|
|
||||||
/* compute size of compound type member. */
|
|
||||||
*comp_size += size;
|
|
||||||
} /* end if */
|
|
||||||
|
|
||||||
/* Alignment for whole compound type */
|
|
||||||
if(struct_align && *struct_align<align)
|
|
||||||
*struct_align = align;
|
|
||||||
|
|
||||||
done:
|
done:
|
||||||
FUNC_LEAVE(ret_value);
|
FUNC_LEAVE(ret_value);
|
||||||
}
|
}
|
||||||
@ -3210,22 +3279,54 @@ H5T_t* H5T_get_native_float(size_t size, H5T_direction_t direction, size_t *stru
|
|||||||
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "cannot retrieve float type");
|
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "cannot retrieve float type");
|
||||||
|
|
||||||
/* compute offset of compound type member. */
|
/* compute offset of compound type member. */
|
||||||
|
if(H5T_cmp_offset(comp_size, offset, size, 1, align, struct_align)<0)
|
||||||
|
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "cannot compute compound offset");
|
||||||
|
|
||||||
|
done:
|
||||||
|
FUNC_LEAVE(ret_value);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*-------------------------------------------------------------------------
|
||||||
|
* Function: H5T_cmp_offset
|
||||||
|
*
|
||||||
|
* Purpose: This function is only for convenience. It computes the
|
||||||
|
* compound type size, offset of the member being considered
|
||||||
|
* and the alignment for the whole compound type.
|
||||||
|
*
|
||||||
|
* Return: Success: Non-negative value.
|
||||||
|
*
|
||||||
|
* Failure: Negative value.
|
||||||
|
*
|
||||||
|
* Programmer: Raymond Lu
|
||||||
|
* December 10, 2002
|
||||||
|
*
|
||||||
|
* Modifications:
|
||||||
|
*
|
||||||
|
*-------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
herr_t H5T_cmp_offset(size_t *comp_size, size_t *offset, size_t elem_size,
|
||||||
|
size_t nelems, size_t align, size_t *struct_align)
|
||||||
|
{
|
||||||
|
herr_t ret_value = SUCCEED;
|
||||||
|
|
||||||
|
FUNC_ENTER_NOAPI(H5T_cmp_offset, FAIL);
|
||||||
|
|
||||||
if(offset && comp_size) {
|
if(offset && comp_size) {
|
||||||
if(align && *comp_size % align) {
|
if(align>1 && *comp_size%align) {
|
||||||
/* Add alignment value */
|
/* Add alignment value */
|
||||||
*offset = *comp_size + (align - *comp_size % align);
|
*offset = *comp_size + (align - *comp_size%align);
|
||||||
size = size + (align - *comp_size % align);
|
*comp_size += (align - *comp_size%align);
|
||||||
} else
|
} else
|
||||||
*offset = *comp_size;
|
*offset = *comp_size;
|
||||||
|
|
||||||
/* compute size of compound type member. */
|
|
||||||
*comp_size += size;
|
|
||||||
} /* end if */
|
|
||||||
|
|
||||||
/* Alignment for whole compound type */
|
/* compute size of compound type member. */
|
||||||
|
*comp_size += nelems*elem_size;
|
||||||
|
}
|
||||||
|
|
||||||
if(struct_align && *struct_align < align)
|
if(struct_align && *struct_align < align)
|
||||||
*struct_align = align;
|
*struct_align = align;
|
||||||
|
|
||||||
done:
|
done:
|
||||||
FUNC_LEAVE(ret_value);
|
FUNC_LEAVE(ret_value);
|
||||||
}
|
}
|
||||||
|
@ -187,6 +187,11 @@ H5_DLLVAR size_t H5T_NATIVE_FLOAT_COMP_ALIGN_g;
|
|||||||
H5_DLLVAR size_t H5T_NATIVE_DOUBLE_COMP_ALIGN_g;
|
H5_DLLVAR size_t H5T_NATIVE_DOUBLE_COMP_ALIGN_g;
|
||||||
H5_DLLVAR size_t H5T_NATIVE_LDOUBLE_COMP_ALIGN_g;
|
H5_DLLVAR size_t H5T_NATIVE_LDOUBLE_COMP_ALIGN_g;
|
||||||
|
|
||||||
|
H5_DLLVAR size_t H5T_POINTER_COMP_ALIGN_g;
|
||||||
|
H5_DLLVAR size_t H5T_HVL_COMP_ALIGN_g;
|
||||||
|
H5_DLLVAR size_t H5T_HOBJREF_COMP_ALIGN_g;
|
||||||
|
H5_DLLVAR size_t H5T_HDSETREGREF_COMP_ALIGN_g;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Alignment information for native types. A value of N indicates that the
|
* Alignment information for native types. A value of N indicates that the
|
||||||
* data must be aligned on an address ADDR such that 0 == ADDR mod N. When
|
* data must be aligned on an address ADDR such that 0 == ADDR mod N. When
|
||||||
|
@ -116,9 +116,14 @@ H5_DLL H5T_t *H5T_get_member_type(H5T_t *dt, int membno);
|
|||||||
H5_DLL size_t H5T_get_member_offset(H5T_t *dt, int membno);
|
H5_DLL size_t H5T_get_member_offset(H5T_t *dt, int membno);
|
||||||
H5_DLL int H5T_get_nmembers(const H5T_t *dt);
|
H5_DLL int H5T_get_nmembers(const H5T_t *dt);
|
||||||
H5_DLL htri_t H5T_is_variable_str(H5T_t *dt);
|
H5_DLL htri_t H5T_is_variable_str(H5T_t *dt);
|
||||||
H5_DLL H5T_t *H5T_get_native_type(H5T_t *dt, H5T_direction_t direction, size_t *struct_align, size_t *offset, size_t *comp_size);
|
H5_DLL H5T_t *H5T_get_native_type(H5T_t *dt, H5T_direction_t direction,
|
||||||
H5_DLL H5T_t *H5T_get_native_integer(size_t size, H5T_sign_t sign, H5T_direction_t direction, size_t *struct_align, size_t *offset, size_t *comp_size);
|
size_t *struct_align, size_t *offset, size_t *comp_size);
|
||||||
H5_DLL H5T_t *H5T_get_native_float(size_t size, H5T_direction_t direction, size_t *struct_align, size_t *offset, size_t *comp_size);
|
H5_DLL H5T_t *H5T_get_native_integer(size_t size, H5T_sign_t sign, H5T_direction_t direction,
|
||||||
|
size_t *struct_align, size_t *offset, size_t *comp_size);
|
||||||
|
H5_DLL H5T_t *H5T_get_native_float(size_t size, H5T_direction_t direction,
|
||||||
|
size_t *struct_align, size_t *offset, size_t *comp_size);
|
||||||
|
H5_DLL herr_t H5T_cmp_offset(size_t *comp_size, size_t *offset, size_t elem_size,
|
||||||
|
size_t nelems, size_t align, size_t *struct_align);
|
||||||
H5_DLL int H5T_cmp(const H5T_t *dt1, const H5T_t *dt2);
|
H5_DLL int H5T_cmp(const H5T_t *dt1, const H5T_t *dt2);
|
||||||
H5_DLL htri_t H5T_is_atomic(const H5T_t *dt);
|
H5_DLL htri_t H5T_is_atomic(const H5T_t *dt);
|
||||||
H5_DLL herr_t H5T_insert(H5T_t *parent, const char *name, size_t offset,
|
H5_DLL herr_t H5T_insert(H5T_t *parent, const char *name, size_t offset,
|
||||||
|
105
src/H5detect.c
105
src/H5detect.c
@ -31,6 +31,8 @@ static const char *FileHeader = "\n\
|
|||||||
*/
|
*/
|
||||||
#undef NDEBUG
|
#undef NDEBUG
|
||||||
#include "H5private.h"
|
#include "H5private.h"
|
||||||
|
#include "H5Tpublic.h"
|
||||||
|
#include "H5Rpublic.h"
|
||||||
|
|
||||||
#define MAXDETECT 64
|
#define MAXDETECT 64
|
||||||
/*
|
/*
|
||||||
@ -51,7 +53,14 @@ typedef struct detected_t {
|
|||||||
size_t comp_align; /*alignment for structure */
|
size_t comp_align; /*alignment for structure */
|
||||||
} detected_t;
|
} detected_t;
|
||||||
|
|
||||||
static void print_results(int nd, detected_t *d);
|
/* This structure holds structure alignment for pointers, hvl_t, hobj_ref_t,
|
||||||
|
* hdset_reg_ref_t */
|
||||||
|
typedef struct malign_t {
|
||||||
|
const char *name;
|
||||||
|
size_t comp_align; /*alignment for structure */
|
||||||
|
} malign_t;
|
||||||
|
|
||||||
|
static void print_results(int nd, detected_t *d, int na, malign_t *m);
|
||||||
static void iprint(detected_t *);
|
static void iprint(detected_t *);
|
||||||
static int byte_cmp(int, void *, void *);
|
static int byte_cmp(int, void *, void *);
|
||||||
static int bit_cmp(int, int *, void *, void *);
|
static int bit_cmp(int, int *, void *, void *);
|
||||||
@ -163,6 +172,11 @@ precision (detected_t *d)
|
|||||||
} \
|
} \
|
||||||
INFO.sign = ('U'!=*(#VAR)); \
|
INFO.sign = ('U'!=*(#VAR)); \
|
||||||
ALIGNMENT(TYPE, INFO.align); \
|
ALIGNMENT(TYPE, INFO.align); \
|
||||||
|
if(!strcmp(INFO.varname, "SCHAR") || !strcmp(INFO.varname, "SHORT") || \
|
||||||
|
!strcmp(INFO.varname, "INT") || !strcmp(INFO.varname, "LONG") || \
|
||||||
|
!strcmp(INFO.varname, "LLONG")) { \
|
||||||
|
COMP_ALIGNMENT(TYPE,INFO.comp_align); \
|
||||||
|
} \
|
||||||
precision (&(INFO)); \
|
precision (&(INFO)); \
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -246,9 +260,36 @@ precision (detected_t *d)
|
|||||||
_v1 = 1.0; \
|
_v1 = 1.0; \
|
||||||
INFO.bias = find_bias (INFO.epos, INFO.esize, INFO.perm, &_v1); \
|
INFO.bias = find_bias (INFO.epos, INFO.esize, INFO.perm, &_v1); \
|
||||||
ALIGNMENT(TYPE, INFO.align); \
|
ALIGNMENT(TYPE, INFO.align); \
|
||||||
|
if(!strcmp(INFO.varname, "FLOAT") || !strcmp(INFO.varname, "DOUBLE") || \
|
||||||
|
!strcmp(INFO.varname, "LDOUBLE")) { \
|
||||||
|
COMP_ALIGNMENT(TYPE,INFO.comp_align); \
|
||||||
|
} \
|
||||||
precision (&(INFO)); \
|
precision (&(INFO)); \
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*-------------------------------------------------------------------------
|
||||||
|
* Function: DETECT_M
|
||||||
|
*
|
||||||
|
* Purpose: This macro takes only miscellaneous structures or pointer
|
||||||
|
* (pointer, hvl_t, hobj_ref_t, hdset_reg_ref_t). It
|
||||||
|
* constructs the names and decides the alignment in structure.
|
||||||
|
*
|
||||||
|
* Return: void
|
||||||
|
*
|
||||||
|
* Programmer: Raymond Lu
|
||||||
|
* slu@ncsa.uiuc.edu
|
||||||
|
* Dec 9, 2002
|
||||||
|
*
|
||||||
|
* Modifications:
|
||||||
|
*
|
||||||
|
*-------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
#define DETECT_M(TYPE,VAR,INFO) { \
|
||||||
|
INFO.name = #VAR; \
|
||||||
|
COMP_ALIGNMENT(TYPE, INFO.comp_align); \
|
||||||
|
}
|
||||||
|
|
||||||
/* Detect alignment for C structure */
|
/* Detect alignment for C structure */
|
||||||
#define COMP_ALIGNMENT(TYPE,COMP_ALIGN) { \
|
#define COMP_ALIGNMENT(TYPE,COMP_ALIGN) { \
|
||||||
struct { \
|
struct { \
|
||||||
@ -399,10 +440,10 @@ sigbus_handler(int UNUSED signo)
|
|||||||
*-------------------------------------------------------------------------
|
*-------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
static void
|
static void
|
||||||
print_results(int nd, detected_t *d)
|
print_results(int nd, detected_t *d, int na, malign_t *misc_align)
|
||||||
{
|
{
|
||||||
|
|
||||||
int i;
|
int i, j;
|
||||||
|
|
||||||
/* Include files */
|
/* Include files */
|
||||||
printf("\
|
printf("\
|
||||||
@ -514,6 +555,11 @@ H5TN_init_interface(void)\n\
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Structure alignment for pointers, hvl_t, hobj_ref_t, hdset_reg_ref_t */
|
||||||
|
printf("\n /* Structure alignment for pointers, hvl_t, hobj_ref_t, hdset_reg_ref_t */\n");
|
||||||
|
for(j=0; j<na; j++)
|
||||||
|
printf(" H5T_%s_COMP_ALIGN_g = %lu;\n", misc_align[j].name, (unsigned long)(misc_align[j].comp_align));
|
||||||
|
|
||||||
printf("\
|
printf("\
|
||||||
\n\
|
\n\
|
||||||
done:\n\
|
done:\n\
|
||||||
@ -1011,8 +1057,9 @@ int
|
|||||||
main(void)
|
main(void)
|
||||||
{
|
{
|
||||||
detected_t d[MAXDETECT];
|
detected_t d[MAXDETECT];
|
||||||
volatile int nd = 0;
|
malign_t m[MAXDETECT];
|
||||||
|
volatile int nd = 0, na = 0;
|
||||||
|
|
||||||
#if defined(H5_HAVE_SETSYSINFO) && defined(SSI_NVPAIRS)
|
#if defined(H5_HAVE_SETSYSINFO) && defined(SSI_NVPAIRS)
|
||||||
#if defined(UAC_NOPRINT) && defined(UAC_SIGBUS)
|
#if defined(UAC_NOPRINT) && defined(UAC_SIGBUS)
|
||||||
/*
|
/*
|
||||||
@ -1032,24 +1079,13 @@ main(void)
|
|||||||
print_header();
|
print_header();
|
||||||
|
|
||||||
/* C89 integer types */
|
/* C89 integer types */
|
||||||
DETECT_I(signed char, SCHAR, d[nd]);
|
DETECT_I(signed char, SCHAR, d[nd]); nd++;
|
||||||
COMP_ALIGNMENT(signed char, d[nd].comp_align); nd++;
|
|
||||||
|
|
||||||
DETECT_I(unsigned char, UCHAR, d[nd]); nd++;
|
DETECT_I(unsigned char, UCHAR, d[nd]); nd++;
|
||||||
|
DETECT_I(short, SHORT, d[nd]); nd++;
|
||||||
DETECT_I(short, SHORT, d[nd]);
|
|
||||||
COMP_ALIGNMENT(short, d[nd].comp_align); nd++;
|
|
||||||
|
|
||||||
DETECT_I(unsigned short, USHORT, d[nd]); nd++;
|
DETECT_I(unsigned short, USHORT, d[nd]); nd++;
|
||||||
|
DETECT_I(int, INT, d[nd]); nd++;
|
||||||
DETECT_I(int, INT, d[nd]);
|
|
||||||
COMP_ALIGNMENT(int, d[nd].comp_align); nd++;
|
|
||||||
|
|
||||||
DETECT_I(unsigned int, UINT, d[nd]); nd++;
|
DETECT_I(unsigned int, UINT, d[nd]); nd++;
|
||||||
|
DETECT_I(long, LONG, d[nd]); nd++;
|
||||||
DETECT_I(long, LONG, d[nd]);
|
|
||||||
COMP_ALIGNMENT(long, d[nd].comp_align); nd++;
|
|
||||||
|
|
||||||
DETECT_I(unsigned long, ULONG, d[nd]); nd++;
|
DETECT_I(unsigned long, ULONG, d[nd]); nd++;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -1129,9 +1165,7 @@ main(void)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if H5_SIZEOF_LONG_LONG>0
|
#if H5_SIZEOF_LONG_LONG>0
|
||||||
DETECT_I(long_long, LLONG, d[nd]);
|
DETECT_I(long_long, LLONG, d[nd]); nd++;
|
||||||
COMP_ALIGNMENT(long_long, d[nd].comp_align); nd++;
|
|
||||||
|
|
||||||
DETECT_I(unsigned long_long, ULLONG, d[nd]); nd++;
|
DETECT_I(unsigned long_long, ULLONG, d[nd]); nd++;
|
||||||
#else
|
#else
|
||||||
/*
|
/*
|
||||||
@ -1139,17 +1173,12 @@ main(void)
|
|||||||
* so we'll just make H5T_NATIVE_LLONG the same as H5T_NATIVE_LONG since
|
* so we'll just make H5T_NATIVE_LLONG the same as H5T_NATIVE_LONG since
|
||||||
* `long long' is probably equivalent to `long' here anyway.
|
* `long long' is probably equivalent to `long' here anyway.
|
||||||
*/
|
*/
|
||||||
DETECT_I(long, LLONG, d[nd]);
|
DETECT_I(long, LLONG, d[nd]); nd++;
|
||||||
COMP_ALIGNMENT(long, d[nd].comp_align); nd++;
|
|
||||||
|
|
||||||
DETECT_I(unsigned long, ULLONG, d[nd]); nd++;
|
DETECT_I(unsigned long, ULLONG, d[nd]); nd++;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
DETECT_F(float, FLOAT, d[nd]);
|
DETECT_F(float, FLOAT, d[nd]); nd++;
|
||||||
COMP_ALIGNMENT(float, d[nd].comp_align); nd++;
|
DETECT_F(double, DOUBLE, d[nd]); nd++;
|
||||||
|
|
||||||
DETECT_F(double, DOUBLE, d[nd]);
|
|
||||||
COMP_ALIGNMENT(double, d[nd].comp_align); nd++;
|
|
||||||
|
|
||||||
#if H5_SIZEOF_DOUBLE == H5_SIZEOF_LONG_DOUBLE
|
#if H5_SIZEOF_DOUBLE == H5_SIZEOF_LONG_DOUBLE
|
||||||
/*
|
/*
|
||||||
@ -1158,14 +1187,18 @@ main(void)
|
|||||||
* some systems and `long double' is probably the same as `double' here
|
* some systems and `long double' is probably the same as `double' here
|
||||||
* anyway.
|
* anyway.
|
||||||
*/
|
*/
|
||||||
DETECT_F(double, LDOUBLE, d[nd]);
|
DETECT_F(double, LDOUBLE, d[nd]); nd++;
|
||||||
COMP_ALIGNMENT(double, d[nd].comp_align); nd++;
|
|
||||||
#else
|
#else
|
||||||
DETECT_F(long double, LDOUBLE, d[nd]);
|
DETECT_F(long double, LDOUBLE, d[nd]); nd++;
|
||||||
COMP_ALIGNMENT(long double, d[nd].comp_align); nd++;
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
print_results (nd, d);
|
/* Detect structure alignment for pointers, hvl_t, hobj_ref_t, hdset_reg_ref_t */
|
||||||
|
DETECT_M(void *, POINTER, m[na]); na++;
|
||||||
|
DETECT_M(hvl_t, HVL, m[na]); na++;
|
||||||
|
DETECT_M(hobj_ref_t, HOBJREF, m[na]); na++;
|
||||||
|
DETECT_M(hdset_reg_ref_t, HDSETREGREF, m[na]); na++;
|
||||||
|
|
||||||
|
print_results (nd, d, na, m);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user