ports/misc/bdelta/files/patch-bpatch.cpp
Kurt Jaeger 18974d5b8d misc/bdelta: 0.1.0 -> 0.3.1 with patches
- changed to github
- many changes since first release
- added FEFE patch, see https://ptrace.fefe.de/bdelta.diff
- added LICENSE

PR:		209063
Approved by:	novel (maintainer)
2016-04-29 04:55:00 +00:00

87 lines
2.5 KiB
C++

--- bpatch.cpp.orig 2013-01-30 20:16:01 UTC
+++ bpatch.cpp
@@ -7,6 +7,8 @@
#include "file.h"
#include "compatibility.h"
+#define FEFE
+
bool copy_bytes_to_file(FILE *infile, FILE *outfile, unsigned numleft) {
size_t numread;
do {
@@ -42,10 +44,17 @@ int main(int argc, char **argv) {
return 1;
}
unsigned short version = read_word(patchfile);
+#ifdef FEFE
+ if (version != 1 && version != 2) {
+ printf("unsupported patch version\n");
+ return 1;
+ }
+#else
if (version != 1) {
printf("unsupported patch version\n");
return 1;
}
+#endif
char intsize;
fread_fixed(patchfile, &intsize, 1);
if (intsize != 4) {
@@ -57,14 +66,32 @@ int main(int argc, char **argv) {
unsigned nummatches = read_dword(patchfile);
+#ifdef FEFE
+ long long * copyloc1 = new long long[nummatches + 1];
+ long long * copyloc2 = new long long[nummatches + 1];
+ unsigned * copynum = new unsigned[nummatches + 1];
+#else
unsigned * copyloc1 = new unsigned[nummatches + 1];
unsigned * copyloc2 = new unsigned[nummatches + 1];
unsigned * copynum = new unsigned[nummatches + 1];
+#endif
for (unsigned i = 0; i < nummatches; ++i) {
+#ifdef FEFE
+ if (version==2) {
+ copyloc1[i] = read_varint(patchfile);
+ copyloc2[i] = read_varint(patchfile);
+ copynum[i] = read_varint(patchfile);
+ } else {
copyloc1[i] = read_dword(patchfile);
copyloc2[i] = read_dword(patchfile);
copynum[i] = read_dword(patchfile);
+ }
+#else
+ copyloc1[i] = read_dword(patchfile);
+ copyloc2[i] = read_dword(patchfile);
+ copynum[i] = read_dword(patchfile);
+#endif
size2 -= copyloc2[i] + copynum[i];
}
if (size2) {
@@ -77,16 +104,22 @@ int main(int argc, char **argv) {
FILE *outfile = fopen(argv[2], "wb");
for (unsigned i = 0; i < nummatches; ++i) {
+// printf("%u/%u: copy %u bytes from patch file ofs %ld (dest ofs %u)\n",i,nummatches,copyloc2[i],ftell(patchfile),ftell(outfile));
if (!copy_bytes_to_file(patchfile, outfile, copyloc2[i])) {
printf("Error. patchfile is truncated\n");
return -1;
}
- int copyloc = copyloc1[i];
+ long long copyloc = copyloc1[i];
fseek(ref, copyloc, SEEK_CUR);
+ long curofs=ftell(ref);
+
+#ifdef FEFE
+// printf("%u/%u: (%d -> %u,%d -> %u,%u)\n",i,nummatches-1,copyloc,ftell(ref),copyloc2[i],ftell(outfile),copynum[i]);
+#endif
if (!copy_bytes_to_file(ref, outfile, copynum[i])) {
- printf("Error while copying from reference file\n");
+ printf("Error while copying from reference file (ofs %ld, %u bytes)\n", curofs, copynum[i]);
return -1;
}
}