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

ruby-changes:3496

From: ko1@a...
Date: Sun, 13 Jan 2008 10:21:58 +0900 (JST)
Subject: [ruby-changes:3496] nobu - Ruby:r15015 (trunk): * encoding.c (enc_table): packed all enc_table stuff.

nobu	2008-01-13 10:21:42 +0900 (Sun, 13 Jan 2008)

  New Revision: 15015

  Modified files:
    trunk/ChangeLog
    trunk/enc/make_encdb.rb
    trunk/encoding.c

  Log:
    * encoding.c (enc_table): packed all enc_table stuff.


  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/enc/make_encdb.rb?r1=15015&r2=15014&diff_format=u
  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/ChangeLog?r1=15015&r2=15014&diff_format=u
  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/encoding.c?r1=15015&r2=15014&diff_format=u

Index: encoding.c
===================================================================
--- encoding.c	(revision 15014)
+++ encoding.c	(revision 15015)
@@ -12,7 +12,6 @@
 #include "ruby/ruby.h"
 #include "ruby/encoding.h"
 #include "regenc.h"
-#include "encdb.h"
 #include <ctype.h>
 #ifdef HAVE_LANGINFO_H
 #include <langinfo.h>
@@ -26,11 +25,17 @@
     rb_encoding *enc;
 };
 
-static struct rb_encoding_entry *enc_table;
-static int enc_table_count;
-static int enc_table_size;
-static st_table *enc_table_alias;
+static struct {
+    struct rb_encoding_entry *list;
+    int count;
+    int size;
+    st_table *alias;
+    st_table *replica_name;
+    st_table *alias_name;
+} enc_table;
 
+#include "encdb.h"
+
 #define ENC_UNINITIALIZED (&rb_cEncoding)
 #define enc_initialized_p(enc) ((enc)->auxiliary_data != &rb_cEncoding)
 #define ENC_FROM_ENCODING(enc) ((VALUE)(enc)->auxiliary_data)
@@ -108,8 +113,8 @@
 rb_gc_mark_encodings(void)
 {
     int i;
-    for (i = 0; i < enc_table_size; ++i) {
-	rb_encoding *enc = enc_table[i].enc;
+    for (i = 0; i < enc_table.size; ++i) {
+	rb_encoding *enc = enc_table.list[i].enc;
 	if (enc && enc_initialized_p(enc)) {
 	    rb_gc_mark(ENC_FROM_ENCODING(enc));
 	}
@@ -121,19 +126,19 @@
 {
     struct rb_encoding_entry *ent;
 
-    if (enc_table_size >= newsize) return newsize;
-    ent = realloc(enc_table, sizeof(*enc_table) * newsize);
+    if (enc_table.size >= newsize) return newsize;
+    ent = realloc(enc_table.list, sizeof(*enc_table.list) * newsize);
     if (!ent) return -1;
-    memset(ent + enc_table_size, 0, sizeof(*ent)*(newsize - enc_table_size));
-    enc_table = ent;
-    enc_table_size = newsize;
+    memset(ent + enc_table.size, 0, sizeof(*ent)*(newsize - enc_table.size));
+    enc_table.list = ent;
+    enc_table.size = newsize;
     return newsize;
 }
 
 static int
 enc_register_at(int index, const char *name, rb_encoding *encoding)
 {
-    struct rb_encoding_entry *ent = &enc_table[index];
+    struct rb_encoding_entry *ent = &enc_table.list[index];
 
     ent->name = name;
     if (!ent->enc) ent->enc = malloc(sizeof(rb_encoding));
@@ -154,11 +159,11 @@
 static int
 enc_register(const char *name, rb_encoding *encoding)
 {
-    int index = enc_table_count;
+    int index = enc_table.count;
 
-    if (index >= ENCODING_INLINE_MAX) index = enc_table_size;
+    if (index >= ENCODING_INLINE_MAX) index = enc_table.size;
     if ((index = enc_table_expand(index + 1)) < 0) return -1;
-    enc_table_count = index;
+    enc_table.count = index;
     return enc_register_at(index - 1, name, encoding);
 }
 
@@ -174,7 +179,7 @@
 	rb_encoding *oldenc = rb_enc_from_index(index);
 	if (STRCASECMP(name, rb_enc_name(oldenc))) {
 	    st_data_t key = (st_data_t)name, alias;
-	    st_delete(enc_table_alias, &key, &alias);
+	    st_delete(enc_table.alias, &key, &alias);
 	    index = enc_register(name, encoding);
 	}
 	else if (enc_initialized_p(oldenc) &&
@@ -203,7 +208,7 @@
 static VALUE
 set_base_encoding(int index, rb_encoding *base)
 {
-    VALUE enc = rb_enc_from_encoding(enc_table[index].enc);
+    VALUE enc = rb_enc_from_encoding(enc_table.list[index].enc);
 
     rb_ivar_set(enc, id_base_encoding, rb_enc_from_encoding(base));
     if (rb_enc_dummy_p(base)) FL_SET(enc, ENC_DUMMY);
@@ -213,7 +218,7 @@
 int
 rb_enc_replicate(const char *name, rb_encoding *encoding)
 {
-    int index = enc_table_size;
+    int index = enc_table.size;
 
     enc_check_duplication(name);
     if (enc_table_expand(index + 1) < 0) return -1;
@@ -225,7 +230,7 @@
 int
 rb_define_dummy_encoding(const char *name)
 {
-    int index = enc_table_size;
+    int index = enc_table.size;
     rb_encoding *encoding;
     VALUE enc;
 
@@ -271,15 +276,15 @@
     st_data_t data;
     int idx;
 
-    if (!enc_table_alias) {
-	enc_table_alias = st_init_strcasetable();
+    if (!enc_table.alias) {
+	enc_table.alias = st_init_strcasetable();
     }
     if ((idx = rb_enc_find_index(orig)) < 0) {
-	if (!st_lookup(enc_table_alias, (st_data_t)orig, &data))
+	if (!st_lookup(enc_table.alias, (st_data_t)orig, &data))
 	    return -1;
 	idx = (int)data;
     }
-    st_insert(enc_table_alias, (st_data_t)alias, (st_data_t)idx);
+    st_insert(enc_table.alias, (st_data_t)alias, (st_data_t)idx);
     return idx;
 }
 
@@ -301,7 +306,7 @@
 void
 rb_enc_init(void)
 {
-    enc_table_count = enc_table_expand(ENCINDEX_BUILTIN_MAX);
+    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);
@@ -313,13 +318,13 @@
 rb_encoding *
 rb_enc_from_index(int index)
 {
-    if (!enc_table) {
+    if (!enc_table.list) {
 	rb_enc_init();
     }
-    if (index < 0 || enc_table_size <= index) {
+    if (index < 0 || enc_table.size <= index) {
 	return 0;
     }
-    return enc_table[index].enc;
+    return enc_table.list[index].enc;
 }
 
 int
@@ -329,20 +334,20 @@
     st_data_t alias = 0;
 
     if (!name) return -1;
-    if (!enc_table) {
+    if (!enc_table.list) {
 	rb_enc_init();
     }
-    for (i=0; i<enc_table_size; i++) {
-	if (!enc_table[i].name) {
+    for (i=0; i<enc_table.size; i++) {
+	if (!enc_table.list[i].name) {
 	    if (i < ENCODING_INLINE_MAX - 1) i = ENCODING_INLINE_MAX - 1;
 	    continue;
 	}
-	if (STRCASECMP(name, enc_table[i].name) == 0) {
+	if (STRCASECMP(name, enc_table.list[i].name) == 0) {
 	    return i;
 	}
     }
-    if (!alias && enc_table_alias) {
-	if (st_lookup(enc_table_alias, (st_data_t)name, &alias)) {
+    if (!alias && enc_table.alias) {
+	if (st_lookup(enc_table.alias, (st_data_t)name, &alias)) {
 	    return (int)alias;
 	}
     }
@@ -374,19 +379,20 @@
     }
     if (i < 0) {
 	st_data_t key = (st_data_t)name, orig;
-	if (st_lookup(enc_table_replica_name, key, &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 replica '%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)) {
+	    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);
 	    if (i < 0) {
 		rb_raise(rb_eRuntimeError, "unknown original encoding name - '%s' for alias '%s'", (char *)orig, name);
 	    }
-	    st_delete(enc_table_alias_name, &key, &orig);
+	    st_delete(enc_table.alias_name, &key, &orig);
 	}
     }
     return i;
@@ -765,10 +771,10 @@
 static VALUE
 enc_list(VALUE klass)
 {
-    VALUE ary = rb_ary_new2(enc_table_size);
+    VALUE ary = rb_ary_new2(enc_table.size);
     int i;
-    for (i = 0; i < enc_table_size; ++i) {
-	rb_encoding *enc = enc_table[i].enc;
+    for (i = 0; i < enc_table.size; ++i) {
+	rb_encoding *enc = enc_table.list[i].enc;
 	if (enc) {
 	    rb_ary_push(ary, rb_enc_from_encoding(enc));
 	}
@@ -846,19 +852,19 @@
 rb_encoding *
 rb_ascii8bit_encoding(void)
 {
-    if (!enc_table) {
+    if (!enc_table.list) {
 	rb_enc_init();
     }
-    return enc_table[0].enc;
+    return enc_table.list[0].enc;
 }
 
 rb_encoding *
 rb_utf8_encoding(void)
 {
-    if (!enc_table) {
+    if (!enc_table.list) {
 	rb_enc_init();
     }
-    return enc_table[ENCINDEX_UTF8].enc;
+    return enc_table.list[ENCINDEX_UTF8].enc;
 }
 
 rb_encoding *
@@ -1021,16 +1027,14 @@
 rb_enc_aliases(VALUE klass)
 {
     VALUE aliases = rb_hash_new();
-    if (enc_table_alias) 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);
+    if (enc_table.alias) 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)
 {
-    int i;
-
     id_base_encoding = rb_intern("#base_encoding");
 
     rb_cEncoding = rb_define_class("Encoding", rb_cObject);
Index: ChangeLog
===================================================================
--- ChangeLog	(revision 15014)
+++ ChangeLog	(revision 15015)
@@ -1,3 +1,7 @@
+Sun Jan 13 10:21:40 2008  Nobuyoshi Nakada  <nobu@r...>
+
+	* encoding.c (enc_table): packed all enc_table stuff.
+
 Sun Jan 13 09:58:17 2008  NARUSE, Yui  <naruse@r...>
 
 	* encoding.c (rb_enc_init): revert removing SJIS.
Index: enc/make_encdb.rb
===================================================================
--- enc/make_encdb.rb	(revision 15014)
+++ enc/make_encdb.rb	(revision 15015)
@@ -40,25 +40,21 @@
   replicas.each_key {|name| f.puts'    "%s",' % name}
   aliases.each_key {|name| f.puts'    "%s",' % name}
   f.puts(<<"_TEXT_")
-    NULL
 };
-static const int enc_name_list_size = #{encodings.length + replicas.length + aliases.length};
-static const int enc_aliases_size = #{aliases.length};
-static st_table *enc_table_replica_name;
-static st_table *enc_table_alias_name;
+#define enc_name_list_size (sizeof(enc_name_list)/sizeof(enc_name_list[0]))
 
 static void enc_init_db(void)
 {
-    if (!enc_table_replica_name) {
-	enc_table_replica_name = st_init_strcasetable();
+    if (!enc_table.replica_name) {
+	enc_table.replica_name = st_init_strcasetable();
     }
-    if (!enc_table_alias_name) {
-	enc_table_alias_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]}
+    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'    st_insert(enc_table.alias_name, (st_data_t)"%s", (st_data_t)"%s");' % [name, orig]}
   f.puts '}'
 end

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

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