* 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
This commit is contained in:
matz 2008-10-21 22:10:49 +00:00
Родитель 34d1e9bb25
Коммит 81525af4c9
3 изменённых файлов: 34 добавлений и 3 удалений

Просмотреть файл

@ -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.

Просмотреть файл

@ -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;
@ -730,6 +734,19 @@ strio_ungetc(VALUE self, VALUE c)
return Qnil;
}
/*
* 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
@ -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);

Просмотреть файл

@ -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);