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

ruby-changes:16233

From: nobu <ko1@a...>
Date: Tue, 8 Jun 2010 06:05:26 +0900 (JST)
Subject: [ruby-changes:16233] Ruby:r28199 (trunk, ruby_1_9_2): * io.c (parse_mode_enc): set set_by_bom bit.

nobu	2010-06-08 06:04:56 +0900 (Tue, 08 Jun 2010)

  New Revision: 28199

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

  Log:
    * io.c (parse_mode_enc): set set_by_bom bit.  [ruby-core:30641]

  Modified files:
    branches/ruby_1_9_2/ChangeLog
    branches/ruby_1_9_2/io.c
    branches/ruby_1_9_2/test/ruby/test_io_m17n.rb
    branches/ruby_1_9_2/version.h
    trunk/ChangeLog
    trunk/io.c
    trunk/test/ruby/test_io_m17n.rb

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 28198)
+++ ChangeLog	(revision 28199)
@@ -1,3 +1,7 @@
+Tue Jun  8 06:04:49 2010  Nobuyoshi Nakada  <nobu@r...>
+
+	* io.c (parse_mode_enc): set set_by_bom bit.  [ruby-core:30641]
+
 Sun Jun  6 22:37:11 2010  Nobuyoshi Nakada  <nobu@r...>
 
 	* string.c (rb_str_buf_cat_escaped_char): get rid of buffer
Index: io.c
===================================================================
--- io.c	(revision 28198)
+++ io.c	(revision 28199)
@@ -4216,7 +4216,7 @@
 }
 
 static void
-parse_mode_enc(const char *estr, rb_encoding **enc_p, rb_encoding **enc2_p)
+parse_mode_enc(const char *estr, rb_encoding **enc_p, rb_encoding **enc2_p, int *fmode_p)
 {
     const char *p;
     char encname[ENCODING_MAXNAMELEN+1];
@@ -4232,6 +4232,7 @@
 	    idx = -1;
 	else {
 	    if (io_encname_bom_p(estr, len)) {
+		if (fmode_p) *fmode_p |= FMODE_SETENC_BY_BOM;
 		estr += 4;
                 len -= 4;
             }
@@ -4244,6 +4245,7 @@
     else {
 	long len = strlen(estr);
 	if (io_encname_bom_p(estr, len)) {
+	    if (fmode_p) *fmode_p |= FMODE_SETENC_BY_BOM;
 	    estr += 4;
             len -= 4;
 	    memcpy(encname, estr, len);
@@ -4288,7 +4290,7 @@
 {
     clear_codeconv(fptr);
 
-    parse_mode_enc(estr, &fptr->encs.enc, &fptr->encs.enc2);
+    parse_mode_enc(estr, &fptr->encs.enc, &fptr->encs.enc2, NULL);
 }
 
 static void
@@ -4301,7 +4303,7 @@
 }
 
 int
-rb_io_extract_encoding_option(VALUE opt, rb_encoding **enc_p, rb_encoding **enc2_p)
+rb_io_extract_encoding_option(VALUE opt, rb_encoding **enc_p, rb_encoding **enc2_p, int *fmode_p)
 {
     VALUE encoding=Qnil, extenc=Qundef, intenc=Qundef, tmp;
     int extracted = 0;
@@ -4351,7 +4353,7 @@
     }
     if (!NIL_P(encoding)) {
 	extracted = 1;
-	parse_mode_enc(StringValueCStr(encoding), enc_p, enc2_p);
+	parse_mode_enc(StringValueCStr(encoding), enc_p, enc2_p, fmode_p);
     }
     else if (extenc != Qundef || intenc != Qundef) {
         extracted = 1;
@@ -4426,9 +4428,7 @@
         p = strchr(p, ':');
         if (p) {
             has_enc = 1;
-            parse_mode_enc(p+1, &enc, &enc2);
-	    if (io_encname_bom_p(p+1, 0))
-		fmode |= FMODE_SETENC_BY_BOM;
+            parse_mode_enc(p+1, &enc, &enc2, &fmode);
         }
 	else {
 	    rb_encoding *e;
@@ -4474,7 +4474,7 @@
 	}
         ecflags = rb_econv_prepare_opts(opthash, &ecopts);
 
-        if (rb_io_extract_encoding_option(opthash, &enc, &enc2)) {
+        if (rb_io_extract_encoding_option(opthash, &enc, &enc2, &fmode)) {
             if (has_enc) {
                 rb_raise(rb_eArgError, "encoding specified twice");
             }
@@ -4700,7 +4700,7 @@
     convconfig_t convconfig;
 
     if (p) {
-        parse_mode_enc(p+1, &convconfig.enc, &convconfig.enc2);
+        parse_mode_enc(p+1, &convconfig.enc, &convconfig.enc2, &fmode);
     }
     else {
 	rb_encoding *e;
@@ -7630,7 +7630,7 @@
 	else {
 	    tmp = rb_check_string_type(v1);
 	    if (!NIL_P(tmp) && rb_enc_asciicompat(rb_enc_get(tmp))) {
-                parse_mode_enc(RSTRING_PTR(tmp), &enc, &enc2);
+                parse_mode_enc(RSTRING_PTR(tmp), &enc, &enc2, NULL);
                 ecflags = rb_econv_prepare_opts(opt, &ecopts);
 	    }
 	    else {
Index: test/ruby/test_io_m17n.rb
===================================================================
--- test/ruby/test_io_m17n.rb	(revision 28198)
+++ test/ruby/test_io_m17n.rb	(revision 28199)
@@ -1740,6 +1740,10 @@
         assert_equal(content[1].force_encoding("ascii-8bit"),
                      result.force_encoding("ascii-8bit"))
       end
+
+      bug3407 = '[ruby-core:30641]'
+      result = File.read('UTF-8-bom.txt', encoding: 'BOM|UTF-8')
+      assert_equal("a", result.force_encoding("ascii-8bit"), bug3407)
     }
   end
 
Index: ruby_1_9_2/ChangeLog
===================================================================
--- ruby_1_9_2/ChangeLog	(revision 28198)
+++ ruby_1_9_2/ChangeLog	(revision 28199)
@@ -1,3 +1,7 @@
+Tue Jun  8 06:04:49 2010  Nobuyoshi Nakada  <nobu@r...>
+
+	* io.c (parse_mode_enc): set set_by_bom bit.  [ruby-core:30641]
+
 Sun Jun  6 23:35:12 2010  Masaya Tarui  <tarui@r...>
 
 	* gc.c (heaps_slot, assign_heap_slot, gc_sweep): skip sweep if
Index: ruby_1_9_2/io.c
===================================================================
--- ruby_1_9_2/io.c	(revision 28198)
+++ ruby_1_9_2/io.c	(revision 28199)
@@ -4216,7 +4216,7 @@
 }
 
 static void
-parse_mode_enc(const char *estr, rb_encoding **enc_p, rb_encoding **enc2_p)
+parse_mode_enc(const char *estr, rb_encoding **enc_p, rb_encoding **enc2_p, int *fmode_p)
 {
     const char *p;
     char encname[ENCODING_MAXNAMELEN+1];
@@ -4232,6 +4232,7 @@
 	    idx = -1;
 	else {
 	    if (io_encname_bom_p(estr, len)) {
+		if (fmode_p) *fmode_p |= FMODE_SETENC_BY_BOM;
 		estr += 4;
                 len -= 4;
             }
@@ -4244,6 +4245,7 @@
     else {
 	long len = strlen(estr);
 	if (io_encname_bom_p(estr, len)) {
+	    if (fmode_p) *fmode_p |= FMODE_SETENC_BY_BOM;
 	    estr += 4;
             len -= 4;
 	    memcpy(encname, estr, len);
@@ -4288,7 +4290,7 @@
 {
     clear_codeconv(fptr);
 
-    parse_mode_enc(estr, &fptr->encs.enc, &fptr->encs.enc2);
+    parse_mode_enc(estr, &fptr->encs.enc, &fptr->encs.enc2, NULL);
 }
 
 static void
@@ -4301,7 +4303,7 @@
 }
 
 int
-rb_io_extract_encoding_option(VALUE opt, rb_encoding **enc_p, rb_encoding **enc2_p)
+rb_io_extract_encoding_option(VALUE opt, rb_encoding **enc_p, rb_encoding **enc2_p, int *fmode_p)
 {
     VALUE encoding=Qnil, extenc=Qundef, intenc=Qundef, tmp;
     int extracted = 0;
@@ -4351,7 +4353,7 @@
     }
     if (!NIL_P(encoding)) {
 	extracted = 1;
-	parse_mode_enc(StringValueCStr(encoding), enc_p, enc2_p);
+	parse_mode_enc(StringValueCStr(encoding), enc_p, enc2_p, fmode_p);
     }
     else if (extenc != Qundef || intenc != Qundef) {
         extracted = 1;
@@ -4426,9 +4428,7 @@
         p = strchr(p, ':');
         if (p) {
             has_enc = 1;
-            parse_mode_enc(p+1, &enc, &enc2);
-	    if (io_encname_bom_p(p+1, 0))
-		fmode |= FMODE_SETENC_BY_BOM;
+            parse_mode_enc(p+1, &enc, &enc2, &fmode);
         }
 	else {
 	    rb_encoding *e;
@@ -4474,7 +4474,7 @@
 	}
         ecflags = rb_econv_prepare_opts(opthash, &ecopts);
 
-        if (rb_io_extract_encoding_option(opthash, &enc, &enc2)) {
+        if (rb_io_extract_encoding_option(opthash, &enc, &enc2, &fmode)) {
             if (has_enc) {
                 rb_raise(rb_eArgError, "encoding specified twice");
             }
@@ -4700,7 +4700,7 @@
     convconfig_t convconfig;
 
     if (p) {
-        parse_mode_enc(p+1, &convconfig.enc, &convconfig.enc2);
+        parse_mode_enc(p+1, &convconfig.enc, &convconfig.enc2, &fmode);
     }
     else {
 	rb_encoding *e;
@@ -7630,7 +7630,7 @@
 	else {
 	    tmp = rb_check_string_type(v1);
 	    if (!NIL_P(tmp) && rb_enc_asciicompat(rb_enc_get(tmp))) {
-                parse_mode_enc(RSTRING_PTR(tmp), &enc, &enc2);
+                parse_mode_enc(RSTRING_PTR(tmp), &enc, &enc2, NULL);
                 ecflags = rb_econv_prepare_opts(opt, &ecopts);
 	    }
 	    else {
Index: ruby_1_9_2/version.h
===================================================================
--- ruby_1_9_2/version.h	(revision 28198)
+++ ruby_1_9_2/version.h	(revision 28199)
@@ -1,5 +1,5 @@
 #define RUBY_VERSION "1.9.2"
-#define RUBY_RELEASE_DATE "2010-06-06"
+#define RUBY_RELEASE_DATE "2010-06-08"
 #define RUBY_PATCHLEVEL -1
 
 #define RUBY_VERSION_MAJOR 1
@@ -7,7 +7,7 @@
 #define RUBY_VERSION_TEENY 1
 #define RUBY_RELEASE_YEAR 2010
 #define RUBY_RELEASE_MONTH 6
-#define RUBY_RELEASE_DAY 6
+#define RUBY_RELEASE_DAY 8
 
 #include "ruby/version.h"
 
Index: ruby_1_9_2/test/ruby/test_io_m17n.rb
===================================================================
--- ruby_1_9_2/test/ruby/test_io_m17n.rb	(revision 28198)
+++ ruby_1_9_2/test/ruby/test_io_m17n.rb	(revision 28199)
@@ -1740,6 +1740,10 @@
         assert_equal(content[1].force_encoding("ascii-8bit"),
                      result.force_encoding("ascii-8bit"))
       end
+
+      bug3407 = '[ruby-core:30641]'
+      result = File.read('UTF-8-bom.txt', encoding: 'BOM|UTF-8')
+      assert_equal("a", result.force_encoding("ascii-8bit"), bug3407)
     }
   end
 

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

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