gmio_core: fix bug in gmio_clocale_char_iequals()

This commit is contained in:
Hugues Delorme 2015-05-28 11:04:41 +02:00
parent 28d133dfa0
commit 37dcad8e5e
2 changed files with 125 additions and 3 deletions

View File

@ -53,13 +53,87 @@ GMIO_INLINE int gmio_clocale_isspace(char c)
#endif
}
/*! Returns non-zero if \p c is an uppercase letter (for C-locale), zero
* otherwise */
GMIO_INLINE int gmio_clocale_isupper(char c)
{
#if 0
return 65 <= c && c <= 90;
#else
static const unsigned char upper_chars[] = {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
};
return upper_chars[c];
#endif
}
/*! Returns non-zero if \p c is a lowercase letter (for C-locale), zero
* otherwise */
GMIO_INLINE int gmio_clocale_islower(char c)
{
#if 0
return 97 <= c && c <= 122;
#else
static const unsigned char lower_chars[] = {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
};
return lower_chars[c];
#endif
}
/*! Returns the lowercase letter converted to uppercase */
GMIO_INLINE char gmio_clocale_toupper(char c)
{
if (gmio_clocale_islower(c))
return c - 32;
return c;
}
/*! Returns the uppercase letter converted to lowercase */
GMIO_INLINE char gmio_clocale_tolower(char c)
{
if (gmio_clocale_isupper(c))
return c + 32;
return c;
}
/*! Returns true if \p c1 compare equals to \p c2
*
* Comparison is case-insensitive
*/
GMIO_INLINE gmio_bool_t gmio_clocale_char_iequals(char c1, char c2)
{
return c1 == c2 || c1 == (c2 - 32) ? GMIO_TRUE : GMIO_FALSE;
return c1 == c2 || (gmio_clocale_toupper(c1) == gmio_clocale_toupper(c2));
}
/*! Returns 0 if \p str1 and \p str2 compare equal, non-zero otherwise

View File

@ -209,8 +209,56 @@ const char* test_internal__string_utils()
UTEST_ASSERT(gmio_clocale_isspace('\t'));
UTEST_ASSERT(gmio_clocale_isspace('\n'));
UTEST_ASSERT(gmio_clocale_isspace('\r'));
UTEST_ASSERT(!gmio_clocale_isspace('a'));
UTEST_ASSERT(!gmio_clocale_isspace('A'));
for (char c = 0; c >= 0 && c <= 127; ++c) {
if (65 <= c && c <= 90) {
UTEST_ASSERT(gmio_clocale_isupper(c));
}
else if (97 <= c && c <= 122) {
UTEST_ASSERT(gmio_clocale_islower(c));
}
else if (c == 0x20 || (0x09 <= c && c <= 0x0d)) {
UTEST_ASSERT(gmio_clocale_isspace(c));
}
else {
UTEST_ASSERT(!gmio_clocale_isupper(c));
UTEST_ASSERT(!gmio_clocale_islower(c));
UTEST_ASSERT(!gmio_clocale_isspace(c));
}
}
UTEST_ASSERT(gmio_clocale_tolower('A') == 'a');
UTEST_ASSERT(gmio_clocale_tolower('Z') == 'z');
UTEST_ASSERT(gmio_clocale_tolower('(') == '(');
UTEST_ASSERT(gmio_clocale_toupper('a') == 'A');
UTEST_ASSERT(gmio_clocale_toupper('z') == 'Z');
UTEST_ASSERT(gmio_clocale_toupper('(') == '(');
UTEST_ASSERT(gmio_clocale_char_iequals('a', 'a'));
UTEST_ASSERT(gmio_clocale_char_iequals('a', 'A'));
UTEST_ASSERT(gmio_clocale_char_iequals('A', 'a'));
UTEST_ASSERT(gmio_clocale_char_iequals('{', '{'));
UTEST_ASSERT(!gmio_clocale_char_iequals('{', '['));
UTEST_ASSERT(gmio_stricmp("FACET", "facet") == 0);
UTEST_ASSERT(gmio_stricmp("facet", "FACET") == 0);
UTEST_ASSERT(gmio_stricmp("facet", "facet") == 0);
UTEST_ASSERT(gmio_stricmp("FACET", "FACET") == 0);
UTEST_ASSERT(gmio_stricmp("", "") == 0);
UTEST_ASSERT(gmio_stricmp("", "facet") != 0);
UTEST_ASSERT(gmio_stricmp("facet", "facet_") != 0);
UTEST_ASSERT(gmio_stricmp("facet_", "facet") != 0);
UTEST_ASSERT(gmio_istarts_with("facet", ""));
UTEST_ASSERT(gmio_istarts_with("facet", "f"));
UTEST_ASSERT(gmio_istarts_with("facet", "fa"));
UTEST_ASSERT(gmio_istarts_with("facet", "facet"));
UTEST_ASSERT(!gmio_istarts_with("facet", "a"));
UTEST_ASSERT(!gmio_istarts_with("facet", " facet"));
UTEST_ASSERT(gmio_istarts_with("facet", "F"));
UTEST_ASSERT(gmio_istarts_with("FACET", "f"));
UTEST_ASSERT(gmio_istarts_with("FACET", "fa"));
return NULL;
}