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

ruby-changes:4372

From: ko1@a...
Date: Mon, 31 Mar 2008 04:17:05 +0900 (JST)
Subject: [ruby-changes:4372] naruse - Ruby:r15863 (trunk): * io.c (io_getc): set coderange while getting characters.

naruse	2008-03-31 04:16:29 +0900 (Mon, 31 Mar 2008)

  New Revision: 15863

  Modified files:
    trunk/ChangeLog
    trunk/io.c
    trunk/version.h

  Log:
    * io.c (io_getc): set coderange while getting characters.

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/version.h?r1=15863&r2=15862&diff_format=u
  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/ChangeLog?r1=15863&r2=15862&diff_format=u
  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/io.c?r1=15863&r2=15862&diff_format=u

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 15862)
+++ ChangeLog	(revision 15863)
@@ -1,3 +1,7 @@
+Mon Mar 31 04:05:15 2008  NARUSE, Yui  <naruse@r...>
+
+	* io.c (io_getc): set coderange while getting characters.
+
 Sun Mar 30 23:16:49 2008  Yukihiro Matsumoto  <matz@r...>
 
 	* proc.c (proc_dup): should copy is_lambda attribute as well.
Index: io.c
===================================================================
--- io.c	(revision 15862)
+++ io.c	(revision 15863)
@@ -2228,42 +2228,59 @@
     return io;
 }
 
-static VALUE 
+static VALUE
 io_getc(rb_io_t *fptr, rb_encoding *enc)
 {
-    int r, n;
+    int r, n, cr = 0;
     VALUE str;
 
     if (io_fillbuf(fptr) < 0) {
 	return Qnil;
     }
-    r = rb_enc_precise_mbclen(fptr->rbuf+fptr->rbuf_off, fptr->rbuf+fptr->rbuf_off+fptr->rbuf_len, enc);
-    if (MBCLEN_CHARFOUND_P(r) &&
-        (n = MBCLEN_CHARFOUND_LEN(r)) <= fptr->rbuf_len) {
-	str = rb_str_new(fptr->rbuf+fptr->rbuf_off, n);
-	fptr->rbuf_off += n;
-	fptr->rbuf_len -= n;
+    if (rb_enc_asciicompat(enc) && ISASCII(fptr->rbuf[fptr->rbuf_off])) {
+	str = rb_str_new(fptr->rbuf+fptr->rbuf_off, 1);
+	fptr->rbuf_off += 1;
+	fptr->rbuf_len -= 1;
+	cr = ENC_CODERANGE_7BIT;
     }
-    else if (MBCLEN_NEEDMORE_P(r)) {
-	str = rb_str_new(fptr->rbuf+fptr->rbuf_off, fptr->rbuf_len);
-        fptr->rbuf_len = 0;
-      getc_needmore:
-        if (io_fillbuf(fptr) != -1) {
-            rb_str_cat(str, fptr->rbuf+fptr->rbuf_off, 1);
-            fptr->rbuf_off++;
-            fptr->rbuf_len--;
-            r = rb_enc_precise_mbclen(RSTRING_PTR(str), RSTRING_PTR(str)+RSTRING_LEN(str), enc);
-            if (MBCLEN_NEEDMORE_P(r)) {
-                goto getc_needmore;
-            }
-        }
-    }
     else {
-	str = rb_str_new(fptr->rbuf+fptr->rbuf_off, 1);
-	fptr->rbuf_off++;
-	fptr->rbuf_len--;
+	r = rb_enc_precise_mbclen(fptr->rbuf+fptr->rbuf_off, fptr->rbuf+fptr->rbuf_off+fptr->rbuf_len, enc);
+	if (MBCLEN_CHARFOUND_P(r) &&
+	    (n = MBCLEN_CHARFOUND_LEN(r)) <= fptr->rbuf_len) {
+	    str = rb_str_new(fptr->rbuf+fptr->rbuf_off, n);
+	    fptr->rbuf_off += n;
+	    fptr->rbuf_len -= n;
+	    cr = ENC_CODERANGE_VALID;
+	}
+	else if (MBCLEN_NEEDMORE_P(r)) {
+	    str = rb_str_new(fptr->rbuf+fptr->rbuf_off, fptr->rbuf_len);
+	    fptr->rbuf_len = 0;
+	  getc_needmore:
+	    if (io_fillbuf(fptr) != -1) {
+		rb_str_cat(str, fptr->rbuf+fptr->rbuf_off, 1);
+		fptr->rbuf_off++;
+		fptr->rbuf_len--;
+		r = rb_enc_precise_mbclen(RSTRING_PTR(str), RSTRING_PTR(str)+RSTRING_LEN(str), enc);
+		if (MBCLEN_NEEDMORE_P(r)) {
+		    goto getc_needmore;
+		}
+		else if (MBCLEN_CHARFOUND_P(r)) {
+		    cr = ENC_CODERANGE_VALID;
+		}
+	    }
+	}
+	else {
+	    str = rb_str_new(fptr->rbuf+fptr->rbuf_off, 1);
+	    fptr->rbuf_off++;
+	    fptr->rbuf_len--;
+	}
     }
-    return io_enc_str(str, fptr);
+    if (!cr) cr = ENC_CODERANGE_BROKEN;
+    str = io_enc_str(str, fptr);
+    if (!fptr->enc2) {
+	ENC_CODERANGE_SET(str, cr);
+    }
+    return str;
 }
 
 /*
Index: version.h
===================================================================
--- version.h	(revision 15862)
+++ version.h	(revision 15863)
@@ -1,7 +1,7 @@
 #define RUBY_VERSION "1.9.0"
-#define RUBY_RELEASE_DATE "2008-03-29"
+#define RUBY_RELEASE_DATE "2008-03-31"
 #define RUBY_VERSION_CODE 190
-#define RUBY_RELEASE_CODE 20080329
+#define RUBY_RELEASE_CODE 20080331
 #define RUBY_PATCHLEVEL 0
 
 #define RUBY_VERSION_MAJOR 1
@@ -9,7 +9,7 @@
 #define RUBY_VERSION_TEENY 0
 #define RUBY_RELEASE_YEAR 2008
 #define RUBY_RELEASE_MONTH 3
-#define RUBY_RELEASE_DAY 29
+#define RUBY_RELEASE_DAY 31
 
 #ifdef RUBY_EXTERN
 RUBY_EXTERN const char ruby_version[];

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

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