summaryrefslogtreecommitdiff
path: root/tools/ghidra/tp_class_to_cpp.py
blob: 9d2de60776c99bb3e20bdcf8c9b89c780c5907bb (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
# Dumps structure members to C format with comments and names
#@Pheenoh / Taka
#@category
#@keybinding 
#@menupath 
#@toolbar 

dtm = currentProgram.getDataTypeManager();

type_name = askString("Generate Struct Members", "Enter a data type name: ")
struct = dtm.getDataType("/" + type_name)

size = struct.getLength()
size_str = str("{:X}".format(size))

offset_pad_size = len(size_str)

check = False
start_address = ""
member_name = ""
undefined_member_name = ""

for i in range (struct.numComponents):
    data_type = str(struct.getComponent(i).getDataType().getName())
    offset = struct.getComponent(i).getOffset()
    hex_offset_string = str("0x%0*X" % (offset_pad_size, offset))

    if struct.getComponent(i).getFieldName() is not None:
        member_name = str(struct.getComponent(i).getFieldName())
    else:
        member_name = "field_"+hex_offset_string.lower()

    # if undefined member
    if data_type == 'undefined' or check == True:
        if data_type == 'undefined':
            if check == False:
                check = True
                start_address = hex_offset_string
            continue

        check = False
        undefined_member_name = "field_"+start_address+"["+hex_offset_string+" - "+start_address+"]"

    if undefined_member_name != "":
        undefined_member_name = "/* " +start_address+" */ u8 "+undefined_member_name+";"
        print(undefined_member_name)
        undefined_member_name = ""

    # turn 'byte' members into u8
    if data_type == 'byte':
	data_type = 'u8'

    # turn 'pointer' members into void*
    if data_type == 'pointer':
	data_type = 'void*'

    if data_type == 'float':
	data_type = 'f32'

    data_type = str(data_type)

    if "[" in data_type:
        # move array to member name
        array_start_idx = data_type.find("[")
        array = data_type[array_start_idx:]
        data_type = data_type[0:array_start_idx]
        member_name = member_name+array
    
    member_string = "/* " +hex_offset_string+" */ "+str(data_type).replace(" ","")+" "+member_name+";"
    print(member_string)