lib: charset: add u16_str<n>cmp()
authorAKASHI Takahiro <takahiro.akashi@linaro.org>
Wed, 18 Sep 2019 01:26:29 +0000 (10:26 +0900)
committerHeinrich Schuchardt <xypron.glpk@gmx.de>
Fri, 20 Sep 2019 18:09:19 +0000 (20:09 +0200)
u16 version of strcmp(): u16_strncmp() works like u16_strcmp() but only
at most n characters (in u16) are compared.
This function will be used in my UEFI secure boot patch.

Signed-off-by: AKASHI Takahiro <takahiro.akashi@linaro.org>
Reviewed-by: Heinrich Schuchardt <xypron.glpk@gmx.de>
include/charset.h
lib/charset.c

index 020f8a90df070c71604f96548297e07e40f8a153..fde6bddbc2fba733108f200354dd1e9d63a85af0 100644 (file)
@@ -168,6 +168,21 @@ s32 utf_to_lower(const s32 code);
  */
 s32 utf_to_upper(const s32 code);
 
+/*
+ * u16_strncmp() - compare two u16 string
+ *
+ * @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
+ *             corresponding u16 in s2
+ */
+int u16_strncmp(const u16 *s1, const u16 *s2, size_t n);
+#define u16_strcmp(s1, s2)     u16_strncmp((s1), (s2), SIZE_MAX)
+
 /**
  * u16_strlen - count non-zero words
  *
index 72d745da4f4e2ab9cb39ae476ca5de892c8b74e0..1c6a7f693de4b20da405b33289285e5f258fc6fb 100644 (file)
@@ -335,6 +335,31 @@ s32 utf_to_upper(const s32 code)
        return ret;
 }
 
+/*
+ * u16_strncmp() - compare two u16 string
+ *
+ * @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
+ *             corresponding u16 in s2
+ */
+int u16_strncmp(const u16 *s1, const u16 *s2, size_t n)
+{
+       int ret = 0;
+
+       for (; n; --n, ++s1, ++s2) {
+               ret = *s1 - *s2;
+               if (ret || !*s1)
+                       break;
+       }
+
+       return ret;
+}
+
 size_t u16_strlen(const void *in)
 {
        const char *pos = in;