p8btools/preprocessor.py

116 lines
2.5 KiB
Python

import io
class Cart:
def __init__(self,basecart):
contents = ""
with io.open(basecart,encoding="utf-8") as f:
contents = f.read()
lines = contents.split("\n")
if "__gfx__" not in lines:
lines.append("__gfx__")
self.header = "\n".join(lines[:3])
self.rest = "\n".join(lines[lines.index("__gfx__"):])
self.lua = "\n".join(lines[3:lines.index("__gfx__")])
@property
def fulltext(self):
return "\n".join(getattr(self,k) for k in ("header","lua","rest"))
class LuaCode:
def __init__(self,filename):
lines = []
with io.open(filename,encoding="utf-8") as f:
lines = [l.rstrip() for l in f if l]
self.lines = []
i=0
while i<len(lines):
if lines[i]:
self.lines.append(lines[i])
i+=1
self.c = 0
self.defines = dict()
def parseDefines(self):
if self.c!=0:
raise Exception("Parsing out of order")
self.c=1
l = []
for i in self.lines:
if i.startswith("--!define"):
p=i.split(" ",2)
self.defines[p[1]]=p[2]
else:
l.append(i)
self.lines = l
def parseIfdef(self):
if self.c!=1:
raise Exception("Parsing out of order")
self.c=2
l = []
i = 0
while i<len(self.lines):
if self.lines[i].startswith("--!ifdef"):
if not self.defines.get(self.lines[i].split(" ",2)[1]):
while i<len(self.lines) and self.lines[i]!="--!endif":
i+=1
elif self.lines[i].startswith("--!ifndef"):
if self.defines.get(self.lines[i].split(" ",2)[1]):
while i<len(self.lines) and self.lines[i]!="--!endif":
i+=1
elif self.lines[i]=="--!endif":
pass # don't include endifs
else:
l.append(self.lines[i])
i+=1
self.lines = l
def useDefines(self):
if self.c!=2:
raise Exception("Parsing out of order")
self.c=3
l = []
for i in self.lines:
for define in self.defines:
i = i.replace(define,self.defines[define])
l.append(i)
self.lines = l
def parseIncludes(self):
if self.c!=3:
raise Exception("Parsing out of order")
self.c=4
l = []
for i in self.lines:
if i.startswith("--!include"):
lua = self.__class__(i.split(" ",1)[1])
lua.parse()
for line in lua.lines:
l.append(line)
else:
l.append(i)
self.lines=l
def parse(self):
if self.c!=0:
raise Exception("Parsing out of order")
self.parseDefines()
self.parseIfdef()
self.useDefines()
self.parseIncludes()
@property
def text(self):
return "\n".join(self.lines)
def findall(s,p):
o=0
while len(s)>0 and (p in s):
yield o+s.find(p)
o+=s.find(p)+len(p)
s = s[s.find(p)+len(p):]
if __name__=="__main__":
l=LuaCode("test.lua")
l.parse()
print(l.text)