mirror of
https://github.com/JGRennison/OpenTTD-patches.git
synced 2024-11-17 21:25:40 +00:00
e8015e497d
This simplifies processing nwidget parts as, unlike the remaining length, the pointer to the end of the list never changes. This is the same principle as we use(d) for tracking end instead of length for C-style strings. And this removes 160~ instances of the lengthof() macro.
51 lines
1.4 KiB
Python
51 lines
1.4 KiB
Python
"""
|
|
Script to scan the OpenTTD source-tree for ini_key issues in WindowDesc entries.
|
|
"""
|
|
|
|
import glob
|
|
import os
|
|
import re
|
|
import sys
|
|
|
|
|
|
def scan_source_files(path, ini_keys=None):
|
|
if ini_keys is None:
|
|
ini_keys = set()
|
|
|
|
errors = []
|
|
|
|
for new_path in glob.glob(f"{path}/*.cpp"):
|
|
if os.path.isdir(new_path):
|
|
errors.append(scan_source_files(new_path, ini_keys))
|
|
continue
|
|
|
|
with open(new_path) as fp:
|
|
output = fp.read()
|
|
|
|
for (name, ini_key, widgets) in re.findall(r"^static WindowDesc ([a-zA-Z0-9_]*).*?, (?:\"(.*?)\")?.*?,(?:\s+.*?,){6}\s+[^\s]+\((.*?)\)", output, re.S|re.M):
|
|
if ini_key:
|
|
if ini_key in ini_keys:
|
|
errors.append(f"{new_path}: {name} ini_key is a duplicate")
|
|
ini_keys.add(ini_key)
|
|
widget = re.findall("static const (?:struct )?NWidgetPart " + widgets + ".*?(?:WWT_(DEFSIZE|STICKY)BOX.*?)?;", output, re.S)[0]
|
|
if widget and not ini_key:
|
|
errors.append(f"{new_path}: {name} has WWT_DEFSIZEBOX/WWT_STICKYBOX without ini_key")
|
|
if ini_key and not widget:
|
|
errors.append(f"{new_path}: {name} has ini_key without WWT_DEFSIZEBOX/WWT_STICKYBOX")
|
|
|
|
return errors
|
|
|
|
|
|
def main():
|
|
errors = scan_source_files("src")
|
|
|
|
if errors:
|
|
print("\n".join(errors))
|
|
sys.exit(1)
|
|
|
|
print("OK")
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|