Revision: 145 http://trac.macosforge.org/projects/ruby/changeset/145 Author: lsansonetti@apple.com Date: 2008-04-17 00:18:14 -0700 (Thu, 17 Apr 2008) Log Message: ----------- fixing String#capitalize Modified Paths: -------------- MacRuby/trunk/string.c Modified: MacRuby/trunk/string.c =================================================================== --- MacRuby/trunk/string.c 2008-04-17 01:14:09 UTC (rev 144) +++ MacRuby/trunk/string.c 2008-04-17 07:18:14 UTC (rev 145) @@ -4546,18 +4546,33 @@ rb_str_capitalize_bang(VALUE str) { #if WITH_OBJC + CFStringRef tmp; + long i, n; + bool changed; UniChar c; - CFStringRef tmp; + UniChar *buffer; rb_str_modify(str); - if (CFStringGetLength((CFStringRef)str) == 0) + n = CFStringGetLength((CFStringRef)str); + if (n == 0) return Qnil; - c = CFStringGetCharacterAtIndex((CFStringRef)str, 0); - if (!iswlower(c)) + buffer = (UniChar *)alloca(sizeof(UniChar) * n); + CFStringGetCharacters((CFStringRef)str, CFRangeMake(0, n), buffer); + changed = false; + if (iswlower(buffer[0])) { + buffer[0] = towupper(buffer[0]); + changed = true; + } + for (i = 1; i < n; i++) { + if (iswupper(buffer[i])) { + buffer[i] = towlower(buffer[i]); + changed = true; + } + } + if (!changed) return Qnil; - c = towupper(c); - tmp = CFStringCreateWithCharacters(NULL, &c, 1); - CFStringReplace((CFMutableStringRef)str, CFRangeMake(0, 1), tmp); + tmp = CFStringCreateWithCharacters(NULL, buffer, n); + CFStringReplaceAll((CFMutableStringRef)str, tmp); return str; #else rb_encoding *enc;