summaryrefslogtreecommitdiff
path: root/file.c
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2015-10-04 02:32:08 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2015-10-04 02:32:08 +0000
commit5f0bb43434fe0fe24acf3b68f30962970f4f7376 (patch)
tree1ede039cf6ab9c9ba951bcdbfe4b7bf6576ccd91 /file.c
parent87a9dcf1b6b8ac1e5580004cad899f3757f3c24d (diff)
file.c: get rid of intermediate objects
* file.c (rb_str_normalize_ospath): place normalized strings to the result string directly, to get rid of intermediate objects and copying. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@52015 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'file.c')
-rw-r--r--file.c21
1 files changed, 11 insertions, 10 deletions
diff --git a/file.c b/file.c
index d5ad01006b..f2b760aa0c 100644
--- a/file.c
+++ b/file.c
@@ -259,9 +259,8 @@ rb_str_encode_ospath(VALUE path)
#ifdef __APPLE__
static VALUE
-rb_str_normalize_ospath0(const char *ptr, long len)
+rb_str_append_normalized_ospath(VALUE str, const char *ptr, long len)
{
- VALUE str;
CFIndex buflen = 0;
CFRange all;
CFStringRef s = CFStringCreateWithBytesNoCopy(kCFAllocatorDefault,
@@ -269,14 +268,15 @@ rb_str_normalize_ospath0(const char *ptr, long len)
kCFStringEncodingUTF8, FALSE,
kCFAllocatorNull);
CFMutableStringRef m = CFStringCreateMutableCopy(kCFAllocatorDefault, len, s);
+ long oldlen = RSTRING_LEN(str);
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);
+ rb_str_modify_expand(str, buflen);
+ CFStringGetBytes(m, all, kCFStringEncodingUTF8, '?', FALSE,
+ (UInt8 *)(RSTRING_PTR(str) + oldlen), buflen, &buflen);
+ rb_str_set_len(str, oldlen + buflen);
CFRelease(m);
CFRelease(s);
return str;
@@ -297,8 +297,9 @@ rb_str_normalize_ospath(const char *ptr, long len)
int r = rb_enc_precise_mbclen(p, e, enc);
if (!MBCLEN_CHARFOUND_P(r)) {
/* invalid byte shall not happen but */
- rb_str_append(str, rb_str_normalize_ospath0(p1, p-p1));
- rb_str_cat2(str, "\xEF\xBF\xBD");
+ static const char invalid[3] = "\xEF\xBF\xBD";
+ rb_str_append_normalized_ospath(str, p1, p-p1);
+ rb_str_cat(str, invalid, sizeof(invalid));
p += 1;
p1 = p;
continue;
@@ -308,7 +309,7 @@ rb_str_normalize_ospath(const char *ptr, long len)
if ((0x2000 <= c && c <= 0x2FFF) || (0xF900 <= c && c <= 0xFAFF) ||
(0x2F800 <= c && c <= 0x2FAFF)) {
if (p - p1 > 0) {
- rb_str_append(str, rb_str_normalize_ospath0(p1, p-p1));
+ rb_str_append_normalized_ospath(str, p1, p-p1);
}
rb_str_cat(str, p, l);
p += l;
@@ -319,7 +320,7 @@ rb_str_normalize_ospath(const char *ptr, long len)
}
}
if (p - p1 > 0) {
- rb_str_append(str, rb_str_normalize_ospath0(p1, p-p1));
+ rb_str_append_normalized_ospath(str, p1, p-p1);
}
return str;