From 25203222f55f8fc3a270620609ecfee2e151d76b Mon Sep 17 00:00:00 2001 From: pionere Date: Sat, 5 Feb 2022 11:01:25 +0100 Subject: [PATCH] optimize the SDL_str(case)cmp functions --- src/stdlib/SDL_string.c | 52 +++++++++++++++++++++-------------------- 1 file changed, 27 insertions(+), 25 deletions(-) diff --git a/src/stdlib/SDL_string.c b/src/stdlib/SDL_string.c index e23f14a21..133193072 100644 --- a/src/stdlib/SDL_string.c +++ b/src/stdlib/SDL_string.c @@ -1070,13 +1070,16 @@ SDL_strcmp(const char *str1, const char *str2) #if defined(HAVE_STRCMP) return strcmp(str1, str2); #else - while (*str1 && *str2) { - if (*str1 != *str2) + int result; + + while(1) { + result = (int)((unsigned char) *str1 - (unsigned char) *str2); + if (result != 0 || (*str1 == '\0'/* && *str2 == '\0'*/)) break; ++str1; ++str2; } - return (int)((unsigned char) *str1 - (unsigned char) *str2); + return result; #endif /* HAVE_STRCMP */ } @@ -1086,17 +1089,20 @@ SDL_strncmp(const char *str1, const char *str2, size_t maxlen) #if defined(HAVE_STRNCMP) return strncmp(str1, str2, maxlen); #else - while (*str1 && *str2 && maxlen) { - if (*str1 != *str2) + int result; + + while (maxlen) { + result = (int) (unsigned char) *str1 - (unsigned char) *str2; + if (result != 0 || *str1 == '\0'/* && *str2 == '\0'*/) break; ++str1; ++str2; --maxlen; } if (!maxlen) { - return 0; + result = 0; } - return (int) ((unsigned char) *str1 - (unsigned char) *str2); + return result; #endif /* HAVE_STRNCMP */ } @@ -1108,19 +1114,18 @@ SDL_strcasecmp(const char *str1, const char *str2) #elif defined(HAVE__STRICMP) return _stricmp(str1, str2); #else - char a = 0; - char b = 0; - while (*str1 && *str2) { + int a, b, result; + + while (1) { a = SDL_toupper((unsigned char) *str1); b = SDL_toupper((unsigned char) *str2); - if (a != b) + result = a - b; + if (result != 0 || a == 0 /*&& b == 0*/) break; ++str1; ++str2; } - a = SDL_toupper((unsigned char) *str1); - b = SDL_toupper((unsigned char) *str2); - return (int) ((unsigned char) a - (unsigned char) b); + return result; #endif /* HAVE_STRCASECMP */ } @@ -1132,24 +1137,21 @@ SDL_strncasecmp(const char *str1, const char *str2, size_t maxlen) #elif defined(HAVE__STRNICMP) return _strnicmp(str1, str2, maxlen); #else - char a = 0; - char b = 0; - while (*str1 && *str2 && maxlen) { + int a, b, result; + + while (maxlen) { a = SDL_tolower((unsigned char) *str1); b = SDL_tolower((unsigned char) *str2); - if (a != b) + result = a - b; + if (result != 0 || a == 0 /*&& b == 0*/) break; ++str1; ++str2; --maxlen; } - if (maxlen == 0) { - return 0; - } else { - a = SDL_tolower((unsigned char) *str1); - b = SDL_tolower((unsigned char) *str2); - return (int) ((unsigned char) a - (unsigned char) b); - } + if (maxlen == 0) + result = 0; + return result; #endif /* HAVE_STRNCASECMP */ }