diff options
author | Andrew Waterman <waterman@s141.Millennium.Berkeley.EDU> | 2011-06-01 00:21:04 -0700 |
---|---|---|
committer | Andrew Waterman <waterman@s141.Millennium.Berkeley.EDU> | 2011-06-01 00:21:04 -0700 |
commit | 13c751687d01dc59bfd3e0913cecadf17f025caa (patch) | |
tree | b0695be27ac3b1e14aa944c4820683fcd8adefca | |
parent | 81a089d4ad784742adb4f13415a7fa26d9b7e504 (diff) | |
download | pk-13c751687d01dc59bfd3e0913cecadf17f025caa.zip pk-13c751687d01dc59bfd3e0913cecadf17f025caa.tar.gz pk-13c751687d01dc59bfd3e0913cecadf17f025caa.tar.bz2 |
[pk] fixed memset bug (again...)
-rw-r--r-- | pk/memset.c | 18 |
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; |