#!/usr/bin/env python # # Copyright (C) 2008 David A. Helder # # GNU General Public Licence (GPL) # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 # USA import sys import string import re name_to_number_map = {} number_to_name_map = {} def name_to_number(name): return name_to_number_map.get(name.lower(), None) def number_to_name(number): try: n = int(number) except ValueError: return None return number_to_name_map.get(n, None) def address_to_namber(addr): parts = string.split(addr, '.') if len(parts) != 4: return None addr0 = number_to_name(parts[0]) if addr0 == None: return None addr1 = number_to_name(parts[1]) if addr1 == None: return None addr2 = number_to_name(parts[2]) if addr2 == None: return None addr3 = number_to_name(parts[3]) if addr3 == None: return None addr = addr0 + "." + addr1 + "." + \ addr2 + "." + addr3 return addr def namber_to_address(name): parts = string.split(name, '.') if len(parts) != 4: return None addr0 = name_to_number(parts[0]) if addr0 == None: return None addr1 = name_to_number(parts[1]) if addr1 == None: return None addr2 = name_to_number(parts[2]) if addr2 == None: return None addr3 = name_to_number(parts[3]) if addr3 == None: return None addr = "%d.%d.%d.%d" % (addr0, addr1, addr2, addr3) return addr def namber_loadfile(file): f = open(file, "r") count = 0 linenum = 0 name_to_number_map.clear() number_to_name_map.clear() for line in f.readlines(): linenum += 1 mo = re.match("^\s*([a-z_]+)", line) if mo: name = mo.group(0) if count < 256: if name_to_number_map.has_key(name): print "Warning: duplicate name \"%s\" at line %d" \ % (name, linenum) continue name_to_number_map[name] = count number_to_name_map[count] = name count += 1 else: print "Warning: extra name \"%s\" at line %d" \ % (name, linenum) if count != 256: print "%d names loaded. Adding more names..." % count f.close() while count < 256: name = "n" + str(count) name_to_number_map[name] = count number_to_name_map[count] = name count += 1 def main(): namber_loadfile("nambers.txt") if len(sys.argv) == 2: arg = sys.argv[1] if ord(arg[0]) >= ord('0') and \ ord(arg[0]) <= ord('9'): name = address_to_namber(arg) if name: print name else: print "Bad address: %s" % arg else: addr = namber_to_address(arg) if addr: print addr else: print "Bad namber: %s" % arg if __name__ == '__main__': main()