summaryrefslogtreecommitdiff
path: root/scripts
diff options
context:
space:
mode:
authorReiko Asakura2021-02-18 18:01:36 -0500
committerReiko Asakura2021-02-18 18:01:36 -0500
commit03d5e98a07c3c53055a5ebc6c416e1ad73d01c24 (patch)
tree408cda16ae82d962f7506dc12e032448734ba8bc /scripts
parentAdd sceKernelCreateHeap flags and opts (diff)
downloadvds-libraries-03d5e98a07c3c53055a5ebc6c416e1ad73d01c24.tar.gz
Add NIDs digest check to lint workflow
Diffstat (limited to '')
-rw-r--r--scripts/nids-check-digest.py52
1 files changed, 52 insertions, 0 deletions
diff --git a/scripts/nids-check-digest.py b/scripts/nids-check-digest.py
new file mode 100644
index 0000000..47a71d2
--- /dev/null
+++ b/scripts/nids-check-digest.py
@@ -0,0 +1,52 @@
+#!/usr/bin/env python3
+
+#
+# Copyright (C) 2021 Reiko Asakura. All Rights Reserved.
+#
+# 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
+
+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)
+ 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'))