ruby-changes:2238
From: ko1@a...
Date: 17 Oct 2007 05:07:34 +0900
Subject: [ruby-changes:2238] nobu - Ruby:r13729 (trunk): * encoding.c (rb_primary_encoding): added Encoding.primary_encoding.
nobu 2007-10-17 05:07:20 +0900 (Wed, 17 Oct 2007) New Revision: 13729 Modified files: trunk/ChangeLog trunk/encoding.c trunk/include/ruby/encoding.h trunk/include/ruby/node.h trunk/parse.y trunk/ruby.c Log: * encoding.c (rb_primary_encoding): added Encoding.primary_encoding. * parse.y (rb_parser_encoding): added. * ruby.c (proc_options): added -E and --encoding options. * ruby.c (process_options): set primary encoding from command line option if set, or source encoding. * include/ruby/encoding.h (rb_enc_from_encoding, rb_get_primary_encoding, rb_set_primary_encoding): prototypes. * include/ruby/node.h (rb_parser_encoding): prototype. http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/ruby.c?r1=13729&r2=13728 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/parse.y?r1=13729&r2=13728 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/ChangeLog?r1=13729&r2=13728 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/include/ruby/node.h?r1=13729&r2=13728 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/include/ruby/encoding.h?r1=13729&r2=13728 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/encoding.c?r1=13729&r2=13728 Index: encoding.c =================================================================== --- encoding.c (revision 13728) +++ encoding.c (revision 13729) @@ -43,8 +43,8 @@ return enc; } -static VALUE -enc_from_encoding(rb_encoding *enc) +VALUE +rb_enc_from_encoding(rb_encoding *enc) { return enc_initialized_p(enc) ? ENC_FROM_ENCODING(enc) : enc_new(enc); } @@ -384,7 +384,7 @@ if (!enc) { rb_raise(rb_eTypeError, "unknown encoding"); } - return enc_from_encoding(enc); + return rb_enc_from_encoding(enc); } @@ -482,7 +482,7 @@ for (i = 0; i < enc_table_size; ++i) { rb_encoding *enc = enc_table[i].enc; if (enc) { - rb_ary_push(ary, enc_from_encoding(enc)); + rb_ary_push(ary, rb_enc_from_encoding(enc)); } } return ary; @@ -495,7 +495,7 @@ if (idx < 0) { rb_raise(rb_eArgError, "unknown encoding name - %s", RSTRING_PTR(enc)); } - return enc_from_encoding(rb_enc_from_index(idx)); + return rb_enc_from_encoding(rb_enc_from_index(idx)); } /* :nodoc: */ @@ -513,7 +513,35 @@ return enc_find(klass, str); } +static VALUE rb_primary_encoding; + +VALUE +rb_get_primary_encoding(void) +{ + return rb_primary_encoding; +} + +static VALUE +get_primary_encoding(VALUE klass) +{ + return rb_get_primary_encoding(); +} + void +rb_set_primary_encoding(VALUE encoding) +{ + rb_to_encoding(encoding); + rb_primary_encoding = encoding; +} + +static VALUE +set_primary_encoding(VALUE klass, VALUE enc) +{ + rb_set_primary_encoding(enc); + return rb_primary_encoding; +} + +void Init_Encoding(void) { rb_cEncoding = rb_define_class("Encoding", rb_cObject); @@ -526,4 +554,8 @@ rb_define_method(rb_cEncoding, "_dump", enc_dump, -1); rb_define_singleton_method(rb_cEncoding, "_load", enc_load, 1); + + rb_primary_encoding = rb_enc_from_encoding(rb_enc_from_index(0)); + rb_define_singleton_method(rb_cEncoding, "primary_encoding", get_primary_encoding, 0); + rb_define_singleton_method(rb_cEncoding, "primary_encoding=", set_primary_encoding, 1); } Index: include/ruby/node.h =================================================================== --- include/ruby/node.h (revision 13728) +++ include/ruby/node.h (revision 13729) @@ -481,6 +481,7 @@ VALUE rb_parser_new(void); VALUE rb_parser_end_seen_p(VALUE); +VALUE rb_parser_encoding(VALUE); NODE *rb_parser_compile_cstr(volatile VALUE, const char*, const char*, int, int); NODE *rb_parser_compile_string(volatile VALUE, const char*, VALUE, int); Index: include/ruby/encoding.h =================================================================== --- include/ruby/encoding.h (revision 13728) +++ include/ruby/encoding.h (revision 13729) @@ -99,5 +99,8 @@ ID rb_intern3(const char*, long, rb_encoding*); int rb_enc_symname_p(const char*, rb_encoding*); int rb_enc_str_coderange(VALUE); +VALUE rb_enc_from_encoding(rb_encoding *enc); +VALUE rb_get_primary_encoding(void); +void rb_set_primary_encoding(VALUE encoding); #endif /* RUBY_ENCODING_H */ Index: ChangeLog =================================================================== --- ChangeLog (revision 13728) +++ ChangeLog (revision 13729) @@ -1,3 +1,19 @@ +Wed Oct 17 05:07:18 2007 Nobuyoshi Nakada <nobu@r...> + + * encoding.c (rb_primary_encoding): added Encoding.primary_encoding. + + * parse.y (rb_parser_encoding): added. + + * ruby.c (proc_options): added -E and --encoding options. + + * ruby.c (process_options): set primary encoding from command line + option if set, or source encoding. + + * include/ruby/encoding.h (rb_enc_from_encoding, + rb_get_primary_encoding, rb_set_primary_encoding): prototypes. + + * include/ruby/node.h (rb_parser_encoding): prototype. + Wed Oct 17 03:37:07 2007 Nobuyoshi Nakada <nobu@r...> * re.c (rb_reg_desc): set encoding. Index: parse.y =================================================================== --- parse.y (revision 13728) +++ parse.y (revision 13729) @@ -8895,6 +8895,21 @@ return ruby__end__seen ? Qtrue : Qfalse; } +/* + * call-seq: + * ripper#encoding -> encoding + * + * Return encoding of the source. + */ +VALUE +rb_parser_encoding(VALUE vparser) +{ + struct parser_params *parser; + + Data_Get_Struct(vparser, struct parser_params, parser); + return rb_enc_from_encoding(parser->enc); +} + #ifdef YYMALLOC #define HEAPCNT(n, size) ((n) * (size) / sizeof(YYSTYPE)) #define NEWHEAP() rb_node_newnode(NODE_ALLOCA, 0, (VALUE)parser->heap, 0) @@ -9415,6 +9430,7 @@ rb_define_method(Ripper, "column", ripper_column, 0); rb_define_method(Ripper, "lineno", ripper_lineno, 0); rb_define_method(Ripper, "end_seen?", rb_parser_end_seen_p, 0); + rb_define_method(Ripper, "encoding", rb_parser_encoding, 0); #ifdef RIPPER_DEBUG rb_define_method(rb_mKernel, "assert_Qundef", ripper_assert_Qundef, 2); rb_define_method(rb_mKernel, "rawVALUE", ripper_value, 1); Index: ruby.c =================================================================== --- ruby.c (revision 13728) +++ ruby.c (revision 13729) @@ -687,10 +687,15 @@ } break; + case 'E': + if (!*++s) { + rb_raise(rb_eRuntimeError, "missing argument for -E"); + } + goto encoding; + case 'K': if (*++s) { rb_encoding *enc = 0; - if ((opt->enc_index = rb_enc_find_index(s)) >= 0) break; switch (*s) { case 'E': case 'e': enc = ONIG_ENCODING_EUC_JP; @@ -705,10 +710,9 @@ enc = ONIG_ENCODING_ASCII; break; } - if (!enc) { - rb_raise(rb_eRuntimeError, "unknown encoding name - %s", s); + if (enc) { + opt->enc_index = rb_enc_find_index(rb_enc_name(enc)); } - opt->enc_index = rb_enc_find_index(rb_enc_name(enc)); s++; } goto reswitch; @@ -770,6 +774,20 @@ ruby_debug = Qtrue; ruby_verbose = Qtrue; } + else if (strcmp("encoding", s) == 0) { + if (!--argc || !(s = *++argv)) { + noencoding: + rb_raise(rb_eRuntimeError, "missing argument for --encoding"); + } + encoding: + if ((opt->enc_index = rb_enc_find_index(s)) < 0) { + rb_raise(rb_eRuntimeError, "unknown encoding name - %s", s); + } + } + else if (strncmp("encoding=", s, 9) == 0) { + if (*(s += 9)) goto noencoding; + goto encoding; + } else if (strcmp("version", s) == 0) opt->version = 1; else if (strcmp("verbose", s) == 0) { @@ -824,6 +842,7 @@ char **argv = opt->argv; NODE *tree = 0; VALUE parser; + VALUE encoding; const char *s; int i = proc_options(argc, argv, opt); @@ -920,7 +939,8 @@ ruby_init_loadpath(); parser = rb_parser_new(); if (opt->e_script) { - rb_enc_associate_index(opt->e_script, opt->enc_index); + if (opt->enc_index >= 0) + rb_enc_associate_index(opt->e_script, opt->enc_index); require_libraries(); tree = rb_parser_compile_string(parser, opt->script, opt->e_script, 1); } @@ -950,6 +970,14 @@ } } + if (opt->enc_index >= 0) { + encoding = rb_enc_from_encoding(rb_enc_from_index(opt->enc_index)); + } + else { + encoding = rb_parser_encoding(parser); + } + rb_set_primary_encoding(encoding); + return (VALUE)tree; } @@ -1068,7 +1096,7 @@ } require_libraries(); /* Why here? unnatural */ } - rb_enc_associate_index(f, opt->enc_index); + if (opt->enc_index >= 0) rb_enc_associate_index(f, opt->enc_index); parser = rb_parser_new(); tree = (NODE *)rb_parser_compile_file(parser, fname, f, line_start); if (script && rb_parser_end_seen_p(parser)) { @@ -1312,6 +1340,7 @@ rb_argv0 = rb_progname; opt.argc = argc; opt.argv = argv; + opt.enc_index = -1; tree = (NODE *)rb_vm_call_cfunc(rb_vm_top_self(), process_options, (VALUE)&opt, 0, rb_progname); -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml