summaryrefslogtreecommitdiff
path: root/io.c
diff options
context:
space:
mode:
authornaruse <naruse@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2008-02-28 06:30:38 +0000
committernaruse <naruse@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2008-02-28 06:30:38 +0000
commit198e1d074c187d2a4e8b9d1bb378a714b2d6001b (patch)
tree329a59bc9bb1a02c666661a0e59cbdaf501c35d7 /io.c
parent51411c1f882e8d455249de2768366c25ba3a9b50 (diff)
* io.c (rb_io_getline_fast): scan coderange.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@15628 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'io.c')
-rw-r--r--io.c6
1 files changed, 6 insertions, 0 deletions
diff --git a/io.c b/io.c
index cbca404d06..cfb86e44c9 100644
--- a/io.c
+++ b/io.c
@@ -1801,6 +1801,9 @@ rb_io_getline_fast(rb_io_t *fptr)
{
VALUE str = Qnil;
int len = 0;
+ long pos = 0;
+ rb_encoding *enc = io_read_encoding(fptr);
+ int cr = 0;
for (;;) {
long pending = READ_DATA_PENDING_COUNT(fptr);
@@ -1823,6 +1826,8 @@ rb_io_getline_fast(rb_io_t *fptr)
read_buffered_data(RSTRING_PTR(str)+len, pending, fptr);
}
len += pending;
+ if (cr != ENC_CODERANGE_BROKEN)
+ pos = rb_str_coderange_scan_restartable(RSTRING_PTR(str) + pos, RSTRING_PTR(str) + len, enc, &cr);
if (e) break;
}
rb_thread_wait_fd(fptr->fd);
@@ -1834,6 +1839,7 @@ rb_io_getline_fast(rb_io_t *fptr)
}
str = io_enc_str(str, fptr);
+ ENC_CODERANGE_SET(str, cr);
fptr->lineno++;
lineno = INT2FIX(fptr->lineno);
return str;