aboutsummaryrefslogtreecommitdiff
path: root/examples
diff options
context:
space:
mode:
authorConrad Meyer <cem@FreeBSD.org>2019-11-06 06:42:00 +0000
committerConrad Meyer <cem@FreeBSD.org>2019-11-06 06:42:00 +0000
commitea68403922c3b53b00fc999fcb3eaef1feb50177 (patch)
tree9870b0c695852e26fb9f8e19df8d7f5cb6616141 /examples
parent90f4bdbe917eaf678feca2b0ff9647b5ae8bbb9d (diff)
Notes
Diffstat (limited to 'examples')
-rw-r--r--examples/.gitignore15
-rw-r--r--examples/streaming_compression.c8
-rw-r--r--examples/streaming_decompression.c18
3 files changed, 24 insertions, 17 deletions
diff --git a/examples/.gitignore b/examples/.gitignore
deleted file mode 100644
index d682cae38a8d..000000000000
--- a/examples/.gitignore
+++ /dev/null
@@ -1,15 +0,0 @@
-#build
-simple_compression
-simple_decompression
-multiple_simple_compression
-dictionary_compression
-dictionary_decompression
-streaming_compression
-streaming_decompression
-multiple_streaming_compression
-streaming_memory_usage
-
-#test artefact
-tmp*
-test*
-*.zst
diff --git a/examples/streaming_compression.c b/examples/streaming_compression.c
index d1353a684a62..d0b04895f018 100644
--- a/examples/streaming_compression.c
+++ b/examples/streaming_compression.c
@@ -44,8 +44,8 @@ static void compressFile_orDie(const char* fname, const char* outName, int cLeve
* and writes all output produced to the output file.
*/
size_t const toRead = buffInSize;
- size_t read;
- while ((read = fread_orDie(buffIn, toRead, fin))) {
+ for (;;) {
+ size_t read = fread_orDie(buffIn, toRead, fin);
/* Select the flush mode.
* If the read may not be finished (read == toRead) we use
* ZSTD_e_continue. If this is the last chunk, we use ZSTD_e_end.
@@ -76,6 +76,10 @@ static void compressFile_orDie(const char* fname, const char* outName, int cLeve
} while (!finished);
CHECK(input.pos == input.size,
"Impossible: zstd only returns 0 when the input is completely consumed!");
+
+ if (lastChunk) {
+ break;
+ }
}
ZSTD_freeCCtx(cctx);
diff --git a/examples/streaming_decompression.c b/examples/streaming_decompression.c
index bcd861b756c1..d26b45b34c74 100644
--- a/examples/streaming_decompression.c
+++ b/examples/streaming_decompression.c
@@ -34,7 +34,10 @@ static void decompressFile_orDie(const char* fname)
*/
size_t const toRead = buffInSize;
size_t read;
+ size_t lastRet = 0;
+ int isEmpty = 1;
while ( (read = fread_orDie(buffIn, toRead, fin)) ) {
+ isEmpty = 0;
ZSTD_inBuffer input = { buffIn, read, 0 };
/* Given a valid frame, zstd won't consume the last byte of the frame
* until it has flushed all of the decompressed data of the frame.
@@ -53,9 +56,24 @@ static void decompressFile_orDie(const char* fname)
size_t const ret = ZSTD_decompressStream(dctx, &output , &input);
CHECK_ZSTD(ret);
fwrite_orDie(buffOut, output.pos, fout);
+ lastRet = ret;
}
}
+ if (isEmpty) {
+ fprintf(stderr, "input is empty\n");
+ exit(1);
+ }
+
+ if (lastRet != 0) {
+ /* The last return value from ZSTD_decompressStream did not end on a
+ * frame, but we reached the end of the file! We assume this is an
+ * error, and the input was truncated.
+ */
+ fprintf(stderr, "EOF before end of stream: %zu\n", lastRet);
+ exit(1);
+ }
+
ZSTD_freeDCtx(dctx);
fclose_orDie(fin);
fclose_orDie(fout);