optimize the SDL_str(case)cmp functions

This commit is contained in:
pionere 2022-02-05 11:01:25 +01:00 committed by Sam Lantinga
parent aec58d8208
commit 25203222f5
1 changed files with 27 additions and 25 deletions

View File

@ -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 */
}