* ext/stringio/stringio.c (strio_getc): should returns

one-character string.

* ext/stringio/stringio.c: remove unnecessary prototypes.

* ext/stringio/stringio.c (strio_getbyte): new method.

* ext/stringio/stringio.c (strio_readbyte): new method.

* ext/stringio/stringio.c (strio_ungetc): should take a string as
  an input.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@12934 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
matz 2007-08-15 00:33:33 +00:00
parent 333454e4dd
commit c8c6ab229a
3 changed files with 85 additions and 75 deletions

View File

@ -52,6 +52,20 @@ Mon Aug 13 13:21:58 2007 Tanaka Akira <akr@fsij.org>
* lib/open-uri.rb: make ftp passive mode to avoid NAT problem. * lib/open-uri.rb: make ftp passive mode to avoid NAT problem.
[ruby-dev:31377] [ruby-dev:31377]
Mon Aug 13 09:18:05 2007 Yukihiro Matsumoto <matz@ruby-lang.org>
* ext/stringio/stringio.c (strio_getc): should returns
one-character string.
* ext/stringio/stringio.c: remove unnecessary prototypes.
* ext/stringio/stringio.c (strio_getbyte): new method.
* ext/stringio/stringio.c (strio_readbyte): new method.
* ext/stringio/stringio.c (strio_ungetc): should take a string as
an input.
Mon Aug 13 08:19:43 2007 Yukihiro Matsumoto <matz@ruby-lang.org> Mon Aug 13 08:19:43 2007 Yukihiro Matsumoto <matz@ruby-lang.org>
* io.c (argf_close): always close via method. * io.c (argf_close): always close via method.

View File

@ -28,14 +28,8 @@ struct StringIO {
int count; int count;
}; };
static struct StringIO* strio_alloc _((void));
static void strio_mark _((struct StringIO *)); static void strio_mark _((struct StringIO *));
static void strio_free _((struct StringIO *)); static void strio_free _((struct StringIO *));
static struct StringIO* check_strio _((VALUE));
static struct StringIO* get_strio _((VALUE));
static struct StringIO* readable _((struct StringIO *));
static struct StringIO* writable _((struct StringIO *));
static void check_modifiable _((struct StringIO *));
#define IS_STRIO(obj) (RDATA(obj)->dmark == (RUBY_DATA_FUNC)strio_mark) #define IS_STRIO(obj) (RDATA(obj)->dmark == (RUBY_DATA_FUNC)strio_mark)
#define error_inval(msg) (errno = EINVAL, rb_sys_fail(msg)) #define error_inval(msg) (errno = EINVAL, rb_sys_fail(msg))
@ -125,74 +119,12 @@ check_modifiable(struct StringIO *ptr)
} }
} }
static VALUE strio_s_allocate _((VALUE));
static VALUE strio_s_open _((int, VALUE *, VALUE));
static VALUE strio_initialize _((int, VALUE *, VALUE));
static VALUE strio_finalize _((VALUE));
static VALUE strio_self _((VALUE));
static VALUE strio_false _((VALUE));
static VALUE strio_nil _((VALUE));
static VALUE strio_0 _((VALUE));
static VALUE strio_first _((VALUE, VALUE));
static VALUE strio_unimpl _((int, VALUE *, VALUE));
static VALUE strio_get_string _((VALUE));
static VALUE strio_set_string _((VALUE, VALUE));
static VALUE strio_close _((VALUE));
static VALUE strio_close_read _((VALUE));
static VALUE strio_close_write _((VALUE));
static VALUE strio_closed _((VALUE));
static VALUE strio_closed_read _((VALUE));
static VALUE strio_closed_write _((VALUE));
static VALUE strio_eof _((VALUE));
static VALUE strio_get_lineno _((VALUE));
static VALUE strio_set_lineno _((VALUE, VALUE));
static VALUE strio_get_pos _((VALUE));
static VALUE strio_set_pos _((VALUE, VALUE));
static VALUE strio_rewind _((VALUE));
static VALUE strio_seek _((int, VALUE *, VALUE));
static VALUE strio_get_sync _((VALUE));
static VALUE strio_each_byte _((VALUE));
static VALUE strio_getc _((VALUE));
static VALUE strio_ungetc _((VALUE, VALUE));
static VALUE strio_readchar _((VALUE));
static VALUE strio_getline _((int, VALUE *, struct StringIO *));
static VALUE strio_gets _((int, VALUE *, VALUE));
static VALUE strio_readline _((int, VALUE *, VALUE));
static VALUE strio_each _((int, VALUE *, VALUE));
static VALUE strio_readlines _((int, VALUE *, VALUE));
static VALUE strio_write _((VALUE, VALUE));
static VALUE strio_putc _((VALUE, VALUE));
static VALUE strio_read _((int, VALUE *, VALUE));
static VALUE strio_size _((VALUE));
static VALUE strio_truncate _((VALUE, VALUE));
void Init_stringio _((void));
/* Boyer-Moore search: copied from regex.c */
static void bm_init_skip _((long *, const char *, long));
static long bm_search _((const char *, long, const char *, long, const long *));
static VALUE static VALUE
strio_s_allocate(klass) strio_s_allocate(VALUE klass)
VALUE klass;
{ {
return Data_Wrap_Struct(klass, strio_mark, strio_free, 0); return Data_Wrap_Struct(klass, strio_mark, strio_free, 0);
} }
/*
* call-seq: StringIO.open(string=""[, mode]) {|strio| ...}
*
* Equivalent to StringIO.new except that when it is called with a block, it
* yields with the new instance and closes it, and returns the result which
* returned from the block.
*/
static VALUE
strio_s_open(int argc, VALUE *argv, VALUE klass)
{
VALUE obj = rb_class_new_instance(argc, argv, klass);
if (!rb_block_given_p()) return obj;
return rb_ensure(rb_yield, obj, strio_finalize, obj);
}
/* /*
* call-seq: StringIO.new(string=""[, mode]) * call-seq: StringIO.new(string=""[, mode])
* *
@ -252,6 +184,21 @@ strio_finalize(VALUE self)
return self; return self;
} }
/*
* call-seq: StringIO.open(string=""[, mode]) {|strio| ...}
*
* Equivalent to StringIO.new except that when it is called with a block, it
* yields with the new instance and closes it, and returns the result which
* returned from the block.
*/
static VALUE
strio_s_open(int argc, VALUE *argv, VALUE klass)
{
VALUE obj = rb_class_new_instance(argc, argv, klass);
if (!rb_block_given_p()) return obj;
return rb_ensure(rb_yield, obj, strio_finalize, obj);
}
/* /*
* Returns +false+. Just for compatibility to IO. * Returns +false+. Just for compatibility to IO.
*/ */
@ -662,6 +609,27 @@ strio_each_byte(VALUE self)
*/ */
static VALUE static VALUE
strio_getc(VALUE self) strio_getc(VALUE self)
{
struct StringIO *ptr = readable(StringIO(self));
int c;
char ch;
if (ptr->pos >= RSTRING_LEN(ptr->string)) {
return Qnil;
}
c = RSTRING_PTR(ptr->string)[ptr->pos++];
ch = c & 0xff;
return rb_str_new(&ch, 1);
}
/*
* call-seq:
* strio.getbyte -> fixnum or nil
*
* See IO#getbyte.
*/
static VALUE
strio_getbyte(VALUE self)
{ {
struct StringIO *ptr = readable(StringIO(self)); struct StringIO *ptr = readable(StringIO(self));
int c; int c;
@ -691,7 +659,7 @@ strio_extend(struct StringIO *ptr, long pos, long len)
/* /*
* call-seq: * call-seq:
* strio.ungetc(integer) -> nil * strio.ungetc(string) -> nil
* *
* Pushes back one character (passed as a parameter) onto *strio* * Pushes back one character (passed as a parameter) onto *strio*
* such that a subsequent buffered read will return it. Pushing back * such that a subsequent buffered read will return it. Pushing back
@ -700,12 +668,23 @@ strio_extend(struct StringIO *ptr, long pos, long len)
* In other case, there is no limitation for multiple pushbacks. * In other case, there is no limitation for multiple pushbacks.
*/ */
static VALUE static VALUE
strio_ungetc(VALUE self, VALUE ch) strio_ungetc(VALUE self, VALUE c)
{ {
struct StringIO *ptr = readable(StringIO(self)); struct StringIO *ptr = readable(StringIO(self));
int cc = NUM2INT(ch); int cc;
long len, pos = ptr->pos; long len, pos = ptr->pos;
if (NIL_P(c)) return Qnil;
if (FIXNUM_P(c)) {
cc = FIX2INT(c);
}
else {
SafeStringValue(c);
if (RSTRING_LEN(c) > 1) {
rb_warn("IO#ungetc pushes back only one byte");
}
cc = (unsigned char)RSTRING_PTR(c)[0];
}
if (cc != EOF && pos > 0) { if (cc != EOF && pos > 0) {
if ((len = RSTRING_LEN(ptr->string)) < pos-- || if ((len = RSTRING_LEN(ptr->string)) < pos-- ||
(unsigned char)RSTRING_PTR(ptr->string)[pos] != (unsigned char)RSTRING_PTR(ptr->string)[pos] !=
@ -733,6 +712,21 @@ strio_readchar(VALUE self)
return c; return c;
} }
/*
* call-seq:
* strio.readbyte -> fixnum
*
* See IO#readbyte.
*/
static VALUE
strio_readbyte(VALUE self)
{
VALUE c = strio_getbyte(self);
if (NIL_P(c)) rb_eof_error();
return c;
}
/* Boyer-Moore search: copied from regex.c */
static void static void
bm_init_skip(long *skip, const char *pat, long m) bm_init_skip(long *skip, const char *pat, long m)
{ {
@ -1216,6 +1210,8 @@ Init_stringio()
rb_define_method(StringIO, "getc", strio_getc, 0); rb_define_method(StringIO, "getc", strio_getc, 0);
rb_define_method(StringIO, "ungetc", strio_ungetc, 1); rb_define_method(StringIO, "ungetc", strio_ungetc, 1);
rb_define_method(StringIO, "readchar", strio_readchar, 0); rb_define_method(StringIO, "readchar", strio_readchar, 0);
rb_define_method(StringIO, "getbyte", strio_getbyte, 0);
rb_define_method(StringIO, "readbyte", strio_readbyte, 0);
rb_define_method(StringIO, "gets", strio_gets, -1); rb_define_method(StringIO, "gets", strio_gets, -1);
rb_define_method(StringIO, "readline", strio_readline, -1); rb_define_method(StringIO, "readline", strio_readline, -1);
rb_define_method(StringIO, "readlines", strio_readlines, -1); rb_define_method(StringIO, "readlines", strio_readlines, -1);

View File

@ -1,7 +1,7 @@
#define RUBY_VERSION "1.9.0" #define RUBY_VERSION "1.9.0"
#define RUBY_RELEASE_DATE "2007-08-14" #define RUBY_RELEASE_DATE "2007-08-15"
#define RUBY_VERSION_CODE 190 #define RUBY_VERSION_CODE 190
#define RUBY_RELEASE_CODE 20070814 #define RUBY_RELEASE_CODE 20070815
#define RUBY_PATCHLEVEL 0 #define RUBY_PATCHLEVEL 0
#define RUBY_VERSION_MAJOR 1 #define RUBY_VERSION_MAJOR 1
@ -9,7 +9,7 @@
#define RUBY_VERSION_TEENY 0 #define RUBY_VERSION_TEENY 0
#define RUBY_RELEASE_YEAR 2007 #define RUBY_RELEASE_YEAR 2007
#define RUBY_RELEASE_MONTH 8 #define RUBY_RELEASE_MONTH 8
#define RUBY_RELEASE_DAY 14 #define RUBY_RELEASE_DAY 15
#ifdef RUBY_EXTERN #ifdef RUBY_EXTERN
RUBY_EXTERN const char ruby_version[]; RUBY_EXTERN const char ruby_version[];