構造体ぐぐるのめんどくさいねw っていうプログラム。

Linuxネットワークプログラミングバイブル

Linuxネットワークプログラミングバイブル

ゆういちろうとこの本を読んでいるとき、

struct addrinfo *res0;
...
getnameinfo(res0->ai_addr,res0->ai_addrlen,....

「getnameinfoってなんだっけなー。manでも見ようー」

int getnameinfo(const struct sockaddr *sa, socklen_t salen,....

「あ? 第一引数の saはポインタを必要としてて、第二引数は普通のsocklen_t...
 やのに、なんで『res0->』っていう形は一緒なんじゃよ!」

という感じで、ゆういちろうとブチギレてるときに、

ゆういちろう「あっ。それ構造体がそういう形だからじゃない?」

足軽「なるほどな。じゃあ見ようか。」

ゆういちろう「はぁ…またぐぐらな。」

足軽「構造体manないもんな。」

ゆういちろう「足軽作ってよ」

足軽「えー…わかった。」

で作ったのが

from sys import argv

def AlPro(x=None):
  Arr = {}
  for j in ['/usr/include/netdb.h',"/usr/include/netinet/in.h"]:
      with file(j) as pc:
          struct = [] 
          FLAG=0
          for line in pc:
              if line.startswith('struct'):
                stname = line.split()[1]
                FLAG=1
              elif FLAG:
                struct.append(line)
                if '};' in line.split():
                  Arr[stname] = struct
                  if stname == x:
                    break
                  struct =[]
                  FLAG=0
              else:
                  continue
  return Arr if x is None else Arr[x]
  
if __name__ == '__main__':
  if '-a' in argv:
    for j in AlPro():
      print j
    

  stru = raw_input('>>')

  for i in AlPro(stru):
    print i,

もっといい方法があれば教えてくださいな。

使い方

$ python test.py -a                            ←オプションaで構造体一覧                                                                                                        
ipv6_mreq
hostent
addrinfo
in_addr
group_source_req
protoent
sockaddr_in
servent
group_filter
group_req
gaicb
in6_pktinfo
ip_mreq
ip6_mtuinfo
sockaddr_in6
ip_msfilter
in6_addr
ip_mreq_source
>>addrinfo     ←ここで入力
{
  int ai_flags;			/* Input flags.  */
  int ai_family;		/* Protocol family for socket.  */
  int ai_socktype;		/* Socket type.  */
  int ai_protocol;		/* Protocol for socket.  */
  socklen_t ai_addrlen;		/* Length of socket address.  */
  struct sockaddr *ai_addr;	/* Socket address for socket.  */
  char *ai_canonname;		/* Canonical name for service location.  */
  struct addrinfo *ai_next;	/* Pointer to next in list.  */
};

構造体が出てきます。。

さっきの例で言うなれば、

ai_addr こいつは構造体として宣言されてるね。
ai_addrlen こいつは普通やね

ってなります。

あー、構造体が入ってるファイルは自分で追加できるようにしてね。
['/usr/include/netdb.h',"/usr/include/netinet/in.h"]



〜終わり〜


今日撮ったイチ押し

f:id:reonreon3reon:20130902012759j:plain