ruby-changes:9703
From: akr <ko1@a...>
Date: Thu, 1 Jan 2009 19:38:02 +0900 (JST)
Subject: [ruby-changes:9703] Ruby:r21244 (trunk): * ext/socket/mkconstants.rb: generate family_to_str.
akr 2009-01-01 19:37:41 +0900 (Thu, 01 Jan 2009) New Revision: 21244 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=21244 Log: * ext/socket/mkconstants.rb: generate family_to_str. * ext/socket/socket.c (ipaddr): use family_to_str. Modified files: trunk/ChangeLog trunk/ext/socket/mkconstants.rb trunk/ext/socket/socket.c Index: ChangeLog =================================================================== --- ChangeLog (revision 21243) +++ ChangeLog (revision 21244) @@ -1,3 +1,9 @@ +Thu Jan 1 19:36:57 2009 Tanaka Akira <akr@f...> + + * ext/socket/mkconstants.rb: generate family_to_str. + + * ext/socket/socket.c (ipaddr): use family_to_str. + Thu Jan 1 17:37:12 2009 Tanaka Akira <akr@f...> * ext/socket/mkconstants.rb: generate socktype_to_int. Index: ext/socket/mkconstants.rb =================================================================== --- ext/socket/mkconstants.rb (revision 21243) +++ ext/socket/mkconstants.rb (revision 21244) @@ -93,6 +93,43 @@ } EOS +MAYBE_ALIAS = [ + ["AF_UNIX", "AF_LOCAL"] +] + +def each_alias(pat) + h = {} + each_name(pat) {|name| + h[name] = [name] + } + MAYBE_ALIAS.each {|names| + a = [] + names.each {|n| + a << n if h.delete n + } + h[a.first] = a + } + h.each_value {|names| + yield names + } +end + +ERB.new(<<'EOS', nil, '%').def_method(Object, "gen_int_to_name(int_var, pat)") + switch (<%=int_var%>) { +% each_alias(pat) {|names| +% names.each_with_index {|n, i| +% cond = ["defined(#{n})"] +% (0...i).each {|j| cond << "(!defined(#{names[j]}) || #{n} != #{names[j]})" } +#if <%=cond.join(" && ")%> + case <%=n%>: return <%=c_str n%>; +#endif +% } +% } + default: + return NULL; + } +EOS + result << ERB.new(<<'EOS', nil, '%').result(binding) static void init_constants(VALUE mConst) @@ -127,6 +164,12 @@ <%= gen_name_to_int("str", "len", /\ASOCK_/) %> } +static char * +family_to_str(int val) +{ +<%= gen_int_to_name("val", /\AAF_/) %> +} + EOS if opt_o Index: ext/socket/socket.c =================================================================== --- ext/socket/socket.c (revision 21243) +++ ext/socket/socket.c (revision 21244) @@ -981,6 +981,8 @@ return sock_getaddrinfo(host, port, &hints); } +static char *family_to_str(int val); + static VALUE ipaddr(struct sockaddr *sockaddr, int norevlookup) { @@ -988,32 +990,14 @@ VALUE ary; int error; char hbuf[1024], pbuf[1024]; + char *name; - switch (sockaddr->sa_family) { - case AF_UNSPEC: - family = rb_str_new2("AF_UNSPEC"); - break; - case AF_INET: - family = rb_str_new2("AF_INET"); - break; -#ifdef INET6 - case AF_INET6: - family = rb_str_new2("AF_INET6"); - break; -#endif -#ifdef AF_LOCAL - case AF_LOCAL: - family = rb_str_new2("AF_LOCAL"); - break; -#elif AF_UNIX - case AF_UNIX: - family = rb_str_new2("AF_UNIX"); - break; -#endif - default: + name = family_to_str(sockaddr->sa_family); + if (name) + family = rb_str_new2(name); + else { sprintf(pbuf, "unknown:%d", sockaddr->sa_family); family = rb_str_new2(pbuf); - break; } addr1 = Qnil; -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/