summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--NEWS8
-rw-r--r--programs/Makefile2
-rw-r--r--programs/lz4io.c35
3 files changed, 41 insertions, 4 deletions
diff --git a/NEWS b/NEWS
index 6da779c..e721ca6 100644
--- a/NEWS
+++ b/NEWS
@@ -1,17 +1,21 @@
r128:
New : lz4 cli sparse file support
New : command -m, to compress multiple files in a single command
-Fixed : Restored lz4hc compression ratio (slightly lower since r124)
+Fixed : Restored lz4hc compression ratio (was slightly lower since r124)
New : lz4frame supports skippable frames
Changed:Default "make install" directory is /usr/local
+New : lz4 cli supports "pass-through" mode
New : g++ compatibility tests
New : datagen can generate sparse files
New : scan-build tests
Fixed : Fuzzer + frametest compatibility with NetBSD (issue #48)
Added : Visual project directory
+r127:
+N/A : added a file on SVN
+
r126:
-New : lz4frame API is now integrated into liblz4
+New : lz4frame API is now integrated into liblz4
Fixed : GCC 4.9 bug on highest performance settings, reported by Greg Slazinski
Fixed : bug within LZ4 HC streaming mode, reported by James Boyle
Fixed : older compiler don't like nameless unions, reported by Cheyi Lin
diff --git a/programs/Makefile b/programs/Makefile
index ae38943..3fa2cfd 100644
--- a/programs/Makefile
+++ b/programs/Makefile
@@ -177,6 +177,8 @@ test-lz4: lz4 datagen
./datagen -g50M -P100 | diff -s - tmpB6
./datagen -g50M -P100 | diff -s - tmpB7
@rm tmp*
+ @echo ---- test pass-through ----
+ ./datagen | ./lz4 -dfvq > /dev/null
test-lz4c: lz4c datagen
diff --git a/programs/lz4io.c b/programs/lz4io.c
index 34fbe10..13d1887 100644
--- a/programs/lz4io.c
+++ b/programs/lz4io.c
@@ -205,7 +205,7 @@ int LZ4IO_setNotificationLevel(int level)
/* Default setting : 0 (disabled) */
int LZ4IO_setSparseFile(int enable)
{
- g_sparseFileSupport = enable;
+ g_sparseFileSupport = (enable!=0);
return g_sparseFileSupport;
}
@@ -671,6 +671,28 @@ static unsigned long long decodeLZ4S(FILE* finput, FILE* foutput)
}
+static unsigned long long LZ4IO_passThrough(FILE* finput, FILE* foutput, unsigned char U32store[MAGICNUMBER_SIZE])
+{
+ void* buffer = malloc(64 KB);
+ size_t read = 1, sizeCheck;
+ unsigned long long total = MAGICNUMBER_SIZE;
+
+ sizeCheck = fwrite(U32store, 1, MAGICNUMBER_SIZE, foutput);
+ if (sizeCheck != MAGICNUMBER_SIZE) EXM_THROW(50, "Pass-through error at start");
+
+ while (read)
+ {
+ read = fread(buffer, 1, 64 KB, finput);
+ total += read;
+ sizeCheck = fwrite(buffer, 1, read, foutput);
+ if (sizeCheck != read) EXM_THROW(50, "Pass-through error");
+ }
+
+ free(buffer);
+ return total;
+}
+
+
#define ENDOFSTREAM ((unsigned long long)-1)
static unsigned long long selectDecoder( FILE* finput, FILE* foutput)
{
@@ -678,6 +700,10 @@ static unsigned long long selectDecoder( FILE* finput, FILE* foutput)
unsigned magicNumber, size;
int errorNb;
size_t nbReadBytes;
+ static unsigned nbCalls = 0;
+
+ /* init */
+ nbCalls++;
/* Check Archive Header */
nbReadBytes = fread(U32store, 1, MAGICNUMBER_SIZE, finput);
@@ -703,7 +729,12 @@ static unsigned long long selectDecoder( FILE* finput, FILE* foutput)
return selectDecoder(finput, foutput);
EXTENDED_FORMAT;
default:
- if (ftell(finput) == MAGICNUMBER_SIZE) EXM_THROW(44,"Unrecognized header : file cannot be decoded"); /* Wrong magic number at the beginning of 1st stream */
+ if (nbCalls == 1) /* just started */
+ {
+ if (g_overwrite)
+ return LZ4IO_passThrough(finput, foutput, U32store);
+ EXM_THROW(44,"Unrecognized header : file cannot be decoded"); /* Wrong magic number at the beginning of 1st stream */
+ }
DISPLAYLEVEL(2, "Stream followed by unrecognized data\n");
return ENDOFSTREAM;
}