diff options
author | kientzle <kientzle@FreeBSD.org> | 2009-03-03 17:02:51 +0000 |
---|---|---|
committer | kientzle <kientzle@FreeBSD.org> | 2009-03-03 17:02:51 +0000 |
commit | 8fc5e74eab7c5235eef741a5e99412c1c314b9c6 (patch) | |
tree | 1dee8b4b9c023077ab174a6dc9ffbb460e86b36b /lib/libarchive/archive_write_set_format_pax.c | |
parent | 534d3efa16fa0651c5b97d3d506ddce25334a6d9 (diff) | |
download | FreeBSD-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.c | 16 |
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) { |