colibri_imx6: fix video stdout in default environment
[oweals/u-boot.git] / lib / charset.c
index 5e349ed5ee45248a8183accf806bb23ecabb8f94..a28034ee1f1ecf3791d08b15a5f20da7808b15c8 100644 (file)
@@ -335,11 +335,41 @@ s32 utf_to_upper(const s32 code)
        return ret;
 }
 
-size_t u16_strlen(const u16 *in)
+/*
+ * 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)
 {
-       size_t i;
-       for (i = 0; in[i]; i++);
-       return i;
+       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;
+       size_t ret;
+
+       for (; pos[0] || pos[1]; pos += 2)
+               ;
+       ret = pos - (char *)in;
+       ret >>= 1;
+       return ret;
 }
 
 size_t u16_strnlen(const u16 *in, size_t count)
@@ -349,6 +379,11 @@ size_t u16_strnlen(const u16 *in, size_t count)
        return i;
 }
 
+size_t u16_strsize(const void *in)
+{
+       return (u16_strlen(in) + 1) * sizeof(u16);
+}
+
 u16 *u16_strcpy(u16 *dest, const u16 *src)
 {
        u16 *tmp = dest;
@@ -362,18 +397,18 @@ u16 *u16_strcpy(u16 *dest, const u16 *src)
        return tmp;
 }
 
-u16 *u16_strdup(const u16 *src)
+u16 *u16_strdup(const void *src)
 {
        u16 *new;
+       size_t len;
 
        if (!src)
                return NULL;
-
-       new = malloc((u16_strlen(src) + 1) * sizeof(u16));
+       len = (u16_strlen(src) + 1) * sizeof(u16);
+       new = malloc(len);
        if (!new)
                return NULL;
-
-       u16_strcpy(new, src);
+       memcpy(new, src, len);
 
        return new;
 }