[macruby-changes] [3657] MacRuby/branches/icu
source_changes at macosforge.org
source_changes at macosforge.org
Sat Feb 27 22:51:21 PST 2010
Revision: 3657
http://trac.macosforge.org/projects/ruby/changeset/3657
Author: lsansonetti at apple.com
Date: 2010-02-27 22:51:19 -0800 (Sat, 27 Feb 2010)
Log Message:
-----------
added bstr_concat() to be used to cat bytes, use it in marshal
Modified Paths:
--------------
MacRuby/branches/icu/encoding.h
MacRuby/branches/icu/marshal.c
MacRuby/branches/icu/string.c
Modified: MacRuby/branches/icu/encoding.h
===================================================================
--- MacRuby/branches/icu/encoding.h 2010-02-28 06:33:40 UTC (rev 3656)
+++ MacRuby/branches/icu/encoding.h 2010-02-28 06:51:19 UTC (rev 3657)
@@ -311,6 +311,7 @@
VALUE bstr_new(void);
VALUE bstr_new_with_data(const uint8_t *bytes, long len);
uint8_t *bstr_bytes(VALUE str);
+void bstr_concat(VALUE str, const uint8_t *bytes, long len);
long bstr_length(VALUE str);
void bstr_set_length(VALUE str, long len);
void bstr_resize(VALUE str, long capa);
Modified: MacRuby/branches/icu/marshal.c
===================================================================
--- MacRuby/branches/icu/marshal.c 2010-02-28 06:33:40 UTC (rev 3656)
+++ MacRuby/branches/icu/marshal.c 2010-02-28 06:51:19 UTC (rev 3657)
@@ -219,7 +219,7 @@
w_nbyte(const char *s, int n, struct dump_arg *arg)
{
VALUE buf = arg->str;
- rb_str_buf_cat(buf, s, n);
+ bstr_concat(buf, (const uint8_t *)s, n);
if (arg->dest && RSTRING_LEN(buf) >= BUFSIZ) {
if (arg->taint) OBJ_TAINT(buf);
rb_io_write(arg->dest, 0, buf);
@@ -898,7 +898,7 @@
w_object(arg->obj, arg->arg, arg->limit);
if (arg->arg->dest) {
rb_io_write(arg->arg->dest, 0, arg->arg->str);
- rb_str_resize(arg->arg->str, 0);
+ bstr_resize(arg->arg->str, 0);
}
return 0;
}
Modified: MacRuby/branches/icu/string.c
===================================================================
--- MacRuby/branches/icu/string.c 2010-02-28 06:33:40 UTC (rev 3656)
+++ MacRuby/branches/icu/string.c 2010-02-28 06:51:19 UTC (rev 3657)
@@ -801,6 +801,18 @@
}
static void
+str_concat_bytes(rb_str_t *self, const char *bytes, long len)
+{
+ assert(bytes != NULL && len >= 0);
+
+ const long new_length_in_bytes = self->length_in_bytes + len;
+
+ str_resize_bytes(self, new_length_in_bytes);
+ memcpy(self->data.bytes + self->length_in_bytes, bytes, len);
+ self->length_in_bytes = new_length_in_bytes;
+}
+
+static void
str_concat_string(rb_str_t *self, rb_str_t *str)
{
if (str->length_in_bytes == 0) {
@@ -814,15 +826,12 @@
str_must_have_compatible_encoding(self, str);
str_make_same_format(self, str);
- long new_length_in_bytes = self->length_in_bytes + str->length_in_bytes;
// TODO: we should maybe merge flags
// (if both are ASCII-only, the concatenation is ASCII-only,
// though I'm not sure all the tests required are worth doing)
str_unset_facultative_flags(self);
- str_resize_bytes(self, new_length_in_bytes);
- memcpy(self->data.bytes + self->length_in_bytes, str->data.bytes,
- str->length_in_bytes);
- self->length_in_bytes = new_length_in_bytes;
+
+ str_concat_bytes(self, str->data.bytes, str->length_in_bytes);
}
static int
@@ -3623,6 +3632,8 @@
// ByteString emulation.
+#define IS_BSTR(obj) (IS_RSTR(obj) && !str_is_stored_in_uchars(RSTR(obj)))
+
VALUE
rb_str_bstr(VALUE str)
{
@@ -3636,7 +3647,7 @@
uint8_t *
bstr_bytes(VALUE str)
{
- assert(IS_RSTR(str));
+ assert(IS_BSTR(str));
return (uint8_t *)RSTR(str)->data.bytes;
}
@@ -3658,21 +3669,28 @@
long
bstr_length(VALUE str)
{
- assert(IS_RSTR(str));
+ assert(IS_BSTR(str));
return RSTR(str)->length_in_bytes;
}
void
+bstr_concat(VALUE str, const uint8_t *bytes, long len)
+{
+ assert(IS_BSTR(str));
+ str_concat_bytes(RSTR(str), (const char *)bytes, len);
+}
+
+void
bstr_resize(VALUE str, long capa)
{
- assert(IS_RSTR(str));
+ assert(IS_BSTR(str));
str_resize_bytes(RSTR(str), capa);
}
void
bstr_set_length(VALUE str, long len)
{
- assert(IS_RSTR(str));
+ assert(IS_BSTR(str));
assert(len <= RSTR(str)->capacity_in_bytes);
RSTR(str)->length_in_bytes = len;
}
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/macruby-changes/attachments/20100227/61b8fc7f/attachment-0001.html>
More information about the macruby-changes
mailing list