summaryrefslogtreecommitdiff
path: root/scripts/nids.py
blob: e9a556764124f7189b4ae14ed869413825ed8e15 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
#!/usr/bin/env python3

#
#   Copyright (C) 2021 Reiko Asakura. All Rights Reserved.
#
#   Vita Development Suite Libraries
#

import sys
from pathlib import Path

from ruamel.yaml import YAML

def load(nids):
	return nids if isinstance(nids, dict) else YAML(typ='safe').load(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')