initial commit
This commit is contained in:
@@ -0,0 +1,128 @@
|
||||
#include "sgu_stdafx.h"
|
||||
#include "sgu_mode_make_diff.h"
|
||||
#include "sgu_utils.h"
|
||||
|
||||
#include "bzlib.h"
|
||||
|
||||
extern "C"
|
||||
{
|
||||
#include "bsdiff.h"
|
||||
}
|
||||
|
||||
static int diffFileWriter(struct bsdiff_stream* stream, const void* buffer, int size)
|
||||
{
|
||||
FILE* fp = (FILE*)stream->opaque;
|
||||
if (size != fwrite(buffer, 1, size, fp))
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int bzPatchFileWriter(struct bsdiff_stream* stream, const void* buffer, int size)
|
||||
{
|
||||
BZFILE* bz2 = (BZFILE*)stream->opaque;
|
||||
|
||||
int bz2err;
|
||||
BZ2_bzWrite(&bz2err, bz2, (void*)buffer, size);
|
||||
|
||||
if (bz2err != BZ_STREAM_END && bz2err != BZ_OK)
|
||||
return -1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
bool createDiff(const char* inputFilename1, const char* inputFilename2, const char* outputFilename)
|
||||
{
|
||||
if (!inputFilename1 || inputFilename1[0] == 0 || !inputFilename2 || inputFilename2[0] == 0)
|
||||
{
|
||||
printf("Error: Input filename is not specified.\n");
|
||||
return false;
|
||||
}
|
||||
if (!outputFilename || outputFilename[0] == 0)
|
||||
{
|
||||
printf("Error: Output filename is not specified.\n");
|
||||
return false;
|
||||
}
|
||||
|
||||
bool result = false;
|
||||
uint8_t* pBuffer1 = nullptr;
|
||||
uint8_t* pBuffer2 = nullptr;
|
||||
FILE* fpOutput = nullptr;
|
||||
do {
|
||||
int64_t fileSize1;
|
||||
pBuffer1 = readFileToBuffer(inputFilename1, fileSize1);
|
||||
if (pBuffer1 == nullptr)
|
||||
{
|
||||
printf("Error: Failed to read input file 1: %s\n", inputFilename1);
|
||||
break;
|
||||
}
|
||||
|
||||
int64_t fileSize2;
|
||||
pBuffer2 = readFileToBuffer(inputFilename2, fileSize2);
|
||||
if (pBuffer2 == nullptr)
|
||||
{
|
||||
printf("Error: Failed to read input file 2: %s\n", inputFilename2);
|
||||
break;
|
||||
}
|
||||
|
||||
// Open the output file
|
||||
fopen_s(&fpOutput, outputFilename, "wb");
|
||||
if (fpOutput == nullptr)
|
||||
{
|
||||
printf("Error: Failed to open output file: %s\n", outputFilename);
|
||||
break;
|
||||
}
|
||||
|
||||
// Write the header
|
||||
if (fwrite("ENDSLEY/BSDIFF43", 16, 1, fpOutput) != 1 ||
|
||||
fwrite(&fileSize2, sizeof(fileSize2), 1, fpOutput) != 1)
|
||||
{
|
||||
printf("Failed to write header\n");
|
||||
break;
|
||||
}
|
||||
|
||||
int bz2err;
|
||||
BZFILE* bzHandle = BZ2_bzWriteOpen(&bz2err, fpOutput, 9, 0, 0);
|
||||
if (bzHandle == nullptr || bz2err != BZ_OK)
|
||||
{
|
||||
printf("BZ2_bzWriteOpen failed, bz2err=%d\n", bz2err);
|
||||
break;
|
||||
}
|
||||
|
||||
//generate diff
|
||||
struct bsdiff_stream stream;
|
||||
stream.malloc = malloc;
|
||||
stream.free = free;
|
||||
stream.write = bzPatchFileWriter;
|
||||
stream.opaque = bzHandle;
|
||||
if (bsdiff(pBuffer1, fileSize1, pBuffer2, fileSize2, &stream))
|
||||
{
|
||||
printf("bsdiff error!\n");
|
||||
break;
|
||||
}
|
||||
|
||||
BZ2_bzWriteClose(&bz2err, bzHandle, 0, NULL, NULL);
|
||||
if (bz2err != BZ_OK)
|
||||
{
|
||||
printf("BZ2_bzWriteClose failed, bz2err=%d", bz2err);
|
||||
break;
|
||||
}
|
||||
|
||||
result = true;
|
||||
printf("Diff file created successfully: %s\n", outputFilename);
|
||||
} while (false);
|
||||
|
||||
if (fpOutput != nullptr)
|
||||
{
|
||||
fclose(fpOutput);
|
||||
fpOutput = nullptr;
|
||||
}
|
||||
freeFileBuffer(pBuffer1);
|
||||
pBuffer1 = nullptr;
|
||||
|
||||
freeFileBuffer(pBuffer2);
|
||||
pBuffer2 = nullptr;
|
||||
|
||||
return result;
|
||||
}
|
||||
Reference in New Issue
Block a user