summaryrefslogtreecommitdiff
path: root/tests/projects/other/bin2obj/src/main.c
blob: 03c50352d5b15b9a1cc9be1ee89488bad935b2d1 (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
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
#include <stdio.h>
#include <stdint.h>
#include <ctype.h>
#include <string.h>

extern const uint8_t _binary_data_bin_start[];
extern const uint8_t _binary_data_bin_end[];

extern const uint8_t _binary_xmake_ico_start[];
extern const uint8_t _binary_xmake_ico_end[];

extern const uint8_t _binary_asset_bin_start[];
extern const uint8_t _binary_asset_bin_end[];

extern const uint8_t _binary_asset2_bin_start[];
extern const uint8_t _binary_asset2_bin_end[];

extern const uint8_t _binary_asset2_bin_start[];
extern const uint8_t _binary_asset2_bin_end[];

static void hexdump(const char* name, const uint8_t* data, uint32_t size) {
    printf("%s: size: %u bytes\n", name, (unsigned int)size);
    if (size == 0) {
        return;
    }

    // if file is larger than 128 bytes, only dump first 64 and last 64 bytes
    uint32_t dump_size = size;
    uint32_t start_offset = 0;
    uint32_t end_offset = 0;
    uint32_t skip_size = 0;

    if (size > 128) {
        dump_size = 64;
        start_offset = 0;
        end_offset = size - 64;
        skip_size = end_offset - start_offset - dump_size;
    }

    // dump start
    for (uint32_t offset = start_offset; offset < start_offset + dump_size; offset += 16) {
        // print offset
        printf("%08x  ", (unsigned int)offset);

        // print hex bytes (8 bytes, space, 8 bytes)
        for (uint32_t i = 0; i < 16; i++) {
            if (offset + i < size) {
                printf("%02x ", data[offset + i]);
            } else {
                printf("   ");
            }
            if (i == 7) {
                printf(" ");
            }
        }

        // print ASCII representation
        printf(" |");
        for (uint32_t i = 0; i < 16 && offset + i < size; i++) {
            uint8_t c = data[offset + i];
            printf("%c", isprint(c) ? c : '.');
        }
        printf("|\n");
    }

    // print skip indicator if needed
    if (skip_size > 0) {
        printf("        ... (skipped %u bytes) ...\n", (unsigned int)skip_size);
    }

    // dump end if needed
    if (size > 128) {
        for (uint32_t offset = end_offset; offset < size; offset += 16) {
            // print offset
            printf("%08x  ", (unsigned int)offset);

            // print hex bytes (8 bytes, space, 8 bytes)
            for (uint32_t i = 0; i < 16; i++) {
                if (offset + i < size) {
                    printf("%02x ", data[offset + i]);
                } else {
                    printf("   ");
                }
                if (i == 7) {
                    printf(" ");
                }
            }

            // print ASCII representation
            printf(" |");
            for (uint32_t i = 0; i < 16 && offset + i < size; i++) {
                uint8_t c = data[offset + i];
                printf("%c", isprint(c) ? c : '.');
            }
            printf("|\n");
        }
    }
}

int main(int argc, char** argv) {
    const uint32_t _binary_data_bin_size = (uint32_t)(_binary_data_bin_end - _binary_data_bin_start);
    const uint32_t _binary_xmake_ico_size = (uint32_t)(_binary_xmake_ico_end - _binary_xmake_ico_start);
    const uint32_t _binary_asset_bin_size = (uint32_t)(_binary_asset_bin_end - _binary_asset_bin_start);
    const uint32_t _binary_asset2_bin_size = (uint32_t)(_binary_asset2_bin_end - _binary_asset2_bin_start);

    hexdump("data.bin", _binary_data_bin_start, _binary_data_bin_size);
    printf("\n");
    hexdump("xmake.ico", _binary_xmake_ico_start, _binary_xmake_ico_size);
    printf("\n");
    hexdump("asset.bin (transformed)", _binary_asset_bin_start, _binary_asset_bin_size);
    printf("\n");
    hexdump("asset2.bin (transformed by lua file)", _binary_asset2_bin_start, _binary_asset2_bin_size);

    // verify the function transform: asset.bin must be the reverse of "hello transform!" (+ zeroend '\0')
    const char* expected = "!mrofsnart olleh";
    if (_binary_asset_bin_size != 17 || memcmp(_binary_asset_bin_start, expected, 16) != 0) {
        printf("asset.bin: transform verification failed!\n");
        return 1;
    }
    printf("asset.bin: transform verification ok\n");

    // verify the lua-file transform: asset2.bin must be the reverse of "hello luafile!" (+ zeroend '\0')
    const char* expected2 = "!elifaul olleh";
    if (_binary_asset2_bin_size != 15 || memcmp(_binary_asset2_bin_start, expected2, 14) != 0) {
        printf("asset2.bin: transform verification failed!\n");
        return 1;
    }
    printf("asset2.bin: transform verification ok\n");
    return 0;
}