diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/gen/hashy.lua | 4 | ||||
-rw-r--r-- | src/nvim/strings.c | 22 |
2 files changed, 24 insertions, 2 deletions
diff --git a/src/gen/hashy.lua b/src/gen/hashy.lua index 48292bfc0e..7fdb00699f 100644 --- a/src/gen/hashy.lua +++ b/src/gen/hashy.lua @@ -129,14 +129,14 @@ function M.hashy_hash(name, strings, access, lower) } } return -1; -]]):format(lower and 'mb_strnicmp' or 'memcmp', access('i'))) +]]):format(lower and 'vim_strnicmp_asc' or 'memcmp', access('i'))) else put(([[ if (low < 0 || %s(str, %s, len)) { return -1; } return low; -]]):format(lower and 'mb_strnicmp' or 'memcmp', access('low'))) +]]):format(lower and 'vim_strnicmp_asc' or 'memcmp', access('low'))) end put '}\n\n' return neworder, table.concat(stats) diff --git a/src/nvim/strings.c b/src/nvim/strings.c index 322b97d6bf..add4c9dcb6 100644 --- a/src/nvim/strings.c +++ b/src/nvim/strings.c @@ -475,6 +475,28 @@ bool striequal(const char *a, const char *b) return (a == NULL && b == NULL) || (a && b && STRICMP(a, b) == 0); } +/// Compare two ASCII strings, for length "len", ignoring case, ignoring locale. +/// +/// @return 0 for match, < 0 for smaller, > 0 for bigger +int vim_strnicmp_asc(const char *s1, const char *s2, size_t len) + FUNC_ATTR_PURE FUNC_ATTR_WARN_UNUSED_RESULT +{ + int i = 0; + while (len > 0) { + i = TOLOWER_ASC(*s1) - TOLOWER_ASC(*s2); + if (i != 0) { + break; // this character is different + } + if (*s1 == NUL) { + break; // strings match until NUL + } + s1++; + s2++; + len--; + } + return i; +} + /// strchr() version which handles multibyte strings /// /// @param[in] string String to search in. |