aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Waterman <waterman@s141.Millennium.Berkeley.EDU>2011-06-01 00:21:04 -0700
committerAndrew Waterman <waterman@s141.Millennium.Berkeley.EDU>2011-06-01 00:21:04 -0700
commit13c751687d01dc59bfd3e0913cecadf17f025caa (patch)
treeb0695be27ac3b1e14aa944c4820683fcd8adefca
parent81a089d4ad784742adb4f13415a7fa26d9b7e504 (diff)
downloadpk-13c751687d01dc59bfd3e0913cecadf17f025caa.zip
pk-13c751687d01dc59bfd3e0913cecadf17f025caa.tar.gz
pk-13c751687d01dc59bfd3e0913cecadf17f025caa.tar.bz2
[pk] fixed memset bug (again...)
-rw-r--r--pk/memset.c18
1 files changed, 15 insertions, 3 deletions
diff --git a/pk/memset.c b/pk/memset.c
index 63815d7..d634138 100644
--- a/pk/memset.c
+++ b/pk/memset.c
@@ -11,6 +11,13 @@ void* memset(void* m, int ch, size_t s)
char* mem = (char*)m;
long* lmem;
+ if(s < sizeof(long))
+ {
+ for(i = 0; i < s; i++)
+ mem[i] = ch;
+ return m;
+ }
+
long l = ch & 0xFF;
l = l | (l << 8);
l = l | (l << 16);
@@ -22,7 +29,7 @@ void* memset(void* m, int ch, size_t s)
*mem++ = ch, s--;
lmem = (long*)mem;
- for(i = 0; i < s/sizeof(long) - 7; i += 8)
+ for(i = 0; i+7 < s/sizeof(long); i += 8)
{
lmem[i+0] = l;
lmem[i+1] = l;
@@ -33,11 +40,16 @@ void* memset(void* m, int ch, size_t s)
lmem[i+6] = l;
lmem[i+7] = l;
}
+ lmem += i;
+ s -= i*sizeof(long);
- for( ; i < s/sizeof(long); i++)
+ for(i = 0; i < s/sizeof(long); i++)
lmem[i] = l;
+ lmem += i;
+ s -= i*sizeof(long);
- for(i *= sizeof(long); i < s; i++)
+ mem = (char*)lmem;
+ for(i = 0; i < s; i++)
mem[i] = ch;
return m;