diff options
Diffstat (limited to 'symbol_analyzer/main.py')
| -rw-r--r-- | symbol_analyzer/main.py | 110 |
1 files changed, 94 insertions, 16 deletions
diff --git a/symbol_analyzer/main.py b/symbol_analyzer/main.py index 1fa5457..f137cfb 100644 --- a/symbol_analyzer/main.py +++ b/symbol_analyzer/main.py @@ -1,26 +1,104 @@ +# this code was written to work, not to be maintained +# don't touch my trash + import os +import json from extractor import parse_file from parser import parse_definition_tokens from symbols import symbols_from_struct_tokens, symbols_from_enum_tokens -symbols = set() +stdlibs = [ + "stdlib.h", "assert.h", "stdio.h", "stdint.h", + "inttypes.h", "mman.h", "stdatomic.h", "string.h", "unistd.h", + "fcntl.h", "pthread.h" +] -for root, subdirs, files in os.walk("include"): - for file in files: - file_symbols = ["int", "bool", "char"] - definitions, usage = parse_file(root + "/" + file) - structs, enums, functions, typedefs = parse_definition_tokens( +files_content = { + "stdbool.h": { + "symbols": ["bool"], + "usage": [], + "imports": [] + } +} + +def handle(file): + files_content[file] = {} + file_symbols = ["int", "char"] + definitions, _ = parse_file(root + "/" + file) + structs, enums, functions, typedefs, imports, usage = \ + parse_definition_tokens( definitions, file_symbols ) - file_symbols.extend(symbols_from_struct_tokens(structs)) - file_symbols.extend(symbols_from_enum_tokens(enums)) - file_symbols.extend(functions) - file_symbols.extend(typedefs) - for item in file_symbols: - if item.isnumeric(): - continue - symbols.add(item) - -print(symbols) + file_symbols.extend(symbols_from_struct_tokens(structs)) + file_symbols.extend(symbols_from_struct_tokens(structs)) + file_symbols.extend(symbols_from_enum_tokens(enums)) + file_symbols.extend(functions) + file_symbols.extend(typedefs) + files_content[file]["symbols"] = set() + files_content[file]["imports"] = list(map(lambda x: x[1:-1] ,imports)) + files_content[file]["usage"] = usage + for item in file_symbols: + if item.isnumeric(): + continue + if "".join(item.split("_")).isalnum(): + files_content[file]["symbols"].add(item) + +for root, subdirs, files in os.walk("include"): + for file in files: + handle(file) +for root, subdirs, files in os.walk("src"): + for file in files: + handle(file) + +for file in files_content.keys(): + final_imports = set() + to_resolve = [] + for imported_file in files_content[file]["imports"]: + x = imported_file.split("/")[-1] + to_resolve.append(x) + final_imports.add(x) + + while len(to_resolve) > 0: + f = to_resolve.pop() + if f not in files_content: + if f not in stdlibs: + print(f) + assert f in stdlibs + continue + new_items = files_content[f]["imports"] + for new_item in new_items: + x = new_item.split("/")[-1] + to_resolve.append(x) + final_imports.add(x) + + files_content[file]["imports"] = final_imports + + +for file, file_content in files_content.items(): + symbols = list(file_content["symbols"]) + for imported_file in file_content["imports"]: + imported_file = imported_file.split("/")[-1] + if imported_file not in files_content: + assert imported_file in stdlibs + continue + symbols.extend(files_content[imported_file]["symbols"]) + symbols = set(symbols) + usage_set = set(file_content["usage"]) + files_content[file]["unused"] = symbols - usage_set + files_content[file]["used"] = symbols.intersection(usage_set) + +output = [] +for file in files_content.keys(): + output.append({ + "name": file, + "imports": list(files_content[file]["imports"]), + "symbols": list(files_content[file]["symbols"]), + "unused": list(files_content[file]["unused"]), + "used": list(files_content[file]["used"]) + }) + +with open("symbol_analyzer/analysis.js", "w") as f: + f.write("data = ") + json.dump(output, f) |
