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