| #!/usr/bin/python3 |
| |
| from lark import Lark, Transformer, Token, Tree |
| import sys |
| |
| from format_ldr import ScriptFormatLDR |
| from format_ipr import ScriptFormatIPR |
| |
| def split_hex(value): |
| """ split a string of hex digits into groups (bytes) of two digits. """ |
| return ' '.join(value[i:i+2] for i in range(0, len(value), 2)) |
| |
| def expand_cmd(cmd): |
| ret = "" |
| for e in cmd: |
| if e[0] == 'hexstr': |
| ret += e[1] |
| else: |
| raise ValueError("Unsupported '%s'" % (e[0])) |
| return ret |
| |
| |
| def ldr_stmt_to_ipr(s): |
| """ translate a single LDR statement to IPR format. """ |
| if s == None: |
| None |
| elif s == 'reset': |
| print("RESET") |
| print("") |
| elif s[0] == 'rem': |
| print("//\t%s" % s[1]) |
| elif s[0] == 'cmd': |
| cmd = s[1] |
| req = cmd['req'] |
| rsp = cmd['rsp'] |
| print("I: %s" % split_hex(expand_cmd([req]))) |
| if rsp != None and len(rsp) != 1: |
| if rsp[0] != 'swmatch' or len(rsp[1]) != 1: |
| raise ValueError("Unsupported '%s'" % (rsp)) |
| print("O: %s" % rsp[1][0]) |
| else: |
| print("O:") |
| print("") |
| else: |
| print("Unknown %s" % (s.pretty())) |
| raise ValueError() |
| |
| |
| test_text = ''' |
| RST |
| CMD E0 CA DF 1F 13 |
| CMD E0 CA DF 1F (90 00) |
| CMD E0 CA DF 1F (61 XX, 90 00) |
| REM foo bar |
| CMD E4 DA DF 20 09 EA 53 F8 D7 64 1E D9 88 00 \\ |
| (90 00 , 6B 00) |
| ''' |
| |
| |
| def run_statement(s): |
| print(s) |
| |
| def fii(s): |
| if s.data == 'rst': |
| print("=> RESET") |
| # FIXME: actually perform card reset |
| elif s.data == 'rem': |
| print(s) |
| elif s.data == 'cmd': |
| #print(s) |
| cmd = s.children[0] |
| print(s.pretty()) |
| # FIXME: if swmatch: match all contained swpattern |
| else: |
| print("Unknown %s" % (s.pretty())) |
| raise ValueError() |
| |
| |
| #process_ldr(test_text, run_statement) |
| #process_ldr(test_text, ldr_stmt_to_ipr) |
| |
| fmt = ScriptFormatLDR() |
| fmt.parse_process_file(sys.argv[1], ldr_stmt_to_ipr) |
| #fmt.parse_process_file(sys.argv[1], run_statement) |