mirror of
https://github.com/cahirwpz/libnix.git
synced 2026-01-11 23:26:09 +00:00
Reimplemented bzero, bcopy and memset again. The previous ones had
subtle errors which crashed things.
This commit is contained in:
@ -1,9 +1,12 @@
|
|||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
/* This is a _fast_ block move routine! */
|
|
||||||
|
|
||||||
void bcopy(const void *s1,void *s2,size_t n)
|
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--;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -2,5 +2,9 @@
|
|||||||
|
|
||||||
void bzero(void *b,size_t n)
|
void bzero(void *b,size_t n)
|
||||||
{
|
{
|
||||||
memset(b, 0, n);
|
unsigned char *ch = (unsigned char *)b;
|
||||||
|
while (n > 0) {
|
||||||
|
*ch++ = 0;
|
||||||
|
n--;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -2,22 +2,10 @@
|
|||||||
|
|
||||||
void *memset(void *s,int c,size_t n)
|
void *memset(void *s,int c,size_t n)
|
||||||
{
|
{
|
||||||
unsigned long *p = (unsigned long *)s;
|
unsigned char *ch = (unsigned char *)s;
|
||||||
unsigned char chr = (unsigned char)c;
|
while (n > 0) {
|
||||||
unsigned long lc = (chr << 24) | (chr << 16) | (chr << 8) | chr;
|
*ch++ = c;
|
||||||
unsigned char *ch;
|
n--;
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
return s;
|
return s;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user