Revision: 3817 http://trac.macosforge.org/projects/ruby/changeset/3817 Author: lsansonetti@apple.com Date: 2010-03-18 19:10:36 -0700 (Thu, 18 Mar 2010) Log Message: ----------- fixed a bunch of bugs in #rindex Modified Paths: -------------- MacRuby/trunk/string.c Modified: MacRuby/trunk/string.c =================================================================== --- MacRuby/trunk/string.c 2010-03-19 02:10:21 UTC (rev 3816) +++ MacRuby/trunk/string.c 2010-03-19 02:10:36 UTC (rev 3817) @@ -1003,7 +1003,7 @@ return 0; } if (searched->length_in_bytes == 0) { - return start_offset_in_bytes; + return backward_search ? end_offset_in_bytes : start_offset_in_bytes; } str_must_have_compatible_encoding(self, searched); str_make_same_format(self, searched); @@ -1020,12 +1020,12 @@ } if (backward_search) { - for (long offset_in_bytes = end_offset_in_bytes; - offset_in_bytes >= start_offset_in_bytes; - offset_in_bytes -= increment) { - if (memcmp(self->data.bytes+offset_in_bytes, searched->data.bytes, + for (long offset = end_offset_in_bytes - increment; + offset >= start_offset_in_bytes; + offset -= increment) { + if (memcmp(self->data.bytes + offset, searched->data.bytes, searched->length_in_bytes) == 0) { - return offset_in_bytes; + return offset; } } } @@ -1033,12 +1033,12 @@ const long max_offset_in_bytes = end_offset_in_bytes - searched->length_in_bytes + 1; - for (long offset_in_bytes = start_offset_in_bytes; - offset_in_bytes < max_offset_in_bytes; - offset_in_bytes += increment) { - if (memcmp(self->data.bytes+offset_in_bytes, searched->data.bytes, + for (long offset = start_offset_in_bytes; + offset < max_offset_in_bytes; + offset += increment) { + if (memcmp(self->data.bytes + offset, searched->data.bytes, searched->length_in_bytes) == 0) { - return offset_in_bytes; + return offset; } } } @@ -1956,11 +1956,11 @@ } } if (pos >= len) { - pos = len - 1; + pos = len; } } else { - pos = len - 1; + pos = len; } switch (TYPE(sub)) { @@ -1972,8 +1972,10 @@ StringValue(sub); // fall through case T_STRING: - pos = str_index_for_string(RSTR(self), str_need_string(sub), - 0, pos - 1, true, true); + if (rb_str_chars_len(sub) > 0) { + pos = str_index_for_string(RSTR(self), str_need_string(sub), + 0, pos, true, true); + } break; }