X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=lib%2Fcharset.c;h=a28034ee1f1ecf3791d08b15a5f20da7808b15c8;hb=164873a0c02ddbc9a59ad3a0670f17684fc00737;hp=0cede9b60b4ccdc0bc9cc28f4c3cbee0b9d77dc6;hpb=592cd5defd4f71d34ffcbd8dd3326bc10f662e20;p=oweals%2Fu-boot.git diff --git a/lib/charset.c b/lib/charset.c index 0cede9b60b..a28034ee1f 100644 --- a/lib/charset.c +++ b/lib/charset.c @@ -97,12 +97,17 @@ static u8 read_string(void *data) /** * read_console() - read byte from console * - * @src - not used, needed to match interface - * Return: - byte read + * @data - not used, needed to match interface + * Return: - byte read or 0 on error */ static u8 read_console(void *data) { - return getc(); + int ch; + + ch = getc(); + if (ch < 0) + ch = 0; + return ch; } int console_read_unicode(s32 *code) @@ -330,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) @@ -344,6 +379,40 @@ 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; + + for (;; dest++, src++) { + *dest = *src; + if (!*src) + break; + } + + return tmp; +} + +u16 *u16_strdup(const void *src) +{ + u16 *new; + size_t len; + + if (!src) + return NULL; + len = (u16_strlen(src) + 1) * sizeof(u16); + new = malloc(len); + if (!new) + return NULL; + memcpy(new, src, len); + + return new; +} + /* Convert UTF-16 to UTF-8. */ uint8_t *utf16_to_utf8(uint8_t *dest, const uint16_t *src, size_t size) {