diff --git a/libretro-common/file/config_file.c b/libretro-common/file/config_file.c index f9723315ca..1c38351c51 100644 --- a/libretro-common/file/config_file.c +++ b/libretro-common/file/config_file.c @@ -745,13 +745,13 @@ bool config_get_bool(config_file_t *conf, const char *key, bool *in) if (entry) { - if (strcasecmp(entry->value, "true") == 0) + if (string_is_equal_noncase(entry->value, "true")) *in = true; - else if (strcasecmp(entry->value, "1") == 0) + else if (string_is_equal_noncase(entry->value, "1")) *in = true; - else if (strcasecmp(entry->value, "false") == 0) + else if (string_is_equal_noncase(entry->value, "false")) *in = false; - else if (strcasecmp(entry->value, "0") == 0) + else if (string_is_equal_noncase(entry->value, "0")) *in = false; else return false; diff --git a/libretro-common/include/string/stdstring.h b/libretro-common/include/string/stdstring.h index 2b968138ca..3238b12acf 100644 --- a/libretro-common/include/string/stdstring.h +++ b/libretro-common/include/string/stdstring.h @@ -25,6 +25,7 @@ #include #include +#include #include #include @@ -49,7 +50,27 @@ static INLINE bool string_is_equal(const char *a, const char *b) static INLINE bool string_is_equal_noncase(const char *a, const char *b) { - return (a && b) ? (strcasecmp(a, b) == 0) : false; + bool ret; + int i; + char *cp1, *cp2; + + if (!a || !b) + return false; + + cp1 = (char*)malloc(strlen(a) + 1); + cp2 = (char*)malloc(strlen(b) + 1); + + for (i = 0; i < strlen(a) + 1; i++) + cp1[i] = tolower((int) (unsigned char) a[i]); + for (i = 0; i < strlen(b) + 1; i++) + cp2[i] = tolower((int) (unsigned char) b[i]); + + ret = string_is_equal(cp1, cp2); + + free(cp1); + free(cp2); + + return ret; } char *string_to_upper(char *s); diff --git a/libretro-common/lists/file_list.c b/libretro-common/lists/file_list.c index d016675558..1cacd96a74 100644 --- a/libretro-common/lists/file_list.c +++ b/libretro-common/lists/file_list.c @@ -27,6 +27,7 @@ #include #include #include +#include #include /** diff --git a/libretro-common/lists/string_list.c b/libretro-common/lists/string_list.c index 3ed16cb0dd..087c8db1d0 100644 --- a/libretro-common/lists/string_list.c +++ b/libretro-common/lists/string_list.c @@ -28,6 +28,7 @@ #include #include #include +#include /** * string_list_free @@ -268,7 +269,7 @@ int string_list_find_elem(const struct string_list *list, const char *elem) for (i = 0; i < list->size; i++) { - if (strcasecmp(list->elems[i].data, elem) == 0) + if (string_is_equal_noncase(list->elems[i].data, elem)) return (int)(i + 1); } @@ -302,8 +303,8 @@ bool string_list_find_elem_prefix(const struct string_list *list, for (i = 0; i < list->size; i++) { - if (strcasecmp(list->elems[i].data, elem) == 0 || - strcasecmp(list->elems[i].data, prefixed) == 0) + if (string_is_equal_noncase(list->elems[i].data, elem) || + string_is_equal_noncase(list->elems[i].data, prefixed) == 0) return true; }