diff options
author | akr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2009-01-02 06:01:57 +0000 |
---|---|---|
committer | akr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2009-01-02 06:01:57 +0000 |
commit | d68b60741ce0ee26f61f4bb16ca14769cd1f0988 (patch) | |
tree | efc2fafa54648f7508910c3bdc0790c878926998 /ext/socket/mkconstants.rb | |
parent | 270f2034a71cecc3361920d5ff609bda41ecef8f (diff) | |
download | ruby-d68b60741ce0ee26f61f4bb16ca14769cd1f0988.tar.gz |
* ext/socket/mkconstants.rb: use hash for family_to_str to avoid
linear search. lenp argument removed.
* ext/socket/socket.c (ipaddr): call family_to_str without lenp
argument.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@21268 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'ext/socket/mkconstants.rb')
-rw-r--r-- | ext/socket/mkconstants.rb | 40 |
1 files changed, 23 insertions, 17 deletions
diff --git a/ext/socket/mkconstants.rb b/ext/socket/mkconstants.rb index 32b99d2fe3..0491924a86 100644 --- a/ext/socket/mkconstants.rb +++ b/ext/socket/mkconstants.rb @@ -66,6 +66,13 @@ def each_name(pat) } end +def reverse_each_name(pat) + DEFS.reverse_each {|name, default_value| + next if pat !~ name + yield name + } +end + def each_names_with_len(pat) h = {} DEFS.each {|name, default_value| @@ -95,27 +102,26 @@ ERB.new(<<'EOS', nil, '%').def_method(Object, "gen_name_to_int(str_var, len_var, } EOS -def each_alias(pat) - names = [] - each_name(pat) {|n| - names << n - } - yield names -end - -ERB.new(<<'EOS', nil, '%').def_method(Object, "gen_int_to_name(int_var, lenp_var, pat)") -% each_name(pat) {|n| +ERB.new(<<'EOS', nil, '%').def_method(Object, "gen_int_to_name_hash(hash_var, pat)") + <%=hash_var%> = st_init_numtable(); +% reverse_each_name(pat) {|n| #ifdef <%=n%> - if (<%=int_var%> == <%=n%>) { - if (<%=lenp_var%>) *<%=lenp_var%> = <%=n.bytesize%>; - return <%=c_str n%>; - } + st_insert(<%=hash_var%>, (st_data_t)<%=n%>, (st_data_t)<%=c_str n%>); #endif % } +EOS + +ERB.new(<<'EOS', nil, '%').def_method(Object, "gen_int_to_name(int_var, hash_var)") + st_data_t name; + if (st_lookup(<%=hash_var%>, (st_data_t)<%=int_var%>, &name)) + return (char*)name; return NULL; EOS result << ERB.new(<<'EOS', nil, '%').result(binding) + +static st_table *family_to_str_hash; + static void init_constants(VALUE mConst) { @@ -133,8 +139,8 @@ init_constants(VALUE mConst) % if guard #endif % end - % } +<%= gen_int_to_name_hash('family_to_str_hash', /\AAF_/) %> } static int @@ -186,9 +192,9 @@ udp_optname_to_int(char *str, int len, int *valp) } static char * -family_to_str(int val, int *lenp) +family_to_str(int val) { -<%= gen_int_to_name("val", "lenp", /\AAF_/) %> +<%= gen_int_to_name("val", "family_to_str_hash") %> } EOS |