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

ruby-changes:2364

From: ko1@a...
Date: 9 Nov 2007 17:48:38 +0900
Subject: [ruby-changes:2364] nobu - Ruby:r13855 (trunk): * ruby.c (locale_encoding): guestimate encoding from environment

nobu	2007-11-09 17:48:13 +0900 (Fri, 09 Nov 2007)

  New Revision: 13855

  Modified files:
    trunk/ChangeLog
    trunk/ruby.c

  Log:
    * ruby.c (locale_encoding): guestimate encoding from environment
      variables.  [ruby-core:13315]
    
    * ruby.c (process_options): set primary encoding from environment.


  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/ruby.c?r1=13855&r2=13854
  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/ChangeLog?r1=13855&r2=13854

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 13854)
+++ ChangeLog	(revision 13855)
@@ -1,3 +1,10 @@
+Fri Nov  9 17:48:22 2007  Nobuyoshi Nakada  <nobu@r...>
+
+	* ruby.c (locale_encoding): guestimate encoding from environment
+	  variables.  [ruby-core:13315]
+
+	* ruby.c (process_options): set primary encoding from environment.
+
 Fri Nov  9 16:51:42 2007  Yukihiro Matsumoto  <matz@r...>
 
 	* io.c (rb_io_each_byte): should update rbuf_off and rbuf_len for
Index: ruby.c
===================================================================
--- ruby.c	(revision 13854)
+++ ruby.c	(revision 13855)
@@ -132,6 +132,37 @@
 	printf("  %s\n", *p++);
 }
 
+static rb_encoding *
+locale_encoding(void)
+{
+    static const char *const langs[] = {"LC_ALL", "LC_CTYPE", "LANG",};
+    const char *lang, *at;
+    int i, len, idx = 0;
+    char buf[32];
+    rb_encoding *enc;
+
+    for (i = 0; i < sizeof(langs) / sizeof(langs[0]); ++i) {
+	if (!(lang = getenv(langs[i]))) continue;
+	if (!(lang = strchr(lang, '.'))) continue;
+	at = strchr(++lang, '@');
+	if ((len = (at ? at - lang : strlen(lang))) >= sizeof(buf) - 1) continue;
+	MEMCPY(buf, lang, char, len);
+	buf[len] = 0;
+	idx = rb_enc_find_index(buf);
+	if (idx < 0 && len > 3 &&
+	    (strncasecmp(buf, "euc", 3) == 0 ||
+	     strncasecmp(buf, "utf", 3) == 0) &&
+	    buf[3]) {
+	    MEMMOVE(buf + 4, buf + 3, char, len - 2);
+	    buf[3] = '-';
+	    idx = rb_enc_find_index(buf);
+	}
+	enc = rb_enc_from_index(idx);
+	if (enc) return enc;
+    }
+    return rb_enc_default();
+}
+
 extern VALUE rb_load_path;
 
 #ifndef CharNext		/* defined as CharNext[AW] on Windows. */
@@ -850,7 +881,7 @@
     char **argv = opt->argv;
     NODE *tree = 0;
     VALUE parser;
-    VALUE encoding;
+    rb_encoding *enc;
     const char *s;
     int i = proc_options(argc, argv, opt);
 
@@ -979,12 +1010,12 @@
     }
 
     if (opt->enc_index >= 0) {
-	encoding = rb_enc_from_encoding(rb_enc_from_index(opt->enc_index));
+	enc = rb_enc_from_index(opt->enc_index);
     }
     else {
-	encoding = rb_parser_encoding(parser);
+	enc = locale_encoding();
     }
-    rb_set_primary_encoding(encoding);
+    rb_set_primary_encoding(rb_enc_from_encoding(enc));
 
     return (VALUE)tree;
 }

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

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