示例#1
0
 def test_void_int(self) -> None:
     parser = cpptypeinfo.TypeParser()
     cpptypeinfo.parse_source(parser, 'void func(int a);', debug=True)
     func = parser.root_namespace.functions[0]
     self.assertEqual(TypeRef(cpptypeinfo.Void(), False), func.result)
     self.assertEqual(1, len(func.params))
     self.assertEqual(TypeRef(cpptypeinfo.Int32()), func.params[0].typeref)
示例#2
0
def gen(args):
    parser = cpptypeinfo.TypeParser()
    includes = [pathlib.Path(x) for x in args.include]
    headers = [pathlib.Path(x) for x in args.header]
    if args.d3d11:
        dir = get_windowskits()
        headers.append(dir / 'shared/ntdef.h')
        headers.append(dir / 'shared/basetsd.h')
        headers.append(dir / 'shared/wtypes.h')
        # headers.append(dir / 'um/winnt.h')
        headers.append(dir / 'um/d3d11.h')
        headers.append(dir / 'um/d3dtypes.h')
        headers.append(dir / 'um/d3dcommon.h')
        headers.append(dir / 'um/d3d10.h')
        headers.append(dir / 'shared/dxgi.h')
        headers.append(dir / 'um/dcommon.h')
        # headers.append(dir / 'um/d2dbasetypes.h')
        headers.append(dir / 'um/dxgicommon.h')
        headers.append(dir / 'um/dxgiformat.h')
        headers.append(dir / 'shared/dxgitype.h')

    decl_map = cpptypeinfo.parse_files(parser, includes=includes, *headers)

    if args.lang == 'dlang':
        cpptypeinfo.languages.dlang.generate(parser, decl_map, headers,
                                             pathlib.Path(args.dst).absolute(),
                                             ['windowskits', 'd3d11'])
    elif args.clang == 'csharp':
        cpptypeinfo.languages.csharp.generate(
            parser, decl_map,
            pathlib.Path(args.dst).absolute())
    else:
        raise NotImplementedError()
示例#3
0
 def test_function(self) -> None:
     parser = cpptypeinfo.TypeParser()
     cpptypeinfo.parse_source(parser, 'typedef void (*T)();', debug=True)
     typedef = parser.root_namespace.user_type_map['T']
     if not isinstance(typedef, cpptypeinfo.usertype.Typedef):
         raise Exception()
     self.assertEqual(typedef.typeref.ref, cpptypeinfo.UInt64())
示例#4
0
    def test_namespace(self) -> None:
        parser = cpptypeinfo.TypeParser()
        cpptypeinfo.parse_source(parser,
                                 '''
namespace A
{
    namespace B
    {
        struct C
        {

        }
    }
}
''',
                                 debug=True)

        self.assertEqual(1, len(parser.root_namespace._children))
        a = parser.root_namespace._children[0]

        self.assertEqual('A', a.name)
        self.assertEqual(1, len(a._children))

        b = a._children[0]
        self.assertEqual(1, len(b._children))
        self.assertEqual('B', b.name)

        c = b._children[0]
        self.assertEqual(0, len(c._children))
        self.assertEqual('C', c.name)
示例#5
0
 def test_int8_ptr(self) -> None:
     parser = cpptypeinfo.TypeParser()
     cpptypeinfo.parse_source(parser, 'typedef char* T;', debug=True)
     typedef = parser.root_namespace.user_type_map['T']
     if not isinstance(typedef, cpptypeinfo.usertype.Typedef):
         raise Exception()
     self.assertEqual(typedef.typeref.ref,
                      cpptypeinfo.usertype.Pointer(cpptypeinfo.Int8()))
示例#6
0
    def test_callback(self) -> None:
        parser = cpptypeinfo.TypeParser()
        cpptypeinfo.parse_source(parser,
                                 '''
typedef struct _NCB {
    void (*ncb_post)( struct _NCB * ); /* POST routine address        */
} NCB, *PNCB;
''',
                                 debug=True)
示例#7
0
    def test_linklist(self) -> None:
        parser = cpptypeinfo.TypeParser()
        cpptypeinfo.parse_source(parser,
                                 '''
typedef struct _LIST_ENTRY {
   struct _LIST_ENTRY *Flink;
   struct _LIST_ENTRY *Blink;
} LIST_ENTRY;
''',
                                 debug=True)
示例#8
0
    def test_struct_forward_pointer(self) -> None:
        parser = cpptypeinfo.TypeParser()
        cpptypeinfo.parse_source(parser,
                                 '''
typedef struct Forward *T;
''',
                                 debug=True)
        typedef = parser.root_namespace.user_type_map['T']
        if not isinstance(typedef, cpptypeinfo.usertype.Typedef):
            raise Exception()
示例#9
0
    def test_elaborated(self) -> None:
        parser = cpptypeinfo.TypeParser()
        cpptypeinfo.parse_source(parser,
                                 '''
typedef struct __crt_locale_pointers
{
    struct __crt_locale_data*    locinfo;
    struct __crt_multibyte_data* mbcinfo;
} __crt_locale_pointers
''',
                                 debug=True)
示例#10
0
 def test_resolve_function(self) -> None:
     parser = cpptypeinfo.TypeParser()
     parser.typedef('uint8_t', 'unsigned char')
     func = parser.parse('uint8_t* (uint8_t, const uint8_t *)').ref
     if not isinstance(func, cpptypeinfo.usertype.Function):
         raise Exception()
     parser.resolve_typedef_by_name('uint8_t')
     self.assertEqual(func.result,
                      cpptypeinfo.usertype.Pointer(cpptypeinfo.UInt8()))
     self.assertEqual(func.params[0].typeref, cpptypeinfo.UInt8())
     self.assertEqual(
         func.params[1].typeref,
         cpptypeinfo.usertype.Pointer(cpptypeinfo.UInt8().to_const()))
示例#11
0
    def test_anonymous_union(self) -> None:
        parser = cpptypeinfo.TypeParser()
        cpptypeinfo.parse_source(parser,
                                 '''
typedef struct D3D11_VIDEO_COLOR
    {
    union 
        {
        int YCbCr;
        float RGBA;
        } 	;
    } 	D3D11_VIDEO_COLOR;
''',
                                 debug=True)
示例#12
0
    def test_struct(self) -> None:
        parser = cpptypeinfo.TypeParser()
        cpptypeinfo.parse_source(parser,
                                 '''
typedef struct Tag {
} T;

typedef T* TP;
''',
                                 debug=True)
        typedef = parser.root_namespace.user_type_map['T']
        if not isinstance(typedef, cpptypeinfo.usertype.Typedef):
            raise Exception()
        self.assertEqual(typedef.typeref.ref,
                         cpptypeinfo.usertype.Struct('Tag'))
示例#13
0
    def test_excpt(self) -> None:
        parser = cpptypeinfo.TypeParser()
        cpptypeinfo.parse_source(parser,
                                 '''
        int __cdecl __C_specific_handler(
            struct _EXCEPTION_RECORD*   ExceptionRecord,
            void*                       EstablisherFrame,
            struct _CONTEXT*            ContextRecord,
            struct _DISPATCHER_CONTEXT* DispatcherContext
            );
''',
                                 debug=True)
        func = parser.root_namespace.functions[0]
        self.assertEqual(TypeRef(cpptypeinfo.Void(), False), func.result)
        self.assertEqual(1, len(func.params))
        self.assertEqual(TypeRef(cpptypeinfo.Int32()), func.params[0].typeref)
示例#14
0
    def test_cimgui(self) -> None:
        parser = cpptypeinfo.TypeParser()
        cpptypeinfo.parse_files(
            parser, CIMGUI_H, cpp_flags=[f'-DCIMGUI_DEFINE_ENUMS_AND_STRUCTS'])

        for ns in parser.root_namespace.traverse():
            if isinstance(ns, cpptypeinfo.usertype.Struct):
                continue

            for k, v in ns.user_type_map.items():
                with self.subTest(name=k):
                    print(f'{ns}{v}')

            for v in ns.functions:
                if v.name:
                    with self.subTest(name=v.name):
                        print(f'{ns}{v}')
示例#15
0
import unittest
import pathlib
import cpptypeinfo
from cpptypeinfo.usertype import (Field, Struct, Pointer, Param, Function)

HERE = pathlib.Path(__file__).absolute().parent
IMGUI_H = HERE.parent / 'libs/imgui/imgui.h'

parser = cpptypeinfo.TypeParser()
EXPECTS = {
    'ImDrawChannel':
    parser.parse('struct ImDrawChannel'),
    'ImDrawCmd':
    parser.parse('struct ImDrawCmd'),
    'ImDrawData':
    parser.parse('struct ImDrawData'),
    'ImDrawList':
    parser.parse('struct ImDrawList'),
    'ImDrawListSharedData':
    parser.parse('struct ImDrawListSharedData'),
    'ImDrawListSplitter':
    parser.parse('struct ImDrawListSplitter'),
    'ImDrawVert':
    parser.parse('struct ImDrawVert'),
    'ImFont':
    parser.parse('struct ImFont'),
    'ImFontAtlas':
    parser.parse('struct ImFontAtlas'),
    'ImFontConfig':
    parser.parse('struct ImFontConfig'),
    'ImFontGlyph':
示例#16
0
 def test_function(self) -> None:
     parser = cpptypeinfo.TypeParser()
     cpptypeinfo.parse_source(parser, SOURCE, debug=True)
示例#17
0
def debug(args):
    parser = cpptypeinfo.TypeParser()
    cpptypeinfo.parse_files(parser, pathlib.Path(args.header), debug=True)
示例#18
0
 def test_resolve_function(self) -> None:
     parser = cpptypeinfo.TypeParser()
     typedef = parser.typedef('uint8_t', 'unsigned char')
     self.assertEqual(typedef.get_concrete_type(), cpptypeinfo.UInt8())