[前][次][番号順一覧][スレッド一覧]

ruby-changes:9332

From: matz <ko1@a...>
Date: Fri, 19 Dec 2008 17:23:05 +0900 (JST)
Subject: [ruby-changes:9332] Ruby:r20870 (trunk): * io.c (rb_io_extract_encoding_option): "internal_encoding: nil"

matz	2008-12-19 17:22:45 +0900 (Fri, 19 Dec 2008)

  New Revision: 20870

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=20870

  Log:
    * 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.

  Modified files:
    trunk/ChangeLog
    trunk/hash.c
    trunk/include/ruby/intern.h
    trunk/io.c

Index: include/ruby/intern.h
===================================================================
--- include/ruby/intern.h	(revision 20869)
+++ include/ruby/intern.h	(revision 20870)
@@ -359,6 +359,7 @@
 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);
Index: ChangeLog
===================================================================
--- ChangeLog	(revision 20869)
+++ ChangeLog	(revision 20870)
@@ -1,3 +1,12 @@
+Fri Dec 19 17:01:35 2008  Yukihiro Matsumoto  <matz@r...>
+
+	* 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  <nobu@r...>
 
 	* ruby.c (process_options): get rid of warning on DOSISH.
Index: io.c
===================================================================
--- io.c	(revision 20869)
+++ io.c	(revision 20870)
@@ -3917,55 +3917,60 @@
 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;
+	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 (!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));
+    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;
 }
 
Index: hash.c
===================================================================
--- hash.c	(revision 20869)
+++ hash.c	(revision 20870)
@@ -463,16 +463,22 @@
 }
 
 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

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]