diff -ur mhash-0.9.9.orig/lib/stdfns.c mhash-0.9.9/lib/stdfns.c --- mhash-0.9.9.orig/lib/stdfns.c Wed Apr 4 21:18:42 2007 +++ mhash-0.9.9/lib/stdfns.c Mon May 28 16:08:38 2007 @@ -152,12 +152,23 @@ } } +static void +mutils_memset8(void *s, __const mutils_word8 c, __const mutils_word32 n) +{ + mutils_word8 *stmp = s; + mutils_word32 i; + + for (i = 0; i < n; i++, stmp++) + { + *stmp = c; + } +} + WIN32DLL_DEFINE void mutils_memset(void *s, __const mutils_word8 c, __const mutils_word32 n) { - mutils_word8 *stmp; - mutils_word32 *ltmp = (mutils_word32 *) s; + mutils_word32 *ltmp; mutils_word32 lump; mutils_word32 i; mutils_word32 words; @@ -168,10 +179,22 @@ return; } + if (n < 16) + { + return mutils_memset8(s, c, n); + } + + /* unaligned portion at beginning */ + remainder = (-(mutils_word32)s) & 0x3; + mutils_memset8(s, c, remainder); + + /* aligned words in the middle */ + ltmp = (mutils_word32 *) (s + remainder); + lump = (c << 24) + (c << 16) + (c << 8) + c; - words = n >> 2; - remainder = n - (words << 2); + words = (n - remainder) >> 2; + remainder = n - remainder - (words << 2); for (i = 0; i < words; i++, ltmp++) { @@ -178,12 +201,8 @@ *ltmp = lump; } - stmp = (mutils_word8 *) ltmp; - - for (i = 0; i < remainder; i++, stmp++) - { - *stmp = c; - } + /* unaligned portion at end */ + return mutils_memset8(ltmp, c, remainder); } static void @@ -275,6 +294,9 @@ mutils_word32 *buffer; mutils_word32 *ptrIn; mutils_word32 *ptrOut; + mutils_word8 *ptr8In; + mutils_word8 *ptr8Out; + mutils_word8 tmp8; mutils_word32 count = n * 4; if (destructive == MUTILS_FALSE) @@ -295,10 +317,36 @@ * data on a little-endian machine. */ - for (loop = 0, ptrIn = x, ptrOut = buffer; loop < n; loop++, ptrOut++, ptrIn++) + if ((mutils_word32)x & 0x3) { - *ptrOut = mutils_lend32(*ptrIn); + ptr8In = (mutils_word8 *) x; + ptr8Out = (mutils_word8 *) buffer; + for (loop = 0; loop < n; loop++) + { +#ifdef WORDS_BIGENDIAN + tmp8 = ptr8In[0]; + ptr8Out[0] = ptr8In[3]; + ptr8Out[3] = tmp8; + tmp8 = ptr8In[1]; + ptr8Out[1] = ptr8In[2]; + ptr8Out[2] = tmp8; +#else + ptr8Out[0] = ptr8In[0]; + ptr8Out[1] = ptr8In[1]; + ptr8Out[2] = ptr8In[2]; + ptr8Out[3] = ptr8In[3]; +#endif + ptr8Out += 4; + ptr8In += 4; + } } + else + { + for (loop = 0, ptrIn = x, ptrOut = buffer; loop < n; loop++, ptrOut++, ptrIn++) + { + *ptrOut = mutils_lend32(*ptrIn); + } + } return(buffer); }