]> git.ipfire.org Git - thirdparty/u-boot.git/blobdiff - lib/charset.c
net: hifemac_mdio: use log_msg_ret() correctly, report error by dev_err()
[thirdparty/u-boot.git] / lib / charset.c
index f44c58d9d81a29517e5092c795257d55fe88830b..df4f0407485248456c7fcfe95025338efa88fc7d 100644 (file)
@@ -5,7 +5,6 @@
  *  Copyright (c) 2017 Rob Clark
  */
 
-#include <common.h>
 #include <charset.h>
 #include <capitalization.h>
 #include <cp437.h>
@@ -16,7 +15,7 @@
 /**
  * codepage_437 - Unicode to codepage 437 translation table
  */
-const u16 codepage_437[128] = CP437;
+const u16 codepage_437[160] = CP437;
 
 static struct capitalization_table capitalization_table[] =
 #ifdef CONFIG_EFI_UNICODE_CAPITALIZATION
@@ -350,6 +349,32 @@ s32 utf_to_upper(const s32 code)
        return ret;
 }
 
+/*
+ * 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
  *
@@ -375,18 +400,6 @@ int u16_strncmp(const u16 *s1, const u16 *s2, size_t n)
        return ret;
 }
 
-size_t u16_strlen(const void *in)
-{
-       const char *pos = in;
-       size_t ret;
-
-       for (; pos[0] || pos[1]; pos += 2)
-               ;
-       ret = pos - (char *)in;
-       ret >>= 1;
-       return ret;
-}
-
 size_t __efi_runtime u16_strnlen(const u16 *in, size_t count)
 {
        size_t i;
@@ -419,7 +432,7 @@ u16 *u16_strdup(const void *src)
 
        if (!src)
                return NULL;
-       len = (u16_strlen(src) + 1) * sizeof(u16);
+       len = u16_strsize(src);
        new = malloc(len);
        if (!new)
                return NULL;
@@ -428,6 +441,22 @@ u16 *u16_strdup(const void *src)
        return new;
 }
 
+size_t u16_strlcat(u16 *dest, const u16 *src, size_t count)
+{
+       size_t destlen = u16_strnlen(dest, count);
+       size_t srclen = u16_strlen(src);
+       size_t ret = destlen + srclen;
+
+       if (destlen >= count)
+               return ret;
+       if (ret >= count)
+               srclen -= (ret - count + 1);
+       memcpy(&dest[destlen], src, 2 * srclen);
+       dest[destlen + srclen] = 0x0000;
+
+       return ret;
+}
+
 /* Convert UTF-16 to UTF-8.  */
 uint8_t *utf16_to_utf8(uint8_t *dest, const uint16_t *src, size_t size)
 {
@@ -487,9 +516,12 @@ int utf_to_cp(s32 *c, const u16 *codepage)
                int j;
 
                /* Look up codepage translation */
-               for (j = 0; j < 0x80; ++j) {
+               for (j = 0; j < 0xA0; ++j) {
                        if (*c == codepage[j]) {
-                               *c = j + 0x80;
+                               if (j < 0x20)
+                                       *c = j;
+                               else
+                                       *c = j + 0x60;
                                return 0;
                        }
                }
@@ -541,6 +573,10 @@ int utf8_to_utf32_stream(u8 c, char *buffer)
                }
                if (pos == end)
                        return 0;
+               /*
+                * Appending the byte lead to an invalid UTF-8 byte sequence.
+                * Consider it as the start of a new code sequence.
+                */
                *buffer = 0;
        }
 }