diff options
author | Raymond Lu <songyulu@hdfgroup.org> | 2005-02-05 18:27:04 (GMT) |
---|---|---|
committer | Raymond Lu <songyulu@hdfgroup.org> | 2005-02-05 18:27:04 (GMT) |
commit | c0bbeb909802f33bac72cd3fabaa4311d97d38a9 (patch) | |
tree | 51d7eec1eff1021dc3ebc0062c6e70ed9ce7dda0 /src | |
parent | 7df531486c17d79b196d39fd75cc44f30207c531 (diff) | |
download | hdf5-c0bbeb909802f33bac72cd3fabaa4311d97d38a9.zip hdf5-c0bbeb909802f33bac72cd3fabaa4311d97d38a9.tar.gz hdf5-c0bbeb909802f33bac72cd3fabaa4311d97d38a9.tar.bz2 |
[svn-r9942] Purpose: Minor Bug fix
Description: H5T_NATIVE_SCHAR, H5T_NATIVE_UCHAR were always considered as little
endian due to the algorithm to detect their order in H5detect.c. This error
didn't affect data but didn't look right.
Solution: In H5detect.c, use native int instead to detect order if type size
is only 1 byte.
Platforms tested: h5committest, fuss and arabica
Diffstat (limited to 'src')
-rw-r--r-- | src/H5detect.c | 26 |
1 files changed, 20 insertions, 6 deletions
diff --git a/src/H5detect.c b/src/H5detect.c index b79911d..73ded41 100644 --- a/src/H5detect.c +++ b/src/H5detect.c @@ -195,17 +195,31 @@ precision (detected_t *d) */ #define DETECT_I(TYPE,VAR,INFO) { \ TYPE _v; \ + int _int_v; \ int _i, _j; \ unsigned char *_x; \ + \ memset (&INFO, 0, sizeof(INFO)); \ INFO.varname = #VAR; \ INFO.size = sizeof(TYPE); \ - for (_i=sizeof(TYPE),_v=0; _i>0; --_i) _v = (_v<<8) + _i; \ - for (_i=0,_x=(unsigned char *)&_v; _i<(signed)sizeof(TYPE); _i++) { \ - _j = (*_x++)-1; \ - assert (_j<(signed)sizeof(TYPE)); \ - INFO.perm[_i] = _j; \ - } \ + \ + if(sizeof(TYPE)!=1) { \ + for (_i=sizeof(TYPE),_v=0; _i>0; --_i) _v = (_v<<8) + _i; \ + for (_i=0,_x=(unsigned char *)&_v; _i<(signed)sizeof(TYPE); _i++) { \ + _j = (*_x++)-1; \ + assert (_j<(signed)sizeof(TYPE)); \ + INFO.perm[_i] = _j; \ + } \ + } else { /*Not able to detect order if type size is 1 byte. Use native int \ + *instead. No effect on data, just make it look correct. */ \ + for (_i=sizeof(int),_int_v=0; _i>0; --_i) _int_v = (_int_v<<8) + _i; \ + for (_i=0,_x=(unsigned char *)&_int_v; _i<(signed)sizeof(int); _i++) { \ + _j = (*_x++)-1; \ + assert (_j<(signed)sizeof(int)); \ + INFO.perm[_i] = _j; \ + } \ + } \ + \ INFO.sign = ('U'!=*(#VAR)); \ precision (&(INFO)); \ ALIGNMENT(TYPE, INFO); \ |