In article
[email protected],
wanabe [email protected] writes:
e$B$9$$^$;$s!“$4;XE&$”$j$,$H$&$4$6$$$^$9!#e(B
e$B8+Mn$H$7$F$$$^$7$?!#<h$j5^$.!"e(Brb_protect e$B$G$/$/$k$h$&$K$7$F:FEY%3%%C%H$7$^$7$?!#e(B
e$B;W$&$s$G$9$,!"%o%J%Y$5$s$,$d$j$?$+$C$?$N$O$`$7$me(B
ECONV_AFTER_OUTPUT e$B$r30$7$?$+$C$?$H$$$&$3$H$J$s$8$c$J$$$G$9e(B
e$B$+$M$'!#e(B
e$B$3$&$9$k$H$3$A$i$G$OB.$/$J$k46$8$G$9$,!"$=$A$i$G$O$I$&$G$7$ge(B
e$B$&!#e(B
% svn diff --diff-cmd diff -x ‘-u -p’
Index: io.c
— io.c (revision 25821)
+++ io.c (working copy)
@@ -1582,17 +1582,22 @@ make_readconv(rb_io_t *fptr, int size)
}
}
-static int
-more_char(rb_io_t *fptr)
+#define MORE_CHAR_CBUF_FULL Qtrue
+#define MORE_CHAR_FINISHED Qnil
+static VALUE
+fill_cbuf(rb_io_t *fptr, int ec_flags)
{
const unsigned char *ss, *sp, *se;
unsigned char *ds, *dp, *de;
rb_econv_result_t res;
int putbackable;
int cbuf_len0;
-
res = rb_econv_convert(fptr->readconv, &sp, se, &dp, de,
ECONV_PARTIAL_INPUT|ECONV_AFTER_OUTPUT);
-
res = rb_econv_convert(fptr->readconv, &sp, se, &dp, de,
ec_flags);
fptr->rbuf_off += (int)(sp - ss);
fptr->rbuf_len -= (int)(sp - ss);
fptr->cbuf_len += (int)(dp - ds);
@@ -1619,13 +1624,15 @@ more_char(rb_io_t *fptr)
fptr->rbuf_len += putbackable;
}
@@ -1645,6 +1652,16 @@ more_char(rb_io_t *fptr)
}
static VALUE
+more_char(rb_io_t *fptr)
+{
- VALUE v;
- v = fill_cbuf(fptr, ECONV_AFTER_OUTPUT);
- if (v != MORE_CHAR_CBUF_FULL && v != MORE_CHAR_FINISHED)
-
rb_exc_raise(v);
- return v;
+}
-
+static VALUE
io_shift_cbuf(rb_io_t *fptr, int len, VALUE *strp)
{
VALUE str;
@@ -1665,7 +1682,7 @@ io_shift_cbuf(rb_io_t fptr, int len, VA
/ xxx: set coderange */
if (fptr->cbuf_len == 0)
fptr->cbuf_off = 0;
- if (fptr->cbuf_off < fptr->cbuf_capa/2) {
- else if (fptr->cbuf_capa/2 < fptr->cbuf_off) {
memmove(fptr->cbuf, fptr->cbuf+fptr->cbuf_off, fptr->cbuf_len);
fptr->cbuf_off = 0;
}
@@ -1686,21 +1703,19 @@ read_all(rb_io_t *fptr, long siz, VALUE
else rb_str_set_len(str, 0);
make_readconv(fptr, 0);
while (1) {
&state);
-
if (fin == -1 || state != 0) {
- if (fptr->cbuf_len) {
-
io_shift_cbuf(fptr, fptr->cbuf_len, &str);
- }
- if (state != 0) {
-
rb_jump_tag(state);
- }
- clear_readconv(fptr);
-
v = fill_cbuf(fptr, 0);
-
if (v != MORE_CHAR_CBUF_FULL && v != MORE_CHAR_FINISHED) {
-
if (fptr->cbuf_len) {
-
io_shift_cbuf(fptr, fptr->cbuf_len, &str);
-
}
-
rb_exc_raise(v);
-
}
-
if (v == MORE_CHAR_FINISHED) {
-
clear_readconv(fptr);
return io_enc_str(str, fptr);
}
}
@@ -2181,7 +2196,7 @@ appendline(rb_io_t *fptr, int delim, VAL
return (unsigned
char)RSTRING_PTR(str)[RSTRING_LEN(str)-1];
}
}
@@ -2695,7 +2710,8 @@ io_getc(rb_io_t *fptr, rb_encoding *enc)
}
}
@@ -2830,8 +2846,8 @@ rb_io_each_codepoint(VALUE io)
rb_raise(rb_eIOError, “too long character”);
}
}
- if (more_char(fptr) == -1) {
-
clear_readconv(fptr);