From a41c51783a45bc01ef9584e72a6d3064b2c7771a Mon Sep 17 00:00:00 2001 From: eck Date: Tue, 28 Aug 1990 13:54:46 +0000 Subject: [PATCH] improved the speed somewhat fixed bug with negative chars in comparisons --- lang/cem/libcc.ansi/string/memchr.c | 16 +++++++++------- lang/cem/libcc.ansi/string/memcmp.c | 8 +++++--- lang/cem/libcc.ansi/string/memcpy.c | 8 +++++--- lang/cem/libcc.ansi/string/memmove.c | 27 +++++++++++++++------------ lang/cem/libcc.ansi/string/memset.c | 10 ++++++---- lang/cem/libcc.ansi/string/strchr.c | 14 ++++++-------- lang/cem/libcc.ansi/string/strcmp.c | 11 ++++++----- lang/cem/libcc.ansi/string/strcoll.c | 9 ++++----- lang/cem/libcc.ansi/string/strerror.c | 4 ++++ lang/cem/libcc.ansi/string/strlen.c | 2 +- lang/cem/libcc.ansi/string/strncat.c | 17 ++++++++--------- lang/cem/libcc.ansi/string/strncmp.c | 19 ++++++++++++------- lang/cem/libcc.ansi/string/strncpy.c | 17 +++++++++-------- lang/cem/libcc.ansi/string/strrchr.c | 10 +++++----- lang/cem/libcc.ansi/string/strstr.c | 2 +- lang/cem/libcc.ansi/string/strtok.c | 13 +++++++------ lang/cem/libcc.ansi/string/strxfrm.c | 2 +- 17 files changed, 104 insertions(+), 85 deletions(-) diff --git a/lang/cem/libcc.ansi/string/memchr.c b/lang/cem/libcc.ansi/string/memchr.c index b91644a29..eb3086984 100644 --- a/lang/cem/libcc.ansi/string/memchr.c +++ b/lang/cem/libcc.ansi/string/memchr.c @@ -7,15 +7,17 @@ #include 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; - unsigned char c1 = (unsigned char) c; - - while (n > 0) { - n--; - if (*s1++ == c1) - return (void *) (s1 - 1); + + c = (unsigned char) c; + if (n) { + n++; + while (--n > 0) { + if (*s1++ != c) continue; + return (void *) --s1; + } } return NULL; } diff --git a/lang/cem/libcc.ansi/string/memcmp.c b/lang/cem/libcc.ansi/string/memcmp.c index 8ae481b33..c10f07e58 100644 --- a/lang/cem/libcc.ansi/string/memcmp.c +++ b/lang/cem/libcc.ansi/string/memcmp.c @@ -11,10 +11,12 @@ memcmp(const void *s1, const void *s2, size_t n) { register const char *p1 = s1, *p2 = s2; - while (n > 0) { - n--; - if (*p1++ != *p2++) + if (n) { + n++; + while (--n > 0) { + if (*p1++ == *p2++) continue; return *--p1 - *--p2; + } } return 0; } diff --git a/lang/cem/libcc.ansi/string/memcpy.c b/lang/cem/libcc.ansi/string/memcpy.c index cb632daaf..6082fa4c1 100644 --- a/lang/cem/libcc.ansi/string/memcpy.c +++ b/lang/cem/libcc.ansi/string/memcpy.c @@ -13,9 +13,11 @@ memcpy(void *s1, const void *s2, register size_t n) register const char *p2 = s2; - while (n > 0) { - n--; - *p1++ = *p2++; + if (n) { + n++; + while (--n > 0) { + *p1++ = *p2++; + } } return s1; } diff --git a/lang/cem/libcc.ansi/string/memmove.c b/lang/cem/libcc.ansi/string/memmove.c index 33c7f5b74..e8d653993 100644 --- a/lang/cem/libcc.ansi/string/memmove.c +++ b/lang/cem/libcc.ansi/string/memmove.c @@ -12,18 +12,21 @@ memmove(void *s1, const void *s2, register size_t n) register char *p1 = s1; register const char *p2 = s2; - if (p2 <= p1 && p2 + (n-1) >= p1) { - /* overlap, copy backwards */ - p1 += n; - p2 += n; - while (n > 0) { - n--; - *--p1 = *--p2; - } - } else - while (n > 0) { - n--; - *p1++ = *p2++; + if (n>0) { + if (p2 <= p1 && p2 + n > p1) { + /* overlap, copy backwards */ + p1 += n; + p2 += n; + n++; + while (--n > 0) { + *--p1 = *--p2; + } + } else { + n++; + while (--n > 0) { + *p1++ = *p2++; + } } + } return s1; } diff --git a/lang/cem/libcc.ansi/string/memset.c b/lang/cem/libcc.ansi/string/memset.c index 469de4f16..2138cf35e 100644 --- a/lang/cem/libcc.ansi/string/memset.c +++ b/lang/cem/libcc.ansi/string/memset.c @@ -7,13 +7,15 @@ #include void * -memset(void *s, int c, register size_t n) +memset(void *s, register int c, register size_t n) { register char *s1 = s; - while (n > 0) { - n--; - *s1++ = c; + if (n>0) { + n++; + while (--n > 0) { + *s1++ = c; + } } return s; } diff --git a/lang/cem/libcc.ansi/string/strchr.c b/lang/cem/libcc.ansi/string/strchr.c index 979f4354d..4c738c39c 100644 --- a/lang/cem/libcc.ansi/string/strchr.c +++ b/lang/cem/libcc.ansi/string/strchr.c @@ -7,14 +7,12 @@ #include 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 { - if (*s == c1) - return (char *)s; - } while (*s++ != '\0'); - - return (char *)NULL; + while (c != *s) { + if (*s++ == '\0') return NULL; + } + return (char *)s; } diff --git a/lang/cem/libcc.ansi/string/strcmp.c b/lang/cem/libcc.ansi/string/strcmp.c index 19813ffaf..3c3b06ebe 100644 --- a/lang/cem/libcc.ansi/string/strcmp.c +++ b/lang/cem/libcc.ansi/string/strcmp.c @@ -9,11 +9,12 @@ int strcmp(register const char *s1, register const char *s2) { - for(;;) { - if (*s1 != *s2) - return *s1 - *s2; - if (*s1++ == '\0') + while (*s1 == *s2++) { + if (*s1++ == '\0') { return 0; - s2++; + } } + if (*s1 == '\0') return -1; + if (*--s2 == '\0') return 1; + return *s1 - *s2; } diff --git a/lang/cem/libcc.ansi/string/strcoll.c b/lang/cem/libcc.ansi/string/strcoll.c index 36d0a5f7c..0d2ddda96 100644 --- a/lang/cem/libcc.ansi/string/strcoll.c +++ b/lang/cem/libcc.ansi/string/strcoll.c @@ -10,11 +10,10 @@ int strcoll(register const char *s1, register const char *s2) { - for(;;) { - if (*s1 != *s2) - return *s1 - *s2; - if (*s1++ == '\0') + while (*s1 == *s2++) { + if (*s1++ == '\0') { return 0; - s2++; + } } + return *s1 - *--s2; } diff --git a/lang/cem/libcc.ansi/string/strerror.c b/lang/cem/libcc.ansi/string/strerror.c index a5841c7c8..ee110ebfe 100644 --- a/lang/cem/libcc.ansi/string/strerror.c +++ b/lang/cem/libcc.ansi/string/strerror.c @@ -6,6 +6,10 @@ #include +/* + * I don't know why, but X3J11 says that strerror() should be in declared + * in . That is why the function is defined here. + */ char * strerror(register int errnum) { diff --git a/lang/cem/libcc.ansi/string/strlen.c b/lang/cem/libcc.ansi/string/strlen.c index 78be8c1a5..ff673e1df 100644 --- a/lang/cem/libcc.ansi/string/strlen.c +++ b/lang/cem/libcc.ansi/string/strlen.c @@ -14,5 +14,5 @@ strlen(const char *org) while (*s++) /* EMPTY */ ; - return (s - 1) - org; + return --s - org; } diff --git a/lang/cem/libcc.ansi/string/strncat.c b/lang/cem/libcc.ansi/string/strncat.c index 706b8d419..6a0a3b0ca 100644 --- a/lang/cem/libcc.ansi/string/strncat.c +++ b/lang/cem/libcc.ansi/string/strncat.c @@ -11,16 +11,15 @@ strncat(char *ret, register const char *s2, size_t n) { register char *s1 = ret; - if (n <= 0) - return s1; - while (*s1++) - /* EMPTY */ ; - s1--; - while (*s1++ = *s2++) { - if (--n == 0) { + if (n > 0) { + while (*s1++) + /* EMPTY */ ; + s1--; + while (*s1++ = *s2++) { + if (--n > 0) continue; *s1 = '\0'; break; } - } - return ret; + return ret; + } else return s1; } diff --git a/lang/cem/libcc.ansi/string/strncmp.c b/lang/cem/libcc.ansi/string/strncmp.c index 3bbac1b2c..ad44ac913 100644 --- a/lang/cem/libcc.ansi/string/strncmp.c +++ b/lang/cem/libcc.ansi/string/strncmp.c @@ -7,15 +7,20 @@ #include 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) { - n--; - if (*s1 != *s2) + if (n) { + do { + 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; - if (*s1++ == '\0') - return 0; - s2++; + } } return 0; } diff --git a/lang/cem/libcc.ansi/string/strncpy.c b/lang/cem/libcc.ansi/string/strncpy.c index 907da62e5..ed3195fdc 100644 --- a/lang/cem/libcc.ansi/string/strncpy.c +++ b/lang/cem/libcc.ansi/string/strncpy.c @@ -7,17 +7,18 @@ #include 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; - while (*s2 && n > 0) { - n--; - *s1++ = *s2++; - } - while (n > 0) { - n--; - *s1++ = '\0'; + if (n>0) { + while((*s1++ = *s2++) && --n > 0) + /* EMPTY */ ; + if ((*--s2 == '\0') && --n > 0) { + do { + *s1++ = '\0'; + } while(--n > 0); + } } return ret; } diff --git a/lang/cem/libcc.ansi/string/strrchr.c b/lang/cem/libcc.ansi/string/strrchr.c index e98d8d7cf..0d350532b 100644 --- a/lang/cem/libcc.ansi/string/strrchr.c +++ b/lang/cem/libcc.ansi/string/strrchr.c @@ -9,14 +9,14 @@ char * strrchr(register const char *s, int c) { - register const char *result; - register char c1 = (char) c; + register const char *result = NULL; + + c = (char) c; - result = (char *)NULL; do { - if (*s == c1) + if (c == *s) result = s; - } while (*s++); + } while (*s++ != '\0'); return (char *)result; } diff --git a/lang/cem/libcc.ansi/string/strstr.c b/lang/cem/libcc.ansi/string/strstr.c index 4c2b23444..2c7a4beb2 100644 --- a/lang/cem/libcc.ansi/string/strstr.c +++ b/lang/cem/libcc.ansi/string/strstr.c @@ -9,7 +9,7 @@ char * 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; while (*s != *wanted || strncmp(s, wanted, len)) diff --git a/lang/cem/libcc.ansi/string/strtok.c b/lang/cem/libcc.ansi/string/strtok.c index 6b5e9f22b..f0788499c 100644 --- a/lang/cem/libcc.ansi/string/strtok.c +++ b/lang/cem/libcc.ansi/string/strtok.c @@ -12,18 +12,19 @@ strtok(register char *string, const char *separators) register char *s1, *s2; static char *savestring; - if (!string) + if (string == NULL) { string = savestring; + if (string == NULL) return (char *)NULL; + } - if (!string) - return (char *)NULL; - - if (*(s1 = string + strspn(string, separators)) == '\0') { + s1 = string + strspn(string, separators); + if (*s1 == '\0') { savestring = NULL; return (char *)NULL; } - if (s2 = strpbrk(s1, separators)) + s2 = strpbrk(s1, separators); + if (s2 != NULL) *s2++ = '\0'; savestring = s2; return s1; diff --git a/lang/cem/libcc.ansi/string/strxfrm.c b/lang/cem/libcc.ansi/string/strxfrm.c index 6b3daf5c6..ca32913e0 100644 --- a/lang/cem/libcc.ansi/string/strxfrm.c +++ b/lang/cem/libcc.ansi/string/strxfrm.c @@ -18,7 +18,7 @@ strxfrm(register char *s1, register const char *save, register size_t n) } else s2++; } - if (n >= 1) + if (n > 0) *s1++ = '\0'; return s2 - save; } -- 2.34.1