[前][次][番号順一覧][スレッド一覧]

ruby-changes:7022

From: nobu <ko1@a...>
Date: Tue, 12 Aug 2008 19:07:25 +0900 (JST)
Subject: [ruby-changes:7022] Ruby:r18540 (trunk): * string.c (rb_str_drop): new function to drop first bytes.

nobu	2008-08-12 19:07:08 +0900 (Tue, 12 Aug 2008)

  New Revision: 18540

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=18540

  Log:
    * string.c (rb_str_drop): new function to drop first bytes.

  Modified files:
    trunk/ChangeLog
    trunk/include/ruby/intern.h
    trunk/string.c

Index: include/ruby/intern.h
===================================================================
--- include/ruby/intern.h	(revision 18539)
+++ include/ruby/intern.h	(revision 18540)
@@ -580,6 +580,7 @@
 int rb_str_comparable(VALUE, VALUE);
 int rb_str_cmp(VALUE, VALUE);
 VALUE rb_str_equal(VALUE str1, VALUE str2);
+VALUE rb_str_drop(VALUE, long);
 void rb_str_update(VALUE, long, long, VALUE);
 VALUE rb_str_inspect(VALUE);
 VALUE rb_str_dump(VALUE);
Index: ChangeLog
===================================================================
--- ChangeLog	(revision 18539)
+++ ChangeLog	(revision 18540)
@@ -1,3 +1,7 @@
+Tue Aug 12 19:07:02 2008  Nobuyoshi Nakada  <nobu@r...>
+
+	* string.c (rb_str_drop): new function to drop first bytes.
+
 Tue Aug 12 18:58:48 2008  Koichi Sasada  <ko1@a...>
 
 	* vm.c, vm_insnhelper.c (vm_define_method): move 
Index: string.c
===================================================================
--- string.c	(revision 18539)
+++ string.c	(revision 18540)
@@ -2829,9 +2829,43 @@
     return rb_str_aref(str, argv[0]);
 }
 
+VALUE
+rb_str_drop(VALUE str, long len)
+{
+    char *ptr = RSTRING_PTR(str);
+    long olen = RSTRING_LEN(str), nlen;
+
+    str_modifiable(str);
+    if (len > olen) len = olen;
+    nlen = olen - len;
+    if (nlen <= RSTRING_EMBED_LEN_MAX) {
+	char *oldptr = ptr;
+	int fl = (RBASIC(str)->flags & (STR_NOEMBED|ELTS_SHARED));
+	STR_SET_EMBED(str);
+	STR_SET_EMBED_LEN(str, nlen);
+	ptr = RSTRING(str)->as.ary;
+	memcpy(ptr, oldptr + len, nlen);
+	if (fl == STR_NOEMBED) xfree(oldptr);
+    }
+    else {
+	if (!STR_SHARED_P(str)) rb_str_new4(str);
+	ptr = RSTRING(str)->as.heap.ptr += len;
+	RSTRING(str)->as.heap.len = nlen;
+    }
+    ptr[nlen] = 0;
+    ENC_CODERANGE_CLEAR(str);
+    return str;
+}
+
 static void
 rb_str_splice_0(VALUE str, long beg, long len, VALUE val)
 {
+    if (beg == 0 && RSTRING_LEN(val) == 0) {
+	rb_str_drop(str, len);
+	OBJ_INFECT(str, val);
+	return;
+    }
+
     rb_str_modify(str);
     if (len < RSTRING_LEN(val)) {
 	/* expand string */

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]