mirror of
https://github.com/idapython/src
synced 2026-06-08 14:47:00 +00:00
63 lines
2.4 KiB
Python
63 lines
2.4 KiB
Python
from __future__ import print_function
|
|
|
|
import sys
|
|
import os
|
|
import glob
|
|
|
|
from argparse import ArgumentParser
|
|
|
|
parser = ArgumentParser()
|
|
parser.add_argument("-i", "--input", required=True)
|
|
parser.add_argument("-o", "--output", required=True)
|
|
parser.add_argument("-m", "--modules", required=True)
|
|
parser.add_argument("-s", "--sdk", required=True)
|
|
args = parser.parse_args()
|
|
|
|
with open(args.input) as fin:
|
|
with open(args.output, "w") as fout:
|
|
parts = []
|
|
|
|
def add_imports_from_dep(depname):
|
|
DEPNAME = depname.upper()
|
|
for dep in glob.glob(os.path.join(args.sdk, "%s.*" % depname)):
|
|
parts.append(" #ifdef HAS_DEP_ON_INTERFACE_%s" % DEPNAME)
|
|
parts.append(" %import \"{0}.i\"".format(depname))
|
|
parts.append(" #else")
|
|
parts.append(" %import \"{0}\"".format(os.path.basename(dep)))
|
|
parts.append(" #endif")
|
|
parts.append("")
|
|
|
|
parts.append("#if defined(IDA_MODULE_PRO)")
|
|
parts.append("// nothing; has to be handled in pro.i")
|
|
parts.append("#else")
|
|
required_headers = ["pro", "ida", "xref", "typeinf", "enum", "netnode", "range", "lines", "kernwin", "bytes", "auto", "nalt", "idd", "idp", "gdl"]
|
|
# required_headers = ["pro", "ida", "xref", "typeinf", "enum", "netnode", "range", "lines", "kernwin", "bytes", "auto", "nalt", "idd", "idp", "dirtree"]
|
|
for rh in required_headers:
|
|
add_imports_from_dep(rh)
|
|
parts.append("#endif")
|
|
|
|
# Collect NONNULL typemaps
|
|
nonnul_typemaps_parts = []
|
|
for md_path in glob.glob(os.path.join(args.sdk, "*.metadata")):
|
|
with open(md_path, "rb") as md_fin:
|
|
raw = md_fin.read().decode("UTF-8")
|
|
md = eval(raw)
|
|
for ptype, pname in md:
|
|
nonnul_typemaps_parts.append(
|
|
"""
|
|
%%typemap(check) (%s %s)
|
|
{
|
|
if ( $1 == nullptr )
|
|
SWIG_exception_fail(SWIG_ValueError, "invalid null pointer " "in method '" "$symname" "', argument " "$argnum"" of type '" "$1_type""'");
|
|
}
|
|
""" % (ptype, pname))
|
|
|
|
# Can't use string.Template here, because it's a nightmare
|
|
# to use with a file that has many '$' is it.
|
|
template = fin.read()
|
|
result = template\
|
|
.replace("${ALL_IMPORTS}", "\n".join(parts))\
|
|
.replace("${NONNULL_TYPEMAPS}", "\n".join(nonnul_typemaps_parts))
|
|
|
|
fout.write(result)
|