summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorRaymond Lu <songyulu@hdfgroup.org>2003-06-16 15:44:14 (GMT)
committerRaymond Lu <songyulu@hdfgroup.org>2003-06-16 15:44:14 (GMT)
commit20848c55fd4277e7a24bf8f3860e3a20033f0f22 (patch)
treec1c9955af755b108a9ae1b18dd1690ed5a4937ad /src
parent6f94c274c44066ce00d19dc58a479aab2ca553dc (diff)
downloadhdf5-20848c55fd4277e7a24bf8f3860e3a20033f0f22.zip
hdf5-20848c55fd4277e7a24bf8f3860e3a20033f0f22.tar.gz
hdf5-20848c55fd4277e7a24bf8f3860e3a20033f0f22.tar.bz2
[svn-r7042] Purpose: bug fix
Description: H5Tget_native_type fails on Cray for compound datatype. Solution: there's size comfusion in the library on H5T_get_native_int function Platforms tested: Cray, h5committest Misc. update:
Diffstat (limited to 'src')
-rw-r--r--src/H5Tnative.c98
1 files changed, 68 insertions, 30 deletions
diff --git a/src/H5Tnative.c b/src/H5Tnative.c
index 4516ddd..6248e27 100644
--- a/src/H5Tnative.c
+++ b/src/H5Tnative.c
@@ -524,6 +524,7 @@ H5T_get_native_integer(size_t size, H5T_sign_t sign, H5T_direction_t direction,
H5T_t *dt; /* Appropriate native datatype to copy */
hid_t tid=(-1); /* Datatype ID of appropriate native datatype */
size_t align=0; /* Alignment necessary for native datatype */
+ size_t native_size=0; /* Datatype size of the native type */
enum match_type { /* The different kinds of integers we can match */
H5T_NATIVE_INT_MATCH_CHAR,
H5T_NATIVE_INT_MATCH_SHORT,
@@ -539,47 +540,69 @@ H5T_get_native_integer(size_t size, H5T_sign_t sign, H5T_direction_t direction,
assert(size>0);
if(direction == H5T_DIR_DEFAULT || direction == H5T_DIR_ASCEND) {
- if(size<=sizeof(char))
+ if(size<=sizeof(char)) {
match=H5T_NATIVE_INT_MATCH_CHAR;
- else if(size<=sizeof(short))
+ native_size = sizeof(char);
+ } else if(size<=sizeof(short)) {
match=H5T_NATIVE_INT_MATCH_SHORT;
- else if(size<=sizeof(int))
+ native_size = sizeof(short);
+ } else if(size<=sizeof(int)) {
match=H5T_NATIVE_INT_MATCH_INT;
- else if(size<=sizeof(long))
+ native_size = sizeof(int);
+ } else if(size<=sizeof(long)) {
match=H5T_NATIVE_INT_MATCH_LONG;
- else if(size<=sizeof(long_long))
+ native_size = sizeof(long);
+ } else if(size<=sizeof(long_long)) {
match=H5T_NATIVE_INT_MATCH_LLONG;
- else /* If no native type matches the querried datatype, simply choose the type of biggest size. */
+ native_size = sizeof(long long);
+ } else { /* If no native type matches the querried datatype, simply choose the type of biggest size. */
match=H5T_NATIVE_INT_MATCH_LLONG;
+ native_size = sizeof(long long);
+ }
} else if(direction == H5T_DIR_DESCEND) {
- if(size>=sizeof(long_long))
+ if(size>=sizeof(long_long)) {
match=H5T_NATIVE_INT_MATCH_LLONG;
- else if(size>=sizeof(long)) {
- if(size==sizeof(long))
+ native_size = sizeof(long long);
+ } else if(size>=sizeof(long)) {
+ if(size==sizeof(long)) {
match=H5T_NATIVE_INT_MATCH_LONG;
- else
+ native_size = sizeof(long);
+ } else {
match=H5T_NATIVE_INT_MATCH_LLONG;
+ native_size = sizeof(long long);
+ }
}
else if(size>=sizeof(int)) {
- if(size==sizeof(int))
+ if(size==sizeof(int)) {
match=H5T_NATIVE_INT_MATCH_INT;
- else
+ native_size = sizeof(int);
+ } else {
match=H5T_NATIVE_INT_MATCH_LONG;
+ native_size = sizeof(long);
+ }
}
else if(size>=sizeof(short)) {
- if(size==sizeof(short))
+ if(size==sizeof(short)) {
match=H5T_NATIVE_INT_MATCH_SHORT;
- else
+ native_size = sizeof(short);
+ } else {
match=H5T_NATIVE_INT_MATCH_INT;
+ native_size = sizeof(int);
+ }
}
else if(size>=sizeof(char)) {
- if(size==sizeof(char))
+ if(size==sizeof(char)) {
match=H5T_NATIVE_INT_MATCH_CHAR;
- else
+ native_size = sizeof(char);
+ } else {
match=H5T_NATIVE_INT_MATCH_SHORT;
+ native_size = sizeof(short);
+ }
}
- else /* If no native type matches the querried datatype, simple choose the type of smallest size. */
+ else { /* If no native type matches the querried datatype, simple choose the type of smallest size. */
match=H5T_NATIVE_INT_MATCH_CHAR;
+ native_size = sizeof(char);
+ }
}
/* Set the appropriate native datatype information */
@@ -641,7 +664,7 @@ H5T_get_native_integer(size_t size, H5T_sign_t sign, H5T_direction_t direction,
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "cannot retrieve float type");
/* compute size and offset of compound type member. */
- if(H5T_cmp_offset(comp_size, offset, size, 1, align, struct_align)<0)
+ if(H5T_cmp_offset(comp_size, offset, native_size, 1, align, struct_align)<0)
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "cannot compute compound offset");
done:
@@ -671,6 +694,7 @@ H5T_get_native_float(size_t size, H5T_direction_t direction, size_t *struct_alig
H5T_t *dt=NULL; /* Appropriate native datatype to copy */
hid_t tid=(-1); /* Datatype ID of appropriate native datatype */
size_t align=0; /* Alignment necessary for native datatype */
+ size_t native_size=0; /* Datatype size of the native type */
enum match_type { /* The different kinds of floating point types we can match */
H5T_NATIVE_FLOAT_MATCH_FLOAT,
H5T_NATIVE_FLOAT_MATCH_DOUBLE,
@@ -684,31 +708,45 @@ H5T_get_native_float(size_t size, H5T_direction_t direction, size_t *struct_alig
assert(size>0);
if(direction == H5T_DIR_DEFAULT || direction == H5T_DIR_ASCEND) {
- if(size<=sizeof(float))
+ if(size<=sizeof(float)) {
match=H5T_NATIVE_FLOAT_MATCH_FLOAT;
- else if(size<=sizeof(double))
+ native_size = sizeof(float);
+ } else if(size<=sizeof(double)) {
match=H5T_NATIVE_FLOAT_MATCH_DOUBLE;
- else if(size<=sizeof(long double))
+ native_size = sizeof(double);
+ } else if(size<=sizeof(long double)) {
match=H5T_NATIVE_FLOAT_MATCH_LDOUBLE;
- else /* If not match, return the biggest datatype */
+ native_size = sizeof(long double);
+ } else { /* If not match, return the biggest datatype */
match=H5T_NATIVE_FLOAT_MATCH_LDOUBLE;
+ native_size = sizeof(long);
+ }
} else {
- if(size>=sizeof(long double))
+ if(size>=sizeof(long double)) {
match=H5T_NATIVE_FLOAT_MATCH_LDOUBLE;
- else if(size>=sizeof(double)) {
- if(size==sizeof(double))
+ native_size = sizeof(long double);
+ } else if(size>=sizeof(double)) {
+ if(size==sizeof(double)) {
match=H5T_NATIVE_FLOAT_MATCH_DOUBLE;
- else
+ native_size = sizeof(double);
+ } else {
match=H5T_NATIVE_FLOAT_MATCH_LDOUBLE;
+ native_size = sizeof(long double);
+ }
}
else if(size>=sizeof(float)) {
- if(size==sizeof(float))
+ if(size==sizeof(float)) {
match=H5T_NATIVE_FLOAT_MATCH_FLOAT;
- else
+ native_size = sizeof(float);
+ } else {
match=H5T_NATIVE_FLOAT_MATCH_DOUBLE;
+ native_size = sizeof(double);
+ }
}
- else
+ else {
match=H5T_NATIVE_FLOAT_MATCH_FLOAT;
+ native_size = sizeof(float);
+ }
}
/* Set the appropriate native floating point information */
@@ -741,7 +779,7 @@ H5T_get_native_float(size_t size, H5T_direction_t direction, size_t *struct_alig
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "cannot retrieve float type");
/* compute offset of compound type member. */
- if(H5T_cmp_offset(comp_size, offset, size, 1, align, struct_align)<0)
+ if(H5T_cmp_offset(comp_size, offset, native_size, 1, align, struct_align)<0)
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "cannot compute compound offset");
done: