- int thereIsSize = (unpackSize != (UInt64)(Int64)-1);\r
- Byte inBuf[IN_BUF_SIZE];\r
- Byte outBuf[OUT_BUF_SIZE];\r
- size_t inPos = 0, inSize = 0, outPos = 0;\r
- LzmaDec_Init(state);\r
- for (;;)\r
- {\r
- if (inPos == inSize)\r
- {\r
- inSize = IN_BUF_SIZE;\r
- RINOK(inStream->Read(inStream, inBuf, &inSize));\r
- inPos = 0;\r
- }\r
- {\r
- SRes res;\r
- SizeT inProcessed = inSize - inPos;\r
- SizeT outProcessed = OUT_BUF_SIZE - outPos;\r
- ELzmaFinishMode finishMode = LZMA_FINISH_ANY;\r
- ELzmaStatus status;\r
- if (thereIsSize && outProcessed > unpackSize)\r
- {\r
- outProcessed = (SizeT)unpackSize;\r
- finishMode = LZMA_FINISH_END;\r
- }\r
-\r
- res = LzmaDec_DecodeToBuf(state, outBuf + outPos, &outProcessed,\r
- inBuf + inPos, &inProcessed, finishMode, &status);\r
- inPos += inProcessed;\r
- outPos += outProcessed;\r
- unpackSize -= outProcessed;\r
-\r
- if (outStream)\r
- if (outStream->Write(outStream, outBuf, outPos) != outPos)\r
- return SZ_ERROR_WRITE;\r