From 5ca872006352d1a586d3d3f0d9770e122393a573 Mon Sep 17 00:00:00 2001 From: Pedro Vicente Nunes Date: Wed, 10 Mar 2004 19:23:55 -0500 Subject: [svn-r8251] Purpose: bug fix Description: the fletcher filter used a temporary 2 byte word buffer to compute the checksum. this is non portable between big-endian/little endian. Solution: replaced with a buffer of 1 byte type Platforms tested: linux solaris solaris 64 bit AIX windows Misc. update: --- release_docs/RELEASE.txt | 2 ++ src/H5Zfletcher32.c | 18 +++++++----------- 2 files changed, 9 insertions(+), 11 deletions(-) diff --git a/release_docs/RELEASE.txt b/release_docs/RELEASE.txt index ad221e7..567610a 100644 --- a/release_docs/RELEASE.txt +++ b/release_docs/RELEASE.txt @@ -109,6 +109,8 @@ Bug Fixes since HDF5-1.6.0 release Library ------- + - Fixed problem with fletcher32 filter when converting data of different + endianess. PVN 2004/03/10 - Fixed problem with H5Tget_native_type() not handling opaque fields correctly. QAK - 2004/01/31 - Fixed several errors in B-tree deletion code which could cause a diff --git a/src/H5Zfletcher32.c b/src/H5Zfletcher32.c index 61340a0..1fd346e 100644 --- a/src/H5Zfletcher32.c +++ b/src/H5Zfletcher32.c @@ -63,20 +63,18 @@ const H5Z_class_t H5Z_FLETCHER32[1] = {{ * Programmer: Raymond Lu * Jan 3, 2003 * - * Modifications: + * Modifications: Pedro Vicente, March 10, 2004 + * defined *SRC as unsigned char for all cases * *------------------------------------------------------------------------- */ + static uint32_t H5Z_filter_fletcher32_compute(void *_src, size_t len) { -#if H5_SIZEOF_UINT16_T==2 - uint16_t *src=(uint16_t *)_src; -#else /* H5_SIZEOF_UINT16_T */ - /*To handle unusual platforms like Cray*/ unsigned char *src=(unsigned char *)_src; + /*To handle unusual platforms like Cray*/ unsigned short tmp_src; -#endif /* H5_SIZEOF_UINT16_T */ size_t count = len; /* Number of bytes left to checksum */ uint32_t s1 = 0, s2 = 0; /* Temporary partial checksums */ @@ -84,15 +82,12 @@ H5Z_filter_fletcher32_compute(void *_src, size_t len) /* Compute checksum */ while(count > 1) { -#if H5_SIZEOF_UINT16_T==2 - /*For normal platforms*/ - s1 += *src++; -#else /* H5_SIZEOF_UINT16_T */ + /*To handle unusual platforms like Cray*/ tmp_src = (((unsigned short)src[0])<<8) | ((unsigned short)src[1]); src +=2; s1 += tmp_src; -#endif /* H5_SIZEOF_UINT16_T */ + if(s1 & 0xFFFF0000) { /*Wrap around carry if occurred*/ s1 &= 0xFFFF; s1++; @@ -121,6 +116,7 @@ H5Z_filter_fletcher32_compute(void *_src, size_t len) FUNC_LEAVE_NOAPI((s2 << 16) + s1) } + /*------------------------------------------------------------------------- * Function: H5Z_filter_fletcher32 -- cgit v0.12