summaryrefslogtreecommitdiffstats
path: root/lib/libarchive/archive_write_set_format_pax.c
diff options
context:
space:
mode:
authorkientzle <kientzle@FreeBSD.org>2009-03-03 17:02:51 +0000
committerkientzle <kientzle@FreeBSD.org>2009-03-03 17:02:51 +0000
commit8fc5e74eab7c5235eef741a5e99412c1c314b9c6 (patch)
tree1dee8b4b9c023077ab174a6dc9ffbb460e86b36b /lib/libarchive/archive_write_set_format_pax.c
parent534d3efa16fa0651c5b97d3d506ddce25334a6d9 (diff)
downloadFreeBSD-src-8fc5e74eab7c5235eef741a5e99412c1c314b9c6.zip
FreeBSD-src-8fc5e74eab7c5235eef741a5e99412c1c314b9c6.tar.gz
Merge r294:337,r348:350 from libarchive.googlecode.com: A lot
of work to make libarchive work on Windows.
Diffstat (limited to 'lib/libarchive/archive_write_set_format_pax.c')
-rw-r--r--lib/libarchive/archive_write_set_format_pax.c16
1 files changed, 16 insertions, 0 deletions
diff --git a/lib/libarchive/archive_write_set_format_pax.c b/lib/libarchive/archive_write_set_format_pax.c
index 621e568..24d611c 100644
--- a/lib/libarchive/archive_write_set_format_pax.c
+++ b/lib/libarchive/archive_write_set_format_pax.c
@@ -203,6 +203,16 @@ utf8_encode(const wchar_t *wval)
utf8len = 0;
for (wp = wval; *wp != L'\0'; ) {
wc = *wp++;
+
+ if (wc >= 0xd800 && wc <= 0xdbff
+ && *wp >= 0xdc00 && *wp <= 0xdfff) {
+ /* This is a surrogate pair. Combine into a
+ * full Unicode value before encoding into
+ * UTF-8. */
+ wc = (wc - 0xd800) << 10; /* High 10 bits */
+ wc += (*wp++ - 0xdc00); /* Low 10 bits */
+ wc += 0x10000; /* Skip BMP */
+ }
if (wc <= 0x7f)
utf8len++;
else if (wc <= 0x7ff)
@@ -226,6 +236,12 @@ utf8_encode(const wchar_t *wval)
for (wp = wval, p = utf8_value; *wp != L'\0'; ) {
wc = *wp++;
+ if (wc >= 0xd800 && wc <= 0xdbff
+ && *wp >= 0xdc00 && *wp <= 0xdfff) {
+ /* Combine surrogate pair. */
+ wc = (wc - 0xd800) << 10;
+ wc += *wp++ - 0xdc00 + 0x10000;
+ }
if (wc <= 0x7f) {
*p++ = (char)wc;
} else if (wc <= 0x7ff) {
OpenPOWER on IntegriCloud