[macruby-changes] [149] MacRuby/trunk/string.c

source_changes at macosforge.org source_changes at macosforge.org
Thu Apr 17 19:02:27 PDT 2008


Revision: 149
          http://trac.macosforge.org/projects/ruby/changeset/149
Author:   lsansonetti at apple.com
Date:     2008-04-17 19:02:26 -0700 (Thu, 17 Apr 2008)

Log Message:
-----------
fixing #dump, #lines

Modified Paths:
--------------
    MacRuby/trunk/string.c

Modified: MacRuby/trunk/string.c
===================================================================
--- MacRuby/trunk/string.c	2008-04-18 01:03:34 UTC (rev 148)
+++ MacRuby/trunk/string.c	2008-04-18 02:02:26 UTC (rev 149)
@@ -4406,6 +4406,7 @@
     OBJ_INFECT(result, str);
     /* result from dump is ASCII */
     rb_enc_associate(result, enc0);
+    RSTRING_SYNC(result);
     return result;
 }
 
@@ -5800,9 +5801,10 @@
 #if WITH_OBJC
     VALUE rs;
     CFArrayRef ranges;
-    long i, count, n, l;
-    UInt8 *buffer;
-    long bufsize = 0;
+    long n;
+    CFStringRef substr;
+    CFRange sub_range, search_range, res_range;
+    bool zero_sep;
 
     if (rb_scan_args(argc, argv, "01", &rs) == 0) {
 	rs = rb_rs;
@@ -5813,33 +5815,50 @@
 	return str;
     }
     StringValue(rs);
+    zero_sep = CFStringGetLength((CFStringRef)rs) == 0;
+    if (zero_sep) {
+	rs = rb_default_rs;
+    }
     n = CFStringGetLength((CFStringRef)str);
-    ranges = CFStringCreateArrayWithFindResults(NULL, (CFStringRef)str, 
-	(CFStringRef)rs, CFRangeMake(0, n), 0);
-    if (ranges == NULL) {
-	rb_yield(str);
-	return str;
-    }
-    for (i = l = 0, count = CFArrayGetCount(ranges); i < count; i++) {
-	CFRange *rs_range;
-       	CFRange sub_range;
+    search_range = CFRangeMake(0, n);
+    sub_range = CFRangeMake(0, 0);
 
-	rs_range = (CFRange *)CFArrayGetValueAtIndex(ranges, i);
-	assert(rs_range->location > 0);
-	sub_range = CFRangeMake(l, rs_range->location - l);
-#if 1
-	rb_yield((VALUE)CFStringCreateWithSubstring(NULL, (CFStringRef)str, sub_range));
-#else
-	if (bufsize < sub_range.length) {
-	    bufsize = sub_range.length + 100;
-	    buffer = (UInt8 *)alloca(sub_range.length + 100);
+#define YIELD_SUBSTR(range) \
+    do { \
+	substr = CFStringCreateWithSubstring(NULL, (CFStringRef)str,  \
+	    range); \
+	CFMakeCollectable((CFTypeRef)substr); \
+	rb_yield((VALUE)substr); \
+    } \
+    while (0)
+
+    while (CFStringFindWithOptions((CFStringRef)str, (CFStringRef)rs,
+	search_range, 0, &res_range)) {
+	if (zero_sep
+	    && sub_range.length > 0 
+	    && sub_range.location + sub_range.length 
+	       == res_range.location) {
+	    sub_range.length += res_range.length;
+	}		
+	else {
+	    if (sub_range.length > 0)
+		YIELD_SUBSTR(sub_range);
+	    sub_range = CFRangeMake(search_range.location, 
+		res_range.location - search_range.location + res_range.length);
 	}
-	CFStringGetBytes((CFStringRef)str, sub_range,
-	    kCFStringEncodingUTF8, 0, false, buffer, sub_range.length, NULL);
-	rb_yield(rb_str_new((const char *)buffer, sub_range.length));
-#endif
-	l = rs_range->location + rs_range->length;
+	search_range.location = res_range.location + res_range.length;
+	search_range.length = n - search_range.location;
     }
+
+    if (sub_range.length != 0)
+	YIELD_SUBSTR(sub_range);
+
+    if (search_range.location < n)
+	YIELD_SUBSTR(CFRangeMake(search_range.location, 
+	    n - search_range.location));
+
+#undef YIELD_SUBSTR
+
     return str;
 #else
     rb_encoding *enc;

-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.macosforge.org/pipermail/macruby-changes/attachments/20080417/a2c3b594/attachment.html


More information about the macruby-changes mailing list