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