| 213 | } |
| 214 | |
| 215 | IReader* IReader::open_chunk_iterator(u32& ID, IReader* _prev) |
| 216 | { |
| 217 | if (0 == _prev) |
| 218 | { |
| 219 | // first |
| 220 | rewind(); |
| 221 | } |
| 222 | else |
| 223 | { |
| 224 | // next |
| 225 | seek(_prev->iterpos); |
| 226 | _prev->close(); |
| 227 | } |
| 228 | |
| 229 | // open |
| 230 | if (elapsed() < static_cast<long>(sizeof(u32) * 2)) |
| 231 | return nullptr; |
| 232 | |
| 233 | ID = r_u32(); |
| 234 | size_t _size = r_u32(); |
| 235 | |
| 236 | //На всякий случай тут тоже так сделаем по аналогии с find_chunk() |
| 237 | if (elapsed() < static_cast<long>(_size)) |
| 238 | { |
| 239 | Msg("!![%s] chunk [%u] has invalid size [%lu], return elapsed size [%d]", __FUNCTION__, ID, _size, elapsed()); |
| 240 | _size = elapsed(); |
| 241 | } |
| 242 | |
| 243 | if (ID & CFS_CompressMark) |
| 244 | { |
| 245 | // compressed |
| 246 | u8* dest; |
| 247 | size_t dest_sz; |
| 248 | _decompressLZ(&dest, &dest_sz, pointer(), _size); |
| 249 | return xr_new<CTempReader>(dest, dest_sz, tell() + _size); |
| 250 | } |
| 251 | else |
| 252 | { |
| 253 | // normal |
| 254 | return xr_new<IReader>(pointer(), _size, tell() + _size); |
| 255 | } |
| 256 | } |
| 257 | |
| 258 | constexpr unsigned char boms[]{0xef, 0xbb, 0xbf}; |
| 259 |
no test coverage detected