зеркало из https://github.com/github/ruby.git
* ext/stringio/stringio.c (strio_read): behave as IO at empty string.
[ruby-dev:21939] * ext/stringio/stringio.c (strio_getc, strio_getline): set EOF flag. * ext/stringio/stringio.c (strio_rewind, strio_seek, strio_ungetc): clear EOF flag. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@4978 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
Родитель
914d8f7008
Коммит
12eee69294
10
ChangeLog
10
ChangeLog
|
@ -1,3 +1,13 @@
|
|||
Tue Nov 18 18:09:37 2003 Nobuyoshi Nakada <nobu@ruby-lang.org>
|
||||
|
||||
* ext/stringio/stringio.c (strio_read): behave as IO at empty string.
|
||||
[ruby-dev:21939]
|
||||
|
||||
* ext/stringio/stringio.c (strio_getc, strio_getline): set EOF flag.
|
||||
|
||||
* ext/stringio/stringio.c (strio_rewind, strio_seek, strio_ungetc):
|
||||
clear EOF flag.
|
||||
|
||||
Tue Nov 18 14:06:35 2003 Minero Aoki <aamine@loveruby.net>
|
||||
|
||||
* lib/fileutils.rb (fu_each_src_dest): raise if src==dest.
|
||||
|
|
|
@ -16,6 +16,7 @@
|
|||
#include "rubyio.h"
|
||||
|
||||
#define STRIO_APPEND 4
|
||||
#define STRIO_EOF 8
|
||||
|
||||
struct StringIO {
|
||||
VALUE string;
|
||||
|
@ -483,6 +484,7 @@ strio_rewind(self)
|
|||
struct StringIO *ptr = StringIO(self);
|
||||
ptr->pos = 0;
|
||||
ptr->lineno = 0;
|
||||
ptr->flags &= ~STRIO_EOF;
|
||||
return INT2FIX(0);
|
||||
}
|
||||
|
||||
|
@ -514,6 +516,7 @@ strio_seek(argc, argv, self)
|
|||
error_inval(0);
|
||||
}
|
||||
ptr->pos = offset;
|
||||
ptr->flags &= ~STRIO_EOF;
|
||||
return INT2FIX(0);
|
||||
}
|
||||
|
||||
|
@ -548,6 +551,7 @@ strio_getc(self)
|
|||
struct StringIO *ptr = readable(StringIO(self));
|
||||
int c;
|
||||
if (ptr->pos >= RSTRING(ptr->string)->len) {
|
||||
ptr->flags |= STRIO_EOF;
|
||||
return Qnil;
|
||||
}
|
||||
c = RSTRING(ptr->string)->ptr[ptr->pos++];
|
||||
|
@ -578,6 +582,7 @@ strio_ungetc(self, ch)
|
|||
OBJ_INFECT(ptr->string, self);
|
||||
}
|
||||
--ptr->pos;
|
||||
ptr->flags &= ~STRIO_EOF;
|
||||
}
|
||||
return Qnil;
|
||||
}
|
||||
|
@ -649,7 +654,10 @@ strio_getline(argc, argv, ptr)
|
|||
if (!NIL_P(str)) StringValue(str);
|
||||
}
|
||||
|
||||
if (ptr->pos >= (n = RSTRING(ptr->string)->len)) return Qnil;
|
||||
if (ptr->pos >= (n = RSTRING(ptr->string)->len)) {
|
||||
ptr->flags |= STRIO_EOF;
|
||||
return Qnil;
|
||||
}
|
||||
s = RSTRING(ptr->string)->ptr;
|
||||
e = s + RSTRING(ptr->string)->len;
|
||||
s += ptr->pos;
|
||||
|
@ -659,7 +667,10 @@ strio_getline(argc, argv, ptr)
|
|||
else if ((n = RSTRING(str)->len) == 0) {
|
||||
p = s;
|
||||
while (*p == '\n') {
|
||||
if (++p == e) return Qnil;
|
||||
if (++p == e) {
|
||||
ptr->flags |= STRIO_EOF;
|
||||
return Qnil;
|
||||
}
|
||||
}
|
||||
s = p;
|
||||
while (p = memchr(p, '\n', e - p)) {
|
||||
|
@ -827,24 +838,34 @@ strio_read(argc, argv, self)
|
|||
VALUE str;
|
||||
long len;
|
||||
|
||||
if (ptr->pos >= RSTRING(ptr->string)->len) {
|
||||
return Qnil;
|
||||
}
|
||||
switch (argc) {
|
||||
case 1:
|
||||
if (!NIL_P(argv[0])) {
|
||||
len = NUM2LONG(argv[0]);
|
||||
if (len < 0) {
|
||||
rb_raise(rb_eArgError, "negative length %ld given", len);
|
||||
}
|
||||
if (len > 0 && ptr->pos >= RSTRING(ptr->string)->len) {
|
||||
ptr->flags |= STRIO_EOF;
|
||||
return Qnil;
|
||||
}
|
||||
break;
|
||||
}
|
||||
/* fall through */
|
||||
case 0:
|
||||
len = RSTRING(ptr->string)->len - ptr->pos;
|
||||
if (len == 0 && ptr->pos == RSTRING(ptr->string)->len) {
|
||||
if (ptr->flags & STRIO_EOF) return Qnil;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
rb_raise(rb_eArgError, "wrong number arguments (%d for 0)", argc);
|
||||
}
|
||||
str = rb_str_substr(ptr->string, ptr->pos, len);
|
||||
ptr->pos += len;
|
||||
if (len > 0 &&
|
||||
(NIL_P(str) || (ptr->pos += RSTRING(str)->len) >= RSTRING(ptr->string)->len)) {
|
||||
ptr->flags |= STRIO_EOF;
|
||||
}
|
||||
return str;
|
||||
}
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче