1
0
Code Issues Pull Requests Packages Projects Releases Wiki Activity GitHub Gitee

81 lines
3.2 KiB
C
Raw Normal View History

2021-04-04 12:17:57 +08:00
// hpatch.c
// Copyright 2021 housisong, All rights reserved
2021-04-04 15:50:40 +08:00
#include "hpatch.h"
#include "HDiffPatch/libHDiffPatch/HPatch/patch.h"
2021-04-04 16:02:24 +08:00
#include "HDiffPatch/file_for_patch.h"
enum {
2021-04-04 17:03:39 +08:00
kHPatch_ok = 0,
kHPatch_error_info =-1,
kHPatch_error_old_fopen =-2,
kHPatch_error_old_fread =-3,
kHPatch_error_old_fclose =-4,
kHPatch_error_pat_fopen =-5,
kHPatch_error_pat_fread =-6,
kHPatch_error_pat_fclose =-7,
kHPatch_error_new_fopen =-8,
kHPatch_error_new_fwrite =-9,
kHPatch_error_new_fclose =-10,
2021-04-04 16:02:24 +08:00
};
2021-04-04 15:50:40 +08:00
2021-04-04 17:03:39 +08:00
#define _check(v,errorType) do{ \
if (!(v)){ if (result==kHPatch_ok) result=errorType; if (!_isInClear){ goto _clear; }; } }while(0)
2021-04-04 15:50:40 +08:00
int hpatch_getInfo_by_mem(struct hpatch_singleCompressedDiffInfo* out_patinfo,
const uint8_t* pat,size_t patsize){
hpatch_TStreamInput patStream;
mem_as_hStreamInput(&patStream,pat,pat+patsize);
if (!getSingleCompressedDiffInfo(out_patinfo,&patStream,0))
2021-04-04 16:02:24 +08:00
return kHPatch_error_info;//data error;
return kHPatch_ok; //ok
}
2021-04-04 17:03:39 +08:00
static int hpatch_by_stream(const hpatch_TStreamInput* old,hpatch_BOOL isLoadOldToMem,const hpatch_TStreamInput* pat,
hpatch_TStreamOutput* out_new,const hpatch_singleCompressedDiffInfo* patInfo){
//todo:
return -1;
2021-04-04 15:50:40 +08:00
}
2021-04-04 12:17:57 +08:00
2021-04-04 16:02:24 +08:00
int hpatch_by_mem(const uint8_t* old,size_t oldsize,uint8_t* newBuf,size_t newsize,
2021-04-04 17:03:39 +08:00
const uint8_t* pat,size_t patsize,const struct hpatch_singleCompressedDiffInfo* patInfo){
2021-04-04 16:02:24 +08:00
hpatch_TStreamInput oldStream;
hpatch_TStreamInput patStream;
hpatch_TStreamOutput newStream;
mem_as_hStreamInput(&oldStream,old,old+oldsize);
mem_as_hStreamInput(&patStream,pat,pat+patsize);
mem_as_hStreamOutput(&newStream,newBuf,newBuf+newsize);
2021-04-04 17:03:39 +08:00
return hpatch_by_stream(&oldStream,hpatch_FALSE,&patStream,&newStream,patInfo);
2021-04-04 12:17:57 +08:00
}
int hpatch_by_file(const char* oldfile, const char* newfile, const char* patchfile){
2021-04-04 17:03:39 +08:00
int result=kHPatch_ok;
int _isInClear=hpatch_FALSE;
int patch_result;
hpatch_TFileStreamInput oldStream;
hpatch_TFileStreamInput patStream;
hpatch_TFileStreamOutput newStream;
hpatch_TFileStreamInput_init(&oldStream);
hpatch_TFileStreamInput_init(&patStream);
hpatch_TFileStreamOutput_init(&newStream);
_check(hpatch_TFileStreamInput_open(&oldStream,oldfile),kHPatch_error_old_fopen);
_check(hpatch_TFileStreamInput_open(&patStream,patchfile),kHPatch_error_pat_fopen);
_check(hpatch_TFileStreamOutput_open(&newStream,newfile,~(hpatch_StreamPos_t)0),kHPatch_error_new_fopen);
patch_result=hpatch_by_stream(&oldStream.base,hpatch_TRUE,&patStream.base,&newStream.base,0);
if (patch_result!=kHPatch_ok){
_check(!oldStream.fileError,kHPatch_error_old_fread);
_check(!patStream.fileError,kHPatch_error_pat_fread);
_check(!newStream.fileError,kHPatch_error_new_fwrite);
_check(hpatch_FALSE,patch_result);
}
_clear:
_isInClear=hpatch_TRUE;
_check(hpatch_TFileStreamInput_close(&oldStream),kHPatch_error_old_fclose);
_check(hpatch_TFileStreamInput_close(&patStream),kHPatch_error_pat_fclose);
_check(hpatch_TFileStreamOutput_close(&newStream),kHPatch_error_new_fclose);
return result;
}