Skip to content

Commit

Permalink
* io.c (rb_io_extract_encoding_option): "internal_encoding: nil"
Browse files Browse the repository at this point in the history
  to specify no-transcoding.  and other corner case fixed.
  [ruby-dev:37496]

* hash.c (rb_hash_lookup2): new function to look-up hash with
  default value.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@20870 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
  • Loading branch information
matz committed Dec 19, 2008
1 parent e5bfdb8 commit 63219d8
Show file tree
Hide file tree
Showing 4 changed files with 61 additions and 40 deletions.
9 changes: 9 additions & 0 deletions ChangeLog
Original file line number Diff line number Diff line change
@@ -1,3 +1,12 @@
Fri Dec 19 17:01:35 2008 Yukihiro Matsumoto <[email protected]>

* io.c (rb_io_extract_encoding_option): "internal_encoding: nil"
to specify no-transcoding. and other corner case fixed.
[ruby-dev:37496]

* hash.c (rb_hash_lookup2): new function to look-up hash with
default value.

Fri Dec 19 15:51:48 2008 Nobuyoshi Nakada <[email protected]>

* ruby.c (process_options): get rid of warning on DOSISH.
Expand Down
10 changes: 8 additions & 2 deletions hash.c
Original file line number Diff line number Diff line change
Expand Up @@ -463,16 +463,22 @@ rb_hash_aref(VALUE hash, VALUE key)
}

VALUE
rb_hash_lookup(VALUE hash, VALUE key)
rb_hash_lookup2(VALUE hash, VALUE key, VALUE def)
{
VALUE val;

if (!RHASH(hash)->ntbl || !st_lookup(RHASH(hash)->ntbl, key, &val)) {
return Qnil; /* without Hash#default */
return def; /* without Hash#default */
}
return val;
}

VALUE
rb_hash_lookup(VALUE hash, VALUE key)
{
return rb_hash_lookup2(hash, key, Qnil);
}

/*
* call-seq:
* hsh.fetch(key [, default] ) => obj
Expand Down
1 change: 1 addition & 0 deletions include/ruby/intern.h
Original file line number Diff line number Diff line change
Expand Up @@ -359,6 +359,7 @@ VALUE rb_hash_dup(VALUE);
VALUE rb_hash_freeze(VALUE);
VALUE rb_hash_aref(VALUE, VALUE);
VALUE rb_hash_lookup(VALUE, VALUE);
VALUE rb_hash_lookup2(VALUE, VALUE, VALUE);
VALUE rb_hash_fetch(VALUE, VALUE);
VALUE rb_hash_aset(VALUE, VALUE, VALUE);
VALUE rb_hash_delete_if(VALUE);
Expand Down
81 changes: 43 additions & 38 deletions io.c
Original file line number Diff line number Diff line change
Expand Up @@ -3917,55 +3917,60 @@ rb_io_mode_enc(rb_io_t *fptr, const char *modestr)
int
rb_io_extract_encoding_option(VALUE opt, rb_encoding **enc_p, rb_encoding **enc2_p)
{
VALUE encoding=Qnil, extenc=Qnil, intenc=Qnil;
VALUE encoding=Qnil, extenc=Qundef, intenc=Qundef, tmp;
int extracted = 0;
rb_encoding *extencoding = NULL;
rb_encoding *intencoding = NULL;

if (!NIL_P(opt)) {
VALUE v;
v = rb_hash_aref(opt, sym_encoding);
if (!NIL_P(v)) encoding = v;
v = rb_hash_aref(opt, sym_extenc);
if (!NIL_P(v)) extenc = v;
v = rb_hash_aref(opt, sym_intenc);
if (!NIL_P(v)) intenc = v;
}
if (!NIL_P(extenc)) {
rb_encoding *extencoding = rb_to_encoding(extenc);
rb_encoding *intencoding = NULL;
extracted = 1;
if (!NIL_P(encoding)) {
rb_warn("Ignoring encoding parameter '%s': external_encoding is used",
RSTRING_PTR(encoding));
v = rb_hash_lookup2(opt, sym_encoding, Qnil);
if (v != Qnil) encoding = v;
v = rb_hash_lookup2(opt, sym_extenc, Qundef);
if (v != Qnil) extenc = v;
v = rb_hash_lookup2(opt, sym_intenc, Qundef);
if (v != Qundef) intenc = v;
}
if ((extenc != Qundef || intenc != Qundef) && !NIL_P(encoding)) {
rb_warn("Ignoring encoding parameter '%s': %s_encoding is used",
StringValueCStr(encoding),
extenc == Qundef ? "internal" : "external");
encoding = Qnil;
}
if (extenc != Qundef && !NIL_P(extenc)) {
extencoding = rb_to_encoding(extenc);
}
if (intenc != Qundef) {
if (NIL_P(intenc)) {
/* internal_encoding: nil => no transcoding */
intencoding = (rb_encoding *)Qnil;
}
if (!NIL_P(intenc)) {
if (!NIL_P(encoding = rb_check_string_type(intenc))) {
char *p = StringValueCStr(encoding);
if (*p == '-' && *(p+1) == '\0') {
/* Special case - "-" => no transcoding */
intencoding = (rb_encoding *)Qnil;
}
else
intencoding = rb_to_encoding(intenc);
else if (!NIL_P(tmp = rb_check_string_type(intenc))) {
char *p = StringValueCStr(tmp);

if (*p == '-' && *(p+1) == '\0') {
/* Special case - "-" => no transcoding */
intencoding = (rb_encoding *)Qnil;
}
else
else {
intencoding = rb_to_encoding(intenc);
if (extencoding == intencoding) {
rb_warn("Ignoring internal encoding '%s': it is identical to external encoding '%s'",
RSTRING_PTR(rb_inspect(intenc)),
RSTRING_PTR(rb_inspect(extenc)));
intencoding = (rb_encoding *)Qnil;
}
}
rb_io_ext_int_to_encs(extencoding, intencoding, enc_p, enc2_p);
}
else {
if (!NIL_P(intenc)) {
rb_raise(rb_eArgError, "External encoding must be specified when internal encoding is given");
else {
intencoding = rb_to_encoding(intenc);
}
if (!NIL_P(encoding)) {
extracted = 1;
parse_mode_enc(StringValueCStr(encoding), enc_p, enc2_p);
if (extencoding == intencoding) {
intencoding = (rb_encoding *)Qnil;
}
}
if (!NIL_P(encoding)) {
extracted = 1;
parse_mode_enc(StringValueCStr(encoding), enc_p, enc2_p);
}
else if (extenc != Qundef || intenc != Qundef) {
extracted = 1;
rb_io_ext_int_to_encs(extencoding, intencoding, enc_p, enc2_p);
}
return extracted;
}

Expand Down

0 comments on commit 63219d8

Please sign in to comment.