mirror of
https://github.com/thepigeongenerator/mcaselector-lite.git
synced 2025-12-17 09:25:44 +01:00
implement nbt_nextcompound
this is still flawed, due to recursion and there being a better way. Just gotta find it.
This commit is contained in:
@@ -21,8 +21,33 @@ int nbt_primsize(u8 tag) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// BUG: recursive, been figuring out how to not have it recursive
|
||||||
const u8 *nbt_nextcompound(const u8 *restrict cdat) {
|
const u8 *nbt_nextcompound(const u8 *restrict cdat) {
|
||||||
return NULL;
|
const u8 *ptr = cdat;
|
||||||
|
do {
|
||||||
|
u16 slen = be16toh(*(u16 *)(ptr + 1));
|
||||||
|
uint mems = 0;
|
||||||
|
|
||||||
|
switch (*ptr) {
|
||||||
|
case NBT_I8:
|
||||||
|
case NBT_I16:
|
||||||
|
case NBT_I32:
|
||||||
|
case NBT_F32:
|
||||||
|
case NBT_I64:
|
||||||
|
case NBT_F64:
|
||||||
|
ptr += 3 + slen + nbt_primsize(*ptr);
|
||||||
|
continue; // continue the while loop; no more to be done
|
||||||
|
|
||||||
|
case NBT_ARR_I64: mems += sizeof(i64) - sizeof(i32); __attribute__((fallthrough));
|
||||||
|
case NBT_ARR_I32: mems += sizeof(i32) - sizeof(i8); __attribute__((fallthrough));
|
||||||
|
case NBT_ARR_I8: ptr += 3 + slen + ++mems * (i32)be32toh(*(u32 *)(ptr)) + 4; continue;
|
||||||
|
case NBT_STR: ptr += 3 + slen + be16toh(*(u16 *)(ptr)) + 2; continue;
|
||||||
|
|
||||||
|
case NBT_LIST: ptr = nbt_nextlist(3 + slen + ptr); continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
} while (ptr && *ptr != NBT_END);
|
||||||
|
return ptr + 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
const u8 *nbt_nextlist(const u8 *restrict ldat) {
|
const u8 *nbt_nextlist(const u8 *restrict ldat) {
|
||||||
|
|||||||
Reference in New Issue
Block a user