summaryrefslogtreecommitdiff
path: root/string.c
diff options
context:
space:
mode:
Diffstat (limited to 'string.c')
-rw-r--r--string.c67
1 files changed, 36 insertions, 31 deletions
diff --git a/string.c b/string.c
index 348bd95132..eb7b9ea5ba 100644
--- a/string.c
+++ b/string.c
@@ -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;