14 auto bytes = [&](
size_t count) {
15 if (count > data.size() - cursor)
20 auto count32 = [&](uint32_t limit, uint32_t& value) {
24 for (
int i = 0; i < 4; ++i)
25 value |= uint32_t(
static_cast<uint8_t
>(data[cursor - 4 + i])) << (8 * i);
26 return value <= limit;
31 return static_cast<uint8_t
>(data[cursor - 1]) <= 1;
35 for (
int i = 0; i < 5; ++i) {
38 const auto value =
static_cast<uint8_t
>(data[cursor - 1]);
39 if (i == 4 && (value & 0xf0))
41 length |= uint32_t(value & 127) << (7 * i);
43 return length <= 1024 * 1024 && bytes(length);
48 return absl::DataLossError(
"Malformed or oversized ZSM asset");
50 if (data.size() > 8 * 1024 * 1024)
53 if (!count32(256, count))
55 for (uint32_t i = 0; i < count; ++i)
56 if (!
string() || !bytes(3))
58 if (!count32(256, count))
60 for (uint32_t i = 0; i < count; ++i) {
62 if (!count32(128, tiles))
64 for (uint32_t j = 0; j < tiles; ++j)
65 if (!bytes(3) || !
boolean() || !
boolean() || !bytes(1) || !
boolean() ||
69 for (
int i = 0; i < 20; ++i)
74 if (cursor < data.size()) {
75 if (!
string() || !count32(1024, count))
77 for (uint32_t i = 0; i < count; ++i)
78 if (!
string() || !
string())
81 if (cursor < data.size() && !
string())
83 return cursor == data.size() ? absl::OkStatus() : invalid();