You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
120 lines
3.0 KiB
120 lines
3.0 KiB
diff -up mhash-0.9.9.9/lib/stdfns.c.BAD mhash-0.9.9.9/lib/stdfns.c
|
|
--- mhash-0.9.9.9/lib/stdfns.c.BAD 2009-07-02 16:38:43.217029623 -0400
|
|
+++ mhash-0.9.9.9/lib/stdfns.c 2009-07-02 16:41:58.647120391 -0400
|
|
@@ -152,6 +152,18 @@ mutils_bzero(void *s, __const mutils_wor
|
|
}
|
|
}
|
|
|
|
+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)
|
|
@@ -160,8 +172,7 @@ mutils_memset(void *s, __const mutils_wo
|
|
/* Sparc needs 8-bit alignment - just use standard memset */
|
|
memset(s, (int) c, (size_t) n);
|
|
#else
|
|
- mutils_word8 *stmp;
|
|
- mutils_word32 *ltmp = (mutils_word32 *) s;
|
|
+ mutils_word32 *ltmp;
|
|
mutils_word32 lump;
|
|
mutils_word32 i;
|
|
mutils_word32 words;
|
|
@@ -172,22 +183,30 @@ mutils_memset(void *s, __const mutils_wo
|
|
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++)
|
|
{
|
|
*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);
|
|
#endif
|
|
}
|
|
|
|
@@ -281,6 +300,9 @@ mutils_word32nswap(mutils_word32 *x, mut
|
|
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)
|
|
@@ -301,9 +323,35 @@ mutils_word32nswap(mutils_word32 *x, mut
|
|
* data on a little-endian machine.
|
|
*/
|
|
|
|
- for (loop = 0, ptrIn = x, ptrOut = buffer; loop < n; loop++, ptrOut++, ptrIn++)
|
|
+ if ((mutils_word32)x & 0x3)
|
|
+ {
|
|
+ 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
|
|
{
|
|
- *ptrOut = mutils_lend32(*ptrIn);
|
|
+ for (loop = 0, ptrIn = x, ptrOut = buffer; loop < n; loop++, ptrOut++, ptrIn++)
|
|
+ {
|
|
+ *ptrOut = mutils_lend32(*ptrIn);
|
|
+ }
|
|
}
|
|
|
|
return(buffer);
|