Revision: 3715 http://trac.macosforge.org/projects/ruby/changeset/3715 Author: lsansonetti@apple.com Date: 2010-03-08 18:02:51 -0800 (Mon, 08 Mar 2010) Log Message: ----------- fixed a bug in #gsub, implemented negation in #tr Modified Paths: -------------- MacRuby/branches/icu/string.c Modified: MacRuby/branches/icu/string.c =================================================================== --- MacRuby/branches/icu/string.c 2010-03-09 01:07:18 UTC (rev 3714) +++ MacRuby/branches/icu/string.c 2010-03-09 02:02:51 UTC (rev 3715) @@ -3381,7 +3381,7 @@ VALUE pat = get_pat(argv[0], 1); VALUE dest = rb_str_new5(str, NULL, 0); - long offset = 0; + long offset = 0, last = 0; bool changed = false; const long len = str_length(RSTR(str), false); @@ -3391,9 +3391,9 @@ if (!changed) { return bang ? Qnil : rstr_dup(str, 0); } - if (offset < len) { + if (last < len) { str_concat_string(RSTR(dest), - RSTR(rstr_substr(str, offset, len - offset))); + RSTR(rstr_substr(str, last, len - last))); } break; } @@ -3433,7 +3433,7 @@ } changed = true; - offset = results[0].end; + offset = last = results[0].end; if (results[0].beg == offset) { offset++; } @@ -4624,19 +4624,41 @@ NULL, repl); assert(repl_buflen > 0); - // Fill the table with 0s. - for (int i = 0; i < 0xff; i++) { - tbl[i] = 0; + // Fill the table based on the values from the linear buffers. + if (negate) { + for (int i = 0; i < 0xff; i++) { + tbl[i] = 1; + } + + long pos = 0; + while (pos < source_buflen) { + const char source_c = source_buf[pos]; + tbl[(int)source_c] = 0; + pos++; + } + + for (int i = 0, pos = 0; i < 0xff; i++) { + if (tbl[i] == 1) { + const char repl_c = pos >= repl_buflen + ? repl_buf[repl_buflen - 1] : repl_buf[pos]; + tbl[i] = repl_c; + pos++; + } + } } + else { + for (int i = 0; i < 0xff; i++) { + tbl[i] = 0; + } - // Now fill the table based on the linear buffer values. - long pos = 0; - while (pos < source_buflen) { - const char source_c = source_buf[pos]; - const char repl_c = pos >= repl_buflen - ? repl_buf[repl_buflen - 1] : repl_buf[pos]; - tbl[(int)source_c] = repl_c; - pos++; + long pos = 0; + while (pos < source_buflen) { + const char source_c = source_buf[pos]; + const char repl_c = pos >= repl_buflen + ? repl_buf[repl_buflen - 1] : repl_buf[pos]; + tbl[(int)source_c] = repl_c; + pos++; + } } }