def main(args=None):
    """Main function."""
    import logging
    import sys

    parser, args = _parse_args(args=args)
    if not args.i:
        parser.print_usage()
        return 0

    logging.basicConfig(format="%(filename)s: %(message)s")
    if args.v > 0:
        logging.getLogger().setLevel(logging.INFO)

    if args.ccargs and args.ccargs[0] == "--":
        clang_args = args.ccargs[1:]
    else:
        clang_args = args.ccargs

    choose_cindex_impl(args.cindex)
    from cbind.cindex import Diagnostic
    from cbind.codegen import CodeGen
    from cbind.ctypes_binding import CtypesBindingGenerator
    from cbind.macro import MacroGenerator
    from cbind.source import SyntaxTree

    CodeGen.ENABLE_CPP = args.enable_cpp
    CodeGen.ASSERT_LAYOUT = args.assert_layout
    SyntaxTree.SEVERITY = getattr(Diagnostic, args.severity.capitalize())

    cbgen = CtypesBindingGenerator()
    if args.config:
        try:
            import yaml
        except ImportError:
            parser.error("could not load Python package yaml")
        cbgen.config(yaml.load(args.config))

    for c_src in args.i:
        cbgen.parse(c_src, args=clang_args)
    if args.enable_macro:
        mcgen = MacroGenerator(macro_int=args.macro_int)
        for c_src in args.i:
            mcgen.parse(c_src, args=clang_args)

    if args.o == "-":
        output = sys.stdout
    else:
        output = open(args.o, "w")
    with output:
        cbgen.generate_preamble(parser.prog, args.l, output)
        cbgen.generate(output)
        if args.enable_macro:
            mcgen.generate(output)

    return 0
    def run_test(self, c_code, python_code, macro_int=None, stderr=None):
        '''Generate Python code from C code and compare it to the answer.'''
        with os.fdopen(self.header_fd, 'w') as header_file:
            header_file.write(c_code)

        mcgen = MacroGenerator(macro_int=macro_int)
        mcgen.parse(self.header_path, None, stderr=stderr)
        output = StringIO()
        mcgen.generate(output)
        gen_code = output.getvalue()

        error_message = prepare_error_message(python_code, gen_code)
        self.assertTrue(compare_codes(gen_code, python_code), error_message)
def main(args=None):
    '''Main function.'''
    import logging
    import sys

    parser, args = _parse_args(args=args)
    if not args.i:
        parser.print_usage()
        return 0

    logging.basicConfig(format='%(filename)s: %(message)s')
    if args.v > 0:
        logging.getLogger().setLevel(logging.INFO)

    if args.ccargs and args.ccargs[0] == '--':
        clang_args = args.ccargs[1:]
    else:
        clang_args = args.ccargs

    choose_cindex_impl(args.cindex)
    from cbind.cindex import Diagnostic
    from cbind.codegen import CodeGen
    from cbind.ctypes_binding import CtypesBindingGenerator
    from cbind.macro import MacroGenerator
    from cbind.source import SyntaxTree

    CodeGen.ENABLE_CPP = args.enable_cpp
    CodeGen.ASSERT_LAYOUT = args.assert_layout
    SyntaxTree.SEVERITY = getattr(Diagnostic, args.severity.capitalize())

    cbgen = CtypesBindingGenerator()
    if args.config:
        try:
            import yaml
        except ImportError:
            parser.error('could not load Python package yaml')
        cbgen.config(yaml.load(args.config))

    for c_src in args.i:
        cbgen.parse(c_src, args=clang_args)
    if args.enable_macro:
        mcgen = MacroGenerator(macro_int=args.macro_int)
        for c_src in args.i:
            mcgen.parse(c_src, args=clang_args)

    if args.o == '-':
        output = sys.stdout
    else:
        output = open(args.o, 'w')
    with output:
        cbgen.generate_preamble(parser.prog, args.l, output)
        cbgen.generate(output)
        if args.enable_macro:
            mcgen.generate(output)

    return 0
    def run_test(self, c_code, python_code, macro_int=None, stderr=None):
        '''Generate Python code from C code and compare it to the answer.'''
        with os.fdopen(self.header_fd, 'w') as header_file:
            header_file.write(c_code)

        mcgen = MacroGenerator(macro_int=macro_int)
        mcgen.parse(self.header_path, None, stderr=stderr)
        output = StringIO()
        mcgen.generate(output)
        gen_code = output.getvalue()

        error_message = prepare_error_message(python_code, gen_code)
        self.assertTrue(compare_codes(gen_code, python_code), error_message)