Index: misc/valid.py
===================================================================
--- misc/valid.py	(revision 83ea4323db515f8436c0c3d4c5ab2c3886cb8f7c)
+++ misc/valid.py	(revision 83ea4323db515f8436c0c3d4c5ab2c3886cb8f7c)
@@ -0,0 +1,47 @@
+#!/usr/bin/env python3
+
+from sys import stdout
+from pycparser import c_ast, parse_file, c_generator
+
+cross_gcc = "/opt/cross-m68k/bin/m68k-none-elf-gcc"
+
+gen = c_generator.CGenerator()
+decls = {}
+
+with open("misc/c-files.txt", "r") as f:
+    for path in f:
+        path = path.rstrip()
+
+        stdout.write("parsing {}                    \r".format(path))
+        stdout.flush()
+
+        ast = parse_file(path, use_cpp = True, cpp_path = cross_gcc,
+                         cpp_args = ["-E", "-D", "PYCP", "-I", "include"])
+        # ast.show()
+
+        for node in ast.ext:
+            decl = None
+
+            if type(node) is c_ast.Decl and \
+               node.name is not None:
+                decl = node
+
+            elif type(node) is c_ast.FuncDef:
+                decl = node.decl
+
+            else:
+                continue
+
+            decl.storage = [x for x in decl.storage if x != "extern"]
+            decl.init = None
+
+            text = gen.visit(decl)
+
+            if decl.name in decls:
+                if decls[decl.name] != text:
+                    print("Inconsistency: {} vs. {}".format(text, decls[decl.name]))
+
+            else:
+                decls[decl.name] = text
+
+print("")
