[macruby-changes] [3631] MacRuby/branches/icu/string.c

source_changes at macosforge.org source_changes at macosforge.org
Thu Feb 25 18:52:52 PST 2010


Revision: 3631
          http://trac.macosforge.org/projects/ruby/changeset/3631
Author:   lsansonetti at apple.com
Date:     2010-02-25 18:52:51 -0800 (Thu, 25 Feb 2010)
Log Message:
-----------
renamed str_substr into rstr_substr, added rstr_splice which sanitizes arguments, added rb_str_update

Modified Paths:
--------------
    MacRuby/branches/icu/string.c

Modified: MacRuby/branches/icu/string.c
===================================================================
--- MacRuby/branches/icu/string.c	2010-02-26 02:43:04 UTC (rev 3630)
+++ MacRuby/branches/icu/string.c	2010-02-26 02:52:51 UTC (rev 3631)
@@ -1094,7 +1094,7 @@
 }
 
 static VALUE
-str_substr(VALUE str, long beg, long len)
+rstr_substr(VALUE str, long beg, long len)
 {
     if (len < 0) {
 	return Qnil;
@@ -1118,6 +1118,31 @@
     return substr == NULL ? Qnil : (VALUE)substr;
 }
 
+static void
+rstr_splice(VALUE self, long beg, long len, VALUE str)
+{
+    if (len < 0) {
+	rb_raise(rb_eIndexError, "negative length %ld", len);
+    }
+
+    const long slen = str_length(RSTR(self), false);
+    if (slen < beg) {
+out_of_range:
+	rb_raise(rb_eIndexError, "index %ld out of string", beg);
+    }
+    if (beg < 0) {
+	if (-beg > slen) {
+	    goto out_of_range;
+	}
+	beg += slen;
+    }
+    if (slen < len || slen < beg + len) {
+	len = slen - beg;
+    }
+
+    str_splice(RSTR(self), beg, len, str_need_string(str), false);
+}
+
 static VALUE
 str_trim(VALUE str)
 {
@@ -1507,7 +1532,7 @@
 	if (TYPE(argv[0]) == T_REGEXP) {
 	    return rb_str_subpat(str, argv[0], NUM2INT(argv[1]));
 	}
-	return str_substr(str, NUM2LONG(argv[0]), NUM2LONG(argv[1]));
+	return rstr_substr(str, NUM2LONG(argv[0]), NUM2LONG(argv[1]));
     }
 
     if (argc != 1) {
@@ -1517,7 +1542,7 @@
     VALUE indx = argv[0];
     switch (TYPE(indx)) {
 	case T_FIXNUM:
-	    str = str_substr(str, FIX2LONG(indx), 1);
+	    str = rstr_substr(str, FIX2LONG(indx), 1);
 	    if (!NIL_P(str) && str_length(RSTR(str), true) == 0) {
 		return Qnil;
 	    }
@@ -1556,9 +1581,9 @@
 		    case Qnil:
 			return Qnil;
 		    default:
-			return str_substr(str, beg, len);
+			return rstr_substr(str, beg, len);
 		}
-		str = str_substr(str, NUM2LONG(indx), 1);
+		str = rstr_substr(str, NUM2LONG(indx), 1);
 		if (!NIL_P(str) && str_length(RSTR(str), true) == 0) {
 		    return Qnil;
 		}
@@ -1693,7 +1718,7 @@
 rstr_getchar(VALUE self, SEL sel, VALUE index)
 {
     const long idx = FIX2LONG(index);
-    return str_substr(self, idx, 1);
+    return rstr_substr(self, idx, 1);
 }
 
 /*
@@ -2370,7 +2395,7 @@
 	if (spat != Qnil) {
 	    if (spat_len == 0) {
 		do {
-		    VALUE substr = str_substr(str, beg, 1);
+		    VALUE substr = rstr_substr(str, beg, 1);
 		    rb_ary_push(result, substr);
 		    beg++;
 		    if (beg >= len) {
@@ -2387,7 +2412,7 @@
 		    if (pos == -1) {
 			break;
 		    }
-		    VALUE substr = str_substr(str, beg, pos - beg);
+		    VALUE substr = rstr_substr(str, beg, pos - beg);
 		    if (!awk_split || rb_str_chars_len(str_trim(substr)) > 0) {
 			rb_ary_push(result, substr);
 		    }
@@ -2416,7 +2441,7 @@
 
 	    if (beg == pos && results[0].beg == results[0].end) {
 		if (last_null) {
-		    rb_ary_push(result, str_substr(str, beg, 1));
+		    rb_ary_push(result, rstr_substr(str, beg, 1));
 		    beg = start;
 		}
 		else {
@@ -2426,7 +2451,7 @@
 		}
 	    }
 	    else {
-		rb_ary_push(result, str_substr(str, beg, pos - beg));
+		rb_ary_push(result, rstr_substr(str, beg, pos - beg));
 		beg = results[0].end;
 	    }
 	    last_null = false;
@@ -2678,7 +2703,7 @@
                 repl = rb_obj_as_string(rb_yield(rb_reg_nth_match(0, match)));
             }
             else {
-                repl = rb_hash_aref(hash, str_substr(str, results[0].beg,
+                repl = rb_hash_aref(hash, rstr_substr(str, results[0].beg,
 			    results[0].end - results[0].beg));
                 repl = rb_obj_as_string(repl);
             }
@@ -2796,7 +2821,7 @@
 		return bang ? Qnil : rstr_dup(str, 0);
 	    }
 	    str_concat_string(RSTR(dest),
-		    RSTR(str_substr(str, offset, len - offset)));
+		    RSTR(rstr_substr(str, offset, len - offset)));
 	    break;
 	}
 
@@ -2811,7 +2836,7 @@
                 val = rb_obj_as_string(rb_yield(rb_reg_nth_match(0, match)));
             }
             else {
-                val = rb_hash_aref(hash, str_substr(str, results[0].beg,
+                val = rb_hash_aref(hash, rstr_substr(str, results[0].beg,
 			    results[0].end - results[0].beg));
                 val = rb_obj_as_string(val);
             }
@@ -2826,7 +2851,7 @@
 
 	if (pos - offset > 0) {
 	    str_concat_string(RSTR(dest),
-		    RSTR(str_substr(str, offset, pos - offset)));
+		    RSTR(rstr_substr(str, offset, pos - offset)));
 	}
 	str_concat_string(RSTR(dest), str_need_string(val));
 
@@ -2981,7 +3006,7 @@
 {
     do {
 	if (padwidth > width) {
-	    pad = RSTR(str_substr((VALUE)pad, 0, width));
+	    pad = RSTR(rstr_substr((VALUE)pad, 0, width));
 	}
 	str_insert(str, index, pad, false);
 	width -= padwidth;
@@ -3322,7 +3347,7 @@
 	    substr_len = off - pos + 1;
 	}
 
-	VALUE substr = str_substr(str, pos, substr_len);
+	VALUE substr = rstr_substr(str, pos, substr_len);
 	if (tainted) {
 	    OBJ_TAINT(substr);
 	}
@@ -4045,7 +4070,7 @@
 rb_str_subseq(VALUE str, long beg, long len)
 {
     if (IS_RSTR(str)) {
-	return str_substr(str, beg, len);
+	return rstr_substr(str, beg, len);
     }
     abort(); // TODO
 }
@@ -4059,5 +4084,10 @@
 void
 rb_str_update(VALUE str, long beg, long len, VALUE val)
 {
-    abort(); // TODO
+    if (IS_RSTR(str)) {
+	rstr_splice(str, beg, len, val);
+    }
+    else {
+	abort(); // TODO
+    }
 }
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/macruby-changes/attachments/20100225/378bce53/attachment.html>


More information about the macruby-changes mailing list