Fixed sparse issue with non seekable streams (#105)
authorYann Collet <yann.collet.73@gmail.com>
Mon, 18 May 2015 21:09:37 +0000 (22:09 +0100)
committerYann Collet <yann.collet.73@gmail.com>
Mon, 18 May 2015 21:09:37 +0000 (22:09 +0100)
programs/Makefile
programs/lz4cli.c
programs/lz4io.c

index 23cbc3d..7e04811 100644 (file)
@@ -150,7 +150,7 @@ test-all: test test32
 test-travis: $(TRAVIS_TARGET)
 
 test-lz4-sparse: lz4 datagen
-       @echo ---- test sparse file support ----
+       @echo "\n ---- test sparse file support ----"
        ./datagen -g5M  -P100 > tmpSrc
        ./lz4 -B4D tmpSrc | ./lz4 -dv --sparse > tmpB4
        diff -s tmpSrc tmpB4
@@ -167,6 +167,9 @@ test-lz4-sparse: lz4 datagen
        ./datagen -s1 -g1200007 -P100 | diff -s - tmpOdd
        ls -ls tmpOdd
        @rm tmp*
+       @echo "\n Compatibility with Console :"
+       ./lz4 COPYING | ./lz4 -d -c
+       ./lz4 COPYING | ./lz4 -d | cat
 
 test-lz4-contentSize: lz4 datagen
        @echo ---- test original size support ----
index 970856d..65af428 100644 (file)
@@ -473,7 +473,7 @@ int main(int argc, char** argv)
     if (multiple_inputs) input_filename = inFileNames[0], output_filename = (const char*)(inFileNames[0]);
     if(!input_filename) { input_filename=stdinmark; }
 
-    /* Check if input or output are defined as console; trigger an error in this case */
+    /* Check if input is defined as console; trigger an error in this case */
     if (!strcmp(input_filename, stdinmark) && IS_CONSOLE(stdin) ) badusage();
 
     /* Check if benchmark is selected */
index 209f5ed..92f8706 100644 (file)
@@ -303,6 +303,12 @@ static int LZ4IO_getFiles(const char* input_filename, const char* output_filenam
 
     if ( *pfoutput==0) EXM_THROW(13, "Pb opening %s", output_filename);
 
+    if (g_sparseFileSupport)
+    {
+        long int ftr = ftell(*pfoutput);
+        if (ftr==-1) g_sparseFileSupport = 0;
+    }
+
     return 0;
 }
 
@@ -639,7 +645,7 @@ static unsigned LZ4IO_fwriteSparse(FILE* file, const void* buffer, size_t buffer
     if (!g_sparseFileSupport)   /* normal write */
     {
         size_t sizeCheck = fwrite(buffer, 1, bufferSize, file);
-        if (sizeCheck != bufferSize) EXM_THROW(68, "Write error : cannot write decoded block");
+        if (sizeCheck != bufferSize) EXM_THROW(70, "Write error : cannot write decoded block");
         return 0;
     }
 
@@ -647,7 +653,7 @@ static unsigned LZ4IO_fwriteSparse(FILE* file, const void* buffer, size_t buffer
     if (storedSkips > 1 GB)
     {
         int seekResult = fseek(file, 1 GB, SEEK_CUR);
-        if (seekResult != 0) EXM_THROW(68, "1 GB skip error (sparse file support)");
+        if (seekResult != 0) EXM_THROW(71, "1 GB skip error (sparse file support)");
         storedSkips -= 1 GB;
     }
 
@@ -667,12 +673,12 @@ static unsigned LZ4IO_fwriteSparse(FILE* file, const void* buffer, size_t buffer
         {
             size_t sizeCheck;
             seekResult = fseek(file, storedSkips, SEEK_CUR);
-            if (seekResult) EXM_THROW(68, "Skip error (sparse file)");
+            if (seekResult) EXM_THROW(72, "Skip error (sparse file)");
             storedSkips = 0;
             seg0SizeT -= nb0T;
             ptrT += nb0T;
             sizeCheck = fwrite(ptrT, sizeT, seg0SizeT, file);
-            if (sizeCheck != seg0SizeT) EXM_THROW(68, "Write error : cannot write decoded block");
+            if (sizeCheck != seg0SizeT) EXM_THROW(73, "Write error : cannot write decoded block");
         }
         ptrT += seg0SizeT;
     }
@@ -689,10 +695,10 @@ static unsigned LZ4IO_fwriteSparse(FILE* file, const void* buffer, size_t buffer
         {
             size_t sizeCheck;
             int seekResult = fseek(file, storedSkips, SEEK_CUR);
-            if (seekResult) EXM_THROW(68, "Skip error (end of block)");
+            if (seekResult) EXM_THROW(74, "Skip error (end of block)");
             storedSkips = 0;
             sizeCheck = fwrite(restPtr, 1, restEnd - restPtr, file);
-            if (sizeCheck != (size_t)(restEnd - restPtr)) EXM_THROW(68, "Write error : cannot write decoded end of block");
+            if (sizeCheck != (size_t)(restEnd - restPtr)) EXM_THROW(75, "Write error : cannot write decoded end of block");
         }
     }