mirror of
https://git.code.sf.net/p/quake/quakeforge
synced 2024-11-29 23:52:22 +00:00
15a906aadb
No geometry is created yet. Both id and quest formats are supported. e1m1.map parses in less than two seconds on my system.
72 lines
2.6 KiB
Python
72 lines
2.6 KiB
Python
# vim:ts=4:et
|
|
|
|
class Script:
|
|
def __init__(self, filename, text, single="{}()':"):
|
|
self.filename = filename
|
|
self.text = text
|
|
self.single = single
|
|
self.pos = 0
|
|
self.line = 1
|
|
self.unget = False
|
|
def tokenAvailable(self, crossline=False):
|
|
if self.unget:
|
|
return True
|
|
while self.pos < len(self.text):
|
|
while self.pos < len(self.text) and self.text[self.pos].isspace():
|
|
if self.text[self.pos] == "\n":
|
|
if not crossline:
|
|
return False
|
|
self.line += 1
|
|
self.pos += 1
|
|
if self.pos == len(self.text):
|
|
return False
|
|
if self.text[self.pos] in ["\x1a", "\x04"]:
|
|
# end of file characters
|
|
self.pos += 1
|
|
continue
|
|
if self.text[self.pos:self.pos + 2] == "//":
|
|
while (self.pos < len(self.text)
|
|
and self.text[self.pos] != "\n"):
|
|
self.pos += 1
|
|
if self.pos == len(self.text):
|
|
return False
|
|
if not crossline:
|
|
return False
|
|
continue
|
|
return True
|
|
return False
|
|
def getToken(self, crossline=False):
|
|
if self.unget:
|
|
self.unget = False
|
|
return self.token
|
|
if not self.tokenAvailable(crossline):
|
|
if not crossline:
|
|
self.error(self, "line is incomplete")
|
|
return None
|
|
if self.text[self.pos] == "\"":
|
|
self.pos += 1
|
|
start = self.pos
|
|
if self.text[self.pos] == len(self.text):
|
|
self.error(self, "EOF inside quoted string")
|
|
while self.text[self.pos] != "\"":
|
|
if self.pos == len(self.text):
|
|
self.error(self, "EOF inside quoted string")
|
|
return None
|
|
if self.text[self.pos] == "\n":
|
|
self.line += 1
|
|
self.pos += 1
|
|
self.token = self.text[start:self.pos]
|
|
self.pos += 1
|
|
else:
|
|
start = self.pos
|
|
if self.text[self.pos] in self.single:
|
|
self.pos += 1
|
|
else:
|
|
while (self.pos < len(self.text)
|
|
and not self.text[self.pos].isspace()
|
|
and self.text[self.pos] not in self.single):
|
|
self.pos += 1
|
|
self.token = self.text[start:self.pos]
|
|
return self.token
|
|
def ungetToken(self):
|
|
self.unget = True
|