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

ruby-changes:7151

From: akr <ko1@a...>
Date: Sun, 17 Aug 2008 13:26:12 +0900 (JST)
Subject: [ruby-changes:7151] Ruby:r18670 (trunk): * include/ruby/encoding.h (rb_econv_putbackable): declared.

akr	2008-08-17 13:25:56 +0900 (Sun, 17 Aug 2008)

  New Revision: 18670

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

  Log:
    * include/ruby/encoding.h (rb_econv_putbackable): declared.
      (rb_econv_putback): ditto.
    
    * transcode.c (rb_econv_putbackable): implemented.
      (rb_econv_putback): ditto.
    
    * io.c (io_getc): put back bytes if possible.

  Modified files:
    trunk/ChangeLog
    trunk/include/ruby/encoding.h
    trunk/io.c
    trunk/test/ruby/test_io_m17n.rb
    trunk/transcode.c

Index: include/ruby/encoding.h
===================================================================
--- include/ruby/encoding.h	(revision 18669)
+++ include/ruby/encoding.h	(revision 18670)
@@ -253,6 +253,7 @@
     const unsigned char **source_buffer_ptr, const unsigned char *source_buffer_end,
     unsigned char **destination_buffer_ptr, unsigned char *destination_buffer_end,
     int flags);
+void rb_econv_close(rb_econv_t *ec);
 
 /* result: 0:success -1:failure */
 int rb_econv_insert_output(rb_econv_t *ec,
@@ -264,7 +265,8 @@
 /* raise an error if the last rb_econv_convert is error */
 void rb_econv_check_error(rb_econv_t *ec);
 
-void rb_econv_close(rb_econv_t *ec);
+int rb_econv_putbackable(rb_econv_t *ec);
+void rb_econv_putback(rb_econv_t *ec, unsigned char *p, int n);
 
 /* flags for rb_econv_open */
 #define ECONV_UNIVERSAL_NEWLINE_DECODER       0x100
Index: ChangeLog
===================================================================
--- ChangeLog	(revision 18669)
+++ ChangeLog	(revision 18670)
@@ -1,3 +1,13 @@
+Sun Aug 17 13:23:53 2008  Tanaka Akira  <akr@f...>
+
+	* include/ruby/encoding.h (rb_econv_putbackable): declared.
+	  (rb_econv_putback): ditto.
+
+	* transcode.c (rb_econv_putbackable): implemented.
+	  (rb_econv_putback): ditto.
+
+	* io.c (io_getc): put back bytes if possible.
+
 Sun Aug 17 12:00:18 2008  Tanaka Akira  <akr@f...>
 
 	* transcode.c (make_econv_exception): add several instance variables
Index: io.c
===================================================================
--- io.c	(revision 18669)
+++ io.c	(revision 18670)
@@ -2308,6 +2308,7 @@
             const unsigned char *ss, *sp, *se;
             unsigned char *ds, *dp, *de;
             rb_econv_result_t res;
+            int putbackable;
             if (fptr->crbuf_len) {
                 r = rb_enc_precise_mbclen(fptr->crbuf+fptr->crbuf_off, fptr->crbuf+fptr->crbuf_off+fptr->crbuf_len, fptr->enc);
                 if (!MBCLEN_NEEDMORE_P(r))
@@ -2332,6 +2333,12 @@
             fptr->rbuf_off += sp - ss;
             fptr->rbuf_len -= sp - ss;
             fptr->crbuf_len += dp - ds;
+            putbackable = rb_econv_putbackable(fptr->readconv);
+            if (putbackable) {
+                rb_econv_putback(fptr->readconv, (unsigned char *)fptr->rbuf + fptr->rbuf_off - putbackable, putbackable);
+                fptr->rbuf_off -= putbackable;
+                fptr->rbuf_len += putbackable;
+            }
             rb_econv_check_error(fptr->readconv);
         }
         if (MBCLEN_INVALID_P(r)) {
Index: test/ruby/test_io_m17n.rb
===================================================================
--- test/ruby/test_io_m17n.rb	(revision 18669)
+++ test/ruby/test_io_m17n.rb	(revision 18670)
@@ -216,6 +216,16 @@
     }
   end
 
+  def test_getc_invalid
+    with_pipe("euc-jp:utf-8") {|r, w|
+      w << "\xa1xyz"
+      w.close
+      err = assert_raise(Encoding::InvalidByteSequence) { r.getc }
+      assert_equal("\xA1".force_encoding("ascii-8bit"), err.error_bytes)
+      assert_equal("xyz", r.read(10))
+    }
+  end
+
   def test_getc_stateful_conversion
     with_tmpdir {
       src = "\e$B\x23\x30\x23\x31\e(B".force_encoding("iso-2022-jp")
Index: transcode.c
===================================================================
--- transcode.c	(revision 18669)
+++ transcode.c	(revision 18670)
@@ -1202,6 +1202,20 @@
     xfree(ec);
 }
 
+int
+rb_econv_putbackable(rb_econv_t *ec)
+{
+    return ec->elems[0].tc->readagain_len;
+}
+
+void
+rb_econv_putback(rb_econv_t *ec, unsigned char *p, int n)
+{
+    rb_transcoding *tc = ec->elems[0].tc;
+    memcpy(p, TRANSCODING_READBUF(tc) + tc->recognized_len, n);
+    tc->readagain_len -= n;
+}
+
 static VALUE
 make_econv_exception(rb_econv_t *ec)
 {

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

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