添加BSDIFF差分补丁算法工具
This commit is contained in:
parent
e911a8a799
commit
a326008bf5
@ -137,27 +137,27 @@
|
|||||||
<ConfigurationType>StaticLibrary</ConfigurationType>
|
<ConfigurationType>StaticLibrary</ConfigurationType>
|
||||||
<UseDebugLibraries>true</UseDebugLibraries>
|
<UseDebugLibraries>true</UseDebugLibraries>
|
||||||
<CharacterSet>Unicode</CharacterSet>
|
<CharacterSet>Unicode</CharacterSet>
|
||||||
<PlatformToolset>v142</PlatformToolset>
|
<PlatformToolset>v143</PlatformToolset>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
|
||||||
<ConfigurationType>StaticLibrary</ConfigurationType>
|
<ConfigurationType>StaticLibrary</ConfigurationType>
|
||||||
<UseDebugLibraries>true</UseDebugLibraries>
|
<UseDebugLibraries>true</UseDebugLibraries>
|
||||||
<CharacterSet>Unicode</CharacterSet>
|
<CharacterSet>Unicode</CharacterSet>
|
||||||
<PlatformToolset>v142</PlatformToolset>
|
<PlatformToolset>v143</PlatformToolset>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
|
||||||
<ConfigurationType>StaticLibrary</ConfigurationType>
|
<ConfigurationType>StaticLibrary</ConfigurationType>
|
||||||
<UseDebugLibraries>false</UseDebugLibraries>
|
<UseDebugLibraries>false</UseDebugLibraries>
|
||||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||||
<CharacterSet>Unicode</CharacterSet>
|
<CharacterSet>Unicode</CharacterSet>
|
||||||
<PlatformToolset>v142</PlatformToolset>
|
<PlatformToolset>v143</PlatformToolset>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
|
||||||
<ConfigurationType>StaticLibrary</ConfigurationType>
|
<ConfigurationType>StaticLibrary</ConfigurationType>
|
||||||
<UseDebugLibraries>false</UseDebugLibraries>
|
<UseDebugLibraries>false</UseDebugLibraries>
|
||||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||||
<CharacterSet>Unicode</CharacterSet>
|
<CharacterSet>Unicode</CharacterSet>
|
||||||
<PlatformToolset>v120_xp</PlatformToolset>
|
<PlatformToolset>v143</PlatformToolset>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
||||||
<ImportGroup Label="ExtensionSettings">
|
<ImportGroup Label="ExtensionSettings">
|
||||||
|
BIN
bin/cef/cef64_d.exe
Normal file
BIN
bin/cef/cef64_d.exe
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
bin/cef32/d3dcompiler_47.dll
Normal file
BIN
bin/cef32/d3dcompiler_47.dll
Normal file
Binary file not shown.
BIN
bin/cef32/libEGL.dll
Normal file
BIN
bin/cef32/libEGL.dll
Normal file
Binary file not shown.
BIN
bin/cef32/libGLESv2.dll
Normal file
BIN
bin/cef32/libGLESv2.dll
Normal file
Binary file not shown.
Binary file not shown.
BIN
bin/cef32/snapshot_blob.bin
Normal file
BIN
bin/cef32/snapshot_blob.bin
Normal file
Binary file not shown.
BIN
bin/cef32/widevinecdm.dll
Normal file
BIN
bin/cef32/widevinecdm.dll
Normal file
Binary file not shown.
BIN
bin/cef32/widevinecdmadapter.dll
Normal file
BIN
bin/cef32/widevinecdmadapter.dll
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -1,8 +1,11 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<Window size="800,600" caption="0,0,0,35">
|
<Window size="500,200" caption="0,0,0,35">
|
||||||
<VBox bkcolor="bk_wnd_darkcolor">
|
<VBox bkcolor="bk_wnd_darkcolor">
|
||||||
<HBox width="stretch" height="35" bkcolor="bk_wnd_lightcolor">
|
<HBox width="stretch" height="35" bkcolor="bk_wnd_lightcolor">
|
||||||
<Control />
|
<Control />
|
||||||
|
<Label name="tooltip" text="Bsdiff差分算法补丁生成器" margin="4,6,0,0"/>
|
||||||
|
<Control />
|
||||||
|
|
||||||
<Button class="btn_wnd_min" name="minbtn" margin="4,6,0,0"/>
|
<Button class="btn_wnd_min" name="minbtn" margin="4,6,0,0"/>
|
||||||
<Box width="21" margin="4,6,0,0">
|
<Box width="21" margin="4,6,0,0">
|
||||||
<Button class="btn_wnd_max" name="maxbtn"/>
|
<Button class="btn_wnd_max" name="maxbtn"/>
|
||||||
@ -10,10 +13,25 @@
|
|||||||
</Box>
|
</Box>
|
||||||
<Button class="btn_wnd_close" name="closebtn" margin="4,6,8,0"/>
|
<Button class="btn_wnd_close" name="closebtn" margin="4,6,8,0"/>
|
||||||
</HBox>
|
</HBox>
|
||||||
<Box>
|
<VBox width="stretch" height="stretch" margin="10,10,0,0">
|
||||||
<VBox margin="0,0,0,0" valign="center" halign="center" width="auto" height="auto">
|
<HBox>
|
||||||
<Label name="tooltip" text="一个简单窗口,带有标题栏和常规按钮。"/>
|
<Label text="文件1" margin="0,10,0,0" height="40" width="80" font="arial_18"/>
|
||||||
</VBox>
|
<RichEdit class="simple input" width="300" name="uart_send_edit" height="30" margin="5,5,5,5" padding="6,6,6" font="arial_18"/>
|
||||||
</Box>
|
<Button class="btn_global_blue_80x30" name="btn_do_open1" width="40" text="打开" bkcolor="lightcolor" margin="25,3,5,3" font="arial_18" />
|
||||||
|
</HBox>
|
||||||
|
<HBox>
|
||||||
|
<Label text="文件2" margin="0,10,0,0" height="20" width="80" font="arial_18"/>
|
||||||
|
<RichEdit class="simple input" name="uart_send_edit" width="300" height="30" margin="5,5,5,5" padding="6,6,6" font="arial_18"/>
|
||||||
|
<Button class="btn_global_blue_80x30" name="btn_do_open2" width="40" text="打开" bkcolor="lightcolor" margin="25,3,5,3" font="arial_18"/>
|
||||||
|
</HBox>
|
||||||
|
</VBox>
|
||||||
|
<HBox>
|
||||||
|
<Control />
|
||||||
|
|
||||||
|
<Button class="btn_global_blue_80x30" name="btn_do_generate" width="80" text="生成补丁" bkcolor="lightcolor" margin="25,3,5,3" font="arial_18"/>
|
||||||
|
<Control />
|
||||||
|
|
||||||
|
</HBox>
|
||||||
|
|
||||||
</VBox>
|
</VBox>
|
||||||
</Window>
|
</Window>
|
37
bin/resources/themes/default/basic/bsdiff.xml
Normal file
37
bin/resources/themes/default/basic/bsdiff.xml
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<Window size="500,200" caption="0,0,0,35">
|
||||||
|
<VBox bkcolor="bk_wnd_darkcolor">
|
||||||
|
<HBox width="stretch" height="35" bkcolor="bk_wnd_lightcolor">
|
||||||
|
<Control />
|
||||||
|
<Label name="tooltip" text="Bsdiff差分算法补丁生成器" margin="4,6,0,0"/>
|
||||||
|
<Control />
|
||||||
|
|
||||||
|
<Button class="btn_wnd_min" name="minbtn" margin="4,6,0,0"/>
|
||||||
|
<Box width="21" margin="4,6,0,0">
|
||||||
|
<Button class="btn_wnd_max" name="maxbtn"/>
|
||||||
|
<Button class="btn_wnd_restore" name="restorebtn" visible="false"/>
|
||||||
|
</Box>
|
||||||
|
<Button class="btn_wnd_close" name="closebtn" margin="4,6,8,0"/>
|
||||||
|
</HBox>
|
||||||
|
<VBox width="stretch" height="stretch" margin="10,10,0,0">
|
||||||
|
<HBox>
|
||||||
|
<Label text="文件1" margin="0,10,0,0" height="40" width="80" font="arial_18"/>
|
||||||
|
<RichEdit class="simple input" width="300" name="file1" height="30" margin="5,5,5,5" padding="6,6,6" font="arial_18"/>
|
||||||
|
<Button class="btn_global_blue_80x30" name="btn_do_open1" width="80" text="打开" bkcolor="lightcolor" margin="25,3,5,3" font="arial_18" />
|
||||||
|
</HBox>
|
||||||
|
<HBox>
|
||||||
|
<Label text="文件2" margin="0,10,0,0" height="20" width="80" font="arial_18"/>
|
||||||
|
<RichEdit class="simple input" name="file2" width="300" height="30" margin="5,5,5,5" padding="6,6,6" font="arial_18"/>
|
||||||
|
<Button class="btn_global_blue_80x30" name="btn_do_open2" width="80" text="打开" bkcolor="lightcolor" margin="25,3,5,3" font="arial_18"/>
|
||||||
|
</HBox>
|
||||||
|
</VBox>
|
||||||
|
<HBox>
|
||||||
|
<Control />
|
||||||
|
|
||||||
|
<Button class="btn_global_blue_80x30" name="btn_do_generate" width="160" text="生成补丁" bkcolor="lightcolor" margin="25,3,5,3" font="arial_18"/>
|
||||||
|
<Control />
|
||||||
|
|
||||||
|
</HBox>
|
||||||
|
|
||||||
|
</VBox>
|
||||||
|
</Window>
|
@ -28,25 +28,25 @@
|
|||||||
<ConfigurationType>StaticLibrary</ConfigurationType>
|
<ConfigurationType>StaticLibrary</ConfigurationType>
|
||||||
<UseOfMfc>false</UseOfMfc>
|
<UseOfMfc>false</UseOfMfc>
|
||||||
<CharacterSet>Unicode</CharacterSet>
|
<CharacterSet>Unicode</CharacterSet>
|
||||||
<PlatformToolset>v142</PlatformToolset>
|
<PlatformToolset>v143</PlatformToolset>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
|
||||||
<ConfigurationType>StaticLibrary</ConfigurationType>
|
<ConfigurationType>StaticLibrary</ConfigurationType>
|
||||||
<UseOfMfc>false</UseOfMfc>
|
<UseOfMfc>false</UseOfMfc>
|
||||||
<CharacterSet>Unicode</CharacterSet>
|
<CharacterSet>Unicode</CharacterSet>
|
||||||
<PlatformToolset>v142</PlatformToolset>
|
<PlatformToolset>v143</PlatformToolset>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
|
||||||
<ConfigurationType>StaticLibrary</ConfigurationType>
|
<ConfigurationType>StaticLibrary</ConfigurationType>
|
||||||
<UseOfMfc>false</UseOfMfc>
|
<UseOfMfc>false</UseOfMfc>
|
||||||
<CharacterSet>Unicode</CharacterSet>
|
<CharacterSet>Unicode</CharacterSet>
|
||||||
<PlatformToolset>v142</PlatformToolset>
|
<PlatformToolset>v143</PlatformToolset>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
|
||||||
<ConfigurationType>StaticLibrary</ConfigurationType>
|
<ConfigurationType>StaticLibrary</ConfigurationType>
|
||||||
<UseOfMfc>false</UseOfMfc>
|
<UseOfMfc>false</UseOfMfc>
|
||||||
<CharacterSet>Unicode</CharacterSet>
|
<CharacterSet>Unicode</CharacterSet>
|
||||||
<PlatformToolset>v142</PlatformToolset>
|
<PlatformToolset>v143</PlatformToolset>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
||||||
<ImportGroup Label="ExtensionSettings">
|
<ImportGroup Label="ExtensionSettings">
|
||||||
|
@ -29,7 +29,7 @@
|
|||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
|
||||||
<ConfigurationType>Application</ConfigurationType>
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
<UseDebugLibraries>true</UseDebugLibraries>
|
<UseDebugLibraries>true</UseDebugLibraries>
|
||||||
<PlatformToolset>v142</PlatformToolset>
|
<PlatformToolset>v143</PlatformToolset>
|
||||||
<CharacterSet>Unicode</CharacterSet>
|
<CharacterSet>Unicode</CharacterSet>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
|
||||||
@ -42,7 +42,7 @@
|
|||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
|
||||||
<ConfigurationType>Application</ConfigurationType>
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
<UseDebugLibraries>true</UseDebugLibraries>
|
<UseDebugLibraries>true</UseDebugLibraries>
|
||||||
<PlatformToolset>v142</PlatformToolset>
|
<PlatformToolset>v143</PlatformToolset>
|
||||||
<CharacterSet>Unicode</CharacterSet>
|
<CharacterSet>Unicode</CharacterSet>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
|
||||||
|
29
examples/bsdiff/Resource.h
Normal file
29
examples/bsdiff/Resource.h
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
//{{NO_DEPENDENCIES}}
|
||||||
|
// Microsoft Visual C++ 生成的包含文件。
|
||||||
|
// 供 basic.rc 使用
|
||||||
|
//
|
||||||
|
#define IDC_MYICON 2
|
||||||
|
#define IDD_BASIC_DIALOG 102
|
||||||
|
#define IDS_APP_TITLE 103
|
||||||
|
#define IDD_ABOUTBOX 103
|
||||||
|
#define IDM_ABOUT 104
|
||||||
|
#define IDM_EXIT 105
|
||||||
|
#define IDI_BASIC 107
|
||||||
|
#define IDI_SMALL 108
|
||||||
|
#define IDC_BASIC 109
|
||||||
|
#define IDR_MAINFRAME 128
|
||||||
|
#define IDR_THEME1 129
|
||||||
|
#define IDR_THEME 129
|
||||||
|
#define IDC_STATIC -1
|
||||||
|
|
||||||
|
// Next default values for new objects
|
||||||
|
//
|
||||||
|
#ifdef APSTUDIO_INVOKED
|
||||||
|
#ifndef APSTUDIO_READONLY_SYMBOLS
|
||||||
|
#define _APS_NO_MFC 1
|
||||||
|
#define _APS_NEXT_RESOURCE_VALUE 130
|
||||||
|
#define _APS_NEXT_COMMAND_VALUE 32771
|
||||||
|
#define _APS_NEXT_CONTROL_VALUE 1000
|
||||||
|
#define _APS_NEXT_SYMED_VALUE 110
|
||||||
|
#endif
|
||||||
|
#endif
|
BIN
examples/bsdiff/basic.ico
Normal file
BIN
examples/bsdiff/basic.ico
Normal file
Binary file not shown.
After Width: | Height: | Size: 45 KiB |
BIN
examples/bsdiff/basic.rc
Normal file
BIN
examples/bsdiff/basic.rc
Normal file
Binary file not shown.
247
examples/bsdiff/basic_form.cpp
Normal file
247
examples/bsdiff/basic_form.cpp
Normal file
@ -0,0 +1,247 @@
|
|||||||
|
#include "stdafx.h"
|
||||||
|
#include "basic_form.h"
|
||||||
|
|
||||||
|
#include <atlstr.h>
|
||||||
|
#include <afxdlgs.h>
|
||||||
|
#include <afxwin.h>
|
||||||
|
#include <io.h>
|
||||||
|
#include <iosfwd>
|
||||||
|
#include <iostream>
|
||||||
|
#include <ios>
|
||||||
|
#include <fstream>
|
||||||
|
#include <vector>
|
||||||
|
#include <codecvt>
|
||||||
|
extern"C" {
|
||||||
|
#include "bsdiff.h"
|
||||||
|
#include "bspatch.h"
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
const std::wstring BasicForm::kClassName = L"Basic";
|
||||||
|
|
||||||
|
BasicForm::BasicForm()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
BasicForm::~BasicForm()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
std::wstring BasicForm::GetSkinFolder()
|
||||||
|
{
|
||||||
|
return L"basic";
|
||||||
|
}
|
||||||
|
|
||||||
|
std::wstring BasicForm::GetSkinFile()
|
||||||
|
{
|
||||||
|
return L"bsdiff.xml";
|
||||||
|
}
|
||||||
|
|
||||||
|
std::wstring BasicForm::GetWindowClassName() const
|
||||||
|
{
|
||||||
|
return kClassName;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int res_write(struct bsdiff_stream* stream, const void* buffer, int size)
|
||||||
|
{
|
||||||
|
int bz2err;
|
||||||
|
|
||||||
|
//BZ2_bzWrite(&bz2err, bz2, (void*)buffer, size);
|
||||||
|
//if (bz2err != BZ_STREAM_END && bz2err != BZ_OK)
|
||||||
|
// return -1;
|
||||||
|
if (stream->size == 0) {
|
||||||
|
stream->result = new char[8192000];
|
||||||
|
stream->size = 8192000;
|
||||||
|
}
|
||||||
|
memcpy(&stream->result[stream->len], buffer, size);
|
||||||
|
stream->len += size;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
LRESULT BasicForm::OnNcHitTest(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
|
||||||
|
{
|
||||||
|
return WindowImplBase::OnNcHitTest(uMsg, wParam, lParam, bHandled);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline std::string to_byte_string(const std::wstring& input)
|
||||||
|
{
|
||||||
|
std::wstring_convert<std::codecvt_utf8<wchar_t>> converter;
|
||||||
|
return converter.to_bytes(input);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int bz2_read( struct bspatch_stream* stream, void* buffer, int length)
|
||||||
|
{
|
||||||
|
int n;
|
||||||
|
int bz2err;
|
||||||
|
char* addr = (char*)stream->opaque;
|
||||||
|
memcpy(buffer, &addr[stream->res_len], length);
|
||||||
|
stream->res_len += length;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
std::vector<char>* ReadFile(std::string path) {
|
||||||
|
std::vector<char>* ret = nullptr;
|
||||||
|
std::ifstream file(path.c_str(), std::ios::in | std::ios::binary);
|
||||||
|
if (file)
|
||||||
|
{
|
||||||
|
// 按照二进制格式读取数据
|
||||||
|
file.seekg(0, std::ios::end);
|
||||||
|
long long fileSize = file.tellg();
|
||||||
|
printf("size of firm: %lld\n", fileSize);
|
||||||
|
|
||||||
|
// 将读写位置移动到文件开头,申请内存,将固件内容存入buffer
|
||||||
|
file.seekg(0, std::ios::beg);
|
||||||
|
char* buffer = new char[fileSize];
|
||||||
|
file.read(buffer, sizeof(char) * fileSize);
|
||||||
|
|
||||||
|
ret = new std::vector<char>(buffer, buffer + sizeof(char) * fileSize);
|
||||||
|
file.close();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
std::cout << "Failed to open file." << std::endl;
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
void BasicForm::InitWindow() {
|
||||||
|
|
||||||
|
ui::Button* btn_open1 = dynamic_cast<ui::Button*>(FindControl(L"btn_do_open1"));
|
||||||
|
|
||||||
|
ui::Button* btn_open2 = dynamic_cast<ui::Button*>(FindControl(L"btn_do_open2"));
|
||||||
|
|
||||||
|
ui::Button* btn_open3 = dynamic_cast<ui::Button*>(FindControl(L"btn_do_generate"));
|
||||||
|
|
||||||
|
mLabel1 = dynamic_cast<ui::RichEdit*>(FindControl(L"file1_dir"));
|
||||||
|
mLabel2 = dynamic_cast<ui::RichEdit*>(FindControl(L"file2_dir"));
|
||||||
|
|
||||||
|
btn_open1->AttachClick([this](ui::EventArgs*) {
|
||||||
|
CString strFilter;
|
||||||
|
CString str;
|
||||||
|
CString m_strTmpFile;
|
||||||
|
CStdioFile cfLogFile;
|
||||||
|
|
||||||
|
//会过滤出*.txt和*.dat的文件
|
||||||
|
strFilter = "dat file (*.*)|*.*";
|
||||||
|
CFileDialog TmpDlg(true, 0, 0, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, strFilter.GetBuffer(),
|
||||||
|
CWnd::FromHandle(this->m_hWnd));
|
||||||
|
|
||||||
|
if (TmpDlg.DoModal() == IDOK)
|
||||||
|
{
|
||||||
|
//获取文件路径
|
||||||
|
m_strTmpFile = TmpDlg.GetPathName();
|
||||||
|
|
||||||
|
mLabel1->SetText(std::wstring(m_strTmpFile));
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
});
|
||||||
|
|
||||||
|
btn_open2->AttachClick([this](ui::EventArgs*) {
|
||||||
|
CString strFilter;
|
||||||
|
CString str;
|
||||||
|
CString m_strTmpFile;
|
||||||
|
CStdioFile cfLogFile;
|
||||||
|
|
||||||
|
//会过滤出*.txt和*.dat的文件
|
||||||
|
strFilter = "dat file (*.*)|*.*";
|
||||||
|
CFileDialog TmpDlg(true, 0, 0, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, strFilter.GetBuffer(),
|
||||||
|
CWnd::FromHandle(this->m_hWnd));
|
||||||
|
|
||||||
|
if (TmpDlg.DoModal() == IDOK)
|
||||||
|
{
|
||||||
|
//获取文件路径
|
||||||
|
m_strTmpFile = TmpDlg.GetPathName();
|
||||||
|
|
||||||
|
mLabel2->SetText(std::wstring(m_strTmpFile));
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
});
|
||||||
|
|
||||||
|
btn_open3->AttachClick([this](ui::EventArgs*) {
|
||||||
|
CString strFilter;
|
||||||
|
CString str;
|
||||||
|
CString m_strTmpFile;
|
||||||
|
CStdioFile cfLogFile;
|
||||||
|
|
||||||
|
if (mLabel1->GetText() == L"") {
|
||||||
|
AfxMessageBox(_T("请先打开文件"));
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if (mLabel2->GetText() == L"") {
|
||||||
|
AfxMessageBox(_T("请先打开文件"));
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::vector<char>* v1 = ReadFile(to_byte_string(mLabel1->GetText()));
|
||||||
|
std::vector<char>* v2 = ReadFile(to_byte_string(mLabel2->GetText()));
|
||||||
|
|
||||||
|
|
||||||
|
//会过滤出*.txt和*.dat的文件
|
||||||
|
strFilter = "dat file (*.diff)|*.diff";
|
||||||
|
CFileDialog TmpDlg(true, 0, 0, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, strFilter.GetBuffer(),
|
||||||
|
CWnd::FromHandle(this->m_hWnd));
|
||||||
|
|
||||||
|
bsdiff_stream stream;
|
||||||
|
stream.malloc = &malloc;
|
||||||
|
stream.free = &free;
|
||||||
|
stream.write = &res_write;
|
||||||
|
stream.size = 0;
|
||||||
|
stream.len = 0;
|
||||||
|
|
||||||
|
int ret = bsdiff((uint8_t*)v1->data(), v1->size(),
|
||||||
|
(uint8_t*)v2->data(), v2->size(), &stream);
|
||||||
|
|
||||||
|
if (TmpDlg.DoModal() == IDOK)
|
||||||
|
{
|
||||||
|
//获取文件路径
|
||||||
|
m_strTmpFile = TmpDlg.GetPathName();
|
||||||
|
|
||||||
|
std::ofstream file(m_strTmpFile, std::ios::out | std::ios::binary);
|
||||||
|
file.write(reinterpret_cast<char*>(stream.result), stream.len);
|
||||||
|
|
||||||
|
file.flush();
|
||||||
|
file.close();
|
||||||
|
|
||||||
|
bspatch_stream rec;
|
||||||
|
rec.read = &bz2_read;
|
||||||
|
rec.opaque = (uint8_t*)stream.result;
|
||||||
|
rec.res_len = 0;
|
||||||
|
char *data = new char[v2->size()];
|
||||||
|
|
||||||
|
// 按照二进制格式读取数据
|
||||||
|
AfxMessageBox(_T("生成成功"));
|
||||||
|
int err = bspatch((uint8_t*)v1->data(), v1->size(), (uint8_t*)data, v2->size(), &rec);
|
||||||
|
if (err < 0) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
m_strTmpFile = "recover.hex";
|
||||||
|
|
||||||
|
std::ofstream file2(m_strTmpFile, std::ios::out | std::ios::binary);
|
||||||
|
file2.write(data, v2->size());
|
||||||
|
|
||||||
|
file2.flush();
|
||||||
|
file2.close();
|
||||||
|
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
LRESULT BasicForm::OnClose(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
|
||||||
|
{
|
||||||
|
PostQuitMessage(0L);
|
||||||
|
return __super::OnClose(uMsg, wParam, lParam, bHandled);
|
||||||
|
}
|
34
examples/bsdiff/basic_form.h
Normal file
34
examples/bsdiff/basic_form.h
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
class BasicForm : public ui::WindowImplBase
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
BasicForm();
|
||||||
|
~BasicForm();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 一下三个接口是必须要覆写的接口,父类会调用这三个接口来构建窗口
|
||||||
|
* GetSkinFolder 接口设置你要绘制的窗口皮肤资源路径
|
||||||
|
* GetSkinFile 接口设置你要绘制的窗口的 xml 描述文件
|
||||||
|
* GetWindowClassName 接口设置窗口唯一的类名称
|
||||||
|
*/
|
||||||
|
virtual std::wstring GetSkinFolder() override;
|
||||||
|
virtual std::wstring GetSkinFile() override;
|
||||||
|
virtual std::wstring GetWindowClassName() const override;
|
||||||
|
virtual LRESULT OnNcHitTest(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 收到 WM_CREATE 消息时该函数会被调用,通常做一些控件初始化的操作
|
||||||
|
*/
|
||||||
|
virtual void InitWindow() override;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 收到 WM_CLOSE 消息时该函数会被调用
|
||||||
|
*/
|
||||||
|
virtual LRESULT OnClose(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
|
||||||
|
|
||||||
|
static const std::wstring kClassName;
|
||||||
|
|
||||||
|
ui::RichEdit* mLabel1;
|
||||||
|
ui::RichEdit* mLabel2;
|
||||||
|
};
|
445
examples/bsdiff/bsdiff.c
Normal file
445
examples/bsdiff/bsdiff.c
Normal file
@ -0,0 +1,445 @@
|
|||||||
|
/*-
|
||||||
|
* Copyright 2003-2005 Colin Percival
|
||||||
|
* Copyright 2012 Matthew Endsley
|
||||||
|
* All rights reserved
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted providing that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
||||||
|
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||||
|
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
|
||||||
|
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||||
|
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||||
|
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||||
|
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
|
||||||
|
* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||||
|
* POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "bsdiff.h"
|
||||||
|
|
||||||
|
#include <limits.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#define MIN(x,y) (((x)<(y)) ? (x) : (y))
|
||||||
|
|
||||||
|
static void split(int64_t *I,int64_t *V,int64_t start,int64_t len,int64_t h)
|
||||||
|
{
|
||||||
|
int64_t i,j,k,x,tmp,jj,kk;
|
||||||
|
|
||||||
|
if(len<16) {
|
||||||
|
for(k=start;k<start+len;k+=j) {
|
||||||
|
j=1;x=V[I[k]+h];
|
||||||
|
for(i=1;k+i<start+len;i++) {
|
||||||
|
if(V[I[k+i]+h]<x) {
|
||||||
|
x=V[I[k+i]+h];
|
||||||
|
j=0;
|
||||||
|
};
|
||||||
|
if(V[I[k+i]+h]==x) {
|
||||||
|
tmp=I[k+j];I[k+j]=I[k+i];I[k+i]=tmp;
|
||||||
|
j++;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
for(i=0;i<j;i++) V[I[k+i]]=k+j-1;
|
||||||
|
if(j==1) I[k]=-1;
|
||||||
|
};
|
||||||
|
return;
|
||||||
|
};
|
||||||
|
|
||||||
|
x=V[I[start+len/2]+h];
|
||||||
|
jj=0;kk=0;
|
||||||
|
for(i=start;i<start+len;i++) {
|
||||||
|
if(V[I[i]+h]<x) jj++;
|
||||||
|
if(V[I[i]+h]==x) kk++;
|
||||||
|
};
|
||||||
|
jj+=start;kk+=jj;
|
||||||
|
|
||||||
|
i=start;j=0;k=0;
|
||||||
|
while(i<jj) {
|
||||||
|
if(V[I[i]+h]<x) {
|
||||||
|
i++;
|
||||||
|
} else if(V[I[i]+h]==x) {
|
||||||
|
tmp=I[i];I[i]=I[jj+j];I[jj+j]=tmp;
|
||||||
|
j++;
|
||||||
|
} else {
|
||||||
|
tmp=I[i];I[i]=I[kk+k];I[kk+k]=tmp;
|
||||||
|
k++;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
while(jj+j<kk) {
|
||||||
|
if(V[I[jj+j]+h]==x) {
|
||||||
|
j++;
|
||||||
|
} else {
|
||||||
|
tmp=I[jj+j];I[jj+j]=I[kk+k];I[kk+k]=tmp;
|
||||||
|
k++;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
if(jj>start) split(I,V,start,jj-start,h);
|
||||||
|
|
||||||
|
for(i=0;i<kk-jj;i++) V[I[jj+i]]=kk-1;
|
||||||
|
if(jj==kk-1) I[jj]=-1;
|
||||||
|
|
||||||
|
if(start+len>kk) split(I,V,kk,start+len-kk,h);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void qsufsort(int64_t *I,int64_t *V,const uint8_t *old,int64_t oldsize)
|
||||||
|
{
|
||||||
|
int64_t buckets[256];
|
||||||
|
int64_t i,h,len;
|
||||||
|
|
||||||
|
for(i=0;i<256;i++) buckets[i]=0;
|
||||||
|
for(i=0;i<oldsize;i++) buckets[old[i]]++;
|
||||||
|
for(i=1;i<256;i++) buckets[i]+=buckets[i-1];
|
||||||
|
for(i=255;i>0;i--) buckets[i]=buckets[i-1];
|
||||||
|
buckets[0]=0;
|
||||||
|
|
||||||
|
for(i=0;i<oldsize;i++) I[++buckets[old[i]]]=i;
|
||||||
|
I[0]=oldsize;
|
||||||
|
for(i=0;i<oldsize;i++) V[i]=buckets[old[i]];
|
||||||
|
V[oldsize]=0;
|
||||||
|
for(i=1;i<256;i++) if(buckets[i]==buckets[i-1]+1) I[buckets[i]]=-1;
|
||||||
|
I[0]=-1;
|
||||||
|
|
||||||
|
for(h=1;I[0]!=-(oldsize+1);h+=h) {
|
||||||
|
len=0;
|
||||||
|
for(i=0;i<oldsize+1;) {
|
||||||
|
if(I[i]<0) {
|
||||||
|
len-=I[i];
|
||||||
|
i-=I[i];
|
||||||
|
} else {
|
||||||
|
if(len) I[i-len]=-len;
|
||||||
|
len=V[I[i]]+1-i;
|
||||||
|
split(I,V,i,len,h);
|
||||||
|
i+=len;
|
||||||
|
len=0;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
if(len) I[i-len]=-len;
|
||||||
|
};
|
||||||
|
|
||||||
|
for(i=0;i<oldsize+1;i++) I[V[i]]=i;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int64_t matchlen(const uint8_t *old,int64_t oldsize,const uint8_t *new,int64_t newsize)
|
||||||
|
{
|
||||||
|
int64_t i;
|
||||||
|
|
||||||
|
for(i=0;(i<oldsize)&&(i<newsize);i++)
|
||||||
|
if(old[i]!=new[i]) break;
|
||||||
|
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int64_t search(const int64_t *I,const uint8_t *old,int64_t oldsize,
|
||||||
|
const uint8_t *new,int64_t newsize,int64_t st,int64_t en,int64_t *pos)
|
||||||
|
{
|
||||||
|
int64_t x,y;
|
||||||
|
|
||||||
|
if(en-st<2) {
|
||||||
|
x=matchlen(old+I[st],oldsize-I[st],new,newsize);
|
||||||
|
y=matchlen(old+I[en],oldsize-I[en],new,newsize);
|
||||||
|
|
||||||
|
if(x>y) {
|
||||||
|
*pos=I[st];
|
||||||
|
return x;
|
||||||
|
} else {
|
||||||
|
*pos=I[en];
|
||||||
|
return y;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
x=st+(en-st)/2;
|
||||||
|
if(memcmp(old+I[x],new,MIN(oldsize-I[x],newsize))<0) {
|
||||||
|
return search(I,old,oldsize,new,newsize,x,en,pos);
|
||||||
|
} else {
|
||||||
|
return search(I,old,oldsize,new,newsize,st,x,pos);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
static void offtout(int64_t x,uint8_t *buf)
|
||||||
|
{
|
||||||
|
int64_t y;
|
||||||
|
|
||||||
|
if(x<0) y=-x; else y=x;
|
||||||
|
|
||||||
|
buf[0]=y%256;y-=buf[0];
|
||||||
|
y=y/256;buf[1]=y%256;y-=buf[1];
|
||||||
|
y=y/256;buf[2]=y%256;y-=buf[2];
|
||||||
|
y=y/256;buf[3]=y%256;y-=buf[3];
|
||||||
|
y=y/256;buf[4]=y%256;y-=buf[4];
|
||||||
|
y=y/256;buf[5]=y%256;y-=buf[5];
|
||||||
|
y=y/256;buf[6]=y%256;y-=buf[6];
|
||||||
|
y=y/256;buf[7]=y%256;
|
||||||
|
|
||||||
|
if(x<0) buf[7]|=0x80;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int64_t writedata(struct bsdiff_stream* stream, const void* buffer, int64_t length)
|
||||||
|
{
|
||||||
|
int64_t result = 0;
|
||||||
|
|
||||||
|
while (length > 0)
|
||||||
|
{
|
||||||
|
const int smallsize = (int)MIN(length, INT_MAX);
|
||||||
|
const int writeresult = stream->write(stream, buffer, smallsize);
|
||||||
|
if (writeresult == -1)
|
||||||
|
{
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
result += writeresult;
|
||||||
|
length -= smallsize;
|
||||||
|
buffer = (uint8_t*)buffer + smallsize;
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct bsdiff_request
|
||||||
|
{
|
||||||
|
const uint8_t* old;
|
||||||
|
int64_t oldsize;
|
||||||
|
const uint8_t* new1;
|
||||||
|
int64_t newsize;
|
||||||
|
struct bsdiff_stream* stream;
|
||||||
|
int64_t *I;
|
||||||
|
uint8_t *buffer;
|
||||||
|
};
|
||||||
|
|
||||||
|
static int bsdiff_internal(const struct bsdiff_request req)
|
||||||
|
{
|
||||||
|
int64_t *I,*V;
|
||||||
|
int64_t scan,pos,len;
|
||||||
|
int64_t lastscan,lastpos,lastoffset;
|
||||||
|
int64_t oldscore,scsc;
|
||||||
|
int64_t s,Sf,lenf,Sb,lenb;
|
||||||
|
int64_t overlap,Ss,lens;
|
||||||
|
int64_t i;
|
||||||
|
uint8_t *buffer;
|
||||||
|
uint8_t buf[8 * 3];
|
||||||
|
|
||||||
|
if((V=req.stream->malloc((req.oldsize+1)*sizeof(int64_t)))==NULL) return -1;
|
||||||
|
I = req.I;
|
||||||
|
|
||||||
|
qsufsort(I,V,req.old,req.oldsize);
|
||||||
|
req.stream->free(V);
|
||||||
|
|
||||||
|
buffer = req.buffer;
|
||||||
|
|
||||||
|
/* Compute the differences, writing ctrl as we go */
|
||||||
|
scan=0;len=0;pos=0;
|
||||||
|
lastscan=0;lastpos=0;lastoffset=0;
|
||||||
|
while(scan<req.newsize) {
|
||||||
|
oldscore=0;
|
||||||
|
|
||||||
|
for(scsc=scan+=len;scan<req.newsize;scan++) {
|
||||||
|
len=search(I,req.old,req.oldsize,req.new1+scan,req.newsize-scan,
|
||||||
|
0,req.oldsize,&pos);
|
||||||
|
|
||||||
|
for(;scsc<scan+len;scsc++)
|
||||||
|
if((scsc+lastoffset<req.oldsize) &&
|
||||||
|
(req.old[scsc+lastoffset] == req.new1[scsc]))
|
||||||
|
oldscore++;
|
||||||
|
|
||||||
|
if(((len==oldscore) && (len!=0)) ||
|
||||||
|
(len>oldscore+8)) break;
|
||||||
|
|
||||||
|
if((scan+lastoffset<req.oldsize) &&
|
||||||
|
(req.old[scan+lastoffset] == req.new1[scan]))
|
||||||
|
oldscore--;
|
||||||
|
};
|
||||||
|
|
||||||
|
if((len!=oldscore) || (scan==req.newsize)) {
|
||||||
|
s=0;Sf=0;lenf=0;
|
||||||
|
for(i=0;(lastscan+i<scan)&&(lastpos+i<req.oldsize);) {
|
||||||
|
if(req.old[lastpos+i]==req.new1[lastscan+i]) s++;
|
||||||
|
i++;
|
||||||
|
if(s*2-i>Sf*2-lenf) { Sf=s; lenf=i; };
|
||||||
|
};
|
||||||
|
|
||||||
|
lenb=0;
|
||||||
|
if(scan<req.newsize) {
|
||||||
|
s=0;Sb=0;
|
||||||
|
for(i=1;(scan>=lastscan+i)&&(pos>=i);i++) {
|
||||||
|
if(req.old[pos-i]==req.new1[scan-i]) s++;
|
||||||
|
if(s*2-i>Sb*2-lenb) { Sb=s; lenb=i; };
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
if(lastscan+lenf>scan-lenb) {
|
||||||
|
overlap=(lastscan+lenf)-(scan-lenb);
|
||||||
|
s=0;Ss=0;lens=0;
|
||||||
|
for(i=0;i<overlap;i++) {
|
||||||
|
if(req.new1[lastscan+lenf-overlap+i]==
|
||||||
|
req.old[lastpos+lenf-overlap+i]) s++;
|
||||||
|
if(req.new1[scan-lenb+i]==
|
||||||
|
req.old[pos-lenb+i]) s--;
|
||||||
|
if(s>Ss) { Ss=s; lens=i+1; };
|
||||||
|
};
|
||||||
|
|
||||||
|
lenf+=lens-overlap;
|
||||||
|
lenb-=lens;
|
||||||
|
};
|
||||||
|
|
||||||
|
offtout(lenf,buf);
|
||||||
|
offtout((scan-lenb)-(lastscan+lenf),buf+8);
|
||||||
|
offtout((pos-lenb)-(lastpos+lenf),buf+16);
|
||||||
|
|
||||||
|
/* Write control data */
|
||||||
|
if (writedata(req.stream, buf, sizeof(buf)))
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
/* Write diff data */
|
||||||
|
for(i=0;i<lenf;i++)
|
||||||
|
buffer[i]=req.new1[lastscan+i]-req.old[lastpos+i];
|
||||||
|
if (writedata(req.stream, buffer, lenf))
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
/* Write extra data */
|
||||||
|
for(i=0;i<(scan-lenb)-(lastscan+lenf);i++)
|
||||||
|
buffer[i]=req.new1[lastscan+lenf+i];
|
||||||
|
if (writedata(req.stream, buffer, (scan-lenb)-(lastscan+lenf)))
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
lastscan=scan-lenb;
|
||||||
|
lastpos=pos-lenb;
|
||||||
|
lastoffset=pos-scan;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int bsdiff(const uint8_t* old, int64_t oldsize, const uint8_t* new1, int64_t newsize, struct bsdiff_stream* stream)
|
||||||
|
{
|
||||||
|
int result;
|
||||||
|
struct bsdiff_request req;
|
||||||
|
|
||||||
|
if((req.I=stream->malloc((oldsize+1)*sizeof(int64_t)))==NULL)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
if((req.buffer=stream->malloc(newsize+1))==NULL)
|
||||||
|
{
|
||||||
|
stream->free(req.I);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
req.old = old;
|
||||||
|
req.oldsize = oldsize;
|
||||||
|
req.new1 = new1;
|
||||||
|
req.newsize = newsize;
|
||||||
|
req.stream = stream;
|
||||||
|
|
||||||
|
result = bsdiff_internal(req);
|
||||||
|
|
||||||
|
stream->free(req.buffer);
|
||||||
|
stream->free(req.I);
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if defined(BSDIFF_EXECUTABLE)
|
||||||
|
|
||||||
|
#include <sys/types.h>
|
||||||
|
|
||||||
|
#include <bzlib.h>
|
||||||
|
#include <err.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
static int bz2_write(struct bsdiff_stream* stream, const void* buffer, int size)
|
||||||
|
{
|
||||||
|
int bz2err;
|
||||||
|
BZFILE* bz2;
|
||||||
|
|
||||||
|
bz2 = (BZFILE*)stream->opaque;
|
||||||
|
BZ2_bzWrite(&bz2err, bz2, (void*)buffer, size);
|
||||||
|
if (bz2err != BZ_STREAM_END && bz2err != BZ_OK)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(int argc,char *argv[])
|
||||||
|
{
|
||||||
|
int fd;
|
||||||
|
int bz2err;
|
||||||
|
uint8_t *old,*new;
|
||||||
|
off_t oldsize,newsize;
|
||||||
|
uint8_t buf[8];
|
||||||
|
FILE * pf;
|
||||||
|
struct bsdiff_stream stream;
|
||||||
|
BZFILE* bz2;
|
||||||
|
|
||||||
|
memset(&bz2, 0, sizeof(bz2));
|
||||||
|
stream.malloc = malloc;
|
||||||
|
stream.free = free;
|
||||||
|
stream.write = bz2_write;
|
||||||
|
|
||||||
|
if(argc!=4) errx(1,"usage: %s oldfile newfile patchfile\n",argv[0]);
|
||||||
|
|
||||||
|
/* Allocate oldsize+1 bytes instead of oldsize bytes to ensure
|
||||||
|
that we never try to malloc(0) and get a NULL pointer */
|
||||||
|
if(((fd=open(argv[1],O_RDONLY,0))<0) ||
|
||||||
|
((oldsize=lseek(fd,0,SEEK_END))==-1) ||
|
||||||
|
((old=malloc(oldsize+1))==NULL) ||
|
||||||
|
(lseek(fd,0,SEEK_SET)!=0) ||
|
||||||
|
(read(fd,old,oldsize)!=oldsize) ||
|
||||||
|
(close(fd)==-1)) err(1,"%s",argv[1]);
|
||||||
|
|
||||||
|
|
||||||
|
/* Allocate newsize+1 bytes instead of newsize bytes to ensure
|
||||||
|
that we never try to malloc(0) and get a NULL pointer */
|
||||||
|
if(((fd=open(argv[2],O_RDONLY,0))<0) ||
|
||||||
|
((newsize=lseek(fd,0,SEEK_END))==-1) ||
|
||||||
|
((new=malloc(newsize+1))==NULL) ||
|
||||||
|
(lseek(fd,0,SEEK_SET)!=0) ||
|
||||||
|
(read(fd,new,newsize)!=newsize) ||
|
||||||
|
(close(fd)==-1)) err(1,"%s",argv[2]);
|
||||||
|
|
||||||
|
/* Create the patch file */
|
||||||
|
if ((pf = fopen(argv[3], "w")) == NULL)
|
||||||
|
err(1, "%s", argv[3]);
|
||||||
|
|
||||||
|
/* Write header (signature+newsize)*/
|
||||||
|
offtout(newsize, buf);
|
||||||
|
if (fwrite("ENDSLEY/BSDIFF43", 16, 1, pf) != 1 ||
|
||||||
|
fwrite(buf, sizeof(buf), 1, pf) != 1)
|
||||||
|
err(1, "Failed to write header");
|
||||||
|
|
||||||
|
|
||||||
|
if (NULL == (bz2 = BZ2_bzWriteOpen(&bz2err, pf, 9, 0, 0)))
|
||||||
|
errx(1, "BZ2_bzWriteOpen, bz2err=%d", bz2err);
|
||||||
|
|
||||||
|
stream.opaque = bz2;
|
||||||
|
if (bsdiff(old, oldsize, new, newsize, &stream))
|
||||||
|
err(1, "bsdiff");
|
||||||
|
|
||||||
|
BZ2_bzWriteClose(&bz2err, bz2, 0, NULL, NULL);
|
||||||
|
if (bz2err != BZ_OK)
|
||||||
|
err(1, "BZ2_bzWriteClose, bz2err=%d", bz2err);
|
||||||
|
|
||||||
|
if (fclose(pf))
|
||||||
|
err(1, "fclose");
|
||||||
|
|
||||||
|
/* Free the memory we used */
|
||||||
|
free(old);
|
||||||
|
free(new);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
48
examples/bsdiff/bsdiff.h
Normal file
48
examples/bsdiff/bsdiff.h
Normal file
@ -0,0 +1,48 @@
|
|||||||
|
/*-
|
||||||
|
* Copyright 2003-2005 Colin Percival
|
||||||
|
* Copyright 2012 Matthew Endsley
|
||||||
|
* All rights reserved
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted providing that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
||||||
|
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||||
|
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
|
||||||
|
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||||
|
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||||
|
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||||
|
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
|
||||||
|
* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||||
|
* POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef BSDIFF_H
|
||||||
|
# define BSDIFF_H
|
||||||
|
|
||||||
|
# include <stddef.h>
|
||||||
|
# include <stdint.h>
|
||||||
|
|
||||||
|
struct bsdiff_stream
|
||||||
|
{
|
||||||
|
void* opaque;
|
||||||
|
|
||||||
|
void* (*malloc)(size_t size);
|
||||||
|
void (*free)(void* ptr);
|
||||||
|
int (*write)(struct bsdiff_stream* stream, const void* buffer, int size);
|
||||||
|
char* result;
|
||||||
|
int size;
|
||||||
|
int len;
|
||||||
|
};
|
||||||
|
|
||||||
|
int bsdiff(const uint8_t* old, int64_t oldsize, const uint8_t* new1, int64_t newsize, struct bsdiff_stream* stream);
|
||||||
|
|
||||||
|
#endif
|
BIN
examples/bsdiff/bsdiff.ico
Normal file
BIN
examples/bsdiff/bsdiff.ico
Normal file
Binary file not shown.
After Width: | Height: | Size: 45 KiB |
174
examples/bsdiff/bsdiff.vcxproj
Normal file
174
examples/bsdiff/bsdiff.vcxproj
Normal file
@ -0,0 +1,174 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<ItemGroup Label="ProjectConfigurations">
|
||||||
|
<ProjectConfiguration Include="Debug|Win32">
|
||||||
|
<Configuration>Debug</Configuration>
|
||||||
|
<Platform>Win32</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
<ProjectConfiguration Include="Release|Win32">
|
||||||
|
<Configuration>Release</Configuration>
|
||||||
|
<Platform>Win32</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
<ProjectConfiguration Include="Debug|x64">
|
||||||
|
<Configuration>Debug</Configuration>
|
||||||
|
<Platform>x64</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
<ProjectConfiguration Include="Release|x64">
|
||||||
|
<Configuration>Release</Configuration>
|
||||||
|
<Platform>x64</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
</ItemGroup>
|
||||||
|
<PropertyGroup Label="Globals">
|
||||||
|
<VCProjectVersion>17.0</VCProjectVersion>
|
||||||
|
<Keyword>Win32Proj</Keyword>
|
||||||
|
<ProjectGuid>{f9a0dd24-fd5a-4ccf-8945-3688ef808bfe}</ProjectGuid>
|
||||||
|
<RootNamespace>bsdiff</RootNamespace>
|
||||||
|
<WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
|
||||||
|
</PropertyGroup>
|
||||||
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
|
||||||
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
|
<UseDebugLibraries>true</UseDebugLibraries>
|
||||||
|
<PlatformToolset>v143</PlatformToolset>
|
||||||
|
<CharacterSet>Unicode</CharacterSet>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
|
||||||
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
|
<UseDebugLibraries>false</UseDebugLibraries>
|
||||||
|
<PlatformToolset>v143</PlatformToolset>
|
||||||
|
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||||
|
<CharacterSet>Unicode</CharacterSet>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
|
||||||
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
|
<UseDebugLibraries>true</UseDebugLibraries>
|
||||||
|
<PlatformToolset>v143</PlatformToolset>
|
||||||
|
<CharacterSet>Unicode</CharacterSet>
|
||||||
|
<UseOfMfc>Static</UseOfMfc>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
|
||||||
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
|
<UseDebugLibraries>false</UseDebugLibraries>
|
||||||
|
<PlatformToolset>v143</PlatformToolset>
|
||||||
|
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||||
|
<CharacterSet>Unicode</CharacterSet>
|
||||||
|
</PropertyGroup>
|
||||||
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
||||||
|
<ImportGroup Label="ExtensionSettings">
|
||||||
|
</ImportGroup>
|
||||||
|
<ImportGroup Label="Shared">
|
||||||
|
</ImportGroup>
|
||||||
|
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
</ImportGroup>
|
||||||
|
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
</ImportGroup>
|
||||||
|
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
</ImportGroup>
|
||||||
|
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
</ImportGroup>
|
||||||
|
<PropertyGroup Label="UserMacros" />
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||||
|
<IncludePath>G:\project\c++\nim_duilib;$(IncludePath)</IncludePath>
|
||||||
|
<LibraryPath>$(CommonExcludePath);$(LibraryPath)</LibraryPath>
|
||||||
|
</PropertyGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||||
|
<ClCompile>
|
||||||
|
<WarningLevel>Level3</WarningLevel>
|
||||||
|
<SDLCheck>true</SDLCheck>
|
||||||
|
<PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<ConformanceMode>true</ConformanceMode>
|
||||||
|
</ClCompile>
|
||||||
|
<Link>
|
||||||
|
<SubSystem>Windows</SubSystem>
|
||||||
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
|
</Link>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||||
|
<ClCompile>
|
||||||
|
<WarningLevel>Level3</WarningLevel>
|
||||||
|
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||||
|
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||||
|
<SDLCheck>true</SDLCheck>
|
||||||
|
<PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<ConformanceMode>true</ConformanceMode>
|
||||||
|
</ClCompile>
|
||||||
|
<Link>
|
||||||
|
<SubSystem>Windows</SubSystem>
|
||||||
|
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||||
|
<OptimizeReferences>true</OptimizeReferences>
|
||||||
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
|
</Link>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||||
|
<ClCompile>
|
||||||
|
<WarningLevel>Level3</WarningLevel>
|
||||||
|
<SDLCheck>true</SDLCheck>
|
||||||
|
<PreprocessorDefinitions>_DEBUG;_WINDOWS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<ConformanceMode>true</ConformanceMode>
|
||||||
|
<RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
|
||||||
|
</ClCompile>
|
||||||
|
<Link>
|
||||||
|
<SubSystem>Windows</SubSystem>
|
||||||
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
|
</Link>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||||
|
<ClCompile>
|
||||||
|
<WarningLevel>Level3</WarningLevel>
|
||||||
|
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||||
|
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||||
|
<SDLCheck>true</SDLCheck>
|
||||||
|
<PreprocessorDefinitions>NDEBUG;_WINDOWS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<ConformanceMode>true</ConformanceMode>
|
||||||
|
</ClCompile>
|
||||||
|
<Link>
|
||||||
|
<SubSystem>Windows</SubSystem>
|
||||||
|
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||||
|
<OptimizeReferences>true</OptimizeReferences>
|
||||||
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
|
</Link>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ClInclude Include="basic_form.h" />
|
||||||
|
<ClInclude Include="bsdiff.h" />
|
||||||
|
<ClInclude Include="bspatch.h" />
|
||||||
|
<ClInclude Include="framework.h" />
|
||||||
|
<ClInclude Include="main.h" />
|
||||||
|
<ClInclude Include="Resource.h" />
|
||||||
|
<ClInclude Include="targetver.h" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<Image Include="bsdiff.ico" />
|
||||||
|
<Image Include="small.ico" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ClCompile Include="basic_form.cpp" />
|
||||||
|
<ClCompile Include="bsdiff.c" />
|
||||||
|
<ClCompile Include="bspatch.c" />
|
||||||
|
<ClCompile Include="main.cpp" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ProjectReference Include="..\..\base\base.vcxproj">
|
||||||
|
<Project>{8d9a6595-717a-41c8-b468-0011a72be3d1}</Project>
|
||||||
|
</ProjectReference>
|
||||||
|
<ProjectReference Include="..\..\duilib\duilib.vcxproj">
|
||||||
|
<Project>{e106acd7-4e53-4aee-942b-d0dd426db34e}</Project>
|
||||||
|
</ProjectReference>
|
||||||
|
<ProjectReference Include="..\..\ui_components\ui_components.vcxproj">
|
||||||
|
<Project>{0149ba6e-3c0a-426d-aa0a-0b9ec7742f19}</Project>
|
||||||
|
</ProjectReference>
|
||||||
|
<ProjectReference Include="..\libmodbus\libmodbus.vcxproj">
|
||||||
|
<Project>{6fb16778-49d1-4bfd-b135-4d1ba6b5d68a}</Project>
|
||||||
|
</ProjectReference>
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<Xml Include="..\..\bin\resources\themes\default\basic\bsdiff.xml" />
|
||||||
|
</ItemGroup>
|
||||||
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||||
|
<ImportGroup Label="ExtensionTargets">
|
||||||
|
</ImportGroup>
|
||||||
|
</Project>
|
67
examples/bsdiff/bsdiff.vcxproj.filters
Normal file
67
examples/bsdiff/bsdiff.vcxproj.filters
Normal file
@ -0,0 +1,67 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<ItemGroup>
|
||||||
|
<Filter Include="源文件">
|
||||||
|
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
|
||||||
|
<Extensions>cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
|
||||||
|
</Filter>
|
||||||
|
<Filter Include="头文件">
|
||||||
|
<UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
|
||||||
|
<Extensions>h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd</Extensions>
|
||||||
|
</Filter>
|
||||||
|
<Filter Include="资源文件">
|
||||||
|
<UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
|
||||||
|
<Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
|
||||||
|
</Filter>
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ClInclude Include="framework.h">
|
||||||
|
<Filter>头文件</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="targetver.h">
|
||||||
|
<Filter>头文件</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="Resource.h">
|
||||||
|
<Filter>头文件</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="basic_form.h">
|
||||||
|
<Filter>源文件</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="main.h">
|
||||||
|
<Filter>源文件</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="bsdiff.h">
|
||||||
|
<Filter>源文件</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="bspatch.h">
|
||||||
|
<Filter>源文件</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<Image Include="small.ico">
|
||||||
|
<Filter>资源文件</Filter>
|
||||||
|
</Image>
|
||||||
|
<Image Include="bsdiff.ico">
|
||||||
|
<Filter>资源文件</Filter>
|
||||||
|
</Image>
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ClCompile Include="basic_form.cpp">
|
||||||
|
<Filter>源文件</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="main.cpp">
|
||||||
|
<Filter>源文件</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="bsdiff.c">
|
||||||
|
<Filter>源文件</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="bspatch.c">
|
||||||
|
<Filter>源文件</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<Xml Include="..\..\bin\resources\themes\default\basic\bsdiff.xml">
|
||||||
|
<Filter>资源文件</Filter>
|
||||||
|
</Xml>
|
||||||
|
</ItemGroup>
|
||||||
|
</Project>
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user