[macruby-changes] [2401] MacRuby/trunk/string.c
source_changes at macosforge.org
source_changes at macosforge.org
Thu Aug 27 21:57:21 PDT 2009
Revision: 2401
http://trac.macosforge.org/projects/ruby/changeset/2401
Author: lsansonetti at apple.com
Date: 2009-08-27 21:57:21 -0700 (Thu, 27 Aug 2009)
Log Message:
-----------
fixed & optimized a few things
Modified Paths:
--------------
MacRuby/trunk/string.c
Modified: MacRuby/trunk/string.c
===================================================================
--- MacRuby/trunk/string.c 2009-08-28 04:52:28 UTC (rev 2400)
+++ MacRuby/trunk/string.c 2009-08-28 04:57:21 UTC (rev 2401)
@@ -252,18 +252,24 @@
VALUE
rb_str_buf_new(long capa)
{
+ return rb_str_new2("");
+#if 0
return rb_bytestring_new();
+#endif
}
VALUE
rb_str_buf_new2(const char *ptr)
{
+ return rb_str_new2(ptr);
+#if 0
VALUE str = rb_bytestring_new();
long len = strlen(ptr);
if (ptr != NULL && len > 0) {
CFDataAppendBytes(rb_bytestring_wrapped_data(str), (const UInt8 *)ptr, len);
}
return str;
+#endif
}
VALUE
@@ -2331,23 +2337,58 @@
static VALUE
rb_str_reverse_bang(VALUE str, SEL sel)
{
- CFIndex i, n;
- UniChar *buffer;
+ rb_str_modify(str);
- n = CFStringGetLength((CFStringRef)str);
+ const long n = CFStringGetLength((CFStringRef)str);
if (n <= 1) {
return rb_str_dup(str);
}
-
- buffer = (UniChar *)alloca(sizeof(UniChar) * n);
+
+#if 1
+ // HACK
+ const char *ptr = CFStringGetCStringPtr((CFStringRef)str, 0);
+ if (ptr != NULL) {
+ char *beg = (char *)ptr;
+ char *end = (char *)&ptr[n - 1];
+ while (beg < end) {
+ char c = *beg;
+ *beg++ = *end;
+ *end-- = c;
+ }
+ return str;
+ }
+ const UniChar *ptr2 = CFStringGetCharactersPtr((CFStringRef)str);
+ if (ptr2 != NULL) {
+ UniChar *beg = (UniChar *)ptr2;
+ UniChar *end = (UniChar *)&ptr2[n - 1];
+ while (beg < end) {
+ UniChar c = *beg;
+ *beg++ = *end;
+ *end-- = c;
+ }
+ return str;
+ }
+#endif
+
+ UniChar *buffer = (UniChar *)alloca(sizeof(UniChar) * n);
CFStringGetCharacters((CFStringRef)str, CFRangeMake(0, n), buffer);
- for (i = 0; i < (n / 2); i++) {
- UniChar c = buffer[i];
- buffer[i] = buffer[n - i - 1];
- buffer[n - i - 1] = c;
+ UniChar *beg = buffer;
+ UniChar *end = &buffer[n - 1];
+ while (beg < end) {
+ UniChar c = *beg;
+ *beg++ = *end;
+ *end-- = c;
}
+
+#if 0
CFStringDelete((CFMutableStringRef)str, CFRangeMake(0, n));
CFStringAppendCharacters((CFMutableStringRef)str, (const UniChar *)buffer, n);
+#else
+ CFStringRef tmp = CFStringCreateWithCharactersNoCopy(kCFAllocatorMalloc,
+ buffer, n, kCFAllocatorNull);
+ CFStringReplaceAll((CFMutableStringRef)str, tmp);
+ CFRelease(tmp);
+#endif
return str;
}
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/macruby-changes/attachments/20090827/145a4bb7/attachment-0001.html>
More information about the macruby-changes
mailing list