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