From 1b7bc825d503bc7bbb200d70099349265954c0cd Mon Sep 17 00:00:00 2001 From: rajdakin Date: Tue, 5 May 2020 16:34:06 +0200 Subject: [PATCH] [DYNAREC] Refactored the printer generator (3) --- rebuild_printer.py | 33 ++++++++++++++++++++------------- 1 file changed, 20 insertions(+), 13 deletions(-) diff --git a/rebuild_printer.py b/rebuild_printer.py index 281bbd6f..3b71ebbc 100755 --- a/rebuild_printer.py +++ b/rebuild_printer.py @@ -28,7 +28,7 @@ def arr2hex(a, forceBin=False): return "0b" + ''.join(map(str, a)) else: al = len(a) - return int2hex(sum([v * 2**(al - i - 1) for i, v in enumerate(a)]), ceil(al / 4)) + return int2hex(sum(v * 2**(al - i - 1) for i, v in enumerate(a)), ceil(al / 4)) def sz2str(sz, forceBin=False): return int2hex(2 ** sz - 1) if not forceBin else ("0b" + "1" * sz) @@ -234,31 +234,38 @@ def main(root, ver, __debug_forceAllDebugging=False): statements.append(statement[:-1]) curSplt = curSplt + 1 - # Now get the (correct!) remainder and glue everything together + # Now get the (correct!) remainder(s) dynvars = [dynvar.split(',') for dynvar in spltln[curSplt].split(';')] - if any([len(dynvar) != len(statements) + 2 for dynvar in dynvars]): + if any(len(dynvar) != len(statements) + 2 for dynvar in dynvars): fail(KeyError, "Not enough or too many commas (@@ modifier, final part)!") + dynvars = list(map(lambda i: [dv[i] for dv in dynvars], range(len(dynvars[0])))) - for i, stmt in enumerate(statements): + # Glue everything together + for stmt, vals in zip(statements, dynvars[1:]): append("if (" + stmt + ") {\n") - for dynvar in dynvars: - append(dynvar[0] + " = " + dynvar[i + 1] + ";\n") + for var, val in zip(dynvars[0], vals): + append(var + " = " + val + ";\n") append("} else ") append("{\n") - for dynvar in dynvars: - append(dynvar[0] + " = " + dynvar[-1] + ";\n") + for var, val in zip(dynvars[0], dynvars[-1]): + append(var + " = " + val + ";\n") append("}\n") curSplt = curSplt + 1 else: - # Simple string switch (true then op = str1, false then op = str2, separated by commas) - if len(dynvar) != len(eq) + 1: + # Standard if, standard statement + dynvars = [dynvar.split(',') for dynvar in spltln[curSplt].split(';')] + dynvars[-1][-1] = dynvars[-1][-1][:-1] + if any(len(dynvar) != len(eq) + 1 for dynvar in dynvars): fail(ValueError, "Not enough/too many possibilities in string switch") + dynvars = list(map(lambda i: [dv[i] for dv in dynvars], range(len(dynvars[0])))) - for e, dv in zip(eq[1:], dynvar[1:-1]): + for e, vals in zip(eq[1:], dynvars[1:]): append("if (" + eq[0] + " == " + e + ") {\n") - append(dynvar[0] + " = " + dv + ";\n} else ") + for var, val in zip(dynvars[0], vals): + append(var + " = " + val + ";\n} else ") append("{\n") - append(dynvar[0] + " = " + dynvar[-1][:-1] + ";\n}\n") + for var, val in zip(dynvars[0], dynvars[-1]): + append(var + " = " + val + ";\n}\n") curSplt = curSplt + 1 elif spltln[curSplt] == "set": # Set a (new?) variable