From f5e2060927bafaf83893756c3b1ccca10f85db2b Mon Sep 17 00:00:00 2001 From: jshepher <> Date: Sat, 4 Dec 2004 22:38:39 +0000 Subject: [PATCH] Reimplemented bzero, bcopy and memset again. The previous ones had subtle errors which crashed things. --- libnix/sources/nix/misc/bcopy.c | 9 ++++++--- libnix/sources/nix/misc/bzero.c | 6 +++++- libnix/sources/nix/string/memset.c | 20 ++++---------------- 3 files changed, 15 insertions(+), 20 deletions(-) diff --git a/libnix/sources/nix/misc/bcopy.c b/libnix/sources/nix/misc/bcopy.c index 6277d55..9339ace 100755 --- a/libnix/sources/nix/misc/bcopy.c +++ b/libnix/sources/nix/misc/bcopy.c @@ -1,9 +1,12 @@ #include #include -/* This is a _fast_ block move routine! */ - void bcopy(const void *s1,void *s2,size_t n) { - memcpy(s2, s1, n); + unsigned char *ch1 = s1; + unsigned char *ch2 = s2; + while (n > 0) { + *ch2++ = *ch1++; + n--; + } } diff --git a/libnix/sources/nix/misc/bzero.c b/libnix/sources/nix/misc/bzero.c index 2b3ce00..e694d00 100755 --- a/libnix/sources/nix/misc/bzero.c +++ b/libnix/sources/nix/misc/bzero.c @@ -2,5 +2,9 @@ void bzero(void *b,size_t n) { - memset(b, 0, n); + unsigned char *ch = (unsigned char *)b; + while (n > 0) { + *ch++ = 0; + n--; + } } diff --git a/libnix/sources/nix/string/memset.c b/libnix/sources/nix/string/memset.c index 5d701d0..6c6f693 100755 --- a/libnix/sources/nix/string/memset.c +++ b/libnix/sources/nix/string/memset.c @@ -2,22 +2,10 @@ void *memset(void *s,int c,size_t n) { - unsigned long *p = (unsigned long *)s; - unsigned char chr = (unsigned char)c; - unsigned long lc = (chr << 24) | (chr << 16) | (chr << 8) | chr; - unsigned char *ch; - size_t i; - size_t num = n / 4; - size_t remain = n % 4; - - /* Do LONG operations most of the time to optimize memory bandwidth */ - for (i = 0; i < num; i++) { - *p++ = lc; - } - - ch = (unsigned char *)p; - for (i = 0; i < remain; i++) { - *ch++ = chr; + unsigned char *ch = (unsigned char *)s; + while (n > 0) { + *ch++ = c; + n--; } return s; }