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

ruby-changes:2843

From: ko1@a...
Date: 19 Dec 2007 23:15:22 +0900
Subject: [ruby-changes:2843] matz - Ruby:r14334 (trunk): * string.c (str_sublen): adjust position if position is not at the

matz	2007-12-19 23:15:05 +0900 (Wed, 19 Dec 2007)

  New Revision: 14334

  Modified files:
    trunk/ChangeLog
    trunk/string.c

  Log:
    * string.c (str_sublen): adjust position if position is not at the
      head of a character.
    
    * string.c (rb_str_chomp_bang): check if match start at the head
      of a character.

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/string.c?r1=14334&r2=14333
  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/ChangeLog?r1=14334&r2=14333

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 14333)
+++ ChangeLog	(revision 14334)
@@ -1,3 +1,11 @@
+Wed Dec 19 22:59:52 2007  Yukihiro Matsumoto  <matz@r...>
+
+	* string.c (str_sublen): adjust position if position is not at the
+	  head of a character.
+
+	* string.c (rb_str_chomp_bang): check if match start at the head
+	  of a character.
+
 Wed Dec 19 21:42:18 2007  Nobuyoshi Nakada  <nobu@r...>
 
 	* re.c (rb_reg_regsub): should set checked encoding.
Index: string.c
===================================================================
--- string.c	(revision 14333)
+++ string.c	(revision 14334)
@@ -776,13 +776,14 @@
 
 	i = 0;
 	while (p < e) {
-	    p += rb_enc_mbclen(p, e, enc);
+	    p += rb_enc_mbclen(p, RSTRING_END(str), enc);
 	    i++;
 	}
-	return i;
+	if (p == e) return i;
+	return i - 1;
     }
 }
-    
+
 int
 rb_str_sublen(VALUE str, int len)
 {
@@ -4462,9 +4463,10 @@
 static VALUE
 rb_str_chomp_bang(int argc, VALUE *argv, VALUE str)
 {
+    rb_encoding *enc;
     VALUE rs;
     int newline;
-    char *p;
+    char *p, *pp, *e;
     long len, rslen;
 
     if (rb_scan_args(argc, argv, "01", &rs) == 0) {
@@ -4494,7 +4496,7 @@
     }
     if (NIL_P(rs)) return Qnil;
     StringValue(rs);
-    rb_enc_check(str, rs);
+    enc = rb_enc_check(str, rs);
     len = RSTRING_LEN(str);
     if (len == 0) return Qnil;
     p = RSTRING_PTR(str);
@@ -4518,9 +4520,20 @@
     if (rslen == 1 && newline == '\n')
 	goto smart_chomp;
 
+    if (is_broken_string(rs)) {
+	return Qnil;
+    }
+    pp = p + len - rslen;
     if (p[len-1] == newline &&
 	(rslen <= 1 ||
-	 memcmp(RSTRING_PTR(rs), p+len-rslen, rslen) == 0)) {
+	 memcmp(RSTRING_PTR(rs), pp, rslen) == 0)) {
+	if (!isascii(*pp)) {
+	    e = p+len;
+	    while (p < pp) {
+		p += rb_enc_mbclen(p, e, enc);
+	    }
+	    if (p != pp) return Qnil;
+	}
 	rb_str_modify(str);
 	STR_SET_LEN(str, RSTRING_LEN(str) - rslen);
 	RSTRING_PTR(str)[RSTRING_LEN(str)] = '\0';

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

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