improved the speed somewhat
fixed bug with negative chars in comparisons
This commit is contained in:
parent
cd1f6c38a4
commit
a41c51783a
17 changed files with 104 additions and 85 deletions
|
@ -7,15 +7,17 @@
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
void *
|
void *
|
||||||
memchr(const void *s, int c, register size_t n)
|
memchr(const void *s, register int c, register size_t n)
|
||||||
{
|
{
|
||||||
register const unsigned char *s1 = s;
|
register const unsigned char *s1 = s;
|
||||||
unsigned char c1 = (unsigned char) c;
|
|
||||||
|
c = (unsigned char) c;
|
||||||
while (n > 0) {
|
if (n) {
|
||||||
n--;
|
n++;
|
||||||
if (*s1++ == c1)
|
while (--n > 0) {
|
||||||
return (void *) (s1 - 1);
|
if (*s1++ != c) continue;
|
||||||
|
return (void *) --s1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
|
@ -11,10 +11,12 @@ memcmp(const void *s1, const void *s2, size_t n)
|
||||||
{
|
{
|
||||||
register const char *p1 = s1, *p2 = s2;
|
register const char *p1 = s1, *p2 = s2;
|
||||||
|
|
||||||
while (n > 0) {
|
if (n) {
|
||||||
n--;
|
n++;
|
||||||
if (*p1++ != *p2++)
|
while (--n > 0) {
|
||||||
|
if (*p1++ == *p2++) continue;
|
||||||
return *--p1 - *--p2;
|
return *--p1 - *--p2;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -13,9 +13,11 @@ memcpy(void *s1, const void *s2, register size_t n)
|
||||||
register const char *p2 = s2;
|
register const char *p2 = s2;
|
||||||
|
|
||||||
|
|
||||||
while (n > 0) {
|
if (n) {
|
||||||
n--;
|
n++;
|
||||||
*p1++ = *p2++;
|
while (--n > 0) {
|
||||||
|
*p1++ = *p2++;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return s1;
|
return s1;
|
||||||
}
|
}
|
||||||
|
|
|
@ -12,18 +12,21 @@ memmove(void *s1, const void *s2, register size_t n)
|
||||||
register char *p1 = s1;
|
register char *p1 = s1;
|
||||||
register const char *p2 = s2;
|
register const char *p2 = s2;
|
||||||
|
|
||||||
if (p2 <= p1 && p2 + (n-1) >= p1) {
|
if (n>0) {
|
||||||
/* overlap, copy backwards */
|
if (p2 <= p1 && p2 + n > p1) {
|
||||||
p1 += n;
|
/* overlap, copy backwards */
|
||||||
p2 += n;
|
p1 += n;
|
||||||
while (n > 0) {
|
p2 += n;
|
||||||
n--;
|
n++;
|
||||||
*--p1 = *--p2;
|
while (--n > 0) {
|
||||||
}
|
*--p1 = *--p2;
|
||||||
} else
|
}
|
||||||
while (n > 0) {
|
} else {
|
||||||
n--;
|
n++;
|
||||||
*p1++ = *p2++;
|
while (--n > 0) {
|
||||||
|
*p1++ = *p2++;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
return s1;
|
return s1;
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,13 +7,15 @@
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
void *
|
void *
|
||||||
memset(void *s, int c, register size_t n)
|
memset(void *s, register int c, register size_t n)
|
||||||
{
|
{
|
||||||
register char *s1 = s;
|
register char *s1 = s;
|
||||||
|
|
||||||
while (n > 0) {
|
if (n>0) {
|
||||||
n--;
|
n++;
|
||||||
*s1++ = c;
|
while (--n > 0) {
|
||||||
|
*s1++ = c;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return s;
|
return s;
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,14 +7,12 @@
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
char *
|
char *
|
||||||
strchr(register const char *s, int c)
|
strchr(register const char *s, register int c)
|
||||||
{
|
{
|
||||||
register char c1 = (char) c;
|
c = (char) c;
|
||||||
|
|
||||||
do {
|
while (c != *s) {
|
||||||
if (*s == c1)
|
if (*s++ == '\0') return NULL;
|
||||||
return (char *)s;
|
}
|
||||||
} while (*s++ != '\0');
|
return (char *)s;
|
||||||
|
|
||||||
return (char *)NULL;
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -9,11 +9,12 @@
|
||||||
int
|
int
|
||||||
strcmp(register const char *s1, register const char *s2)
|
strcmp(register const char *s1, register const char *s2)
|
||||||
{
|
{
|
||||||
for(;;) {
|
while (*s1 == *s2++) {
|
||||||
if (*s1 != *s2)
|
if (*s1++ == '\0') {
|
||||||
return *s1 - *s2;
|
|
||||||
if (*s1++ == '\0')
|
|
||||||
return 0;
|
return 0;
|
||||||
s2++;
|
}
|
||||||
}
|
}
|
||||||
|
if (*s1 == '\0') return -1;
|
||||||
|
if (*--s2 == '\0') return 1;
|
||||||
|
return *s1 - *s2;
|
||||||
}
|
}
|
||||||
|
|
|
@ -10,11 +10,10 @@
|
||||||
int
|
int
|
||||||
strcoll(register const char *s1, register const char *s2)
|
strcoll(register const char *s1, register const char *s2)
|
||||||
{
|
{
|
||||||
for(;;) {
|
while (*s1 == *s2++) {
|
||||||
if (*s1 != *s2)
|
if (*s1++ == '\0') {
|
||||||
return *s1 - *s2;
|
|
||||||
if (*s1++ == '\0')
|
|
||||||
return 0;
|
return 0;
|
||||||
s2++;
|
}
|
||||||
}
|
}
|
||||||
|
return *s1 - *--s2;
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,6 +6,10 @@
|
||||||
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
|
/*
|
||||||
|
* I don't know why, but X3J11 says that strerror() should be in declared
|
||||||
|
* in <string.h>. That is why the function is defined here.
|
||||||
|
*/
|
||||||
char *
|
char *
|
||||||
strerror(register int errnum)
|
strerror(register int errnum)
|
||||||
{
|
{
|
||||||
|
|
|
@ -14,5 +14,5 @@ strlen(const char *org)
|
||||||
while (*s++)
|
while (*s++)
|
||||||
/* EMPTY */ ;
|
/* EMPTY */ ;
|
||||||
|
|
||||||
return (s - 1) - org;
|
return --s - org;
|
||||||
}
|
}
|
||||||
|
|
|
@ -11,16 +11,15 @@ strncat(char *ret, register const char *s2, size_t n)
|
||||||
{
|
{
|
||||||
register char *s1 = ret;
|
register char *s1 = ret;
|
||||||
|
|
||||||
if (n <= 0)
|
if (n > 0) {
|
||||||
return s1;
|
while (*s1++)
|
||||||
while (*s1++)
|
/* EMPTY */ ;
|
||||||
/* EMPTY */ ;
|
s1--;
|
||||||
s1--;
|
while (*s1++ = *s2++) {
|
||||||
while (*s1++ = *s2++) {
|
if (--n > 0) continue;
|
||||||
if (--n == 0) {
|
|
||||||
*s1 = '\0';
|
*s1 = '\0';
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
return ret;
|
||||||
return ret;
|
} else return s1;
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,15 +7,20 @@
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
int
|
int
|
||||||
strncmp(register const char *s1, register const char *s2, size_t n)
|
strncmp(register const char *s1, register const char *s2, register size_t n)
|
||||||
{
|
{
|
||||||
while (n > 0) {
|
if (n) {
|
||||||
n--;
|
do {
|
||||||
if (*s1 != *s2)
|
if (*s1 != *s2++)
|
||||||
|
break;
|
||||||
|
if (*s1++ == '\0')
|
||||||
|
return 0;
|
||||||
|
} while (--n > 0);
|
||||||
|
if (n > 0) {
|
||||||
|
if (*s1 == '\0') return -1;
|
||||||
|
if (*--s2 == '\0') return 1;
|
||||||
return *s1 - *s2;
|
return *s1 - *s2;
|
||||||
if (*s1++ == '\0')
|
}
|
||||||
return 0;
|
|
||||||
s2++;
|
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,17 +7,18 @@
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
char *
|
char *
|
||||||
strncpy(char *ret, register const char *s2, size_t n)
|
strncpy(char *ret, register const char *s2, register size_t n)
|
||||||
{
|
{
|
||||||
register char *s1 = ret;
|
register char *s1 = ret;
|
||||||
|
|
||||||
while (*s2 && n > 0) {
|
if (n>0) {
|
||||||
n--;
|
while((*s1++ = *s2++) && --n > 0)
|
||||||
*s1++ = *s2++;
|
/* EMPTY */ ;
|
||||||
}
|
if ((*--s2 == '\0') && --n > 0) {
|
||||||
while (n > 0) {
|
do {
|
||||||
n--;
|
*s1++ = '\0';
|
||||||
*s1++ = '\0';
|
} while(--n > 0);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
|
@ -9,14 +9,14 @@
|
||||||
char *
|
char *
|
||||||
strrchr(register const char *s, int c)
|
strrchr(register const char *s, int c)
|
||||||
{
|
{
|
||||||
register const char *result;
|
register const char *result = NULL;
|
||||||
register char c1 = (char) c;
|
|
||||||
|
c = (char) c;
|
||||||
|
|
||||||
result = (char *)NULL;
|
|
||||||
do {
|
do {
|
||||||
if (*s == c1)
|
if (c == *s)
|
||||||
result = s;
|
result = s;
|
||||||
} while (*s++);
|
} while (*s++ != '\0');
|
||||||
|
|
||||||
return (char *)result;
|
return (char *)result;
|
||||||
}
|
}
|
||||||
|
|
|
@ -9,7 +9,7 @@
|
||||||
char *
|
char *
|
||||||
strstr(register const char *s, register const char *wanted)
|
strstr(register const char *s, register const char *wanted)
|
||||||
{
|
{
|
||||||
int len = strlen(wanted);
|
register const int len = strlen(wanted);
|
||||||
|
|
||||||
if (len == 0) return (char *)s;
|
if (len == 0) return (char *)s;
|
||||||
while (*s != *wanted || strncmp(s, wanted, len))
|
while (*s != *wanted || strncmp(s, wanted, len))
|
||||||
|
|
|
@ -12,18 +12,19 @@ strtok(register char *string, const char *separators)
|
||||||
register char *s1, *s2;
|
register char *s1, *s2;
|
||||||
static char *savestring;
|
static char *savestring;
|
||||||
|
|
||||||
if (!string)
|
if (string == NULL) {
|
||||||
string = savestring;
|
string = savestring;
|
||||||
|
if (string == NULL) return (char *)NULL;
|
||||||
|
}
|
||||||
|
|
||||||
if (!string)
|
s1 = string + strspn(string, separators);
|
||||||
return (char *)NULL;
|
if (*s1 == '\0') {
|
||||||
|
|
||||||
if (*(s1 = string + strspn(string, separators)) == '\0') {
|
|
||||||
savestring = NULL;
|
savestring = NULL;
|
||||||
return (char *)NULL;
|
return (char *)NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (s2 = strpbrk(s1, separators))
|
s2 = strpbrk(s1, separators);
|
||||||
|
if (s2 != NULL)
|
||||||
*s2++ = '\0';
|
*s2++ = '\0';
|
||||||
savestring = s2;
|
savestring = s2;
|
||||||
return s1;
|
return s1;
|
||||||
|
|
|
@ -18,7 +18,7 @@ strxfrm(register char *s1, register const char *save, register size_t n)
|
||||||
} else
|
} else
|
||||||
s2++;
|
s2++;
|
||||||
}
|
}
|
||||||
if (n >= 1)
|
if (n > 0)
|
||||||
*s1++ = '\0';
|
*s1++ = '\0';
|
||||||
return s2 - save;
|
return s2 - save;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue