diff options
Diffstat (limited to 'subx.py')
| -rw-r--r-- | subx.py | 107 |
1 files changed, 0 insertions, 107 deletions
diff --git a/subx.py b/subx.py deleted file mode 100644 index 3266403..0000000 --- a/subx.py +++ /dev/null @@ -1,107 +0,0 @@ -import re -white = re.compile('[ \t\.\n]+') -hex = re.compile(r'^\-?(0x)?[0-9a-f]+$') - -def parse_part(part): - part = part.split('/') - if hex.match(part[0]): - part[0] = int(part[0], 16) - return tuple(part) - -def parse_instr(line): - parts = white.split(line) - parts = [parse_part(part) for part in parts if part != ''] - return parts - -def parse_bits(line): - parts = [] - for part in white.split(line): - if part == '': - continue - - val, size = parse_part(part) - parts.append((val, int(size))) - return parts - -def parse_segment(line): - parts = white.split(line) - return (parts[1], int(parts[2], 16)) - -def parse_label(line): - return line[:-1] - -def is_lref(part): - return isinstance(part[0], str) - -def untag(part, expect=None): - if expect and part[1] != expect: - raise ValueError("expected {} to be labelled {}".format(part, expect)) - return part[0] - -def format_part(part): - if not is_lref(part): - first = '{:02x}'.format(part[0]) - part = (first,) + part[1:] - return '/'.join([str(p) for p in part]) - -def format_instr(inst, comment=None): - packed = ' '.join(format_part(part) for part in inst) - if comment: - packed = packed + ' # ' + comment - return packed - -def clean(line): - return line.strip().split('#')[0].rstrip() - -def classify(line): - if line.startswith('=='): # segment - return 'segment' - elif line.endswith(':'): # label - return 'label' - else: - return 'instr' - -import unittest -class TestParsing(unittest.TestCase): - def test_parse_part(self): - self.assertEqual(parse_part('0'), (0,)) - self.assertEqual(parse_part('00'), (0,)) - self.assertEqual(parse_part('0x00'), (0,)) - - self.assertEqual(parse_part('12'), (0x12,)) - self.assertEqual(parse_part('0x12'), (0x12,)) - - self.assertEqual(parse_part('-12'), (-0x12,)) - self.assertEqual(parse_part('-0x12'), (-0x12,)) - - self.assertEqual(parse_part('00/with/tag'), (0, 'with', 'tag')) - self.assertEqual(parse_part('-12/and<</tag*'), (-0x12, 'and<<', 'tag*')) - - self.assertEqual(parse_part('label/tag*'), ('label', 'tag*')) - self.assertEqual(parse_part('$label/tag*'), ('$label', 'tag*')) - self.assertEqual(parse_part('label:suff/tag*'), ('label:suff', 'tag*')) - self.assertEqual(parse_part('$label:suff/tag*'), ('$label:suff', 'tag*')) - -class TestChecks(unittest.TestCase): - def test_is_lref(self): - self.assertTrue(is_lref(('hello',))) - self.assertTrue(is_lref(('hello:world',))) - self.assertTrue(is_lref(('$label',))) - self.assertTrue(is_lref(('$label:extra',))) - self.assertTrue(is_lref(('$label:extra','disp20u'))) - self.assertTrue(is_lref(('plain','disp20u'))) - - self.assertFalse(is_lref((0,))) - self.assertFalse(is_lref((1,))) - self.assertFalse(is_lref((1,'disp20u'))) - self.assertFalse(is_lref((0x13f,'imm12'))) - -class TestFormatting(unittest.TestCase): - def test_format_part(self): - self.assertEqual(format_part((0,)), '00') - self.assertEqual(format_part((0x00,)), '00') - - self.assertEqual(format_part(('label', 'tag*')), 'label/tag*') - self.assertEqual(format_part(('$label', 'tag*')), '$label/tag*') - self.assertEqual(format_part(('label:suff', 'tag')), 'label:suff/tag') - self.assertEqual(format_part(('$label:suff', 'tag')), '$label:suff/tag') |
