Revision
5223
Author
lsansonetti@apple.com
Date
2011-02-08 18:29:50 -0800 (Tue, 08 Feb 2011)

Log Message

better RSTRING_{PTR,LEN] for pure NSStrings

Modified Paths

Diff

Modified: MacRuby/trunk/NSString.m (5222 => 5223)


--- MacRuby/trunk/NSString.m	2011-02-09 02:28:44 UTC (rev 5222)
+++ MacRuby/trunk/NSString.m	2011-02-09 02:29:50 UTC (rev 5223)
@@ -427,3 +427,15 @@
     rb_objc_define_method(rb_cString, "to_data", rstr_only, 0);
     rb_objc_define_method(rb_cString, "pointer", rstr_only, 0);
 }
+
+const char *
+nsstr_cstr(VALUE str)
+{
+    return [(NSString *)str UTF8String];
+}
+
+long
+nsstr_clen(VALUE str)
+{
+    return [(NSString *)str lengthOfBytesUsingEncoding:NSUTF8StringEncoding];
+}

Modified: MacRuby/trunk/encoding.h (5222 => 5223)


--- MacRuby/trunk/encoding.h	2011-02-09 02:28:44 UTC (rev 5222)
+++ MacRuby/trunk/encoding.h	2011-02-09 02:29:50 UTC (rev 5223)
@@ -378,6 +378,9 @@
 
 VALUE rstr_new_path(const char *path);
 
+const char *nsstr_cstr(VALUE str);
+long nsstr_clen(VALUE str);
+
 #if defined(__cplusplus)
 } // extern "C"
 #endif

Modified: MacRuby/trunk/string.c (5222 => 5223)


--- MacRuby/trunk/string.c	2011-02-09 02:28:44 UTC (rev 5222)
+++ MacRuby/trunk/string.c	2011-02-09 02:29:50 UTC (rev 5223)
@@ -6333,24 +6333,7 @@
 	str_ensure_null_terminator(RSTR(str));
 	return RSTR(str)->bytes;
     }
-
-    // CFString code path, hopefully this should not happen very often.
-    const char *cptr = (const char *)CFStringGetCStringPtr((CFStringRef)str, 0);
-    if (cptr != NULL) {
-	return cptr;
-    }
-
-    const long max = CFStringGetMaximumSizeForEncoding(
-	    CFStringGetLength((CFStringRef)str),
-	    kCFStringEncodingUTF8);
-    char *cptr2 = (char *)xmalloc(max + 1);
-    if (!CFStringGetCString((CFStringRef)str, cptr2, max + 1,
-		kCFStringEncodingUTF8)) {
-	// Probably an UTF16 string...
-	xfree(cptr2);
-	return NULL;
-    }
-    return cptr2;
+    return nsstr_cstr(str);
 }
 
 long
@@ -6359,7 +6342,7 @@
     if (IS_RSTR(str)) {
 	return RSTR(str)->length_in_bytes;
     }
-    return CFStringGetLength((CFStringRef)str);
+    return nsstr_clen(str);
 }
 
 char *