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

source_changes at macosforge.org source_changes at macosforge.org
Mon Apr 21 18:04:24 PDT 2008


Revision: 160
          http://trac.macosforge.org/projects/ruby/changeset/160
Author:   lsansonetti at apple.com
Date:     2008-04-21 18:04:23 -0700 (Mon, 21 Apr 2008)

Log Message:
-----------
fixing #succ + misc things

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

Modified: MacRuby/trunk/string.c
===================================================================
--- MacRuby/trunk/string.c	2008-04-21 21:43:26 UTC (rev 159)
+++ MacRuby/trunk/string.c	2008-04-22 01:04:23 UTC (rev 160)
@@ -149,6 +149,15 @@
 }
 
 static void *
+rb_str_cfdata2(VALUE str) 
+{
+    struct rb_objc_str_struct *s;
+
+    s = rb_objc_str_get_struct2(str);
+    return s != NULL ? s->cfdata : NULL;
+}
+
+static void *
 rb_str_cfdata(VALUE str)
 {
     struct rb_objc_str_struct *s;
@@ -192,17 +201,19 @@
 rb_str_bytesync(VALUE str)
 {
     CFDataRef data;
-    CFIndex datalen;
-    data = (CFDataRef)rb_str_cfdata(str);
-    datalen = CFDataGetLength(data);
-    CFStringRef bytestr = CFStringCreateWithBytesNoCopy(
-	NULL,
-	CFDataGetBytePtr((CFDataRef)data),
-	datalen,
-	kCFStringEncodingUTF8,
-	false,
-	kCFAllocatorNull);
-    CFStringReplaceAll((CFMutableStringRef)str, (CFStringRef)bytestr);
+    data = (CFDataRef)rb_str_cfdata2(str);
+    if (data != NULL) {
+	CFIndex datalen;
+	datalen = CFDataGetLength(data);
+	CFStringRef bytestr = CFStringCreateWithBytesNoCopy(
+		NULL,
+		CFDataGetBytePtr((CFDataRef)data),
+		datalen,
+		kCFStringEncodingUTF8,
+		false,
+		kCFAllocatorNull);
+	CFStringReplaceAll((CFMutableStringRef)str, (CFStringRef)bytestr);
+    }
 }
 
 VALUE
@@ -837,7 +848,8 @@
 rb_str_shared_replace(VALUE str, VALUE str2)
 {
 #if WITH_OBJC
-    rb_notimplement();
+    rb_str_modify(str);
+    CFStringReplaceAll((CFMutableStringRef)str, (CFStringRef)str2);
 #else
     rb_encoding *enc;
     int cr;
@@ -2984,9 +2996,6 @@
 VALUE
 rb_str_succ(VALUE orig)
 {
-#if WITH_OBJC
-    rb_notimplement();
-#else
     rb_encoding *enc;
     VALUE str;
     char *sbeg, *s, *e;
@@ -2995,10 +3004,12 @@
     char carry[ONIGENC_CODE_TO_MBC_MAXLEN] = "\1";
     int carry_pos = 0, carry_len = 1;
 
-    str = rb_str_new5(orig, RSTRING_PTR(orig), RSTRING_LEN(orig));
+    str = rb_str_new5(orig, RSTRING_CPTR(orig), RSTRING_CLEN(orig));
+#if !WITH_OBJC
     rb_enc_cr_str_copy_for_substr(str, orig);
     OBJ_INFECT(str, orig);
-    if (RSTRING_LEN(str) == 0) return str;
+#endif
+    if (RSTRING_CLEN(str) == 0) return str;
 
     enc = STR_ENC_GET(orig);
     sbeg = RSTRING_PTR(str);
@@ -3010,8 +3021,10 @@
         neighbor = enc_succ_alnum_char(s, l, enc, carry);
         if (neighbor == NEIGHBOR_NOT_CHAR)
             continue;
-        if (neighbor == NEIGHBOR_FOUND)
+        if (neighbor == NEIGHBOR_FOUND) {
+	    RSTRING_SYNC(str);
             return str;
+	}
         c = 1;
         carry_pos = s - sbeg;
         carry_len = l;
@@ -3022,8 +3035,10 @@
             enum neighbor_char neighbor;
             if ((l = rb_enc_precise_mbclen(s, e, enc)) <= 0) continue;
             neighbor = enc_succ_char(s, l, enc);
-            if (neighbor == NEIGHBOR_FOUND)
-                return str;
+	    if (neighbor == NEIGHBOR_FOUND) {
+		RSTRING_SYNC(str);
+		return str;
+	    }
             if (rb_enc_precise_mbclen(s, s+l, enc) != l) {
                 /* wrapped to \0...\0.  search next valid char. */
                 enc_succ_char(s, l, enc);
@@ -3035,6 +3050,14 @@
             carry_pos = s - sbeg;
 	}
     }
+#if WITH_OBJC
+    CFMutableDataRef data = (CFMutableDataRef)rb_str_cfdata(str);
+    CFDataSetLength(data, RSTRING_LEN(str) + carry_len);
+    s = (char *)CFDataGetMutableBytePtr(data);
+    memmove(s + carry_len, s, RSTRING_LEN(str) - carry_pos);
+    memmove(s, carry, carry_len);
+    RSTRING_SYNC(str);
+#else
     RESIZE_CAPA(str, RSTRING_LEN(str) + carry_len);
     s = RSTRING_PTR(str) + carry_pos;
     memmove(s + carry_len, s, RSTRING_LEN(str) - carry_pos);
@@ -3042,8 +3065,8 @@
     STR_SET_LEN(str, RSTRING_LEN(str) + carry_len);
     RSTRING_PTR(str)[RSTRING_LEN(str)] = '\0';
     rb_enc_str_coderange(str);
+#endif
     return str;
-#endif
 }
 
 
@@ -3100,10 +3123,10 @@
     succ = rb_intern("succ");
     StringValue(end);
     enc = rb_enc_check(beg, end);
-    if (RSTRING_LEN(beg) == 1 && RSTRING_LEN(end) == 1 &&
+    if (RSTRING_CLEN(beg) == 1 && RSTRING_CLEN(end) == 1 &&
 	is_ascii_string(beg) && is_ascii_string(end)) {
-	char c = RSTRING_PTR(beg)[0];
-	char e = RSTRING_PTR(end)[0];
+	char c = RSTRING_CPTR(beg)[0];
+	char e = RSTRING_CPTR(end)[0];
 
 	if (c > e || (excl && c == e)) return beg;
 	for (;;) {
@@ -3125,7 +3148,7 @@
 	current = rb_funcall(current, succ, 0, 0);
 	StringValue(current);
 	if (excl && rb_str_equal(current, end)) break;
-	if (RSTRING_LEN(current) > RSTRING_LEN(end) || RSTRING_LEN(current) == 0)
+	if (RSTRING_CLEN(current) > RSTRING_CLEN(end) || RSTRING_CLEN(current) == 0)
 	    break;
     }
 
@@ -3635,7 +3658,7 @@
 #endif
 	rb_str_modify(str);
 #if WITH_OBJC
-	rb_str_splice(str, BEG(0), END(0) - BEG(0), repl);
+	rb_str_splice_0(str, BEG(0), END(0) - BEG(0), repl);
 	if (rb_obj_tainted(repl))
 	    rb_str_taint(str);
 #else
@@ -5913,9 +5936,6 @@
 static VALUE
 rb_str_split_m(int argc, VALUE *argv, VALUE str)
 {
-#if 0//WITH_OBJC
-    rb_notimplement();
-#else
     rb_encoding *enc;
     VALUE spat;
     VALUE limit;
@@ -6073,7 +6093,6 @@
     }
 
     return result;
-#endif
 }
 
 VALUE

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


More information about the macruby-changes mailing list