summaryrefslogtreecommitdiff
path: root/string.c
diff options
context:
space:
mode:
authormatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2000-02-02 08:10:32 +0000
committermatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2000-02-02 08:10:32 +0000
commitd7b8616260f1012bdb011e4ac808eba9f0cf38aa (patch)
tree6e08147177cf566e36cc9ad91753df6b554f339e /string.c
parent683839054fad9935d362e5228d1d93e78c340699 (diff)
2000-02-02
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@613 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'string.c')
-rw-r--r--string.c346
1 files changed, 76 insertions, 270 deletions
diff --git a/string.c b/string.c
index b1288fee0f..f71a9b63af 100644
--- a/string.c
+++ b/string.c
@@ -1008,7 +1008,7 @@ get_pat(pat)
}
static VALUE
-str_sub_bang(argc, argv, str)
+rb_str_sub_bang(argc, argv, str)
int argc;
VALUE *argv;
VALUE str;
@@ -1057,18 +1057,7 @@ str_sub_bang(argc, argv, str)
RSTRING(repl)->ptr, RSTRING(repl)->len);
RSTRING(str)->len += RSTRING(repl)->len - plen;
RSTRING(str)->ptr[RSTRING(str)->len] = '\0';
- return str;
}
- return Qnil;
-}
-
-static VALUE
-rb_str_sub_bang(argc, argv, str)
- int argc;
- VALUE *argv;
- VALUE str;
-{
- str_sub_bang(argc, argv, str);
return str;
}
@@ -1078,17 +1067,13 @@ rb_str_sub(argc, argv, str)
VALUE *argv;
VALUE str;
{
- VALUE dup = rb_str_dup(str);
-
- if (NIL_P(str_sub_bang(argc, argv, dup))) {
- rb_gc_force_recycle(dup);
- return str;
- }
- return dup;
+ str = rb_str_dup(str);
+ rb_str_sub_bang(argc, argv, str);
+ return str;
}
static VALUE
-str_gsub_bang(argc, argv, str)
+rb_str_gsub_bang(argc, argv, str)
int argc;
VALUE *argv;
VALUE str;
@@ -1115,7 +1100,7 @@ str_gsub_bang(argc, argv, str)
pat = get_pat(argv[0]);
offset=0; n=0;
beg = rb_reg_search(pat, str, 0, 0);
- if (beg < 0) return Qnil; /* no match, no substitution */
+ if (beg < 0) return str; /* no match, no substitution */
blen = RSTRING(str)->len + 30; /* len + margin */
buf = ALLOC_N(char, blen);
@@ -1125,11 +1110,10 @@ str_gsub_bang(argc, argv, str)
while (beg >= 0) {
n++;
match = rb_backref_get();
+ rb_match_busy(match, Qtrue);
regs = RMATCH(match)->regs;
if (iter) {
- rb_match_busy(match, Qtrue);
val = rb_obj_as_string(rb_yield(rb_reg_nth_match(0, match)));
- rb_match_busy(match, Qfalse);
rb_backref_set(match);
}
else {
@@ -1176,6 +1160,8 @@ str_gsub_bang(argc, argv, str)
memcpy(bp, cp, RSTRING(str)->len - offset);
bp += RSTRING(str)->len - offset;
}
+ rb_match_busy(match, Qfalse);
+ rb_backref_set(match);
rb_str_modify(str);
free(RSTRING(str)->ptr);
RSTRING(str)->ptr = buf;
@@ -1187,28 +1173,14 @@ str_gsub_bang(argc, argv, str)
}
static VALUE
-rb_str_gsub_bang(argc, argv, str)
- int argc;
- VALUE *argv;
- VALUE str;
-{
- str_gsub_bang(argc, argv, str);
- return str;
-}
-
-static VALUE
rb_str_gsub(argc, argv, str)
int argc;
VALUE *argv;
VALUE str;
{
- VALUE dup = rb_str_dup(str);
-
- if (NIL_P(str_gsub_bang(argc, argv, dup))) {
- rb_gc_force_recycle(dup);
- return str;
- }
- return dup;
+ str = rb_str_dup(str);
+ rb_str_gsub_bang(argc, argv, str);
+ return str;
}
static VALUE
@@ -1250,15 +1222,11 @@ rb_f_sub(argc, argv)
int argc;
VALUE *argv;
{
- VALUE line = uscore_get();
- VALUE dup = rb_str_dup(line);
+ VALUE str = rb_str_dup(uscore_get());
- if (NIL_P(str_sub_bang(argc, argv, dup))) {
- rb_gc_force_recycle(dup);
- return line;
- }
- rb_lastline_set(dup);
- return dup;
+ rb_str_sub_bang(argc, argv, str);
+ rb_lastline_set(str);
+ return str;
}
static VALUE
@@ -1274,15 +1242,11 @@ rb_f_gsub(argc, argv)
int argc;
VALUE *argv;
{
- VALUE line = uscore_get();
- VALUE dup = rb_str_dup(line);
+ VALUE str = rb_str_dup(uscore_get());
- if (NIL_P(str_gsub_bang(argc, argv, dup))) {
- rb_gc_force_recycle(dup);
- return line;
- }
- rb_lastline_set(dup);
- return dup;
+ rb_str_gsub_bang(argc, argv, str);
+ rb_lastline_set(str);
+ return str;
}
static VALUE
@@ -1550,11 +1514,10 @@ rb_str_dump(str)
}
static VALUE
-str_upcase_bang(str)
+rb_str_upcase_bang(str)
VALUE str;
{
char *s, *send;
- int modify = 0;
rb_str_modify(str);
s = RSTRING(str)->ptr; send = s + RSTRING(str)->len;
@@ -1564,20 +1527,9 @@ str_upcase_bang(str)
}
else if (islower(*s)) {
*s = toupper(*s);
- modify = 1;
}
s++;
}
-
- if (modify) return str;
- return Qnil;
-}
-
-static VALUE
-rb_str_upcase_bang(str)
- VALUE str;
-{
- str_upcase_bang(str);
return str;
}
@@ -1585,21 +1537,16 @@ static VALUE
rb_str_upcase(str)
VALUE str;
{
- VALUE dup = rb_str_dup(str);
-
- if (NIL_P(str_upcase_bang(dup))) {
- rb_gc_force_recycle(dup);
- return str;
- }
- return dup;
+ str = rb_str_dup(str);
+ rb_str_upcase_bang(str);
+ return str;
}
static VALUE
-str_downcase_bang(str)
+rb_str_downcase_bang(str)
VALUE str;
{
char *s, *send;
- int modify = 0;
rb_str_modify(str);
s = RSTRING(str)->ptr; send = s + RSTRING(str)->len;
@@ -1609,20 +1556,9 @@ str_downcase_bang(str)
}
else if (ISUPPER(*s)) {
*s = tolower(*s);
- modify = 1;
}
s++;
}
-
- if (modify) return str;
- return Qnil;
-}
-
-static VALUE
-rb_str_downcase_bang(str)
- VALUE str;
-{
- str_downcase_bang(str);
return str;
}
@@ -1630,27 +1566,21 @@ static VALUE
rb_str_downcase(str)
VALUE str;
{
- VALUE dup = rb_str_dup(str);
-
- if (NIL_P(str_downcase_bang(dup))) {
- rb_gc_force_recycle(dup);
- return str;
- }
- return dup;
+ str = rb_str_dup(str);
+ rb_str_downcase_bang(str);
+ return str;
}
static VALUE
-str_capitalize_bang(str)
+rb_str_capitalize_bang(str)
VALUE str;
{
char *s, *send;
- int modify = 0;
rb_str_modify(str);
s = RSTRING(str)->ptr; send = s + RSTRING(str)->len;
if (ISLOWER(*s)) {
*s = toupper(*s);
- modify = 1;
}
while (++s < send) {
if (ismbchar(*s)) {
@@ -1658,18 +1588,8 @@ str_capitalize_bang(str)
}
else if (ISUPPER(*s)) {
*s = tolower(*s);
- modify = 1;
}
}
- if (modify) return str;
- return Qnil;
-}
-
-static VALUE
-rb_str_capitalize_bang(str)
- VALUE str;
-{
- str_capitalize_bang(str);
return str;
}
@@ -1677,21 +1597,16 @@ static VALUE
rb_str_capitalize(str)
VALUE str;
{
- VALUE dup = rb_str_dup(str);
-
- if (NIL_P(str_capitalize_bang(dup))) {
- rb_gc_force_recycle(dup);
- return str;
- }
- return dup;
+ str = rb_str_dup(str);
+ rb_str_capitalize_bang(str);
+ return str;
}
static VALUE
-str_swapcase_bang(str)
+rb_str_swapcase_bang(str)
VALUE str;
{
char *s, *send;
- int modify = 0;
rb_str_modify(str);
s = RSTRING(str)->ptr; send = s + RSTRING(str)->len;
@@ -1701,24 +1616,13 @@ str_swapcase_bang(str)
}
else if (ISUPPER(*s)) {
*s = tolower(*s);
- modify = 1;
}
else if (ISLOWER(*s)) {
*s = toupper(*s);
- modify = 1;
}
s++;
}
- if (modify) return str;
- return Qnil;
-}
-
-static VALUE
-rb_str_swapcase_bang(str)
- VALUE str;
-{
- str_swapcase_bang(str);
return str;
}
@@ -1726,13 +1630,9 @@ static VALUE
rb_str_swapcase(str)
VALUE str;
{
- VALUE dup = rb_str_dup(str);
-
- if (NIL_P(str_swapcase_bang(dup))) {
- rb_gc_force_recycle(dup);
- return str;
- }
- return dup;
+ str = rb_str_dup(str);
+ rb_str_swapcase_bang(str);
+ return str;
}
typedef unsigned char *USTR;
@@ -1775,7 +1675,7 @@ trnext(t)
static VALUE rb_str_delete_bang _((int,VALUE*,VALUE));
-static VALUE
+static void
tr_trans(str, src, repl, sflag)
VALUE str, src, repl;
int sflag;
@@ -1783,7 +1683,7 @@ tr_trans(str, src, repl, sflag)
struct tr trsrc, trrepl;
int cflag = 0;
int trans[256];
- int i, c, modify = 0;
+ int i, c;
char *s, *send;
rb_str_modify(str);
@@ -1795,7 +1695,8 @@ tr_trans(str, src, repl, sflag)
}
if (TYPE(repl) != T_STRING) repl = rb_str_to_str(repl);
if (RSTRING(repl)->len == 0) {
- return rb_str_delete_bang(1, &src, str);
+ rb_str_delete_bang(1, &src, str);
+ return;
}
trrepl.p = RSTRING(repl)->ptr;
trrepl.pend = trrepl.p + RSTRING(repl)->len;
@@ -1842,7 +1743,6 @@ tr_trans(str, src, repl, sflag)
if (last == c) continue;
last = c;
*t++ = c & 0xff;
- modify = 1;
}
else {
last = -1;
@@ -1851,7 +1751,6 @@ tr_trans(str, src, repl, sflag)
}
if (RSTRING(str)->len > (t - RSTRING(str)->ptr)) {
RSTRING(str)->len = (t - RSTRING(str)->ptr);
- modify = 1;
*t = '\0';
}
}
@@ -1859,14 +1758,10 @@ tr_trans(str, src, repl, sflag)
while (s < send) {
if ((c = trans[*s & 0xff]) >= 0) {
*s = c & 0xff;
- modify = 1;
}
s++;
}
}
-
- if (modify) return str;
- return Qnil;
}
static VALUE
@@ -1881,11 +1776,9 @@ static VALUE
rb_str_tr(str, src, repl)
VALUE str, src, repl;
{
- VALUE dup = rb_str_dup(str);
-
- if (NIL_P(tr_trans(str, src, repl, 0)))
- return str;
- return dup;
+ str = rb_str_dup(str);
+ tr_trans(str, src, repl, 0);
+ return str;
}
static void
@@ -1923,14 +1816,13 @@ tr_setup_table(str, table, init)
}
static VALUE
-str_delete_bang(argc, argv, str)
+rb_str_delete_bang(argc, argv, str)
int argc;
VALUE *argv;
VALUE str;
{
char *s, *send, *t;
char squeez[256];
- int modify = 0;
int init = 1;
int i;
@@ -1947,53 +1839,36 @@ str_delete_bang(argc, argv, str)
s = t = RSTRING(str)->ptr;
send = s + RSTRING(str)->len;
while (s < send) {
- if (squeez[*s & 0xff])
- modify = 1;
- else
+ if (!squeez[*s & 0xff])
*t++ = *s;
s++;
}
*t = '\0';
RSTRING(str)->len = t - RSTRING(str)->ptr;
- if (modify) return str;
- return Qnil;
-}
-
-static VALUE
-rb_str_delete_bang(argc, argv, str)
- int argc;
- VALUE *argv;
- VALUE str;
-{
- str_delete_bang(argc, argv, str);
return str;
}
-
+
static VALUE
rb_str_delete(argc, argv, str)
int argc;
VALUE *argv;
VALUE str;
{
- VALUE dup = rb_str_dup(str);
-
- if (NIL_P(str_delete_bang(argc, argv, dup))) {
- rb_gc_force_recycle(dup);
- return str;
- }
- return dup;
+ str = rb_str_dup(str);
+ rb_str_delete_bang(argc, argv, str);
+ return str;
}
static VALUE
-str_squeeze_bang(argc, argv, str)
+rb_str_squeeze_bang(argc, argv, str)
int argc;
VALUE *argv;
VALUE str;
{
char squeez[256];
char *s, *send, *t;
- int c, save, modify = 0;
+ int c, save;
int init = 1;
int i;
@@ -2014,7 +1889,6 @@ str_squeeze_bang(argc, argv, str)
}
rb_str_modify(str);
-
s = t = RSTRING(str)->ptr;
send = s + RSTRING(str)->len;
save = -1;
@@ -2027,20 +1901,8 @@ str_squeeze_bang(argc, argv, str)
*t = '\0';
if (t - RSTRING(str)->ptr != RSTRING(str)->len) {
RSTRING(str)->len = t - RSTRING(str)->ptr;
- modify = 1;
}
- if (modify) return str;
- return Qnil;
-}
-
-static VALUE
-rb_str_squeeze_bang(argc, argv, str)
- int argc;
- VALUE *argv;
- VALUE str;
-{
- str_squeeze_bang(argc, argv, str);
return str;
}
@@ -2050,13 +1912,9 @@ rb_str_squeeze(argc, argv, str)
VALUE *argv;
VALUE str;
{
- VALUE dup = rb_str_dup(str);
-
- if (NIL_P(str_squeeze_bang(argc, argv, dup))) {
- rb_gc_force_recycle(dup);
- return str;
- }
- return dup;
+ str = rb_str_dup(str);
+ rb_str_squeeze_bang(argc, argv, str);
+ return str;
}
static VALUE
@@ -2071,11 +1929,9 @@ static VALUE
rb_str_tr_s(str, src, repl)
VALUE str, src, repl;
{
- VALUE dup = rb_str_dup(str);
-
- if (NIL_P(tr_trans(str, src, repl, 1)))
- return str;
- return dup;
+ str = rb_str_dup(str);
+ tr_trans(str, src, repl, 1);
+ return str;
}
static VALUE
@@ -2343,7 +2199,7 @@ rb_str_each_byte(str)
}
static VALUE
-str_chop_bang(str)
+rb_str_chop_bang(str)
VALUE str;
{
if (RSTRING(str)->len > 0) {
@@ -2356,16 +2212,7 @@ str_chop_bang(str)
}
}
RSTRING(str)->ptr[RSTRING(str)->len] = '\0';
- return str;
}
- return Qnil;
-}
-
-static VALUE
-rb_str_chop_bang(str)
- VALUE str;
-{
- str_chop_bang(str);
return str;
}
@@ -2373,13 +2220,9 @@ static VALUE
rb_str_chop(str)
VALUE str;
{
- VALUE dup = rb_str_dup(str);
-
- if (NIL_P(str_chop_bang(dup))) {
- rb_gc_force_recycle(dup);
- return str;
- }
- return dup;
+ str = rb_str_dup(str);
+ rb_str_chop_bang(str);
+ return str;
}
static VALUE
@@ -2392,18 +2235,15 @@ rb_f_chop_bang(str)
static VALUE
rb_f_chop()
{
- VALUE line = uscore_get();
- VALUE dup = rb_str_dup(line);
+ VALUE str = rb_str_dup(uscore_get());
- if (!NIL_P(str_chop_bang(dup))) {
- rb_lastline_set(dup);
- return dup;
- }
- return line;
+ rb_str_chop_bang(str);
+ rb_lastline_set(str);
+ return str;
}
static VALUE
-str_chomp_bang(argc, argv, str)
+rb_str_chomp_bang(argc, argv, str)
int argc;
VALUE *argv;
VALUE str;
@@ -2440,18 +2280,7 @@ str_chomp_bang(argc, argv, str)
memcmp(RSTRING(rs)->ptr, p+len-rslen, rslen) == 0)) {
RSTRING(str)->len -= rslen;
RSTRING(str)->ptr[RSTRING(str)->len] = '\0';
- return str;
}
- return Qnil;
-}
-
-static VALUE
-rb_str_chomp_bang(argc, argv, str)
- int argc;
- VALUE *argv;
- VALUE str;
-{
- str_chomp_bang(argc, argv, str);
return str;
}
@@ -2461,13 +2290,9 @@ rb_str_chomp(argc, argv, str)
VALUE *argv;
VALUE str;
{
- VALUE dup = rb_str_dup(str);
-
- if (NIL_P(str_chomp_bang(argc, argv, dup))) {
- rb_gc_force_recycle(dup);
- return str;
- }
- return dup;
+ str = rb_str_dup(str);
+ rb_str_chomp_bang(argc, argv, str);
+ return str;
}
static VALUE
@@ -2483,18 +2308,15 @@ rb_f_chomp(argc, argv)
int argc;
VALUE *argv;
{
- VALUE str = uscore_get();
- VALUE dup = rb_str_dup(str);
+ VALUE str = rb_str_dup(uscore_get());;
- if (!NIL_P(str_chomp_bang(argc, argv, dup))) {
- rb_lastline_set(dup);
- return dup;
- }
+ rb_str_chomp_bang(argc, argv, str);
+ rb_lastline_set(str);
return str;
}
static VALUE
-str_strip_bang(str)
+rb_str_strip_bang(str)
VALUE str;
{
char *s, *t, *e;
@@ -2522,18 +2344,6 @@ str_strip_bang(str)
else if (t < e) {
RSTRING(str)->ptr[RSTRING(str)->len] = '\0';
}
- else {
- return Qnil;
- }
-
- return str;
-}
-
-static VALUE
-rb_str_strip_bang(str)
- VALUE str;
-{
- str_strip_bang(str);
return str;
}
@@ -2541,13 +2351,9 @@ static VALUE
rb_str_strip(str)
VALUE str;
{
- VALUE dup = rb_str_dup(str);
-
- if (NIL_P(str_strip_bang(dup))) {
- rb_gc_force_recycle(dup);
- return str;
- }
- return dup;
+ str = rb_str_dup(str);
+ rb_str_strip_bang(str);
+ return str;
}
static VALUE