diff options
Diffstat (limited to 'scripts')
-rw-r--r-- | scripts/nids-check-digest.py | 52 | ||||
-rw-r--r-- | scripts/nids-check-sort.py | 58 | ||||
-rw-r--r-- | scripts/nids.py | 95 |
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') |