Revision
3761
Author
lsansonetti@apple.com
Date
2010-03-12 23:28:48 -0800 (Fri, 12 Mar 2010)

Log Message

added support for NSString -> bytestring coercion

Modified Paths

Diff

Modified: MacRuby/trunk/string.c (3760 => 3761)


--- MacRuby/trunk/string.c	2010-03-13 04:33:48 UTC (rev 3760)
+++ MacRuby/trunk/string.c	2010-03-13 07:28:48 UTC (rev 3761)
@@ -5432,11 +5432,28 @@
 VALUE
 rb_str_bstr(VALUE str)
 {
-    if (IS_RSTR(str)) {
-	str_make_data_binary(RSTR(str));
-	return str;
+    if (!IS_RSTR(str)) {
+	const char *cptr = CFStringGetCStringPtr((CFStringRef)str,
+		kCFStringEncodingUTF8);
+	if (cptr != NULL) {
+	    str = rb_str_new2(cptr);
+	}
+	else {
+	    const long max = CFStringGetMaximumSizeForEncoding(
+		    CFStringGetLength((CFStringRef)str), kCFStringEncodingUTF8);
+	    assert(max > 0);
+	    char *buf = (char *)malloc(max + 1);
+	    if (!CFStringGetCString((CFStringRef)str, buf, max,
+			kCFStringEncodingUTF8)) {
+		free(buf);
+		rb_raise(rb_eArgError,
+			"cannot coerce NSString %p as UTF-8 data", (void *)str);
+	    }
+	    str = rb_str_new2(buf);
+	}
     }
-    abort(); // TODO
+    str_make_data_binary(RSTR(str));
+    return str;
 }
 
 uint8_t *