Twilight Princess
Decompilation of The Legend of Zelda: Twilight Princess
Loading...
Searching...
No Matches
binary.h
Go to the documentation of this file.
1#ifndef BINARY_H
2#define BINARY_H
3
5#include "dolphin/types.h"
7
8namespace JGadget {
9namespace binary {
10
11struct TEBit {
13};
14
15const void* parseVariableUInt_16_32_following(const void* pu16, u32* pu32First, u32* pu32Second,
16 TEBit* tebit);
17
18inline bool isPower2(unsigned int arg0) {
19 return arg0 != 0 && (arg0 & arg0 - 1) == 0;
20}
21
22inline u32 align_roundUp(unsigned int arg0, unsigned int uAlign) {
23 JUT_ASSERT(98, isPower2(uAlign));
24 return (arg0 + uAlign - 1) & ~(uAlign - 1);
25}
26
27struct TParseData {
28 TParseData(const void* pContent) : raw(pContent) {}
29
30 const void* getRaw() const { return raw; }
31 void setRaw(const void* p) { raw = p; }
32
33 /* 0x0 */ const void* raw;
34};
35
36template <int S>
38 TParseData_aligned(const void* pContent) : TParseData(pContent) {}
39 void setRaw(const void* p) {
40 /* if ((u32)p % S != 0) {
41 JUTWarn w;
42 w << "misaligned : " << (u32)p;
43 } */
44 static_cast<TParseData*>(this)->setRaw(p);
45 }
46};
47
48// Base for header and/or block parsing
50 virtual ~TParse_header_block() = 0;
51
52 virtual bool parseHeader_next(const void** ppData_inout, u32* puBlock_out, u32 arg2) = 0;
53 virtual bool parseBlock_next(const void** ppData_inout, u32* puData_out, u32 arg2) = 0;
54
55 bool parse_next(const void** ppData_inout, u32 a2);
56
57 bool parse(const void* ppData_inout, u32 a2) {
58 return parse_next(&ppData_inout, a2);
59 }
60
61 bool checkNext(const void** ptrLocation, u32* headerEnd, u32 idx) {
62 bool checkNext = false;
63 if (parseHeader_next(ptrLocation, headerEnd, idx)) {
64 checkNext = true;
65 }
66 return checkNext;
67 }
68};
69
70template <typename T>
72 typedef T ParseType;
73 static T parse(const void* data) { return (T)*(T*)data; }
74};
75
76template <typename T>
80
81template <typename T>
83 static T parse(const void* data) { return TParseValue_raw_<T>::parse(data); }
84};
85
86template <class Parser>
87struct TParseValue : public Parser {
88 static typename Parser::ParseType parse(const void* data) { return Parser::parse(data); }
89
90 static typename Parser::ParseType parse(const void* data, s32 advanceNum) {
91 return Parser::parse(advance(data, advanceNum));
92 }
93
94 static const void* advance(const void* data, s32 advanceNum) {
95 return (char*)data + (advanceNum * sizeof(Parser::ParseType));
96 }
97};
98
99template<class Parser, int size>
101 : public JGadget::TIterator<
102 std::random_access_iterator_tag,
103 typename Parser::ParseType,
104 ptrdiff_t,
105 typename Parser::ParseType*,
106 typename Parser::ParseType&
107 >
108 {
109 typedef typename Parser::ParseType ValueType;
110
111 TValueIterator(const void* begin) {
112 mBegin = reinterpret_cast<const char*>(begin);
113 }
114
115 const void* get() const { return mBegin; }
116
117 typename Parser::ParseType operator*() const {
119 }
120
122 mBegin += size;
123 return *this;
124 }
125
127 TValueIterator old(*this);
128 ++(*this);
129 return old;
130 }
131
133 mBegin += size * n;
134 return *this;
135 }
136
138 mBegin -= size;
139 return *this;
140 }
141
142 char const* mBegin;
143};
144
145template<typename T>
146struct TValueIterator_raw : public TValueIterator<TParseValue_raw<T>, sizeof(T)> {
147 TValueIterator_raw(const void* begin) : TValueIterator<TParseValue_raw<T>, sizeof(T)>(begin) {}
148
150 return a.mBegin == b.mBegin;
151 }
152
154 return !operator==(a, b);
155 }
156
157 friend TValueIterator<TParseValue_raw<T>, sizeof(T)> operator+(TValueIterator<TParseValue_raw<T>, sizeof(T)> a, s32 b) {
159 it += b;
160 return it;
161 }
162};
163
164template <typename T>
166 typedef T ParseType;
167 static T parse(const void* data) { return TParseValue_raw_<T>::parse(data); }
168};
169
170template <typename T>
174
175template<typename T>
176struct TValueIterator_misaligned : public TValueIterator<TParseValue_misaligned<T>, sizeof(T)> {
177 TValueIterator_misaligned(const void* begin) : TValueIterator<TParseValue_misaligned<T>, sizeof(T)>(begin) {}
178
180 return a.mBegin == b.mBegin;
181 }
182
184 return !operator==(a, b);
185 }
186
189 it += b;
190 return it;
191 }
192};
193
194} // namespace binary
195} // namespace JGadget
196
197#endif /* BINARY_H */
unsigned int size
Definition __os.h:106
unsigned long u32
Definition types.h:12
signed long s32
Definition types.h:11
p
Definition e_acos.c:98
n
Definition e_fmod.c:112
a
Definition k_cos.c:89
static const double T[]
Definition k_tan.c:106
bool isPower2(unsigned int arg0)
Definition binary.h:18
u32 align_roundUp(unsigned int arg0, unsigned int uAlign)
Definition binary.h:22
const void * parseVariableUInt_16_32_following(const void *pu16, u32 *pu32First, u32 *pu32Second, TEBit *tebit)
Definition binary.cpp:6
Definition binary.h:8
Definition search.h:38
Definition binary.h:11
u32 value
Definition binary.h:12
TParseData_aligned(const void *pContent)
Definition binary.h:38
void setRaw(const void *p)
Definition binary.h:39
Definition binary.h:27
TParseData(const void *pContent)
Definition binary.h:28
void setRaw(const void *p)
Definition binary.h:31
const void * getRaw() const
Definition binary.h:30
const void * raw
Definition binary.h:33
static T parse(const void *data)
Definition binary.h:83
T ParseType
Definition binary.h:166
static T parse(const void *data)
Definition binary.h:167
TParseValue_misaligned_< T > InnerParseValueClass
Definition binary.h:172
Definition binary.h:71
static T parse(const void *data)
Definition binary.h:73
T ParseType
Definition binary.h:72
Definition binary.h:77
TParseValue_raw_< T > InnerParseValueClass
Definition binary.h:78
Definition binary.h:87
static const void * advance(const void *data, s32 advanceNum)
Definition binary.h:94
static Parser::ParseType parse(const void *data, s32 advanceNum)
Definition binary.h:90
static Parser::ParseType parse(const void *data)
Definition binary.h:88
virtual ~TParse_header_block()=0
Definition binary.cpp:31
virtual bool parseHeader_next(const void **ppData_inout, u32 *puBlock_out, u32 arg2)=0
bool parse(const void *ppData_inout, u32 a2)
Definition binary.h:57
bool parse_next(const void **ppData_inout, u32 a2)
Definition binary.cpp:34
bool checkNext(const void **ptrLocation, u32 *headerEnd, u32 idx)
Definition binary.h:61
virtual bool parseBlock_next(const void **ppData_inout, u32 *puData_out, u32 arg2)=0
TValueIterator_misaligned(const void *begin)
Definition binary.h:177
friend bool operator!=(TValueIterator< TParseValue_misaligned< T >, sizeof(T)> a, TValueIterator< TParseValue_misaligned< T >, sizeof(T)> b)
Definition binary.h:183
friend bool operator==(TValueIterator< TParseValue_misaligned< T >, sizeof(T)> a, TValueIterator< TParseValue_misaligned< T >, sizeof(T)> b)
Definition binary.h:179
friend bool operator==(TValueIterator< TParseValue_raw< T >, sizeof(T)> a, TValueIterator< TParseValue_raw< T >, sizeof(T)> b)
Definition binary.h:149
TValueIterator_raw(const void *begin)
Definition binary.h:147
friend bool operator!=(TValueIterator< TParseValue_raw< T >, sizeof(T)> a, TValueIterator< TParseValue_raw< T >, sizeof(T)> b)
Definition binary.h:153
Definition binary.h:108
TValueIterator(const void *begin)
Definition binary.h:111
const void * get() const
Definition binary.h:115
Parser::ParseType ValueType
Definition binary.h:109
const TValueIterator operator++(int)
Definition binary.h:126
TValueIterator & operator+=(s32 n)
Definition binary.h:132
char const * mBegin
Definition binary.h:142
TValueIterator & operator++()
Definition binary.h:121
Parser::ParseType operator*() const
Definition binary.h:117
TValueIterator & operator--()
Definition binary.h:137