summaryrefslogtreecommitdiff
path: root/file.c
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2013-08-09 03:06:53 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2013-08-09 03:06:53 +0000
commitc04f402f0f7692f6105c930f19d81b332d6a93d5 (patch)
treeac0a64d657e88dc9e750271779c47a0541c083ae /file.c
parentf9cbf0e89f92f149aed9f41b81d72b9d76a9b14a (diff)
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.c28
1 files changed, 22 insertions, 6 deletions
diff --git a/file.c b/file.c
index cfa10ae67d..3923ddeec7 100644
--- a/file.c
+++ b/file.c
@@ -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