summaryrefslogtreecommitdiff
path: root/scripts
diff options
context:
space:
mode:
authorReiko Asakura2021-03-03 22:21:18 -0500
committerReiko Asakura2021-03-03 22:21:18 -0500
commit067a0ce1a72f220ee91ddd29a47a70f9abddc5a2 (patch)
treed7cd347de0839d3d4a7df7c20a7c61a72a13681d /scripts
parentAdd SceNpWebApi internal functions (diff)
downloadvds-libraries-067a0ce1a72f220ee91ddd29a47a70f9abddc5a2.tar.gz
Refactor lint scripts
Diffstat (limited to 'scripts')
-rw-r--r--scripts/nids-check-digest.py52
-rw-r--r--scripts/nids-check-sort.py58
-rw-r--r--scripts/nids.py95
3 files changed, 123 insertions, 82 deletions
diff --git a/scripts/nids-check-digest.py b/scripts/nids-check-digest.py
index 47a71d2..b386bb3 100644
--- a/scripts/nids-check-digest.py
+++ b/scripts/nids-check-digest.py
@@ -6,47 +6,33 @@
# Vita Development Suite Libraries
#
-import sys
from hashlib import sha1
from pathlib import Path
-from yaml import load
-try:
- from yaml import CLoader as Loader
-except ImportError:
- from yaml import SafeLoader as Loader
+import nids
def name2nid(n, s):
digest = sha1((n + s).encode('utf-8')).digest()
return int.from_bytes(digest[:4], byteorder='little')
-def print_ex_expect(exports, suffix):
- for name, nid in exports.items():
- computed_nid = name2nid(name, suffix)
+def module_cb(ud, modname, module):
+ ud[0] = modname
+
+def library_cb(ud, libname, library):
+ for suffix in ['', ud[0], libname]:
+ if library['nid'] == name2nid(libname, suffix):
+ print(f'{libname} [{suffix}]')
+ ud[1] = suffix
+ return
+ ud[1] = None
+
+def export_cb(ud, kind, name, nid):
+ if ud[1] is not None:
+ computed_nid = name2nid(name, ud[1])
if nid != computed_nid:
print(f' {nid:08X} ≠ {computed_nid:08X} {name}')
-def print_lib_expect(libname, lib, suffix):
- if lib['nid'] == name2nid(libname, suffix):
- print(f'{libname} [{suffix}]')
- if 'functions' in lib:
- print_ex_expect(lib['functions'], suffix)
- if 'variables' in lib:
- print_ex_expect(lib['variables'], suffix)
- return 1
- return 0
-
-def check_digest(d):
- for c in d.iterdir():
- if c.is_file():
- for modname, mod in load(c.read_bytes(), Loader=Loader)['modules'].items():
- for libname, lib in mod['libraries'].items():
- if not print_lib_expect(libname, lib, ''):
- if not print_lib_expect(libname, lib, libname):
- print_lib_expect(libname, lib, modname)
- elif c.is_dir():
- check_digest(c)
- else:
- sys.exit("Unexpected file type")
-
-check_digest(Path('nids'))
+def check_digest(f):
+ nids.process(f, module_cb=module_cb, library_cb=library_cb, export_cb=export_cb, user_data=[None, None])
+
+nids.iterdir('nids', check_digest)
diff --git a/scripts/nids-check-sort.py b/scripts/nids-check-sort.py
index d8764d6..98ce44b 100644
--- a/scripts/nids-check-sort.py
+++ b/scripts/nids-check-sort.py
@@ -7,55 +7,15 @@
#
import sys
-from pathlib import Path
-from yaml import load
-try:
- from yaml import CLoader as Loader
-except ImportError:
- from yaml import SafeLoader as Loader
+import nids
-def write_export_syms(syms):
- out = ''
- for name, nid in sorted(syms.items()):
- out += f' {name}: 0x{nid:08X}\n'
- return out
+def check_sort(f):
+ nids_string = f.read_text()
+ sorted_nids_string = nids.dump_string(nids_string)
+ if nids_string != sorted_nids_string:
+ print(f'{f} is not sorted')
+ print(sorted_nids_string)
+ sys.exit(1)
-def write_export_libs(exports):
- out = ''
- for libname, library in sorted(exports.items()):
- out += f' {libname}:\n'
- out += f' nid: 0x{library["nid"]:08X}\n'
- if 'functions' in library and library['functions']:
- out += ' functions:\n'
- out += write_export_syms(library['functions'])
- if 'variables' in library and library['variables']:
- out += ' variables:\n'
- out += write_export_syms(library['variables'])
- return out
-
-def write_nids(nids):
- out = 'modules:\n'
- for modname, module in sorted(nids['modules'].items()):
- out += f' {modname}:\n'
- out += f' nid: 0x{module["nid"]:08X}\n'
- if 'libraries' in module and module['libraries']:
- out += ' libraries:\n'
- out += write_export_libs(module['libraries'])
- return out
-
-def check_sort(d):
- for c in d.iterdir():
- if c.is_file():
- c_text = c.read_text()
- c_sorted = write_nids(load(c_text, Loader=Loader))
- if c_text != c_sorted:
- print(f'{c} is not sorted')
- print(c_sorted)
- sys.exit(1)
- elif c.is_dir():
- check_sort(c)
- else:
- sys.exit("Unexpected file type")
-
-check_sort(Path('nids'))
+nids.iterdir('nids', check_sort)
diff --git a/scripts/nids.py b/scripts/nids.py
new file mode 100644
index 0000000..6966076
--- /dev/null
+++ b/scripts/nids.py
@@ -0,0 +1,95 @@
+#!/usr/bin/env python3
+
+#
+# Copyright (C) 2021 Reiko Asakura. All Rights Reserved.
+#
+# Vita Development Suite Libraries
+#
+
+import sys
+from pathlib import Path
+
+import yaml
+try:
+ from yaml import CLoader as YamlLoader
+except ImportError:
+ from yaml import SafeLoader as YamlLoader
+
+def load(nids):
+ if isinstance(nids, Path):
+ nids = yaml.load(nids.read_bytes(), Loader=YamlLoader)
+ elif not isinstance(nids, dict):
+ nids = yaml.load(nids, Loader=YamlLoader)
+
+ return nids
+
+def process(nids, modules_cb=None, module_cb=None, libraries_cb=None, library_cb=None, functions_cb=None, variables_cb=None, export_cb=None, user_data=None):
+
+ nids = load(nids)
+
+ if modules_cb:
+ modules_cb(user_data, nids['modules'])
+ for modname, module in sorted(nids['modules'].items()):
+ if module_cb:
+ module_cb(user_data, modname, module)
+ if 'libraries' in module:
+ if libraries_cb:
+ libraries_cb(user_data, module['libraries'])
+ for libname, library in sorted(module['libraries'].items()):
+ if library_cb:
+ library_cb(user_data, libname, library)
+ if 'functions' in library:
+ if functions_cb:
+ functions_cb(user_data, library['functions'])
+ if export_cb:
+ for name, nid in sorted(library['functions'].items()):
+ export_cb(user_data, 'functions', name, nid)
+ if 'variables' in library:
+ if variables_cb:
+ variables_cb(user_data, library['variables'])
+ if export_cb:
+ for name, nid in sorted(library['variables'].items()):
+ export_cb(user_data, 'variables', name, nid)
+
+def dump_string(nids):
+ def modules_cb(ud, modules):
+ if modules:
+ ud.append('modules:\n')
+ else:
+ ud.append('modules: {}\n')
+
+ def module_cb(ud, modname, module):
+ ud.append(f' {modname}:\n')
+ ud.append(f' nid: 0x{module["nid"]:08X}\n')
+
+ def libraries_cb(ud, libraries):
+ if libraries:
+ ud.append(' libraries:\n')
+
+ def library_cb(ud, libname, library):
+ ud.append(f' {libname}:\n')
+ ud.append(f' nid: 0x{library["nid"]:08X}\n')
+
+ def functions_cb(ud, functions):
+ if functions:
+ ud.append(' functions:\n')
+
+ def variables_cb(ud, variables):
+ if variables:
+ ud.append(' variables:\n')
+
+ def export_cb(ud, kind, name, nid):
+ ud.append(f' {name}: 0x{nid:08X}\n')
+
+ ud = []
+ process(nids, modules_cb, module_cb, libraries_cb, library_cb, functions_cb, variables_cb, export_cb, ud)
+ return ''.join(ud)
+
+def iterdir(path, func):
+ for c in Path(path).iterdir():
+ if c.is_file():
+ func(c)
+ elif c.is_dir():
+ iterdir(c, func)
+ else:
+ sys.exit('Unexpected file type')