void ParseBuffer(uint_t count, Stream& source, Builder& target) { const std::size_t bufSize = source.GetBufferSize(); Dump buf(bufSize); std::size_t cursor = 0; uint_t flag = 0x40; //dX_flag while (count) { //dX_next flag <<= 1; if ((flag & 0xff) == 0) { flag = source.ReadByte(); flag = (flag << 1) | 1; } if ((flag & 0x100) != 0) { flag &= 0xff; uint_t counter = source.ReadCounter(); std::size_t srcPtr = source.ReadBackRef(); Require(count >= counter); Require(srcPtr < bufSize); count -= counter; while (counter--) { buf[cursor++] = buf[srcPtr++]; if (cursor >= bufSize) { target.AddValues(buf); cursor -= bufSize; } if (srcPtr >= bufSize) { srcPtr -= bufSize; } } } else { //dX_chr --count; buf[cursor++] = source.ReadByte(); if (cursor >= bufSize) { target.AddValues(buf); cursor -= bufSize; } } } if (cursor) { buf.resize(cursor); target.AddValues(buf); } }