summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2008-10-21 22:10:49 +0000
committermatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2008-10-21 22:10:49 +0000
commit81525af4c9a8e512db6bd8b73c6fbe5ea39c865a (patch)
tree1dae2e33418150469470a784a251fd160dc69fa3
parent34d1e9bb2504d7fa0b98ad99a32c549cd0d92853 (diff)
* ext/zlib/zlib.c (rb_gzreader_ungetc): should be able to unget
Fixnum. * ext/stringio/stringio.c (strio_ungetc): should convert unget string. * ext/stringio/stringio.c (strio_ungetbyte): new method. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@19883 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r--ChangeLog10
-rw-r--r--ext/stringio/stringio.c22
-rw-r--r--ext/zlib/zlib.c5
3 files changed, 34 insertions, 3 deletions
diff --git a/ChangeLog b/ChangeLog
index 1c922f2d24..1d4dd45f09 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,13 @@
+Wed Oct 22 07:09:19 2008 Yukihiro Matsumoto <matz@ruby-lang.org>
+
+ * ext/zlib/zlib.c (rb_gzreader_ungetc): should be able to unget
+ Fixnum.
+
+ * ext/stringio/stringio.c (strio_ungetc): should convert unget
+ string.
+
+ * ext/stringio/stringio.c (strio_ungetbyte): new method.
+
Wed Oct 22 05:46:25 2008 Koichi Sasada <ko1@atdot.net>
* include/ruby/vm.h: write a comment.
diff --git a/ext/stringio/stringio.c b/ext/stringio/stringio.c
index b907047137..191c1024c4 100644
--- a/ext/stringio/stringio.c
+++ b/ext/stringio/stringio.c
@@ -701,7 +701,7 @@ strio_ungetc(VALUE self, VALUE c)
struct StringIO *ptr = readable(StringIO(self));
long lpos, clen;
char *p, *pend;
- rb_encoding *enc;
+ rb_encoding *enc, *enc2;
if (NIL_P(c)) return Qnil;
if (FIXNUM_P(c)) {
@@ -714,7 +714,11 @@ strio_ungetc(VALUE self, VALUE c)
}
else {
SafeStringValue(c);
- enc = rb_enc_check(ptr->string, c);
+ enc = rb_enc_get(ptr->string);
+ enc2 = rb_enc_get(c);
+ if (enc != enc2 && enc != rb_ascii8bit_encoding()) {
+ c = rb_str_conv_enc(c, enc2, enc);
+ }
}
/* get logical position */
lpos = 0; p = RSTRING_PTR(ptr->string); pend = p + ptr->pos - 1;
@@ -732,6 +736,19 @@ strio_ungetc(VALUE self, VALUE c)
/*
* call-seq:
+ * strio.ungetbyte(fixnum) -> nil
+ *
+ * See IO#ungetbyte
+ */
+static VALUE
+strio_ungetbyte(VALUE self, VALUE c)
+{
+ NUM2INT(c);
+ return strio_ungetc(self, c);
+}
+
+/*
+ * call-seq:
* strio.readchar -> fixnum
*
* See IO#readchar.
@@ -1318,6 +1335,7 @@ Init_stringio()
rb_define_method(StringIO, "chars", strio_each_char, 0);
rb_define_method(StringIO, "getc", strio_getc, 0);
rb_define_method(StringIO, "ungetc", strio_ungetc, 1);
+ rb_define_method(StringIO, "ungetbyte", strio_ungetbyte, 1);
rb_define_method(StringIO, "readchar", strio_readchar, 0);
rb_define_method(StringIO, "getbyte", strio_getbyte, 0);
rb_define_method(StringIO, "readbyte", strio_readbyte, 0);
diff --git a/ext/zlib/zlib.c b/ext/zlib/zlib.c
index d2bcf76eb4..2cce207180 100644
--- a/ext/zlib/zlib.c
+++ b/ext/zlib/zlib.c
@@ -3075,8 +3075,11 @@ rb_gzreader_each_byte(VALUE obj)
static VALUE
rb_gzreader_ungetc(VALUE obj, VALUE s)
{
- struct gzfile *gz = get_gzfile(obj);
+ struct gzfile *gz;
+ if (FIXNUM_P(s))
+ return rb_gzreader_ungetbyte(obj, s);
+ gz = get_gzfile(obj);
StringValue(s);
if (gz->enc2 && gz->enc2 != rb_ascii8bit_encoding()) {
s = rb_str_conv_enc(s, rb_enc_get(s), gz->enc2);