[macruby-changes] [3624] MacRuby/branches/icu/string.c

source_changes at macosforge.org source_changes at macosforge.org
Thu Feb 25 14:26:19 PST 2010


Revision: 3624
          http://trac.macosforge.org/projects/ruby/changeset/3624
Author:   lsansonetti at apple.com
Date:     2010-02-25 14:26:18 -0800 (Thu, 25 Feb 2010)
Log Message:
-----------
make sure the evil RSTRING_PTR macro always return a null-terminated string

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

Modified: MacRuby/branches/icu/string.c
===================================================================
--- MacRuby/branches/icu/string.c	2010-02-25 21:56:37 UTC (rev 3623)
+++ MacRuby/branches/icu/string.c	2010-02-25 22:26:18 UTC (rev 3624)
@@ -689,15 +689,33 @@
 str_resize_bytes(rb_str_t *self, long new_capacity)
 {
     if (self->capacity_in_bytes < new_capacity) {
-	char *bytes = xrealloc(self->data.bytes, new_capacity);
-	if (bytes != self->data.bytes) {
-	    GC_WB(&self->data.bytes, bytes);
+	if (self->data.bytes == NULL) {
+	    GC_WB(&self->data.bytes, xmalloc(new_capacity));
 	}
+	else {
+	    char *bytes = xrealloc(self->data.bytes, new_capacity);
+	    if (bytes != self->data.bytes) {
+		GC_WB(&self->data.bytes, bytes);
+	    }
+	}
 	self->capacity_in_bytes = new_capacity;
     }
 }
 
 static void
+str_ensure_null_terminator(rb_str_t *self)
+{
+    assert(!str_is_stored_in_uchars(self));
+
+    if (self->length_in_bytes > 0
+	&& (self->capacity_in_bytes == self->length_in_bytes
+	    || self->data.bytes[self->length_in_bytes] != '\0')) {
+	str_resize_bytes(self, self->length_in_bytes + 1);
+	self->data.bytes[self->length_in_bytes] = '\0';
+    }
+}
+
+static void
 str_splice(rb_str_t *self, long pos, long len, rb_str_t *str, bool ucs2_mode)
 {
     // self[pos..pos+len] = str
@@ -3459,11 +3477,15 @@
 rb_str_cstr(VALUE str)
 {
     if (IS_RSTR(str)) {
+	if (RSTR(str)->length_in_bytes == 0) {
+	    return "";
+	}
 	str_make_data_binary(RSTR(str));
+	str_ensure_null_terminator(RSTR(str));
 	return RSTR(str)->data.bytes;
     }
 
-    // CFString code path, hopefully this should not happen a lot.
+    // CFString code path, hopefully this should not happen very often.
     const char *cptr = (const char *)CFStringGetCStringPtr((CFStringRef)str, 0);
     if (cptr != NULL) {
 	return cptr;
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/macruby-changes/attachments/20100225/93cdcf7d/attachment.html>


More information about the macruby-changes mailing list