ruby-changes:2802
From: ko1@a...
Date: 18 Dec 2007 17:04:51 +0900
Subject: [ruby-changes:2802] nobu - Ruby:r14293 (trunk): * transcode.c (rb_str_transcode_bang, rb_str_transcode): set new
nobu 2007-12-18 17:04:26 +0900 (Tue, 18 Dec 2007) New Revision: 14293 Modified files: trunk/ChangeLog trunk/transcode.c Log: * transcode.c (rb_str_transcode_bang, rb_str_transcode): set new encoding even if no conversion is done because of 7bit only. [ruby-dev:32591] http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/ChangeLog?r1=14293&r2=14292 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/transcode.c?r1=14293&r2=14292 Index: ChangeLog =================================================================== --- ChangeLog (revision 14292) +++ ChangeLog (revision 14293) @@ -1,3 +1,9 @@ +Tue Dec 18 17:04:25 2007 Nobuyoshi Nakada <nobu@r...> + + * transcode.c (rb_str_transcode_bang, rb_str_transcode): set new + encoding even if no conversion is done because of 7bit only. + [ruby-dev:32591] + Tue Dec 18 15:43:59 2007 Nobuyoshi Nakada <nobu@r...> * common.mk (encs, ext/ripper/ripper.c): other options must come Index: transcode.c =================================================================== --- transcode.c (revision 14292) +++ transcode.c (revision 14293) @@ -261,10 +261,11 @@ return RSTRING_PTR(dest_string); } -static VALUE -str_transcode(int argc, VALUE *argv, VALUE str) +static int +str_transcode(int argc, VALUE *argv, VALUE *self) { VALUE dest; + VALUE str = *self; long blen, slen; char *buf, *bp, *sp, *fromp; rb_encoding *from_enc, *to_enc; @@ -301,14 +302,15 @@ } if (from_enc && from_enc == to_enc) { - return Qnil; + return -1; } if (from_enc && to_enc && rb_enc_asciicompat(from_enc) && rb_enc_asciicompat(to_enc)) { - if (ENC_CODERANGE(str) == ENC_CODERANGE_7BIT) - return Qnil; + if (ENC_CODERANGE(str) == ENC_CODERANGE_7BIT) { + return to_encidx; + } } if (strcasecmp(from_e, to_e) == 0) { - return Qnil; + return -1; } while (!final_encoding) /* loop for multistep transcoding */ @@ -333,8 +335,6 @@ *bp = '\0'; rb_str_set_len(dest, bp - buf); - rb_enc_associate(dest, to_enc); - if (encoding_equal(my_transcoder->to_encoding, to_e)) { final_encoding = 1; } @@ -346,10 +346,10 @@ /* set encoding */ if (!to_enc) { to_encidx = rb_enc_replicate(to_e, rb_default_encoding()); - to_enc = rb_enc_from_index(to_encidx); } + *self = dest; - return dest; + return to_encidx; } /* @@ -367,10 +367,12 @@ static VALUE rb_str_transcode_bang(int argc, VALUE *argv, VALUE str) { - VALUE newstr = str_transcode(argc, argv, str); - if (NIL_P(newstr)) return str; + VALUE newstr = str; + int encidx = str_transcode(argc, argv, &newstr); + + if (encidx < 0) return Qnil; rb_str_shared_replace(str, newstr); - rb_enc_copy(str, newstr); + rb_enc_associate_index(str, encidx); return str; } @@ -387,10 +389,18 @@ static VALUE rb_str_transcode(int argc, VALUE *argv, VALUE str) { - VALUE newstr = str_transcode(argc, argv, str); - if (NIL_P(newstr)) return rb_str_dup(str); - RBASIC(newstr)->klass = rb_obj_class(str); - OBJ_INFECT(newstr, str); + VALUE newstr = str; + int encidx = str_transcode(argc, argv, &newstr); + + if (newstr == str) { + newstr = rb_str_new3(str); + if (encidx >= 0) rb_enc_associate_index(newstr, encidx); + } + else { + RBASIC(newstr)->klass = rb_obj_class(str); + OBJ_INFECT(newstr, str); + rb_enc_associate_index(newstr, encidx); + } return newstr; } -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml