From 30717a85d213fbd7c3e7aae88a043c7dff0e7b26 Mon Sep 17 00:00:00 2001 From: "Pavel I. Kryukov" Date: Thu, 28 Feb 2019 22:35:25 +0300 Subject: Read opcodes from files (#23) Current generation flow assumes that opcodes are provided in a `cat ./opcodes | ./parse_opcodes -c' manner. However, Windows CMD has no `cat' command, and it uses `type' instead, so implementation of cross-platform script is complicated. In this patch, we allow parsing opcode files directly by Python, if their names are provided as a command line arguments, not depending on the host shell. If no arguments are passed, script behaves as usual, reading opcodes from the stdin. --- parse-opcodes | 135 ++++++++++++++++++++++++++++++++-------------------------- 1 file changed, 74 insertions(+), 61 deletions(-) diff --git a/parse-opcodes b/parse-opcodes index 73bbec8..82f5c22 100755 --- a/parse-opcodes +++ b/parse-opcodes @@ -947,70 +947,83 @@ def make_go(): print('\treturn nil, false') print('}') -for line in sys.stdin: - line = line.partition('#') - tokens = line[0].split() - - if len(tokens) == 0: - continue - assert len(tokens) >= 2 - - name = tokens[0] - pseudo = name[0] == '@' - if pseudo: - name = name[1:] - mymatch = 0 - mymask = 0 - cover = 0 - - if not name in list(arguments.keys()): - arguments[name] = [] - - for token in tokens[1:]: - if len(token.split('=')) == 2: - tokens = token.split('=') - if len(tokens[0].split('..')) == 2: - tmp = tokens[0].split('..') - hi = int(tmp[0]) - lo = int(tmp[1]) - if hi <= lo: - sys.exit("%s: bad range %d..%d" % (name,hi,lo)) +inputs = [] +for index in range(2, len(sys.argv)): + try: + inputs.append(open(sys.argv[index])) + except: + assert(0) +if not inputs: + inputs.append(sys.stdin) + +for f in inputs: + for line in f: + line = line.partition('#') + tokens = line[0].split() + + if len(tokens) == 0: + continue + assert len(tokens) >= 2 + + name = tokens[0] + pseudo = name[0] == '@' + if pseudo: + name = name[1:] + mymatch = 0 + mymask = 0 + cover = 0 + + if not name in list(arguments.keys()): + arguments[name] = [] + + for token in tokens[1:]: + if len(token.split('=')) == 2: + tokens = token.split('=') + if len(tokens[0].split('..')) == 2: + tmp = tokens[0].split('..') + hi = int(tmp[0]) + lo = int(tmp[1]) + if hi <= lo: + sys.exit("%s: bad range %d..%d" % (name,hi,lo)) + else: + hi = lo = int(tokens[0]) + + if tokens[1] != 'ignore': + val = int(tokens[1], 0) + if val >= (1 << (hi-lo+1)): + sys.exit("%s: bad value %d for range %d..%d" % (name,val,hi,lo)) + mymatch = mymatch | (val << lo) + mymask = mymask | ((1<<(hi+1))-(1<= (1 << (hi-lo+1)): - sys.exit("%s: bad value %d for range %d..%d" % (name,val,hi,lo)) - mymatch = mymatch | (val << lo) - mymask = mymask | ((1<<(hi+1))-(1<