diff options
Diffstat (limited to 'string.c')
-rw-r--r-- | string.c | 67 |
1 files changed, 36 insertions, 31 deletions
@@ -725,7 +725,7 @@ str_succ(orig) { VALUE str, str2; char *sbeg, *s; - char c = -1; + int c = -1; str = str_new(RSTRING(orig)->ptr, RSTRING(orig)->len); @@ -1169,7 +1169,7 @@ str_sub(argc, argv, str) else { v = str_sub_s(str, pat, val, 1); } - if (NIL_P(v)) return str_dup(str); + if (NIL_P(v)) return str; return v; } @@ -1201,7 +1201,7 @@ str_gsub(argc, argv, str) else { v = str_sub_s(str, pat, val, 0); } - if (NIL_P(v)) return str_dup(str); + if (NIL_P(v)) return str; return v; } @@ -1294,10 +1294,12 @@ f_gsub(argc, argv) else { v = str_sub_s(line, pat, val, 0); } - if (NIL_P(v)) v = str_dup(line); - lastline_set(v); + if (!NIL_P(v)) { + lastline_set(v); + line = v; + } - return v; + return line; } static VALUE @@ -1592,7 +1594,7 @@ static VALUE str_upcase(str) VALUE str; { - VALUE val = str_upcase_bang(str = str_dup(str)); + VALUE val = str_upcase_bang(str_dup(str)); if (NIL_P(val)) return str; return val; @@ -1626,7 +1628,7 @@ static VALUE str_downcase(str) VALUE str; { - VALUE val = str_downcase_bang(str = str_dup(str)); + VALUE val = str_downcase_bang(str_dup(str)); if (NIL_P(val)) return str; return val; @@ -1662,7 +1664,7 @@ static VALUE str_capitalize(str) VALUE str; { - VALUE val = str_capitalize_bang(str = str_dup(str)); + VALUE val = str_capitalize_bang(str_dup(str)); if (NIL_P(val)) return str; return val; @@ -1700,7 +1702,7 @@ static VALUE str_swapcase(str) VALUE str; { - VALUE val = str_swapcase_bang(str = str_dup(str)); + VALUE val = str_swapcase_bang(str_dup(str)); if (NIL_P(val)) return str; return val; @@ -1753,7 +1755,7 @@ tr_trans(str, src, repl, sflag) { struct tr trsrc, trrepl; int cflag = 0; - char trans[256]; + int trans[256]; int i, c, modify = 0; char *s, *send; @@ -1765,7 +1767,9 @@ tr_trans(str, src, repl, sflag) trsrc.p++; } if (TYPE(repl) != T_STRING) repl = str_to_str(repl); - if (RSTRING(repl)->len == 0) return str_delete_bang(str, src); + if (RSTRING(repl)->len == 0) { + return str_delete_bang(str, src); + } trrepl.p = RSTRING(repl)->ptr; trrepl.pend = trrepl.p + RSTRING(repl)->len; trsrc.gen = trrepl.gen = 0; @@ -1777,21 +1781,21 @@ tr_trans(str, src, repl, sflag) trans[i] = 1; } while ((c = trnext(&trsrc)) >= 0) { - trans[c & 0xff] = 0; + trans[c & 0xff] = -1; } while ((c = trnext(&trrepl)) >= 0) /* retrieve last replacer */; for (i=0; i<256; i++) { - if (trans[i] != 0) { + if (trans[i] >= 0) { trans[i] = trrepl.now; } } } else { - char r; + int r; for (i=0; i<256; i++) { - trans[i] = 0; + trans[i] = -1; } while ((c = trnext(&trsrc)) >= 0) { r = trnext(&trrepl); @@ -1807,10 +1811,10 @@ tr_trans(str, src, repl, sflag) while (s < send) { c0 = *s++; - if ((c = trans[c0 & 0xff] & 0xff) != 0) { + if ((c = trans[c0 & 0xff]) >= 0) { if (last == c) continue; last = c; - *t++ = c; + *t++ = c & 0xff; modify = 1; } else { @@ -1826,10 +1830,11 @@ tr_trans(str, src, repl, sflag) } else { while (s < send) { - if ((c = trans[*s++ & 0xff] & 0xff) != 0) { - *s = c; + if ((c = trans[*s & 0xff]) >= 0) { + *s = c & 0xff; modify = 1; } + s++; } } @@ -1848,7 +1853,7 @@ static VALUE str_tr(str, src, repl) VALUE str, src, repl; { - VALUE val = tr_trans(str = str_dup(str), src, repl, 0); + VALUE val = tr_trans(str_dup(str), src, repl, 0); if (NIL_P(val)) return str; return val; @@ -1911,7 +1916,7 @@ static VALUE str_delete(str1, str2) VALUE str1, str2; { - VALUE val = str_delete_bang(str1 = str_dup(str1), str2); + VALUE val = str_delete_bang(str_dup(str1), str2); if (NIL_P(val)) return str1; return val; @@ -1978,7 +1983,7 @@ str_squeeze(argc, argv, str) VALUE *argv; VALUE str; { - VALUE val = str_squeeze_bang(argc, argv, str = str_dup(str)); + VALUE val = str_squeeze_bang(argc, argv, str_dup(str)); if (NIL_P(val)) return str; return val; @@ -1995,7 +2000,7 @@ static VALUE str_tr_s(str, src, repl) VALUE str, src, repl; { - VALUE val = tr_trans(str = str_dup(str), src, repl, 1); + VALUE val = tr_trans(str_dup(str), src, repl, 1); if (NIL_P(val)) return str; return val; @@ -2255,7 +2260,7 @@ static VALUE str_chop(str) VALUE str; { - VALUE val = str_chop_bang(str = str_dup(str)); + VALUE val = str_chop_bang(str_dup(str)); if (NIL_P(val)) return str; return val; @@ -2271,10 +2276,10 @@ f_chop_bang(str) static VALUE f_chop() { - VALUE str = str_dup(uscore_get()); + VALUE str = uscore_get(); VALUE val; - val = str_chop_bang(str); + val = str_chop_bang(str_dup(str)); if (NIL_P(val)) return str; lastline_set(val); return val; @@ -2329,7 +2334,7 @@ str_chomp(argc, argv, str) VALUE *argv; VALUE str; { - VALUE val = str_chomp_bang(argc, argv, str = str_dup(str)); + VALUE val = str_chomp_bang(argc, argv, str_dup(str)); if (NIL_P(val)) return str; return val; @@ -2348,8 +2353,8 @@ f_chomp(argc, argv) int argc; VALUE *argv; { - VALUE str = str_dup(uscore_get()); - VALUE val = str_chomp_bang(argc, argv, str); + VALUE str = uscore_get(); + VALUE val = str_chomp_bang(argc, argv, str_dup(str)); if (NIL_P(val)) return str; lastline_set(val); @@ -2396,7 +2401,7 @@ static VALUE str_strip(str) VALUE str; { - VALUE val = str_strip_bang(str = str_dup(str)); + VALUE val = str_strip_bang(str_dup(str)); if (NIL_P(val)) return str; return val; |