| 80 | { |
| 81 | } |
| 82 | void Read(void* dst, int sz) { |
| 83 | char* dstBuf = (char*)dst; |
| 84 | while (sz > 0) { |
| 85 | if (BlockId >= Chain.GetBlockCount()) { |
| 86 | // JACKPOT! |
| 87 | fprintf(stderr, "reading beyond chain end: BlockId %d, Chain.GetBlockCount() %d, Pos %d, BlockPos %d\n", |
| 88 | BlockId, Chain.GetBlockCount(), Pos, BlockPos); |
| 89 | Y_ASSERT(0 && "reading beyond chain end"); |
| 90 | memset(dstBuf, 0, sz); |
| 91 | Failed = true; |
| 92 | return; |
| 93 | } |
| 94 | const TBlockChain::TBlock& blk = Chain.GetBlock(BlockId); |
| 95 | int copySize = Min(blk.Size - BlockPos, sz); |
| 96 | memcpy(dstBuf, blk.Data + BlockPos, copySize); |
| 97 | dstBuf += copySize; |
| 98 | Pos += copySize; |
| 99 | BlockPos += copySize; |
| 100 | sz -= copySize; |
| 101 | if (BlockPos == blk.Size) { |
| 102 | BlockPos = 0; |
| 103 | ++BlockId; |
| 104 | } |
| 105 | } |
| 106 | } |
| 107 | void Seek(int pos) { |
| 108 | if (pos < 0 || pos > Chain.GetSize()) { |
| 109 | Y_ASSERT(0); |
no test coverage detected