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

ruby-changes:2708

From: ko1@a...
Date: 12 Dec 2007 16:40:38 +0900
Subject: [ruby-changes:2708] matz - Ruby:r14199 (trunk): * io.c (rb_io_check_readable): set default external encoding to

matz	2007-12-12 16:39:43 +0900 (Wed, 12 Dec 2007)

  New Revision: 14199

  Modified files:
    trunk/ChangeLog
    trunk/io.c

  Log:
    * io.c (rb_io_check_readable): set default external encoding to
      STDIN.
    
    * io.c (io_enc_str): associate encoding to output string.

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/ChangeLog?r1=14199&r2=14198
  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/io.c?r1=14199&r2=14198

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 14198)
+++ ChangeLog	(revision 14199)
@@ -1,3 +1,10 @@
+Wed Dec 12 16:34:53 2007  Yukihiro Matsumoto  <matz@r...>
+
+	* io.c (rb_io_check_readable): set default external encoding to
+	  STDIN.
+
+	* io.c (io_enc_str): associate encoding to output string.
+
 Wed Dec 12 12:44:39 2007  Yukihiro Matsumoto  <matz@r...>
 
 	* parse.y (expr): 'not' and '!' should act as conditional
Index: io.c
===================================================================
--- io.c	(revision 14198)
+++ io.c	(revision 14199)
@@ -356,6 +356,9 @@
     if (fptr->wbuf_len) {
         io_fflush(fptr);
     }
+    if (!fptr->enc && fptr->fd == 0) {
+	fptr->enc = rb_default_external_encoding();
+    }
 }
 
 void
@@ -1518,6 +1521,16 @@
     return LONG2FIX(n);
 }
 
+static VALUE
+io_enc_str(VALUE str, rb_io_t *fptr)
+{
+    OBJ_TAINT(str);
+    if (fptr->enc) {
+	rb_enc_associate(str, fptr->enc);
+    }
+    return str;
+}
+
 /*
  *  call-seq:
  *     ios.read([length [, buffer]])    => string, buffer, or nil
@@ -1561,7 +1574,7 @@
     }
 
     if (NIL_P(str)) {
-	str = rb_tainted_str_new(0, len);
+	str = rb_str_new(0, len);
     }
     else {
 	StringValue(str);
@@ -1584,9 +1597,7 @@
         return Qnil;
     }
     rb_str_resize(str, n);
-    OBJ_TAINT(str);
-
-    return str;
+    return io_enc_str(str, fptr);
 }
 
 static int
@@ -1679,7 +1690,7 @@
 }
 
 static VALUE
-rb_io_getline_fast(rb_io_t *fptr, unsigned char delim, long limit, rb_encoding *enc)
+rb_io_getline_fast(rb_io_t *fptr, unsigned char delim, long limit)
 {
     VALUE str = Qnil;
     int c, nolimit = 0;
@@ -1694,14 +1705,12 @@
     }
 
     if (!NIL_P(str)) {
-	rb_enc_associate(str, enc);
+	str = io_enc_str(str, fptr);
 	if (!nolimit) {
 	    fptr->lineno++;
 	    lineno = INT2FIX(fptr->lineno);
 	}
-	OBJ_TAINT(str);
     }
-
     return str;
 }
 
@@ -1743,23 +1752,21 @@
 static VALUE
 rb_io_getline_1(VALUE rs, long limit, VALUE io)
 {
-    rb_encoding *enc;
     VALUE str = Qnil;
     rb_io_t *fptr;
     int nolimit = 0;
 
     GetOpenFile(io, fptr);
     rb_io_check_readable(fptr);
-    enc = rb_enc_get(io);
     if (NIL_P(rs)) {
 	str = read_all(fptr, 0, Qnil);
 	if (RSTRING_LEN(str) == 0) return Qnil;
     }
     else if (limit == 0) {
-	return rb_enc_str_new(0, 0, enc);
+	return rb_enc_str_new(0, 0, fptr->enc);
     }
     else if (rs == rb_default_rs) {
-	return rb_io_getline_fast(fptr, '\n', limit, enc);
+	return rb_io_getline_fast(fptr, '\n', limit);
     }
     else {
 	int c, newline;
@@ -1775,8 +1782,7 @@
 	    swallow(fptr, '\n');
 	}
 	else if (rslen == 1) {
-	    return rb_io_getline_fast(fptr, (unsigned char)RSTRING_PTR(rs)[0],
-				      limit, enc);
+	    return rb_io_getline_fast(fptr, (unsigned char)RSTRING_PTR(rs)[0], limit);
 	}
 	else {
 	    rsptr = RSTRING_PTR(rs);
@@ -1804,12 +1810,11 @@
     }
 
     if (!NIL_P(str)) {
-	rb_enc_associate(str, enc);
+	str = io_enc_str(str, fptr);
 	if (!nolimit) {
 	    fptr->lineno++;
 	    lineno = INT2FIX(fptr->lineno);
 	}
-	OBJ_TAINT(str);
     }
 
     return str;
@@ -1832,7 +1837,7 @@
 
     GetOpenFile(io, fptr);
     rb_io_check_readable(fptr);
-    return rb_io_getline_fast(fptr, '\n', 0, rb_enc_get(io));
+    return rb_io_getline_fast(fptr, '\n', 0);
 }
 
 /*
@@ -2125,20 +2130,18 @@
 static VALUE
 rb_io_getc(VALUE io)
 {
-    rb_encoding *enc;
     rb_io_t *fptr;
     int r, n;
     VALUE str;
 
     GetOpenFile(io, fptr);
     rb_io_check_readable(fptr);
-    enc = rb_enc_get(io);
 
     READ_CHECK(fptr);
     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);
+    r = rb_enc_precise_mbclen(fptr->rbuf+fptr->rbuf_off, fptr->rbuf+fptr->rbuf_off+fptr->rbuf_len, fptr->enc);
     if ((n = MBCLEN_CHARFOUND(r)) != 0 && n <= fptr->rbuf_len) {
 	str = rb_str_new(fptr->rbuf+fptr->rbuf_off, n);
 	fptr->rbuf_off += n;
@@ -2152,7 +2155,7 @@
             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);
+            r = rb_enc_precise_mbclen(RSTRING_PTR(str), RSTRING_PTR(str)+RSTRING_LEN(str), fptr->enc);
             if (MBCLEN_NEEDMORE(r)) {
                 goto getc_needmore;
             }
@@ -2163,9 +2166,7 @@
 	fptr->rbuf_off++;
 	fptr->rbuf_len--;
     }
-    rb_enc_associate(str, enc);
-
-    return str;
+    return io_enc_str(str, fptr);
 }
 
 int

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

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