# Source code for fontTools.unicode

    def _makeunicodes(f):
    	lines = iter(f.readlines())
    	unicodes = {}
    	for line in lines:
    		if not line: continue
    		num, name = line.split(';')[:2]
    		if name[0] == '<': continue # "<control>", etc.
    		num = int(num, 16)
    		unicodes[num] = name
    	return unicodes

    class _UnicodeCustom(object):

    	def __init__(self, f):
    		if isinstance(f, str):
    			with open(f) as fd:
    				codes = _makeunicodes(fd)
    		else:
    			codes = _makeunicodes(f)
    		self.codes = codes

    	def __getitem__(self, charCode):
    		try:
    			return self.codes[charCode]
    		except KeyError:
    			return "????"

    class _UnicodeBuiltin(object):

    	def __getitem__(self, charCode):
    		try:
    			# use unicodedata backport to python2, if available:
    			# https://github.com/mikekap/unicodedata2
    			import unicodedata2 as unicodedata
    		except ImportError:
    			import unicodedata
    		try:
    			return unicodedata.name(chr(charCode))
    		except ValueError:
    			return "????"

    Unicode = _UnicodeBuiltin()

    def setUnicodeData(f):
    	global Unicode
    	Unicode = _UnicodeCustom(f)