summaryrefslogtreecommitdiff
path: root/src/JSystem/JGadget/binary.cpp
blob: af491912658cfab2d15e84bba141f5ccd94dc78d (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
#include "JSystem/JSystem.h" // IWYU pragma: keep

#include "JSystem/JGadget/binary.h"
#include "JSystem/JGadget/define.h"
#include <stdint>

#if DEBUG
static void dummyString() {
    // probably some stripped function that called JUT_ASSERT here
    DEAD_STRING("Halt");
}
#endif

const void* JGadget::binary::parseVariableUInt_16_32_following(const void* pBuffer, u32* pu32First, u32* pu32Second,
                                                               JGadget::binary::TEBit* pTEBit) {
    u16* pu16 = (u16*)pBuffer;
    JUT_ASSERT(122, pu16!=NULL);
    JUT_ASSERT(123, pu32First!=NULL);
    JUT_ASSERT(124, pu32Second!=NULL);

    JGadget::binary::TEBit spC;
    if (pTEBit == NULL) {
        pTEBit = &spC;
    }

    u32 var_r30 = *pu16;
    if ((var_r30 & 0x8000) == 0) {
        pTEBit->value = 0x10;

        *pu32First = var_r30;
        pu16++;
        *pu32Second =  *pu16;

        return pu16 + 1;
    } else {
        pTEBit->value = 0x20;

        var_r30 &= 0x7FFF;
        var_r30 <<= 16;
        pu16++;
        var_r30 |= *pu16;

        *pu32First = var_r30;
        pu16++;
        *pu32Second = *(u32*)pu16;

        return pu16 + 2;
    }
}

JGadget::binary::TParse_header_block::~TParse_header_block() {}

bool JGadget::binary::TParse_header_block::parse_next(const void** ppData_inout, u32 idx) {
    u32 uBlock, uData;
    
    if (ppData_inout == NULL || *ppData_inout == NULL) {
        JGADGET_WARNMSG(172, "data not specified");
        return false;
    }

    bool var_r29 = true;
    var_r29 = parseHeader_next(ppData_inout, &uBlock, idx) && var_r29;

    if (!(idx & 1) && !var_r29) {
        return var_r29;
    }
    
    while (uBlock > 0) {
        const void* p = *ppData_inout;
        var_r29 = parseBlock_next(ppData_inout, &uData, idx) && var_r29;

        JUT_ASSERT(192, std::uintptr_t(*ppData_inout)==std::uintptr_t(p)+uData);

        if ((idx & 2) == 0 && !var_r29) {
            return var_r29;
        }
        uBlock--;
    }

    return var_r29;
}