| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213 |
- // patch_private.h
- //
- /*
- The MIT License (MIT)
- Copyright (c) 2012-2018 HouSisong
-
- Permission is hereby granted, free of charge, to any person
- obtaining a copy of this software and associated documentation
- files (the "Software"), to deal in the Software without
- restriction, including without limitation the rights to use,
- copy, modify, merge, publish, distribute, sublicense, and/or sell
- copies of the Software, and to permit persons to whom the
- Software is furnished to do so, subject to the following
- conditions:
-
- The above copyright notice and this permission notice shall be
- included in all copies of the Software.
-
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
- OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
- HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
- WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- OTHER DEALINGS IN THE SOFTWARE.
- */
- #ifndef HPatch_patch_private_h
- #define HPatch_patch_private_h
- #include "patch_types.h"
- #ifdef __cplusplus
- extern "C" {
- #endif
-
- //byte rle type , ctrl code: high 2bit + packedLen(6bit+...)
- typedef enum TByteRleType{
- kByteRleType_rle0 = 0, //00 rle 0 , data code:0 byte
- kByteRleType_rle255= 1, //01 rle 255, data code:0 byte
- kByteRleType_rle = 2, //10 rle x(1--254), data code:1 byte (save x)
- kByteRleType_unrle = 3 //11 n byte data, data code:n byte(save no rle data)
- } TByteRleType;
-
- static const hpatch_uint kByteRleType_bit=2;
-
- typedef struct _THDiffzHead{
- hpatch_StreamPos_t coverCount;
-
- hpatch_StreamPos_t cover_buf_size;
- hpatch_StreamPos_t compress_cover_buf_size;
- hpatch_StreamPos_t rle_ctrlBuf_size;
- hpatch_StreamPos_t compress_rle_ctrlBuf_size;
- hpatch_StreamPos_t rle_codeBuf_size;
- hpatch_StreamPos_t compress_rle_codeBuf_size;
- hpatch_StreamPos_t newDataDiff_size;
- hpatch_StreamPos_t compress_newDataDiff_size;
-
- hpatch_StreamPos_t typesEndPos;
- hpatch_StreamPos_t compressSizeBeginPos;
- hpatch_StreamPos_t headEndPos;
- hpatch_StreamPos_t coverEndPos;
- } _THDiffzHead;
-
- hpatch_BOOL read_diffz_head(hpatch_compressedDiffInfo* out_diffInfo,_THDiffzHead* out_head,
- const hpatch_TStreamInput* compressedDiff);
- // Stream Clip cache
- typedef struct TStreamCacheClip{
- hpatch_StreamPos_t streamPos;
- hpatch_StreamPos_t streamPos_end;
- const hpatch_TStreamInput* srcStream;
- unsigned char* cacheBuf;
- hpatch_size_t cacheBegin;
- hpatch_size_t cacheEnd;
- } TStreamCacheClip;
- hpatch_inline static
- void _TStreamCacheClip_init(TStreamCacheClip* sclip,const hpatch_TStreamInput* srcStream,
- hpatch_StreamPos_t streamPos,hpatch_StreamPos_t streamPos_end,
- unsigned char* aCache,hpatch_size_t cacheSize){
- assert((streamPos<=streamPos_end)&&(streamPos_end<=(srcStream?srcStream->streamSize:0)));
- sclip->streamPos=streamPos;
- sclip->streamPos_end=streamPos_end;
- sclip->srcStream=srcStream;
- sclip->cacheBuf=aCache;
- sclip->cacheBegin=cacheSize;
- sclip->cacheEnd=cacheSize;
- }
-
- #define _TStreamCacheClip_isFinish(sclip) ( 0==_TStreamCacheClip_leaveSize(sclip) )
- #define _TStreamCacheClip_isCacheEmpty(sclip) ( (sclip)->cacheBegin==(sclip)->cacheEnd )
- #define _TStreamCacheClip_cachedSize(sclip) ( (hpatch_size_t)((sclip)->cacheEnd-(sclip)->cacheBegin) )
- #define _TStreamCacheClip_leaveSize(sclip) \
- ( (hpatch_StreamPos_t)((sclip)->streamPos_end-(sclip)->streamPos) \
- + (hpatch_StreamPos_t)_TStreamCacheClip_cachedSize(sclip) )
- #define _TStreamCacheClip_readPosOfSrcStream(sclip) ( \
- (sclip)->streamPos - _TStreamCacheClip_cachedSize(sclip) )
-
- hpatch_BOOL _TStreamCacheClip_updateCache(TStreamCacheClip* sclip);
-
- hpatch_inline static //error return 0
- unsigned char* _TStreamCacheClip_accessData(TStreamCacheClip* sclip,hpatch_size_t readSize){
- //assert(readSize<=sclip->cacheEnd);
- if (readSize>_TStreamCacheClip_cachedSize(sclip)){
- if (!_TStreamCacheClip_updateCache(sclip)) return 0;
- if (readSize>_TStreamCacheClip_cachedSize(sclip)) return 0;
- }
- return &sclip->cacheBuf[sclip->cacheBegin];
- }
- #define _TStreamCacheClip_skipData_noCheck(sclip,skipSize) ((sclip)->cacheBegin+=skipSize)
- hpatch_BOOL _TStreamCacheClip_skipData(TStreamCacheClip* sclip,hpatch_StreamPos_t skipLongSize);
-
- hpatch_inline static //error return 0
- unsigned char* _TStreamCacheClip_readData(TStreamCacheClip* sclip,hpatch_size_t readSize){
- unsigned char* result=_TStreamCacheClip_accessData(sclip,readSize);
- _TStreamCacheClip_skipData_noCheck(sclip,readSize);
- return result;
- }
- hpatch_BOOL _TStreamCacheClip_readDataTo(TStreamCacheClip* sclip,
- unsigned char* out_buf,unsigned char* bufEnd);
- hpatch_BOOL _TStreamCacheClip_addDataTo(TStreamCacheClip* self,unsigned char* dst,hpatch_size_t addLen);
- hpatch_BOOL _TStreamCacheClip_unpackUIntWithTag(TStreamCacheClip* sclip,
- hpatch_StreamPos_t* result,const hpatch_uint kTagBit);
- hpatch_BOOL _TStreamCacheClip_readType_end(TStreamCacheClip* sclip,unsigned char endTag,
- char out_type[hpatch_kMaxPluginTypeLength+1]);
- // Stream Clip cache
- typedef struct {
- hpatch_StreamPos_t writeToPos;
- const hpatch_TStreamOutput* dstStream;
- unsigned char* cacheBuf;
- hpatch_size_t cacheCur;
- hpatch_size_t cacheEnd;
- } _TOutStreamCache;
- static hpatch_inline void _TOutStreamCache_init(_TOutStreamCache* self,const hpatch_TStreamOutput* dstStream,
- unsigned char* aCache,hpatch_size_t aCacheSize){
- self->writeToPos=0;
- self->cacheCur=0;
- self->dstStream=dstStream;
- self->cacheBuf=aCache;
- self->cacheEnd=aCacheSize;
- }
- hpatch_inline static
- void _TOutStreamCache_resetCache(_TOutStreamCache* self,unsigned char* aCache,hpatch_size_t aCacheSize){
- assert(0==self->cacheCur);
- self->cacheBuf=aCache;
- self->cacheEnd=aCacheSize;
- }
- static hpatch_inline hpatch_StreamPos_t _TOutStreamCache_leaveSize(const _TOutStreamCache* self){
- return self->dstStream->streamSize-self->writeToPos;
- }
- static hpatch_inline hpatch_BOOL _TOutStreamCache_isFinish(const _TOutStreamCache* self){
- return self->writeToPos==self->dstStream->streamSize;
- }
- static hpatch_inline hpatch_size_t _TOutStreamCache_cachedDataSize(const _TOutStreamCache* self){
- return self->cacheCur;
- }
- hpatch_BOOL _TOutStreamCache_flush(_TOutStreamCache* self);
- hpatch_BOOL _TOutStreamCache_write(_TOutStreamCache* self,const unsigned char* data,hpatch_size_t dataSize);
- hpatch_BOOL _TOutStreamCache_fill(_TOutStreamCache* self,hpatch_byte fillValue,hpatch_StreamPos_t fillLength);
- hpatch_BOOL _TOutStreamCache_copyFromClip(_TOutStreamCache* self,TStreamCacheClip* src,hpatch_StreamPos_t copyLength);
- hpatch_BOOL _TOutStreamCache_copyFromStream(_TOutStreamCache* self,const hpatch_TStreamInput* src,
- hpatch_StreamPos_t srcPos,hpatch_StreamPos_t copyLength);
- hpatch_BOOL _TOutStreamCache_copyFromSelf(_TOutStreamCache* self,hpatch_StreamPos_t aheadLength,hpatch_StreamPos_t copyLength);
- typedef struct _TDecompressInputStream{
- hpatch_TStreamInput IInputStream;
- hpatch_TDecompress* decompressPlugin;
- hpatch_decompressHandle decompressHandle;
- } _TDecompressInputStream;
-
- hpatch_BOOL getStreamClip(TStreamCacheClip* out_clip,_TDecompressInputStream* out_stream,
- hpatch_StreamPos_t dataSize,hpatch_StreamPos_t compressedSize,
- const hpatch_TStreamInput* stream,hpatch_StreamPos_t* pCurStreamPos,
- hpatch_TDecompress* decompressPlugin,unsigned char* aCache,hpatch_size_t cacheSize);
-
- #define _TDiffToSingleStream_kBufSize hpatch_kStreamCacheSize
- typedef struct {
- hpatch_TStreamInput base;
- const hpatch_TStreamInput* diffStream;
- hpatch_StreamPos_t readedSize;
- hpatch_size_t cachedBufBegin;
- hpatch_BOOL isInSingleStream;
- unsigned char buf[_TDiffToSingleStream_kBufSize];
- } TDiffToSingleStream;
- void TDiffToSingleStream_init(TDiffToSingleStream* self,const hpatch_TStreamInput* diffStream);
- hpatch_inline static
- void TDiffToSingleStream_setInSingleStream(TDiffToSingleStream* self,hpatch_StreamPos_t singleStreamPos){
- self->isInSingleStream=hpatch_TRUE; }
-
- hpatch_inline static
- void TDiffToSingleStream_resetStream(TDiffToSingleStream* self,const hpatch_TStreamInput* diffStream){
- self->diffStream=diffStream; }
- #ifdef __cplusplus
- }
- #endif
- #endif
|