aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog5
-rw-r--r--configure.in2
-rw-r--r--file.c28
-rw-r--r--test/ruby/test_process.rb2
4 files changed, 31 insertions, 6 deletions
diff --git a/ChangeLog b/ChangeLog
index c3d1c061a6..8bb3489196 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+Fri Aug 9 12:06:49 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * file.c (rb_str_normalize_ospath): normalize to Normalization Form C
+ using CFString.
+
Fri Aug 9 10:53:57 2013 Kazuki Tsujimoto <kazuki@callcc.net>
* time.c (get_timeval, get_new_timeval): use rb_obj_class()
diff --git a/configure.in b/configure.in
index a701056491..71519926cf 100644
--- a/configure.in
+++ b/configure.in
@@ -3061,6 +3061,8 @@ AS_CASE("$enable_shared", [yes], [
LIBRUBY_DLDFLAGS="$LIBRUBY_DLDFLAGS "' $(XLDFLAGS)'
LIBRUBY_SO='lib$(RUBY_SO_NAME).dylib'
LIBRUBY_ALIASES='lib$(RUBY_BASE_NAME).$(MAJOR).$(MINOR).dylib lib$(RUBY_INSTALL_NAME).dylib'
+ RUBY_APPEND_OPTION(XLDFLAGS, [-framework CoreFoundation])
+ RUBY_APPEND_OPTION(LIBRUBYARG_STATIC, [-framework CoreFoundation])
],
[interix*], [
LIBRUBYARG_SHARED='-L. -L${libdir} -l$(RUBY_SO_NAME)'
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
diff --git a/test/ruby/test_process.rb b/test/ruby/test_process.rb
index 058494385d..9c764925d8 100644
--- a/test/ruby/test_process.rb
+++ b/test/ruby/test_process.rb
@@ -237,6 +237,8 @@ class TestProcess < Test::Unit::TestCase
MANDATORY_ENVS << 'LD_PRELOAD'
when /mswin|mingw/
MANDATORY_ENVS.concat(%w[HOME USER TMPDIR])
+ when /darwin/
+ MANDATORY_ENVS.concat(ENV.keys.grep(/\A__CF_/))
end
if e = RbConfig::CONFIG['LIBPATHENV']
MANDATORY_ENVS << e