diff options
author | Heinrich Schuchardt | 2022-12-29 14:44:03 +0100 |
---|---|---|
committer | Heinrich Schuchardt | 2023-01-04 13:17:42 +0100 |
commit | 7a9b366cd9b7c1c880fda82509054a06fbac208c (patch) | |
tree | d8d1897d9dbddc98a2a60d5f973ea7c2b09e22bd | |
parent | d7ddeb66a6ce55672ba89496c621fbfc9465b4c2 (diff) |
lib: add function u16_strcasecmp()
Provide a function for comparing UTF-16 strings in a case insensitive
manner.
Signed-off-by: Heinrich Schuchardt <heinrich.schuchardt@canonical.com>
-rw-r--r-- | include/charset.h | 13 | ||||
-rw-r--r-- | lib/charset.c | 26 |
2 files changed, 39 insertions, 0 deletions
diff --git a/include/charset.h b/include/charset.h index e900fd789a2..6e79d7152e6 100644 --- a/include/charset.h +++ b/include/charset.h @@ -174,6 +174,19 @@ s32 utf_to_lower(const s32 code); s32 utf_to_upper(const s32 code); /** + * u16_strcasecmp() - compare two u16 strings case insensitively + * + * @s1: first string to compare + * @s2: second string to compare + * @n: maximum number of u16 to compare + * Return: 0 if the first n u16 are the same in s1 and s2 + * < 0 if the first different u16 in s1 is less than the + * corresponding u16 in s2 + * > 0 if the first different u16 in s1 is greater than the + */ +int u16_strcasecmp(const u16 *s1, const u16 *s2); + +/** * u16_strncmp() - compare two u16 string * * @s1: first string to compare diff --git a/lib/charset.c b/lib/charset.c index bece4985bfc..b1842755eb1 100644 --- a/lib/charset.c +++ b/lib/charset.c @@ -351,6 +351,32 @@ s32 utf_to_upper(const s32 code) } /* + * u16_strcasecmp() - compare two u16 strings case insensitively + * + * @s1: first string to compare + * @s2: second string to compare + * @n: maximum number of u16 to compare + * Return: 0 if the first n u16 are the same in s1 and s2 + * < 0 if the first different u16 in s1 is less than the + * corresponding u16 in s2 + * > 0 if the first different u16 in s1 is greater than the + */ +int u16_strcasecmp(const u16 *s1, const u16 *s2) +{ + int ret = 0; + s32 c1, c2; + + for (;;) { + c1 = utf_to_upper(utf16_get(&s1)); + c2 = utf_to_upper(utf16_get(&s2)); + ret = c1 - c2; + if (ret || !c1 || c1 == -1 || c2 == -1) + break; + } + return ret; +} + +/* * u16_strncmp() - compare two u16 string * * @s1: first string to compare |