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

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/

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