diff options
author | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2013-08-09 03:06:53 +0000 |
---|---|---|
committer | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2013-08-09 03:06:53 +0000 |
commit | c04f402f0f7692f6105c930f19d81b332d6a93d5 (patch) | |
tree | ac0a64d657e88dc9e750271779c47a0541c083ae /file.c | |
parent | f9cbf0e89f92f149aed9f41b81d72b9d76a9b14a (diff) | |
download | ruby-c04f402f0f7692f6105c930f19d81b332d6a93d5.tar.gz |
file.c: normalize Form C
* file.c (rb_str_normalize_ospath): normalize to Normalization Form C
using CFString.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@42457 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'file.c')
-rw-r--r-- | file.c | 28 |
1 files changed, 22 insertions, 6 deletions
@@ -19,6 +19,9 @@ #include <sys/cygwin.h> #include <wchar.h> #endif +#ifdef __APPLE__ +#include <CoreFoundation/CFString.h> +#endif #include "ruby/ruby.h" #include "ruby/io.h" @@ -244,12 +247,25 @@ rb_str_encode_ospath(VALUE path) VALUE rb_str_normalize_ospath(const char *ptr, long len) { - rb_encoding *utf8mac = rb_enc_from_index(ENCINDEX_UTF8_MAC); - if (utf8mac) { - return rb_str_conv_enc(rb_tainted_str_new(ptr, len), - utf8mac, rb_utf8_encoding()); - } - return Qnil; + VALUE str; + CFIndex buflen = 0; + CFRange all; + CFStringRef s = CFStringCreateWithBytesNoCopy(kCFAllocatorDefault, + (const UInt8 *)ptr, len, + kCFStringEncodingUTF8, FALSE, + kCFAllocatorNull); + CFMutableStringRef m = CFStringCreateMutableCopy(kCFAllocatorDefault, len, s); + + CFStringNormalize(m, kCFStringNormalizationFormC); + all = CFRangeMake(0, CFStringGetLength(m)); + CFStringGetBytes(m, all, kCFStringEncodingUTF8, '?', FALSE, NULL, 0, &buflen); + str = rb_enc_str_new(0, buflen, rb_utf8_encoding()); + CFStringGetBytes(m, all, kCFStringEncodingUTF8, '?', FALSE, (UInt8 *)RSTRING_PTR(str), + buflen, &buflen); + rb_str_set_len(str, buflen); + CFRelease(m); + CFRelease(s); + return str; } #endif |