aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHeinrich Schuchardt2022-12-29 14:44:03 +0100
committerHeinrich Schuchardt2023-01-04 13:17:42 +0100
commit7a9b366cd9b7c1c880fda82509054a06fbac208c (patch)
treed8d1897d9dbddc98a2a60d5f973ea7c2b09e22bd
parentd7ddeb66a6ce55672ba89496c621fbfc9465b4c2 (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.h13
-rw-r--r--lib/charset.c26
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