summaryrefslogtreecommitdiff
path: root/ext
diff options
context:
space:
mode:
authorshyouhei <shyouhei@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2009-02-09 04:40:47 +0000
committershyouhei <shyouhei@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2009-02-09 04:40:47 +0000
commitd8646119b7e2f616e6c36cb50d56b027091db8d4 (patch)
tree2ef5c0d17a276ab1a68397a406e3f713b33ad9dd /ext
parentd17f8b06df2a4028898839acd6cfc88508a2f2ff (diff)
merge revision(s) 20151:
* ext/stringio/stringio.c (strio_ungetc): should allow ungetc at the top of the buffer. ref #701 git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_8_7@22163 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'ext')
-rw-r--r--ext/stringio/stringio.c25
1 files changed, 17 insertions, 8 deletions
diff --git a/ext/stringio/stringio.c b/ext/stringio/stringio.c
index 537fc19a4e..71b7b69f71 100644
--- a/ext/stringio/stringio.c
+++ b/ext/stringio/stringio.c
@@ -779,15 +779,24 @@ strio_ungetc(self, ch)
int cc = NUM2INT(ch);
long len, pos = ptr->pos;
- if (cc != EOF && pos > 0) {
- if ((len = RSTRING(ptr->string)->len) < pos-- ||
- (unsigned char)RSTRING(ptr->string)->ptr[pos] !=
- (unsigned char)cc) {
- strio_extend(ptr, pos, 1);
- RSTRING(ptr->string)->ptr[pos] = cc;
- OBJ_INFECT(ptr->string, self);
+ if (cc != EOF) {
+ len = RSTRING(ptr->string)->len;
+ if (pos == 0) {
+ char *p;
+ rb_str_resize(ptr->string, len + 1);
+ p = RSTRING(ptr->string)->ptr;
+ memmove(p + 1, p, len);
+ }
+ else {
+ if (len < pos-- ||
+ (unsigned char)RSTRING(ptr->string)->ptr[pos] !=
+ (unsigned char)cc) {
+ strio_extend(ptr, pos, 1);
+ }
+ --ptr->pos;
}
- --ptr->pos;
+ RSTRING(ptr->string)->ptr[pos] = cc;
+ OBJ_INFECT(ptr->string, self);
ptr->flags &= ~STRIO_EOF;
}
return Qnil;