From d8646119b7e2f616e6c36cb50d56b027091db8d4 Mon Sep 17 00:00:00 2001 From: shyouhei Date: Mon, 9 Feb 2009 04:40:47 +0000 Subject: 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 --- ChangeLog | 5 +++++ ext/stringio/stringio.c | 25 +++++++++++++++++-------- version.h | 8 ++++---- 3 files changed, 26 insertions(+), 12 deletions(-) diff --git a/ChangeLog b/ChangeLog index d437ea0ad6..12c8bd89d1 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +Mon Feb 9 13:40:21 2009 Yukihiro Matsumoto + + * ext/stringio/stringio.c (strio_ungetc): should allow ungetc at + the top of the buffer. ref #701 + Thu Feb 5 09:38:48 2009 NARUSE, Yui * ext/nkf/nkf-utf8/nkf.c (h_conv): can't guess UTF-8 input in 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; diff --git a/version.h b/version.h index 6e660830d6..7f2ad62eef 100644 --- a/version.h +++ b/version.h @@ -1,15 +1,15 @@ #define RUBY_VERSION "1.8.7" -#define RUBY_RELEASE_DATE "2009-02-05" +#define RUBY_RELEASE_DATE "2009-02-09" #define RUBY_VERSION_CODE 187 -#define RUBY_RELEASE_CODE 20090205 -#define RUBY_PATCHLEVEL 108 +#define RUBY_RELEASE_CODE 20090209 +#define RUBY_PATCHLEVEL 109 #define RUBY_VERSION_MAJOR 1 #define RUBY_VERSION_MINOR 8 #define RUBY_VERSION_TEENY 7 #define RUBY_RELEASE_YEAR 2009 #define RUBY_RELEASE_MONTH 2 -#define RUBY_RELEASE_DAY 5 +#define RUBY_RELEASE_DAY 9 #ifdef RUBY_EXTERN RUBY_EXTERN const char ruby_version[]; -- cgit v1.2.3