209 lines
8.6 KiB
C
209 lines
8.6 KiB
C
// 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; }
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
#endif
|