| #!/usr/bin/env python | 
 | # | 
 |  | 
 | import sys, os, string, re | 
 |  | 
 | def usage(): | 
 |     print """\ | 
 |   usage:  genserv < /etc/services > libc/netbsd/net/services.h | 
 |  | 
 |   this program is used to generate the hard-coded internet service list for the | 
 |   Bionic C library. | 
 | """ | 
 |  | 
 | re_service = re.compile(r"([\d\w\-_]+)\s+(\d+)/(tcp|udp)(.*)") | 
 | re_alias   = re.compile(r"([\d\w\-_]+)(.*)") | 
 |  | 
 | class Service: | 
 |     def __init__(self,name,port,proto): | 
 |         self.name    = name | 
 |         self.port    = port | 
 |         self.proto   = proto | 
 |         self.aliases = [] | 
 |  | 
 |     def add_alias(self,alias): | 
 |         self.aliases.append(alias) | 
 |  | 
 |     def __str__(self): | 
 |         result  = "\\%0o%s" % (len(self.name),self.name) | 
 |         result += "\\%0o\\%0o" % (((self.port >> 8) & 255), self.port & 255) | 
 |         if self.proto == "tcp": | 
 |             result += "t" | 
 |         else: | 
 |             result += "u" | 
 |  | 
 |         result += "\\%0o" % len(self.aliases) | 
 |         for alias in self.aliases: | 
 |             result += "\\%0o%s" % (len(alias), alias) | 
 |  | 
 |         return result | 
 |  | 
 | def parse(f): | 
 |     result = []  # list of Service objects | 
 |     for line in f.xreadlines(): | 
 |         if len(line) > 0 and line[-1] == "\n": | 
 |             line = line[:-1] | 
 |         if len(line) > 0 and line[-1] == "\r": | 
 |             line = line[:-1] | 
 |  | 
 |         line = string.strip(line) | 
 |         if len(line) == 0 or line[0] == "#": | 
 |             continue | 
 |  | 
 |         m = re_service.match(line) | 
 |         if m: | 
 |             service = Service( m.group(1), int(m.group(2)), m.group(3) ) | 
 |             rest    = string.strip(m.group(4)) | 
 |  | 
 |             while 1: | 
 |                 m = re_alias.match(rest) | 
 |                 if not m: | 
 |                     break | 
 |                 service.add_alias(m.group(1)) | 
 |                 rest = string.strip(m.group(2)) | 
 |  | 
 |             result.append(service) | 
 |  | 
 |     return result | 
 |  | 
 | services = parse(sys.stdin) | 
 | line = '/* generated by genserv.py - do not edit */\nstatic const char  _services[] = "\\\n' | 
 | for s in services: | 
 |     line += str(s)+"\\\n" | 
 | line += '\\0";\n' | 
 | print line |