summaryrefslogtreecommitdiff
path: root/preprocessor.py
diff options
context:
space:
mode:
authorBryan Bishop <kanzure@gmail.com>2013-08-28 17:53:26 -0500
committerBryan Bishop <kanzure@gmail.com>2013-08-28 17:53:26 -0500
commite4d3ea72569b3c326c264be9dda31e237475bd55 (patch)
treeb494cdd8d1f19010ff7f8a433b1fef481c731967 /preprocessor.py
parent16bfc0112428cd9f872e06b2ce6a2fe553b8eb11 (diff)
don't use globals in the preprocessor
Macros are now passed around as lists and dicts.
Diffstat (limited to 'preprocessor.py')
-rw-r--r--preprocessor.py33
1 files changed, 17 insertions, 16 deletions
diff --git a/preprocessor.py b/preprocessor.py
index 150faee11..54000a7a6 100644
--- a/preprocessor.py
+++ b/preprocessor.py
@@ -44,10 +44,6 @@ do_macro_sanity_check = False
class SkippableMacro(object):
macro_name = "db"
-skippable_macros = [SkippableMacro]
-
-macros += skippable_macros
-
chars = {
"ガ": 0x05,
"ギ": 0x06,
@@ -415,11 +411,10 @@ def quote_translator(asm):
def extract_token(asm):
return asm.split(" ")[0].strip()
-def make_macro_table():
+def make_macro_table(macros):
return dict(((macro.macro_name, macro) for macro in macros))
-macro_table = make_macro_table()
-def macro_test(asm):
+def macro_test(asm, macro_table):
"""
Returns a matching macro, or None/False.
"""
@@ -485,7 +480,7 @@ def macro_translator(macro, token, line, skippable_macros):
# "db" is a macro because of SkippableMacro
# rgbasm can handle "db" so no preprocessing is required
# (don't check its param count)
- if macro.macro_name == "db" and macro in skippable_macros:
+ if macro.__name__ in skippable_macros or (macro.macro_name == "db" and macro in skippable_macros):
sys.stdout.write(original_line)
return
@@ -542,7 +537,10 @@ def macro_translator(macro, token, line, skippable_macros):
index = 0
while index < len(params):
- param_type = macro.param_types[index - correction]
+ try:
+ param_type = macro.param_types[index - correction]
+ except KeyError as exception:
+ raise Exception("line is: " + str(line) + " and macro is: " + str(macro))
description = param_type["name"]
param_klass = param_type["class"]
byte_type = param_klass.byte_type # db or dw
@@ -588,7 +586,7 @@ def macro_translator(macro, token, line, skippable_macros):
sys.stdout.write(output)
-def read_line(l, skippable_macros):
+def read_line(l, skippable_macros, macro_table):
"""Preprocesses a given line of asm."""
# strip comments from asm
@@ -614,7 +612,7 @@ def read_line(l, skippable_macros):
# check against other preprocessor features
else:
- macro, token = macro_test(asm)
+ macro, token = macro_test(asm, macro_table)
if macro:
macro_translator(macro, token, asm, skippable_macros)
else:
@@ -622,13 +620,16 @@ def read_line(l, skippable_macros):
if comment: sys.stdout.write(comment)
-def preprocess(skippable_macros=None, lines=None):
+def preprocess(macros, skippable_macros=None, lines=None):
"""Main entry point for the preprocessor."""
if skippable_macros == None:
- # Note that this is bad because the macro table doesn't include the
- # skippable macros.
skippable_macros = [SkippableMacro]
+ macro_table = make_macro_table(list(set(macros + skippable_macros)))
+
+ # HACK for pokecrystal. Must be after make_macro_table call.
+ skippable_macros += ["TextEndingCommand"]
+
if not lines:
# read each line from stdin
lines = (sys.stdin.readlines())
@@ -637,8 +638,8 @@ def preprocess(skippable_macros=None, lines=None):
lines = lines.split("\n")
for l in lines:
- read_line(l, skippable_macros)
+ read_line(l, skippable_macros, macro_table)
# only run against stdin when not included as a module
if __name__ == "__main__":
- preprocess(skippable_macros=skippable_macros)
+ preprocess(macros)