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

ruby-changes:3529

From: ko1@a...
Date: Sun, 13 Jan 2008 15:39:05 +0900 (JST)
Subject: [ruby-changes:3529] naruse - Ruby:r15007 (trunk): * enc/make_encdb.rb: added. search enc/*.c and make encoding database.

naruse	2008-01-13 01:03:51 +0900 (Sun, 13 Jan 2008)

  New Revision: 15007

  Added files:
    trunk/enc/make_encdb.rb
  Modified files:
    trunk/ChangeLog
    trunk/common.mk
    trunk/enc/ascii.c
    trunk/enc/euc_jp.c
    trunk/enc/sjis.c
    trunk/enc/us_ascii.c
    trunk/encoding.c
    trunk/regenc.h

  Log:
    * enc/make_encdb.rb: added. search enc/*.c and make encoding database.
    
    * regenc.h (ENC_REPLICATE, ENC_ALIAS): added for defining replica
      encoding and encoding alias.
    
    * encoding.c (rb_enc_init): move alias definitions to enc/*.c.
      (rb_enc_find_index): search original of replica and alias when no
      encoding library.
      (rb_enc_name_list, rb_enc_aliases_enc_i, rb_enc_aliases_str_i,
       rb_enc_aliases, Encoding.name_list, Encoding.aliases): added.
      (Init_Encoding): init encdb.
    
    * enc/ascii.c, enc/us_ascii.c, enc/euc_jp.c, enc/sjis.c:
      add replica encoding and encoding alias difinition.
    
    * common.mk (dist-clean-local): add rule for remvoe encdb.h.


  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/enc/make_encdb.rb?revision=15007&view=markup
  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/enc/make_encdb.rb?r1=15007&r2=15006&diff_format=u
  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/ChangeLog?r1=15007&r2=15006&diff_format=u
  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/enc/ascii.c?r1=15007&r2=15006&diff_format=u
  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/enc/euc_jp.c?r1=15007&r2=15006&diff_format=u
  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/enc/sjis.c?r1=15007&r2=15006&diff_format=u
  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/encoding.c?r1=15007&r2=15006&diff_format=u
  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/regenc.h?r1=15007&r2=15006&diff_format=u
  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/enc/us_ascii.c?r1=15007&r2=15006&diff_format=u
  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/common.mk?r1=15007&r2=15006&diff_format=u

Index: encoding.c
===================================================================
--- encoding.c	(revision 15006)
+++ encoding.c	(revision 15007)
@@ -12,6 +12,7 @@
 #include "ruby/ruby.h"
 #include "ruby/encoding.h"
 #include "regenc.h"
+#include "encdb.h"
 #include <ctype.h>
 #ifdef HAVE_LANGINFO_H
 #include <langinfo.h>
@@ -291,8 +292,6 @@
 
 enum {
     ENCINDEX_ASCII,
-    ENCINDEX_EUC_JP,
-    ENCINDEX_SJIS,
     ENCINDEX_UTF8,
     ENCINDEX_BUILTIN_MAX
 };
@@ -303,14 +302,8 @@
     enc_table_count = enc_table_expand(ENCINDEX_BUILTIN_MAX);
 #define ENC_REGISTER(enc) enc_register_at(ENCINDEX_##enc, rb_enc_name(ONIG_ENCODING_##enc), ONIG_ENCODING_##enc)
     ENC_REGISTER(ASCII);
-    ENC_REGISTER(EUC_JP);
-    ENC_REGISTER(SJIS);
     ENC_REGISTER(UTF8);
 #undef ENC_REGISTER
-    enc_alias("ASCII", rb_enc_name(ONIG_ENCODING_ASCII));
-    enc_alias("BINARY", rb_enc_name(ONIG_ENCODING_ASCII));
-    enc_alias("eucJP", rb_enc_name(ONIG_ENCODING_EUC_JP)); /* UI-OSF Application Platform Profile for Japanese Environment Version 1.1 */
-    enc_alias("SJIS", rb_enc_name(ONIG_ENCODING_SJIS));
 }
 
 rb_encoding *
@@ -373,6 +366,20 @@
 	OBJ_FREEZE(enclib);
 	if (RTEST(rb_protect(require_enc, enclib, 0)))
 	    i = rb_enc_registered(name);
+	else {
+	    st_data_t key = (st_data_t)name, orig;
+	    if (st_lookup(enc_table_replica_name, key, &orig)) {
+		i = rb_enc_find_index((char *)orig);
+		if (i < 0) {
+		    rb_raise(rb_eRuntimeError, "unknown original encoding name - %s for %s", (char *)orig, name);
+		}
+		i = rb_enc_replicate(name, rb_enc_from_index(i));
+		st_delete(enc_table_replica_name, &key, &orig);
+	    } else if (st_lookup(enc_table_alias_name, key, &orig)) {
+		i = rb_enc_alias(name, (char *)orig);
+		st_delete(enc_table_replica_name, &key, &orig);
+	    }
+	}
 	rb_set_errinfo(Qnil);
     }
     return i;
@@ -978,6 +985,40 @@
     return ST_CONTINUE;
 }
 
+static VALUE
+rb_enc_name_list(VALUE klass)
+{
+    VALUE ary = rb_ary_new2(enc_name_list_size);
+    int i;
+    for (i = 0; i < enc_name_list_size; i++) {
+	rb_ary_push(ary, rb_str_new2(enc_name_list[i]));
+    }
+    return ary;
+}
+
+static int
+rb_enc_aliases_enc_i(st_data_t name, st_data_t orig, st_data_t arg)
+{
+    rb_hash_aset((VALUE)arg, rb_str_new2((char *)name), rb_enc_name(rb_enc_from_index((int)orig)));
+    return 0;
+}
+
+static int
+rb_enc_aliases_str_i(st_data_t name, st_data_t orig, st_data_t arg)
+{
+    rb_hash_aset((VALUE)arg, rb_str_new2((char *)name), rb_str_new2((char *)orig));
+    return 0;
+}
+
+static VALUE
+rb_enc_aliases(VALUE klass)
+{
+    VALUE aliases = rb_hash_new();
+    st_foreach(enc_table_alias, rb_enc_aliases_enc_i, (st_data_t)aliases);
+    st_foreach(enc_table_alias_name, rb_enc_aliases_str_i, (st_data_t)aliases);
+    return aliases;
+}
+
 void
 Init_Encoding(void)
 {
@@ -993,6 +1034,8 @@
     rb_define_method(rb_cEncoding, "base_encoding", enc_base_encoding, 0);
     rb_define_method(rb_cEncoding, "dummy?", enc_dummy_p, 0);
     rb_define_singleton_method(rb_cEncoding, "list", enc_list, 0);
+    rb_define_singleton_method(rb_cEncoding, "name_list", rb_enc_name_list, 0);
+    rb_define_singleton_method(rb_cEncoding, "aliases", rb_enc_aliases, 0);
     rb_define_singleton_method(rb_cEncoding, "find", enc_find, 1);
     rb_define_singleton_method(rb_cEncoding, "compatible?", enc_compatible_p, 2);
 
@@ -1005,15 +1048,7 @@
     /* dummy for unsupported, statefull encoding */
     rb_define_dummy_encoding("ISO-2022-JP");
 
-    rb_enc_replicate("Windows-31J", rb_enc_from_index(ENCINDEX_SJIS));
-    rb_enc_alias("CP932", "Windows-31J");
-    rb_enc_alias("csWindows31J", "Windows-31J"); /* IANA.  IE6 don't accept Windows-31J but csWindows31J. */
-
-    for (i = 0; i < enc_table_size; ++i) {
-	rb_encoding *enc = enc_table[i].enc;
-	if (enc) set_encoding_const(rb_enc_name(enc), enc);
-    }
-    st_foreach(enc_table_alias, set_encoding_alias, 0);
+    enc_init_db();
 }
 
 /* locale insensitive functions */
Index: ChangeLog
===================================================================
--- ChangeLog	(revision 15006)
+++ ChangeLog	(revision 15007)
@@ -1,3 +1,22 @@
+Sun Jan 13 00:01:07 2008  NARUSE, Yui  <naruse@r...>
+
+	* enc/make_encdb.rb: added. search enc/*.c and make encoding database.
+
+	* regenc.h (ENC_REPLICATE, ENC_ALIAS): added for defining replica
+	  encoding and encoding alias.
+
+	* encoding.c (rb_enc_init): move alias definitions to enc/*.c.
+	  (rb_enc_find_index): search original of replica and alias when no
+	  encoding library.
+	  (rb_enc_name_list, rb_enc_aliases_enc_i, rb_enc_aliases_str_i,
+	   rb_enc_aliases, Encoding.name_list, Encoding.aliases): added.
+	  (Init_Encoding): init encdb.	
+
+	* enc/ascii.c, enc/us_ascii.c, enc/euc_jp.c, enc/sjis.c:
+	  add replica encoding and encoding alias difinition.
+
+	* common.mk (dist-clean-local): add rule for remvoe encdb.h.
+
 Sat Jan 12 18:27:41 2008  Nobuyoshi Nakada  <nobu@r...>
 
 	* eval.c (rb_define_alloc_func, rb_undef_alloc_func): should
@@ -3,6 +22,4 @@
 	  define/undef on a signleton class.  [ruby-core:09959]
 
-9959]
-
 Sat Jan 12 12:44:36 2008  NARUSE, Yui  <naruse@r...>
 
Index: regenc.h
===================================================================
--- regenc.h	(revision 15006)
+++ regenc.h	(revision 15007)
@@ -199,4 +199,8 @@
 #define OnigEncodingDefine(f,n) OnigEncodingDeclare(n)
 #endif
 
+/* macros for define replica encoding and encoding alias */
+#define ENC_REPLICATE(name, orig)
+#define ENC_ALIAS(name, orig)
+
 #endif /* REGENC_H */
Index: enc/us_ascii.c
===================================================================
--- enc/us_ascii.c	(revision 15006)
+++ enc/us_ascii.c	(revision 15007)
@@ -26,3 +26,6 @@
   onigenc_single_byte_left_adjust_char_head,
   onigenc_always_true_is_allowed_reverse_match
 };
+ENC_ALIAS("ASCII", "US-ASCII");
+ENC_ALIAS("ANSI_X3.4-1986", "US-ASCII");
+
Index: enc/euc_jp.c
===================================================================
--- enc/euc_jp.c	(revision 15006)
+++ enc/euc_jp.c	(revision 15007)
@@ -361,3 +361,4 @@
   is_allowed_reverse_match,
   0
 };
+ENC_ALIAS("eucJP", "EUC-JP"); /* UI-OSF Application Platform Profile for Japanese Environment Version 1.1 */
Index: enc/sjis.c
===================================================================
--- enc/sjis.c	(revision 15006)
+++ enc/sjis.c	(revision 15007)
@@ -370,3 +370,7 @@
   is_allowed_reverse_match,
   0
 };
+ENC_ALIAS("SJIS", "Shift_JIS");
+ENC_REPLICATE("Windows-31J", "Shift_JIS");
+ENC_ALIAS("CP932", "Windows-31J");
+ENC_ALIAS("csWindows31J", "Windows-31J"); /* IANA.  IE6 don't accept Windows-31J but csWindows31J. */
Index: enc/ascii.c
===================================================================
--- enc/ascii.c	(revision 15006)
+++ enc/ascii.c	(revision 15007)
@@ -47,3 +47,4 @@
   onigenc_single_byte_left_adjust_char_head,
   onigenc_always_true_is_allowed_reverse_match
 };
+ENC_ALIAS("BINARY", "ASCII-8BIT");
Index: enc/make_encdb.rb
===================================================================
--- enc/make_encdb.rb	(revision 0)
+++ enc/make_encdb.rb	(revision 15007)
@@ -0,0 +1,65 @@
+#! ./miniruby
+
+#
+# OnigEncodingDefine(foo, Foo) = {
+#   ..
+#   "Shift_JIS", /* Canonical Name */
+#   ..
+# };
+# ENC_ALIAS("SJIS", "Shift_JIS")
+# ENC_REPLICATE("Windows-31J", "Shift_JIS")
+# ENC_ALIAS("CP932", "Windows-31J")
+#
+
+require 'mkmf'
+
+encodings = []
+replicas = {}
+aliases = {}
+Dir.open($srcdir) {|d| d.grep(/.+\.c\z/)}.each do |fn|
+  open(File.join($srcdir,fn)) do |f|
+    orig = nil
+    name = nil
+    f.each_line do |line|
+      break if /^OnigEncodingDefine/o =~ line
+    end
+    f.each_line do |line|
+      break if /"(.*?)"/ =~ line
+    end
+    encodings << $1 if $1
+    f.each_line do |line|
+      if /^ENC_REPLICATE\(\s*"([^"]+)"\s*,\s*"([^"]+)"/o =~ line
+	replicas[$1] = $2
+      elsif /^ENC_ALIAS\(\s*"([^"]+)"\s*,\s*"([^"]+)"/o =~ line
+	aliases[$1] = $2
+      end
+    end
+  end
+end
+open('encdb.h', 'wb') do |f|
+  f.puts 'static const char *enc_name_list[] = {'
+  encodings.each {|name| f.puts'    "%s",' % name}
+  replicas.each_key {|name| f.puts'    "%s",' % name}
+  f.puts(<<"_TEXT_")
+    NULL
+};
+static const int enc_name_list_size = #{encodings.length + replicas.length};
+static const int enc_aliases_size = #{aliases.length};
+static st_table *enc_table_replica_name;
+static st_table *enc_table_alias_name;
+
+static void enc_init_db(void)
+{
+    if (!enc_table_replica_name) {
+	enc_table_replica_name = st_init_strcasetable();
+    }
+    if (!enc_table_alias_name) {
+	enc_table_alias_name = st_init_strcasetable();
+    }
+_TEXT_
+  replicas.each_pair {|name, orig|
+    f.puts'    st_insert(enc_table_replica_name, (st_data_t)"%s", (st_data_t)"%s");' % [name, orig]}
+  aliases.each_pair {|name, orig|
+    f.puts'    st_insert(enc_table_alias_name, (st_data_t)"%s", (st_data_t)"%s");' % [name, orig]}
+  f.puts '}'
+end

Property changes on: enc/make_encdb.rb
___________________________________________________________________
Name: svn:executable
   + *

Index: common.mk
===================================================================
--- common.mk	(revision 15006)
+++ common.mk	(revision 15007)
@@ -312,7 +312,7 @@
 
 distclean: distclean-ext distclean-local distclean-enc
 distclean-local:: clean-local
-	@$(RM) $(MKFILES) config.h rbconfig.rb yasmdata.rb
+	@$(RM) $(MKFILES) config.h rbconfig.rb yasmdata.rb encdb.h
 	@$(RM) config.cache config.log config.status config.status.lineno $(PRELUDES)
 	@$(RM) *~ *.bak *.stackdump core *.core gmon.out y.tab.c y.output $(PREP)
 distclean-ext:
@@ -431,7 +431,7 @@
 encoding.$(OBJEXT): {$(VPATH)}encoding.c {$(VPATH)}ruby.h \
   {$(VPATH)}config.h {$(VPATH)}defines.h {$(VPATH)}missing.h \
   {$(VPATH)}intern.h {$(VPATH)}st.h {$(VPATH)}encoding.h \
-  {$(VPATH)}oniguruma.h {$(VPATH)}regenc.h
+  {$(VPATH)}oniguruma.h {$(VPATH)}regenc.h {$(VPATH)}encdb.h
 enum.$(OBJEXT): {$(VPATH)}enum.c {$(VPATH)}ruby.h {$(VPATH)}config.h \
   {$(VPATH)}defines.h {$(VPATH)}missing.h {$(VPATH)}intern.h \
   {$(VPATH)}st.h {$(VPATH)}node.h {$(VPATH)}util.h
@@ -708,6 +708,9 @@
 node_name.inc: {$(VPATH)}node.h
 	$(BASERUBY) -n $(srcdir)/tool/node_name.rb $? > $@
 
+encdb.h: $(srcdir)/enc/make_encdb.rb
+	$(BASERUBY) -I$(srcdir) $(srcdir)/enc/make_encdb.rb
+
 miniprelude.c: $(srcdir)/tool/compile_prelude.rb $(srcdir)/prelude.rb
 	$(BASERUBY) -I$(srcdir) $(srcdir)/tool/compile_prelude.rb $(srcdir)/prelude.rb $@
 

--
ML: ruby-changes@q...
Info: 

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