summaryrefslogtreecommitdiff
path: root/io.c
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2012-05-24 03:07:49 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2012-05-24 03:07:49 +0000
commit3cc5ddcac142317709aa235a27d8ce0a84140150 (patch)
tree1e3bc3cf086c47d524182fe7febc253f0e66a7e8 /io.c
parentc427f44f1092c96a3bd3ea90d10ec591f3a93f94 (diff)
Bug #6487
* io.c (io_strip_bom): check EOF. [Bug #6487][ruby-core:45203] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@35766 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'io.c')
-rw-r--r--io.c68
1 files changed, 33 insertions, 35 deletions
diff --git a/io.c b/io.c
index e5e77be5cb..c935ff1a3f 100644
--- a/io.c
+++ b/io.c
@@ -5099,65 +5099,63 @@ static void io_encoding_set(rb_io_t *, VALUE, VALUE, VALUE);
static int
io_strip_bom(VALUE io)
{
- int b1, b2, b3, b4;
- switch (b1 = FIX2INT(rb_io_getbyte(io))) {
- case 0xEF:
- b2 = FIX2INT(rb_io_getbyte(io));
- if (b2 == 0xBB) {
- b3 = FIX2INT(rb_io_getbyte(io));
- if (b3 == 0xBF) {
+ VALUE b1, b2, b3, b4;
+
+ if (NIL_P(b1 = rb_io_getbyte(io))) return 0;
+ switch (b1) {
+ case INT2FIX(0xEF):
+ if (NIL_P(b2 = rb_io_getbyte(io))) break;
+ if (b2 == INT2FIX(0xBB) && !NIL_P(b3 = rb_io_getbyte(io))) {
+ if (b3 == INT2FIX(0xBF)) {
return rb_utf8_encindex();
}
- rb_io_ungetbyte(io, INT2FIX(b3));
+ rb_io_ungetbyte(io, b3);
}
- rb_io_ungetbyte(io, INT2FIX(b2));
+ rb_io_ungetbyte(io, b2);
break;
- case 0xFE:
- b2 = FIX2INT(rb_io_getbyte(io));
- if (b2 == 0xFF) {
+ case INT2FIX(0xFE):
+ if (NIL_P(b2 = rb_io_getbyte(io))) break;
+ if (b2 == INT2FIX(0xFF)) {
return rb_enc_find_index("UTF-16BE");
}
- rb_io_ungetbyte(io, INT2FIX(b2));
+ rb_io_ungetbyte(io, b2);
break;
- case 0xFF:
- b2 = FIX2INT(rb_io_getbyte(io));
- if (b2 == 0xFE) {
- b3 = FIX2INT(rb_io_getbyte(io));
- if (b3 == 0) {
- b4 = FIX2INT(rb_io_getbyte(io));
- if (b4 == 0) {
+ case INT2FIX(0xFF):
+ if (NIL_P(b2 = rb_io_getbyte(io))) break;
+ if (b2 == INT2FIX(0xFE)) {
+ b3 = rb_io_getbyte(io);
+ if (b3 == INT2FIX(0) && !NIL_P(b4 = rb_io_getbyte(io))) {
+ if (b4 == INT2FIX(0)) {
return rb_enc_find_index("UTF-32LE");
}
- rb_io_ungetbyte(io, INT2FIX(b4));
+ rb_io_ungetbyte(io, b4);
+ rb_io_ungetbyte(io, b3);
}
else {
- rb_io_ungetbyte(io, INT2FIX(b3));
+ rb_io_ungetbyte(io, b3);
return rb_enc_find_index("UTF-16LE");
}
- rb_io_ungetbyte(io, INT2FIX(b3));
}
- rb_io_ungetbyte(io, INT2FIX(b2));
+ rb_io_ungetbyte(io, b2);
break;
- case 0:
- b2 = FIX2INT(rb_io_getbyte(io));
- if (b2 == 0) {
- b3 = FIX2INT(rb_io_getbyte(io));
- if (b3 == 0xFE) {
- b4 = FIX2INT(rb_io_getbyte(io));
- if (b4 == 0xFF) {
+ case INT2FIX(0):
+ if (NIL_P(b2 = rb_io_getbyte(io))) break;
+ if (b2 == INT2FIX(0) && !NIL_P(b3 = rb_io_getbyte(io))) {
+ if (b3 == INT2FIX(0xFE) && !NIL_P(b4 = rb_io_getbyte(io))) {
+ if (b4 == INT2FIX(0xFF)) {
return rb_enc_find_index("UTF-32BE");
}
- rb_io_ungetbyte(io, INT2FIX(b4));
+ rb_io_ungetbyte(io, b4);
}
- rb_io_ungetbyte(io, INT2FIX(b3));
+ rb_io_ungetbyte(io, b3);
}
- rb_io_ungetbyte(io, INT2FIX(b2));
+ rb_io_ungetbyte(io, b2);
break;
}
- rb_io_ungetbyte(io, INT2FIX(b1));
+ rb_io_ungetbyte(io, b1);
return 0;
}