1
0
mirror of https://github.com/mnaberez/py65.git synced 2024-06-06 20:29:34 +00:00

Remove unused hexdump loader. Closes #37

This commit is contained in:
Mike Naberezny 2017-09-20 08:41:29 -07:00
parent cc40261499
commit f4c7ecdc35
3 changed files with 2 additions and 219 deletions

View File

@ -1,6 +1,8 @@
1.0.1.dev0 (Next Release)
-------------------------
- The unused hexdump loader utility has been removed.
1.0.0 (2017-05-11)
------------------

View File

@ -1,129 +0,0 @@
import unittest
import sys
from py65.utils.hexdump import load, Loader
class TopLevelHexdumpTests(unittest.TestCase):
def test_load(self):
text = 'c000: aa bb'
start, data = load(text)
self.assertEqual(0xC000, start)
self.assertEqual([0xAA, 0xBB], data)
class HexdumpLoaderTests(unittest.TestCase):
def test_empty_string_does_nothing(self):
text = ''
loader = Loader(text)
self.assertEqual(None, loader.start_address)
self.assertEqual([], loader.data)
def test_all_whitespace_does_nothing(self):
text = " \r\n \t \n"
loader = Loader(text)
self.assertEqual(None, loader.start_address)
self.assertEqual([], loader.data)
def test_raises_when_start_address_not_found(self):
text = 'aa bb cc'
try:
Loader(text)
self.fail()
except ValueError as exc:
msg = 'Start address was not found in data'
self.assertEqual(msg, str(exc))
def test_raises_when_start_address_is_invalid(self):
text = 'oops: aa bb cc'
try:
Loader(text)
self.fail()
except ValueError as exc:
msg = 'Could not parse address: oops'
self.assertEqual(msg, str(exc))
def test_raises_when_start_address_is_too_short(self):
text = '01: aa bb cc'
try:
Loader(text)
self.fail()
except ValueError as exc:
msg = 'Expected address to be 2 bytes, got 1'
self.assertEqual(msg, str(exc))
def test_raises_when_start_address_is_too_long(self):
text = '010304: aa bb cc'
try:
Loader(text)
self.fail()
except ValueError as exc:
msg = 'Expected address to be 2 bytes, got 3'
self.assertEqual(msg, str(exc))
def test_raises_when_next_address_is_unexpected(self):
text = "c000: aa\nc002: cc"
try:
Loader(text)
self.fail()
except ValueError as exc:
msg = 'Non-contigous block detected. Expected next ' \
'address to be $c001, label was $c002'
self.assertEqual(msg, str(exc))
def test_raises_when_data_is_invalid(self):
text = 'c000: foo'
try:
Loader(text)
self.fail()
except ValueError as exc:
msg = 'Could not parse data: foo'
self.assertEqual(msg, str(exc))
def test_loads_data_without_dollar_signs(self):
text = 'c000: aa bb'
load = Loader(text)
self.assertEqual(0xC000, load.start_address)
self.assertEqual([0xAA, 0xBB], load.data)
def test_loads_data_with_some_dollar_signs(self):
text = '$c000: aa $bb'
load = Loader(text)
self.assertEqual(0xC000, load.start_address)
self.assertEqual([0xAA, 0xBB], load.data)
def test_loads_multiline_data_with_unix_endings(self):
text = '$c000: aa bb\n$c002: cc'
load = Loader(text)
self.assertEqual(0xC000, load.start_address)
self.assertEqual([0xAA, 0xBB, 0xCC], load.data)
def test_loads_multiline_data_with_dos_endings(self):
text = '$c000: aa bb\r\n$c002: cc'
load = Loader(text)
self.assertEqual(0xC000, load.start_address)
self.assertEqual([0xAA, 0xBB, 0xCC], load.data)
def test_ignores_semicolon_comments(self):
text = 'c000: aa bb ;comment'
load = Loader(text)
self.assertEqual(0xC000, load.start_address)
self.assertEqual([0xAA, 0xBB], load.data)
def test_ignores_double_dash_comments(self):
text = 'c000: aa bb -- comment'
load = Loader(text)
self.assertEqual(0xC000, load.start_address)
self.assertEqual([0xAA, 0xBB], load.data)
def test_ignores_pound_comments(self):
text = 'c000: aa bb # comment'
load = Loader(text)
self.assertEqual(0xC000, load.start_address)
self.assertEqual([0xAA, 0xBB], load.data)
def test_suite():
return unittest.findTestCases(sys.modules[__name__])
if __name__ == '__main__':
unittest.main(defaultTest='test_suite')

View File

@ -1,90 +0,0 @@
from binascii import a2b_hex
def load(text):
load = Loader(text)
return (load.start_address, load.data)
class Loader:
def __init__(self, text):
self.load(text)
def load(self, text):
self._reset()
for line in text.splitlines():
self._parse_line(line)
def _reset(self):
self.data = []
self.start_address = None
self.current_address = None
def _parse_line(self, line):
line = self._remove_comments(line)
pieces = line.strip().split()
for piece in pieces:
if piece.startswith('$'):
piece = piece[1:]
if piece.endswith(':'):
self._parse_address(piece[:-1])
else:
self._parse_bytes(piece)
def _remove_comments(self, line):
for delimiter in (';', '--', '#'):
pos = line.find(delimiter)
if pos != -1:
line = line[:pos]
return line
def _parse_address(self, piece):
try:
binstr = a2b_hex(piece.encode('utf-8'))
if isinstance(binstr, str):
addr_bytes = [ ord(b) for b in binstr ]
else: # Python 3
addr_bytes = [ b for b in binstr ]
except (TypeError, ValueError):
msg = "Could not parse address: %s" % piece
raise ValueError(msg)
if len(addr_bytes) != 2:
msg = "Expected address to be 2 bytes, got %d" % (
len(addr_bytes))
raise ValueError(msg)
address = (addr_bytes[0] << 8) + addr_bytes[1]
if self.start_address is None:
self.start_address = address
self.current_address = address
elif address != (self.current_address):
msg = "Non-contigous block detected. Expected next address " \
"to be $%04x, label was $%04x" % (self.current_address,
address)
raise ValueError(msg)
def _parse_bytes(self, piece):
if self.start_address is None:
msg = "Start address was not found in data"
raise ValueError(msg)
else:
try:
binstr = a2b_hex(piece.encode('utf-8'))
if isinstance(binstr, str):
data_bytes = [ ord(b) for b in binstr ]
else: # Python 3
data_bytes = [ b for b in binstr ]
except (TypeError, ValueError):
msg = "Could not parse data: %s" % piece
raise ValueError(msg)
self.current_address += len(data_bytes)
self.data.extend(data_bytes)