[macruby-changes] [914] MacRuby/branches/experimental/string.c

source_changes at macosforge.org source_changes at macosforge.org
Fri Mar 13 20:40:01 PDT 2009


Revision: 914
          http://trac.macosforge.org/projects/ruby/changeset/914
Author:   lsansonetti at apple.com
Date:     2009-03-13 20:40:01 -0700 (Fri, 13 Mar 2009)
Log Message:
-----------
clean the bytestring stuff

Modified Paths:
--------------
    MacRuby/branches/experimental/string.c

Modified: MacRuby/branches/experimental/string.c
===================================================================
--- MacRuby/branches/experimental/string.c	2009-03-14 03:39:31 UTC (rev 913)
+++ MacRuby/branches/experimental/string.c	2009-03-14 03:40:01 UTC (rev 914)
@@ -5377,36 +5377,44 @@
 
 #undef INSTALL_METHOD
 
-CFMutableDataRef 
+static inline void **
+rb_bytestring_ivar_addr(VALUE bstr)
+{
+    return (void **)((char *)bstr + wrappedDataOffset);
+}
+
+inline CFMutableDataRef 
 rb_bytestring_wrapped_data(VALUE bstr)
 {
-    void **data = (void **)((char *)bstr + wrappedDataOffset);
-    return (CFMutableDataRef)(*data); 
+    void **addr = rb_bytestring_ivar_addr(bstr);
+    return (CFMutableDataRef)(*addr); 
 }
 
-inline
-UInt8 *rb_bytestring_byte_pointer(VALUE bstr)
+inline void
+rb_bytestring_set_wrapped_data(VALUE bstr, CFMutableDataRef data)
 {
+    void **addr = rb_bytestring_ivar_addr(bstr);
+    *addr = (void *)data;
+}
+
+inline UInt8 *
+rb_bytestring_byte_pointer(VALUE bstr)
+{
     return CFDataGetMutableBytePtr(rb_bytestring_wrapped_data(bstr));
 }
 
-
 static VALUE
 rb_bytestring_alloc(VALUE klass, SEL sel)
 {
     VALUE bstr = (VALUE)class_createInstance((Class)rb_cByteString, 0);
 
     CFMutableDataRef data = CFDataCreateMutable(NULL, 0);
-    //CFDataIncreaseLength(data, 1);
+    rb_bytestring_set_wrapped_data(bstr, data);
+    CFMakeCollectable(data);
 
-    // TODO: Maybe we should access this with wrappedDataOffset...
-    object_setInstanceVariable((id)bstr, "wrappedData", (void *)data);
-    
-    CFMakeCollectable(data);
     return bstr;
 }
 
-
 VALUE 
 rb_bytestring_new() 
 {
@@ -5423,15 +5431,28 @@
     return v;
 }
 
+static void inline
+rb_bytestring_copy_cfstring_content(VALUE bstr, CFStringRef str)
+{
+    const char *cptr = CFStringGetCStringPtr(str, kCFStringEncodingUTF8);
+    assert(cptr != NULL); // TODO handle UTF-16 strings
+
+    CFDataAppendBytes(rb_bytestring_wrapped_data(bstr), (UInt8 *)cptr, 
+	    CFStringGetLength(str));
+}
+
 static VALUE
 rb_bytestring_initialize(VALUE recv, SEL sel, int argc, VALUE *argv)
 {
     VALUE orig;
+
+    rb_scan_args(argc, argv, "01", &orig);
+
     recv = (VALUE)objc_msgSend((id)recv, selInit); // [recv init];
-    if(argc == 1) {
-        rb_scan_args(argc, argv, "01", &orig);
-        const UniChar *toCopy = (const UniChar*)CFStringGetCStringPtr((CFStringRef)orig, kCFStringEncodingUTF8);
-        CFDataAppendBytes(rb_bytestring_wrapped_data(recv), (UInt8*)toCopy, CFStringGetLength((CFStringRef)orig));
+
+    if (!NIL_P(orig)) {
+	StringValue(orig);
+	rb_bytestring_copy_cfstring_content(recv, (CFStringRef)orig);
     }
     return orig;
 }
@@ -5440,43 +5461,45 @@
 rb_coerce_to_bytestring(VALUE str)
 {
     VALUE new = rb_bytestring_alloc(0, 0);
-    const UniChar *toCopy = (const UniChar*)CFStringGetCStringPtr((CFStringRef)str, kCFStringEncodingUTF8);
-    CFDataAppendBytes(rb_bytestring_wrapped_data(new), (UInt8*)toCopy, CFStringGetLength((CFStringRef)str));
+    rb_bytestring_copy_cfstring_content(new, (CFStringRef)str);
     return new;
 }
 
 long 
 rb_bytestring_length(VALUE str)
 {
-    return CFDataGetLength(rb_bytestring_wrapped_data(str))-1;
+    return CFDataGetLength(rb_bytestring_wrapped_data(str));
 }
 
 static CFIndex
 imp_rb_bytestring_length(void *rcv, SEL sel) 
 {
-    return CFDataGetLength(rb_bytestring_wrapped_data((VALUE)rcv))-1;
+    return rb_bytestring_length((VALUE)rcv);
 }
 
-// There has GOT to be some character encoding issues with this.
 static UniChar
 imp_rb_bytestring_characterAtIndex(void *rcv, SEL sel, CFIndex idx)
 {
+    // XXX should be encoding aware
     return rb_bytestring_byte_pointer((VALUE)rcv)[idx];
 }
 
 static void
-imp_rb_bytestring_replaceCharactersInRange_withString(void *rcv, SEL sel, CFRange range, void *str)
+imp_rb_bytestring_replaceCharactersInRange_withString(void *rcv, SEL sel,
+	CFRange range, void *str)
 {
-    const UniChar *toCopy = (const UniChar*)CFStringGetCStringPtr((CFStringRef)str, kCFStringEncodingUTF8);
-    // TODO: Add a call to CFStringGetCString to catch if this fails.
-    assert(toCopy != NULL);
-    size_t length = strlen((const char*)toCopy);
+    const char *cstr = CFStringGetCStringPtr((CFStringRef)str,
+	    kCFStringEncodingUTF8);
+    assert(cstr != NULL); // TODO handle UTF-16 strings
+    const long length = CFStringGetLength((CFStringRef)str);
+
     CFMutableDataRef data = rb_bytestring_wrapped_data((VALUE)rcv);
+
     // TODO: Have a more robust check than merely an assert(),
     // and find out whether CFDataReplaceBytes complains if you give it
     // a range outside the length of the wrapped data..
     assert((length + range.location) < CFDataGetLength(data));
-    CFDataReplaceBytes(data, range, (const UInt8*)toCopy, length);
+    CFDataReplaceBytes(data, range, (const UInt8 *)cstr, length);
 }
 
 /*
@@ -5502,7 +5525,8 @@
     rb_const_set(rb_cObject, rb_intern("String"), rb_cNSMutableString);
     rb_set_class_path(rb_cNSMutableString, rb_cObject, "NSMutableString");
 
-    rb_objc_define_method(*(VALUE *)rb_cString, "__new_bytestring__", rb_str_new_bytestring_m, 1);
+    rb_objc_define_method(*(VALUE *)rb_cString, "__new_bytestring__",
+	    rb_str_new_bytestring_m, 1);
     rb_objc_define_method(rb_cString, "__bytestring__?", rb_str_bytestring_m, 0);
 
     rb_include_module(rb_cString, rb_mComparable);
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/macruby-changes/attachments/20090313/7a987c82/attachment-0001.html>


More information about the macruby-changes mailing list