git.s-ol.nu subv / master strings.py
master

Tree @master (Download .tar.gz)

strings.py @masterraw · history · blame

#!/usr/bin/env python3
""" strings.py
Replaces literal strings with byte-slices

>>> from io import StringIO
>>> # doctest: +REPORT_NDIFF
... print(subv.join_all(strings(StringIO('''
... == data 0x80500000
... E_MAGIC:
...   @@/string "Invalid DTB magic!\\\\n\\\\0"
... S_TOTALSZ:
...   @@/string "Total Size: \\\\0"
... S_DASH:
...   @@/string " - \\\\0"
... '''[1:-1]))))
== data 0x80500000
E_MAGIC:
49/8 6e/8 76/8 61/8 6c/8 69/8 64/8 20/8 44/8 54/8 42/8 20/8 6d/8 61/8 67/8 69/8 63/8 21/8 a/8 0/8
S_TOTALSZ:
54/8 6f/8 74/8 61/8 6c/8 20/8 53/8 69/8 7a/8 65/8 3a/8 20/8 0/8
S_DASH:
20/8 2d/8 20/8 0/8
"""

import subv
from ast import literal_eval

@subv.with_parsed_lines
def strings(iter):
    for segment, line in iter:
        if line["type"] == "special" and line["special"][0] == ('@@', 'string'):
            string = literal_eval(line["special"][1])
            result = {
                "type": "instr",
                "instr": [(byte, 8) for byte in string.encode('utf-8')],
                "comment": None,
            }

            yield subv.format(result) 
        else:
            yield line["raw"]

if __name__ == "__main__":
    import sys

    for line in strings(sys.stdin):
        print(line)