[macruby-changes] [3832] MacRuby/trunk/string.c
source_changes at macosforge.org
source_changes at macosforge.org
Fri Mar 19 16:58:13 PDT 2010
Revision: 3832
http://trac.macosforge.org/projects/ruby/changeset/3832
Author: lsansonetti at apple.com
Date: 2010-03-19 16:58:12 -0700 (Fri, 19 Mar 2010)
Log Message:
-----------
fixed misc bugs in #chomp, #sub, #gsub, #strip
Modified Paths:
--------------
MacRuby/trunk/string.c
Modified: MacRuby/trunk/string.c
===================================================================
--- MacRuby/trunk/string.c 2010-03-19 22:42:44 UTC (rev 3831)
+++ MacRuby/trunk/string.c 2010-03-19 23:58:12 UTC (rev 3832)
@@ -3179,8 +3179,8 @@
long to_del = 0;
if (rs == rb_default_rs
- || rslen == 0
|| (rslen == 1 && rb_str_get_uchar(rs, 0) == '\n')) {
+ // Remove trailing carriage return.
UChar c = str_get_uchar(RSTR(str), len - 1, false);
if (c == '\n') {
to_del++;
@@ -3190,7 +3190,22 @@
to_del++;
}
}
+ else if (rslen == 0) {
+ // Remove all trailing carriage returns.
+ for (int i = len - 1; i >= 0; i--) {
+ UChar c = str_get_uchar(RSTR(str), i, false);
+ if (c != '\n') {
+ break;
+ }
+ to_del++;
+ if (i > 0 && str_get_uchar(RSTR(str), i - 1, false) == '\r') {
+ to_del++;
+ i--;
+ }
+ }
+ }
else if (rslen <= len) {
+ // Remove trailing substring.
if (str_index_for_string(RSTR(str), str_need_string(rs),
len - rslen, -1, false, false) >= 0) {
to_del += rslen;
@@ -3428,6 +3443,11 @@
rb_raise(rb_eArgError, "wrong number of arguments (%d for 2)", argc);
}
+ if (!block_given) {
+ // RubySpec compliance...
+ rstr_modify(str);
+ }
+
VALUE pat = get_pat(argv[0], true);
if (rb_reg_search(pat, str, 0, false) >= 0) {
VALUE match = rb_backref_get();
@@ -3438,7 +3458,11 @@
if (block_given || !NIL_P(hash)) {
if (block_given) {
rb_match_busy(match);
+ const unsigned long hash = rb_str_hash(str);
repl = rb_obj_as_string(rb_yield(rb_reg_nth_match(0, match)));
+ if (rb_str_hash(str) != hash) {
+ rb_raise(rb_eRuntimeError, "string modified");
+ }
}
else {
repl = rb_hash_aref(hash, rstr_substr(str, results[0].beg,
@@ -3554,6 +3578,11 @@
const long len = str_length(RSTR(str), false);
VALUE match = Qnil;
+ if (bang) {
+ // RubySpec compliance...
+ rstr_modify(str);
+ }
+
while (true) {
const long pos = rb_reg_search(pat, str, offset, false);
if (pos < 0) {
@@ -3613,7 +3642,6 @@
rb_backref_set(match);
if (bang) {
- rstr_modify(str);
str_replace(RSTR(str), dest);
}
else {
@@ -4051,7 +4079,8 @@
// Strip right side.
long pos = len - 1;
while (pos >= 0) {
- if (!iswspace(rb_str_get_uchar(str, pos))) {
+ UChar c = rb_str_get_uchar(str, pos);
+ if (!iswspace(c) && c != '\0') {
break;
}
pos--;
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/macruby-changes/attachments/20100319/d8ca8e48/attachment-0001.html>
More information about the macruby-changes
mailing list