From: Matt Fleming <matt@codeblueprint.co.uk>
To: stable@vger.kernel.org
Cc: Ard Biesheuvel <ard.biesheuvel@linaro.org>,
Peter Jones <pjones@redhat.com>,
Matthew Garrett <mjg59@srcf.ucam.org>, joeyli <jlee@suse.com>,
Matt Fleming <matt@codeblueprint.co.uk>,
Matthew Garrett <mjg59@coreos.com>
Subject: [PATCH 1/7] lib/ucs2_string: Add ucs2 -> utf8 helper functions
Date: Thu, 25 Feb 2016 21:02:39 +0000 [thread overview]
Message-ID: <1456434165-32520-2-git-send-email-matt@codeblueprint.co.uk> (raw)
In-Reply-To: <1456434165-32520-1-git-send-email-matt@codeblueprint.co.uk>
From: Peter Jones <pjones@redhat.com>
commit 73500267c930baadadb0d02284909731baf151f7 upstream.
This adds ucs2_utf8size(), which tells us how big our ucs2 string is in
bytes, and ucs2_as_utf8, which translates from ucs2 to utf8..
Signed-off-by: Peter Jones <pjones@redhat.com>
Tested-by: Lee, Chun-Yi <jlee@suse.com>
Acked-by: Matthew Garrett <mjg59@coreos.com>
Signed-off-by: Matt Fleming <matt@codeblueprint.co.uk>
---
include/linux/ucs2_string.h | 4 +++
lib/ucs2_string.c | 62 +++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 66 insertions(+)
diff --git a/include/linux/ucs2_string.h b/include/linux/ucs2_string.h
index cbb20afdbc01..bb679b48f408 100644
--- a/include/linux/ucs2_string.h
+++ b/include/linux/ucs2_string.h
@@ -11,4 +11,8 @@ unsigned long ucs2_strlen(const ucs2_char_t *s);
unsigned long ucs2_strsize(const ucs2_char_t *data, unsigned long maxlength);
int ucs2_strncmp(const ucs2_char_t *a, const ucs2_char_t *b, size_t len);
+unsigned long ucs2_utf8size(const ucs2_char_t *src);
+unsigned long ucs2_as_utf8(u8 *dest, const ucs2_char_t *src,
+ unsigned long maxlength);
+
#endif /* _LINUX_UCS2_STRING_H_ */
diff --git a/lib/ucs2_string.c b/lib/ucs2_string.c
index 6f500ef2301d..17dd74e21ef9 100644
--- a/lib/ucs2_string.c
+++ b/lib/ucs2_string.c
@@ -49,3 +49,65 @@ ucs2_strncmp(const ucs2_char_t *a, const ucs2_char_t *b, size_t len)
}
}
EXPORT_SYMBOL(ucs2_strncmp);
+
+unsigned long
+ucs2_utf8size(const ucs2_char_t *src)
+{
+ unsigned long i;
+ unsigned long j = 0;
+
+ for (i = 0; i < ucs2_strlen(src); i++) {
+ u16 c = src[i];
+
+ if (c > 0x800)
+ j += 3;
+ else if (c > 0x80)
+ j += 2;
+ else
+ j += 1;
+ }
+
+ return j;
+}
+EXPORT_SYMBOL(ucs2_utf8size);
+
+/*
+ * copy at most maxlength bytes of whole utf8 characters to dest from the
+ * ucs2 string src.
+ *
+ * The return value is the number of characters copied, not including the
+ * final NUL character.
+ */
+unsigned long
+ucs2_as_utf8(u8 *dest, const ucs2_char_t *src, unsigned long maxlength)
+{
+ unsigned int i;
+ unsigned long j = 0;
+ unsigned long limit = ucs2_strnlen(src, maxlength);
+
+ for (i = 0; maxlength && i < limit; i++) {
+ u16 c = src[i];
+
+ if (c > 0x800) {
+ if (maxlength < 3)
+ break;
+ maxlength -= 3;
+ dest[j++] = 0xe0 | (c & 0xf000) >> 12;
+ dest[j++] = 0x80 | (c & 0x0fc0) >> 8;
+ dest[j++] = 0x80 | (c & 0x003f);
+ } else if (c > 0x80) {
+ if (maxlength < 2)
+ break;
+ maxlength -= 2;
+ dest[j++] = 0xc0 | (c & 0xfe0) >> 5;
+ dest[j++] = 0x80 | (c & 0x01f);
+ } else {
+ maxlength -= 1;
+ dest[j++] = c & 0x7f;
+ }
+ }
+ if (maxlength)
+ dest[j] = '\0';
+ return j;
+}
+EXPORT_SYMBOL(ucs2_as_utf8);
--
2.6.2
next prev parent reply other threads:[~2016-02-25 21:02 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-02-25 21:02 [PATCH v2 0/7] make efivarfs files immutable by default (for stable) Matt Fleming
2016-02-25 21:02 ` Matt Fleming [this message]
2016-02-25 21:02 ` [PATCH 2/7] efi: Use ucs2_as_utf8 in efivarfs instead of open coding a bad version Matt Fleming
2016-03-01 5:28 ` Greg KH
2016-03-10 14:06 ` Matt Fleming
2016-02-25 21:02 ` [PATCH 3/7] efi: Do variable name validation tests in utf8 Matt Fleming
2016-02-25 21:02 ` [PATCH 4/7] efi: Make our variable validation list include the guid Matt Fleming
2016-02-25 21:02 ` [PATCH 5/7] efi: Make efivarfs entries immutable by default Matt Fleming
2016-02-25 21:02 ` [PATCH 6/7] efi: Add pstore variables to the deletion whitelist Matt Fleming
2016-02-25 21:02 ` [PATCH 7/7] lib/ucs2_string: Correct ucs2 -> utf8 conversion Matt Fleming
-- strict thread matches above, loose matches on Subject: below --
2016-03-10 14:05 [PATCH 0/7] make efivarfs files immutable by default (for 3.10 and 3.14) Matt Fleming
2016-03-10 14:05 ` [PATCH 1/7] lib/ucs2_string: Add ucs2 -> utf8 helper functions Matt Fleming
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1456434165-32520-2-git-send-email-matt@codeblueprint.co.uk \
--to=matt@codeblueprint.co.uk \
--cc=ard.biesheuvel@linaro.org \
--cc=jlee@suse.com \
--cc=mjg59@coreos.com \
--cc=mjg59@srcf.ucam.org \
--cc=pjones@redhat.com \
--cc=stable@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.