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

ruby-changes:11863

From: yugui <ko1@a...>
Date: Fri, 22 May 2009 00:05:34 +0900 (JST)
Subject: [ruby-changes:11863] Ruby:r23520 (ruby_1_9_1): merges r23424 from trunk into ruby_1_9_1.

yugui	2009-05-21 23:48:03 +0900 (Thu, 21 May 2009)

  New Revision: 23520

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

  Log:
    merges r23424 from trunk into ruby_1_9_1.
    --
    * ext/stringio/stringio.c (strio_ungetbyte): encoding should not
      be effective.

  Modified files:
    branches/ruby_1_9_1/ChangeLog
    branches/ruby_1_9_1/ext/stringio/stringio.c
    branches/ruby_1_9_1/test/ruby/test_io.rb
    branches/ruby_1_9_1/test/stringio/test_stringio.rb
    branches/ruby_1_9_1/version.h

Index: ruby_1_9_1/ChangeLog
===================================================================
--- ruby_1_9_1/ChangeLog	(revision 23519)
+++ ruby_1_9_1/ChangeLog	(revision 23520)
@@ -1,3 +1,8 @@
+Thu May 14 16:07:48 2009  Nobuyoshi Nakada  <nobu@r...>
+
+	* ext/stringio/stringio.c (strio_ungetbyte): encoding should no
+	  be effective.
+
 Sun May 10 11:36:11 2009  Nobuyoshi Nakada  <nobu@r...>
 
 	* ext/dl/cfunc.c (rb_dlcfunc_instance_p): new function to check if
Index: ruby_1_9_1/ext/stringio/stringio.c
===================================================================
--- ruby_1_9_1/ext/stringio/stringio.c	(revision 23519)
+++ ruby_1_9_1/ext/stringio/stringio.c	(revision 23520)
@@ -744,8 +744,37 @@
 static VALUE
 strio_ungetbyte(VALUE self, VALUE c)
 {
-    NUM2INT(c);
-    return strio_ungetc(self, c);
+    struct StringIO *ptr = readable(StringIO(self));
+    char buf[1], *cp = buf;
+    long pos = ptr->pos, cl = 1;
+    VALUE str = ptr->string;
+
+    if (NIL_P(c)) return Qnil;
+    if (FIXNUM_P(c)) {
+	buf[0] = (char)FIX2INT(c);
+    }
+    else {
+	SafeStringValue(c);
+	cp = RSTRING_PTR(c);
+	cl = RSTRING_LEN(c);
+	if (cl == 0) return Qnil;
+    }
+    rb_str_modify(str);
+    if (cl > pos) {
+	char *s;
+	long rest = RSTRING_LEN(str) - pos;
+	rb_str_resize(str, rest + cl);
+	s = RSTRING_PTR(str);
+	memmove(s + cl, s + pos, rest);
+	pos = 0;
+    }
+    else {
+	pos -= cl;
+    }
+    memcpy(RSTRING_PTR(str) + pos, cp, cl);
+    ptr->pos = pos;
+    RB_GC_GUARD(c);
+    return Qnil;
 }
 
 /*
Index: ruby_1_9_1/version.h
===================================================================
--- ruby_1_9_1/version.h	(revision 23519)
+++ ruby_1_9_1/version.h	(revision 23520)
@@ -1,6 +1,6 @@
 #define RUBY_VERSION "1.9.1"
 #define RUBY_RELEASE_DATE "2009-05-12"
-#define RUBY_PATCHLEVEL 137
+#define RUBY_PATCHLEVEL 138
 #define RUBY_VERSION_MAJOR 1
 #define RUBY_VERSION_MINOR 9
 #define RUBY_VERSION_TEENY 1
Index: ruby_1_9_1/test/ruby/test_io.rb
===================================================================
--- ruby_1_9_1/test/ruby/test_io.rb	(revision 23519)
+++ ruby_1_9_1/test/ruby/test_io.rb	(revision 23520)
@@ -77,6 +77,22 @@
     r.close
   end
 
+  def test_ungetbyte
+    t = make_tempfile
+    t.open
+    t.ungetbyte(0x41)
+    assert_equal(0x41, t.getbyte)
+    t.rewind
+    t.ungetbyte("qux")
+    assert_equal("quxfoo\n", t.gets)
+    t.set_encoding("utf-8")
+    t.ungetbyte(0x89)
+    t.ungetbyte(0x8e)
+    t.ungetbyte("\xe7")
+    t.ungetbyte("\xe7\xb4\x85")
+    assert_equal("\u7d05\u7389bar\n", t.gets)
+  end
+
   def test_each_byte
     r, w = IO.pipe
     w << "abc def"
Index: ruby_1_9_1/test/stringio/test_stringio.rb
===================================================================
--- ruby_1_9_1/test/stringio/test_stringio.rb	(revision 23519)
+++ ruby_1_9_1/test/stringio/test_stringio.rb	(revision 23520)
@@ -293,6 +293,21 @@
     f.close unless f.closed?
   end
 
+  def test_ungetbyte
+    s = "foo\nbar\n"
+    t = StringIO.new(s, "r")
+    t.ungetbyte(0x41)
+    assert_equal(0x41, t.getbyte)
+    t.ungetbyte("qux")
+    assert_equal("quxfoo\n", t.gets)
+    t.set_encoding("utf-8")
+    t.ungetbyte(0x89)
+    t.ungetbyte(0x8e)
+    t.ungetbyte("\xe7")
+    t.ungetbyte("\xe7\xb4\x85")
+    assert_equal("\u7d05\u7389bar\n", t.gets)
+  end
+
   def test_ungetc
     s = "1234"
     f = StringIO.new(s, "r")

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

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