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

ruby-changes:2947

From: ko1@a...
Date: 22 Dec 2007 01:40:00 +0900
Subject: [ruby-changes:2947] akr - Ruby:r14438 (trunk): * re.c (ARG_ENCODING_NONE): defined for /.../n option.

akr	2007-12-22 01:39:36 +0900 (Sat, 22 Dec 2007)

  New Revision: 14438

  Modified files:
    trunk/.gdbinit
    trunk/ChangeLog
    trunk/re.c

  Log:
    * re.c (ARG_ENCODING_NONE): defined for /.../n option.
      (REG_ENCODING_NONE): ditto.
      (rb_char_to_option_kcode): return ARG_ENCODING_NONE for n.
      (rb_reg_prepare_re): warn /ascii/n =~ "non-ascii".
      (rb_reg_initialize): set REG_ENCODING_NONE from ARG_ENCODING_NONE.


  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/.gdbinit?r1=14438&r2=14437
  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/ChangeLog?r1=14438&r2=14437
  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/re.c?r1=14438&r2=14437

Index: .gdbinit
===================================================================
--- .gdbinit	(revision 14437)
+++ .gdbinit	(revision 14438)
@@ -91,6 +91,9 @@
     output ((struct RRegexp*)$arg0)->str
     set print address on
     printf " len:%d ", ((struct RRegexp*)$arg0)->len
+    if $flags & RUBY_FL_USER6
+      printf "(none) "
+    end
     if $flags & RUBY_FL_USER5
       printf "(literal) "
     end
Index: re.c
===================================================================
--- re.c	(revision 14437)
+++ re.c	(revision 14438)
@@ -133,12 +133,14 @@
 }
 
 #define REG_LITERAL FL_USER5
+#define REG_ENCODING_NONE FL_USER6
 
 #define KCODE_FIXED FL_USER4
 
 #define ARG_REG_OPTION_MASK \
     (ONIG_OPTION_IGNORECASE|ONIG_OPTION_MULTILINE|ONIG_OPTION_EXTEND)
 #define ARG_ENCODING_FIXED    16
+#define ARG_ENCODING_NONE     32
 
 #define ARG_KCODE_NONE	      0
 #define ARG_KCODE_EUC 	      1
@@ -186,8 +188,8 @@
 
     switch (c) {
       case 'n':
-	*kcode = ARG_KCODE_NONE;
-	break;
+        *kcode = -1;
+        return (*option = ARG_ENCODING_NONE);
       case 'e':
 	*kcode = ARG_KCODE_EUC;
 	break;
@@ -946,9 +948,16 @@
             rb_raise(rb_eArgError, "fixed character encoding regexp with incompatible string (encoding: %s)", rb_enc_name(rb_enc_get(str)));
         }
     }
-    else if ((enc = rb_enc_get(str)) != 0 &&
+    else {
+        if ((enc = rb_enc_get(str)) != 0 &&
 	     RREGEXP(re)->ptr->enc != enc) {
-	need_recompile = 1;
+            need_recompile = 1;
+        }
+        if ((RBASIC(re)->flags & REG_ENCODING_NONE) &&
+            rb_enc_str_coderange(str) != ENC_CODERANGE_7BIT) {
+            rb_warn("none encoding regexp with non ASCII string (string encoding: %s)",
+                    rb_enc_name(rb_enc_get(str)));
+        }
     }
 
     if (need_recompile) {
@@ -1971,7 +1980,8 @@
         return -1;
 
     if (fixed_enc) {
-	if (fixed_enc != enc && (options & ARG_ENCODING_FIXED)) {
+	if ((fixed_enc != enc && (options & ARG_ENCODING_FIXED)) ||
+            (fixed_enc != d_enc && (options & ARG_ENCODING_NONE))) {
 	    strcpy(err, "incompatible character encoding");
 	    return -1;
 	}
@@ -1983,11 +1993,15 @@
     else if (!(options & ARG_ENCODING_FIXED)) {
         enc = d_enc;
     }
-    
+
     rb_enc_associate((VALUE)re, enc);
     if ((options & ARG_ENCODING_FIXED) || fixed_enc) {
 	re->basic.flags |= KCODE_FIXED;
     }
+    if (options & ARG_ENCODING_NONE) {
+        re->basic.flags |= REG_ENCODING_NONE;
+    }
+    
     re->ptr = make_regexp(RSTRING_PTR(unescaped), RSTRING_LEN(unescaped), enc,
             options & ARG_REG_OPTION_MASK, err);
     if (!re->ptr) return -1;
@@ -2536,6 +2550,7 @@
     rb_reg_check(re);
     options = RREGEXP(re)->ptr->options & ARG_REG_OPTION_MASK;
     if (RBASIC(re)->flags & KCODE_FIXED) options |= ARG_ENCODING_FIXED;
+    if (RBASIC(re)->flags & REG_ENCODING_NONE) options |= ARG_ENCODING_NONE;
     return options;
 }
 
Index: ChangeLog
===================================================================
--- ChangeLog	(revision 14437)
+++ ChangeLog	(revision 14438)
@@ -1,3 +1,11 @@
+Sat Dec 22 01:35:41 2007  Tanaka Akira  <akr@f...>
+
+	* re.c (ARG_ENCODING_NONE): defined for /.../n option.
+	  (REG_ENCODING_NONE): ditto.
+	  (rb_char_to_option_kcode): return ARG_ENCODING_NONE for n.
+	  (rb_reg_prepare_re): warn /ascii/n =~ "non-ascii".
+	  (rb_reg_initialize): set REG_ENCODING_NONE from ARG_ENCODING_NONE.
+
 Sat Dec 22 01:23:10 2007  Shugo Maeda  <shugo@r...>
 
 	* test/json/test_json_addition.rb (test_core): do not use Time.now

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

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