Files
2025-03-13 16:17:53 +01:00

65 lines
1.8 KiB
Python

import sys
import logging
import re
logging.basicConfig(stream=sys.stdout)
logger = logging.getLogger(__name__)
class CleanLoggerAdapter(logging.LoggerAdapter):
objaddr_re = re.compile(r"(<[a-zA-Z0-9\.\s_']* at )0x[0-9a-f]*(>)")
def process(self, msg, kwargs):
msg = re.sub(self.objaddr_re, r"\1(snipped)\2", msg)
return msg, kwargs
def getChild(self, suffix):
sub_logger = self.logger.getChild(suffix)
return CleanLoggerAdapter(sub_logger, self.extra)
logger = CleanLoggerAdapter(logger, {})
import importlib
import ast
import os
__dir__, _ = os.path.split(__file__)
import astor_0_8_1
def parse_options():
from argparse import ArgumentParser
p = ArgumentParser()
p.add_argument("-m", "--idapython-module-name", required=True)
p.add_argument("-i", "--input", required=True)
p.add_argument("-x", "--doxygen-xml", required=True)
p.add_argument("-c", "--cpp-wrapper", required=True)
p.add_argument("-r", "--pydoc-overrides", required=True)
p.add_argument("-o", "--output", required=True)
p.add_argument("-d", "--debug", default=False, action="store_true")
p.add_argument("-p", "--passes", required=True)
return p.parse_args()
opts = parse_options()
if opts.debug:
logger.setLevel(logging.DEBUG)
with open(opts.input) as fin:
tree = ast.parse(fin.read(), filename=opts.input)
import pypasses.doxy
setattr(opts, "dx_module", pypasses.doxy.parse(opts, logger))
for one_pass in opts.passes.split(","):
module_name = f"pypasses.{one_pass}"
module = importlib.import_module(module_name)
sub_logger = logger.getChild(module_name)
module.process(tree, opts, sub_logger)
tree = ast.fix_missing_locations(tree)
clob = astor_0_8_1.to_source(tree)
with open(opts.output, "wb") as fout:
fout.write(clob.encode("UTF-8"))