old_contents: """fontTools.misc.textTools.py -- miscellaneous routines."""
  
  
  from __future__ import print_function, division, absolute_import
  from fontTools.misc.py23 import *
  import string
  
  
  def safeEval(data, eval=eval):
  	"""A (kindof) safe replacement for eval."""
  	return eval(data, {"__builtins__":{"True":True,"False":False}})
  
  
  def readHex(content):
  	"""Convert a list of hex strings to binary data."""
  	return deHexStr(strjoin(chunk for chunk in content if isinstance(chunk, basestring)))
  
  def deHexStr(hexdata):
  	"""Convert a hex string to binary data."""
  	hexdata = strjoin(hexdata.split())
  	if len(hexdata) % 2:
  		hexdata = hexdata + "0"
  	data = []
  	for i in range(0, len(hexdata), 2):
  		data.append(bytechr(int(hexdata[i:i+2], 16)))
  	return bytesjoin(data)
  
  
  def hexStr(data):
  	"""Convert binary data to a hex string."""
  	h = string.hexdigits
  	r = ''
  	for c in data:
  		i = byteord(c)
  		r = r + h[(i >> 4) & 0xF] + h[i & 0xF]
  	return r
  
  
  def num2binary(l, bits=32):
  	items = []
  	binary = ""
  	for i in range(bits):
  		if l & 0x1:
  			binary = "1" + binary
  		else:
  			binary = "0" + binary
  		l = l >> 1
  		if not ((i+1) % 8):
  			items.append(binary)
  			binary = ""
  	if binary:
  		items.append(binary)
  	items.reverse()
  	assert l in (0, -1), "number doesn't fit in number of bits"
  	return ' '.join(items)
  
  
  def binary2num(bin):
  	bin = strjoin(bin.split())
  	l = 0
  	for digit in bin:
  		l = l << 1
  		if digit != "0":
  			l = l | 0x1
  	return l
  
  
  def caselessSort(alist):
  	"""Return a sorted copy of a list. If there are only strings
  	in the list, it will not consider case.
  	"""
  
  	try:
  		return sorted(alist, key=lambda a: (a.lower(), a))
  	except TypeError:
  		return sorted(alist)
  
  
  def pad(data, size):
  	r""" Pad byte string 'data' with null bytes until its length is a
  	multiple of 'size'.
  
  	>>> len(pad(b'abcd', 4))
  	4
  	>>> len(pad(b'abcde', 2))
  	6
  	>>> len(pad(b'abcde', 4))
  	8
  	>>> pad(b'abcdef', 4) == b'abcdef\x00\x00'
  	True
  	"""
  	data = tobytes(data)
  	if size > 1:
  		remainder = len(data) % size
  		if remainder:
  			data += b"\0" * (size - remainder)
  	return data
  
  
  if __name__ == "__main__":
  	import doctest
  	sys.exit(doctest.testmod().failed)
  
new_contents: """fontTools.misc.textTools.py -- miscellaneous routines."""
  
  
  from __future__ import print_function, division, absolute_import
  from fontTools.misc.py23 import *
  import string
  
  
  def safeEval(data, eval=eval):
  	"""A (kindof) safe replacement for eval."""
  	return eval(data, {"__builtins__":{"True":True,"False":False}})
  
  
  def readHex(content):
  	"""Convert a list of hex strings to binary data."""
  	return deHexStr(strjoin(chunk for chunk in content if isinstance(chunk, basestring)))
  
  def deHexStr(hexdata):
  	"""Convert a hex string to binary data."""
  	hexdata = strjoin(hexdata.split())
  	if len(hexdata) % 2:
  		hexdata = hexdata + "0"
  	data = []
  	for i in range(0, len(hexdata), 2):
  		data.append(bytechr(int(hexdata[i:i+2], 16)))
  	return bytesjoin(data)
  
  
  def hexStr(data):
  	"""Convert binary data to a hex string."""
  	h = string.hexdigits
  	r = ''
  	for c in data:
  		i = byteord(c)
  		r = r + h[(i >> 4) & 0xF] + h[i & 0xF]
  	return r
  
  
  def num2binary(l, bits=32):
  	items = []
  	binary = ""
  	for i in range(bits):
  		if l & 0x1:
  			binary = "1" + binary
  		else:
  			binary = "0" + binary
  		l = l >> 1
  		if not ((i+1) % 8):
  			items.append(binary)
  			binary = ""
  	if binary:
  		items.append(binary)
  	items.reverse()
  	assert l in (0, -1), "number doesn't fit in number of bits"
  	return ' '.join(items)
  
  
  def binary2num(bin):
  	bin = strjoin(bin.split())
  	l = 0
  	for digit in bin:
  		l = l << 1
  		if digit != "0":
  			l = l | 0x1
  	return l
  
  
  def caselessSort(alist):
  	"""Return a sorted copy of a list. If there are only strings
  	in the list, it will not consider case.
  	"""
  
  	try:
  		return sorted(alist, key=lambda a: (a.lower(), a))
  	except TypeError:
  		return sorted(alist)
  
  
  def pad(data, size):
  	r""" Pad byte string 'data' with null bytes until its length is a
  	multiple of 'size'.
  
  	>>> len(pad(b'abcd', 4))
  	4
  	>>> len(pad(b'abcde', 2))
  	6
  	>>> len(pad(b'abcde', 4))
  	8
  	>>> pad(b'abcdef', 4) == b'abcdef\x00\x00'
  	True
  	"""
  	data = tobytes(data)
  	if size > 1:
  		remainder = len(data) % size
  		if remainder:
  			data += b"\0" * (size - remainder)
  	return data
  
  
  if __name__ == "__main__":
  	import doctest, sys
  	sys.exit(doctest.testmod().failed)
  
subject: add import sys