mirror of
https://github.com/coop-deluxe/sm64coopdx.git
synced 2024-11-26 22:13:01 +00:00
75bb9b7912
* Refresh 13 Co-authored-by: n64 <n64>
104 lines
No EOL
2.5 KiB
Python
104 lines
No EOL
2.5 KiB
Python
import os
|
|
import re
|
|
import sys
|
|
|
|
def extract_level_defines(txt):
|
|
tmp = txt
|
|
txt = 'enum LevelNum {\n LEVEL_NONE,\n'
|
|
for line in tmp.splitlines():
|
|
if line.startswith('STUB_LEVEL') or line.startswith('DEFINE_LEVEL'):
|
|
txt += ' ' + line.split(',')[1].strip() + ',\n'
|
|
txt += ' LEVEL_COUNT,\n };'
|
|
return txt
|
|
|
|
extra_steps = {
|
|
"levels/level_defines.h": extract_level_defines,
|
|
}
|
|
|
|
def extract_constants(filename):
|
|
with open(filename) as file:
|
|
txt = file.read()
|
|
|
|
# perform special functions
|
|
short_filename = filename.split('/../', 1)[-1]
|
|
if short_filename in extra_steps:
|
|
txt = extra_steps[short_filename](txt)
|
|
|
|
# strip comments
|
|
txt = re.sub('//.*', ' ', txt)
|
|
while ('/*' in txt):
|
|
s1 = txt.split('/*', 1)
|
|
s2 = s1[1].split('*/', 1)
|
|
txt = s1[0] + s2[-1]
|
|
|
|
# strip multiline continues
|
|
txt = re.sub(r'\\\n', ' ', txt)
|
|
|
|
# strip extern C
|
|
txt = re.sub(r'extern "C" {', ' ', txt)
|
|
|
|
# single-line blocks
|
|
txt = re.sub(r'{\n', '{ ', txt)
|
|
txt = re.sub(r'\n{', ' {', txt)
|
|
tmp = txt
|
|
txt = ''
|
|
inside = 0
|
|
for character in tmp:
|
|
if inside != 0 and character == '\n':
|
|
continue
|
|
|
|
txt += character
|
|
|
|
if character == '{':
|
|
inside += 1
|
|
|
|
if character == '}':
|
|
inside -= 1
|
|
|
|
# normalize whitespace
|
|
txt = txt.replace('\t', ' ')
|
|
while (' ' in txt):
|
|
txt = txt.replace(' ', ' ')
|
|
while ('\n\n' in txt):
|
|
txt = txt.replace('\n\n', '\n')
|
|
|
|
# BAD culling of ifdef version
|
|
tmp = txt
|
|
txt = ''
|
|
inside = 0
|
|
for line in tmp.splitlines():
|
|
line = line.strip()
|
|
if line == '#ifdef VERSION_JP':
|
|
inside = 1
|
|
continue
|
|
if line == '#ifdef VERSION_EU':
|
|
inside = 1
|
|
continue
|
|
if line == '#else':
|
|
inside = 0
|
|
continue
|
|
if line == '#endif':
|
|
inside = 0
|
|
continue
|
|
if inside == 0:
|
|
txt += line + '\n'
|
|
|
|
# cull obvious non-enums, non-defines
|
|
tmp = txt
|
|
txt = ''
|
|
for line in tmp.splitlines():
|
|
line = line.strip()
|
|
if line.startswith('enum '):
|
|
txt += line + '\n'
|
|
if line.startswith('#define '):
|
|
pieces = line.split(' ')
|
|
if len(pieces) < 3:
|
|
continue
|
|
if '(' in pieces[1]:
|
|
continue
|
|
txt += line + '\n'
|
|
|
|
return txt
|
|
|
|
if __name__ == "__main__":
|
|
print(extract_constants(sys.argv[1])) |