1e2c84118f52cefe48fd2f751e66ad3ecd904f7b9Yann Collet// LZ4 HC streaming API example : ring buffer
2e2c84118f52cefe48fd2f751e66ad3ecd904f7b9Yann Collet// Based on previous work from Takayuki Matsuoka
3e2c84118f52cefe48fd2f751e66ad3ecd904f7b9Yann Collet
4e2c84118f52cefe48fd2f751e66ad3ecd904f7b9Yann Collet
5e2c84118f52cefe48fd2f751e66ad3ecd904f7b9Yann Collet/**************************************
63de7f00a0b83f0f8ad861789d8da1ad697b1f05aYann Collet * Compiler Options
73de7f00a0b83f0f8ad861789d8da1ad697b1f05aYann Collet **************************************/
8e2c84118f52cefe48fd2f751e66ad3ecd904f7b9Yann Collet#ifdef _MSC_VER    /* Visual Studio */
9cc21115cb4f9ff1f97322104ffb19ca89b5a0eb1Yann Collet#  define _CRT_SECURE_NO_WARNINGS   /* for MSVC */
10e2c84118f52cefe48fd2f751e66ad3ecd904f7b9Yann Collet#  define snprintf sprintf_s
11e2c84118f52cefe48fd2f751e66ad3ecd904f7b9Yann Collet#endif
12e2c84118f52cefe48fd2f751e66ad3ecd904f7b9Yann Collet
13e2c84118f52cefe48fd2f751e66ad3ecd904f7b9Yann Collet#define GCC_VERSION (__GNUC__ * 100 + __GNUC_MINOR__)
14e2c84118f52cefe48fd2f751e66ad3ecd904f7b9Yann Collet#ifdef __GNUC__
15e2c84118f52cefe48fd2f751e66ad3ecd904f7b9Yann Collet#  pragma GCC diagnostic ignored "-Wmissing-braces"   /* GCC bug 53119 : doesn't accept { 0 } as initializer (https://gcc.gnu.org/bugzilla/show_bug.cgi?id=53119) */
16e2c84118f52cefe48fd2f751e66ad3ecd904f7b9Yann Collet#endif
17e2c84118f52cefe48fd2f751e66ad3ecd904f7b9Yann Collet
18e2c84118f52cefe48fd2f751e66ad3ecd904f7b9Yann Collet
19e2c84118f52cefe48fd2f751e66ad3ecd904f7b9Yann Collet/**************************************
203de7f00a0b83f0f8ad861789d8da1ad697b1f05aYann Collet * Includes
213de7f00a0b83f0f8ad861789d8da1ad697b1f05aYann Collet **************************************/
22e2c84118f52cefe48fd2f751e66ad3ecd904f7b9Yann Collet#include "lz4hc.h"
23e2c84118f52cefe48fd2f751e66ad3ecd904f7b9Yann Collet#include "lz4.h"
24e2c84118f52cefe48fd2f751e66ad3ecd904f7b9Yann Collet
25e2c84118f52cefe48fd2f751e66ad3ecd904f7b9Yann Collet#include <stdio.h>
26e2c84118f52cefe48fd2f751e66ad3ecd904f7b9Yann Collet#include <stdint.h>
27e2c84118f52cefe48fd2f751e66ad3ecd904f7b9Yann Collet#include <stdlib.h>
28e2c84118f52cefe48fd2f751e66ad3ecd904f7b9Yann Collet#include <string.h>
29e2c84118f52cefe48fd2f751e66ad3ecd904f7b9Yann Collet
30e2c84118f52cefe48fd2f751e66ad3ecd904f7b9Yann Colletenum {
31e2c84118f52cefe48fd2f751e66ad3ecd904f7b9Yann Collet    MESSAGE_MAX_BYTES   = 1024,
322b421e97d4e7cfbefdc007bf30133b0de7e7e14eYann Collet    RING_BUFFER_BYTES   = 1024 * 8 + MESSAGE_MAX_BYTES,
337050d4b7672f164144f0cef0a95aa68ad71cf9e6Yann Collet    DEC_BUFFER_BYTES    = RING_BUFFER_BYTES + MESSAGE_MAX_BYTES   // Intentionally larger to test unsynchronized ring buffers
34e2c84118f52cefe48fd2f751e66ad3ecd904f7b9Yann Collet};
35e2c84118f52cefe48fd2f751e66ad3ecd904f7b9Yann Collet
36e2c84118f52cefe48fd2f751e66ad3ecd904f7b9Yann Collet
37e2c84118f52cefe48fd2f751e66ad3ecd904f7b9Yann Colletsize_t write_int32(FILE* fp, int32_t i) {
38e2c84118f52cefe48fd2f751e66ad3ecd904f7b9Yann Collet    return fwrite(&i, sizeof(i), 1, fp);
39e2c84118f52cefe48fd2f751e66ad3ecd904f7b9Yann Collet}
40e2c84118f52cefe48fd2f751e66ad3ecd904f7b9Yann Collet
41e2c84118f52cefe48fd2f751e66ad3ecd904f7b9Yann Colletsize_t write_bin(FILE* fp, const void* array, int arrayBytes) {
42e2c84118f52cefe48fd2f751e66ad3ecd904f7b9Yann Collet    return fwrite(array, 1, arrayBytes, fp);
43e2c84118f52cefe48fd2f751e66ad3ecd904f7b9Yann Collet}
44e2c84118f52cefe48fd2f751e66ad3ecd904f7b9Yann Collet
45e2c84118f52cefe48fd2f751e66ad3ecd904f7b9Yann Colletsize_t read_int32(FILE* fp, int32_t* i) {
46e2c84118f52cefe48fd2f751e66ad3ecd904f7b9Yann Collet    return fread(i, sizeof(*i), 1, fp);
47e2c84118f52cefe48fd2f751e66ad3ecd904f7b9Yann Collet}
48e2c84118f52cefe48fd2f751e66ad3ecd904f7b9Yann Collet
49e2c84118f52cefe48fd2f751e66ad3ecd904f7b9Yann Colletsize_t read_bin(FILE* fp, void* array, int arrayBytes) {
50e2c84118f52cefe48fd2f751e66ad3ecd904f7b9Yann Collet    return fread(array, 1, arrayBytes, fp);
51e2c84118f52cefe48fd2f751e66ad3ecd904f7b9Yann Collet}
52e2c84118f52cefe48fd2f751e66ad3ecd904f7b9Yann Collet
53e2c84118f52cefe48fd2f751e66ad3ecd904f7b9Yann Collet
54e2c84118f52cefe48fd2f751e66ad3ecd904f7b9Yann Colletvoid test_compress(FILE* outFp, FILE* inpFp)
55e2c84118f52cefe48fd2f751e66ad3ecd904f7b9Yann Collet{
56e2c84118f52cefe48fd2f751e66ad3ecd904f7b9Yann Collet    LZ4_streamHC_t lz4Stream_body = { 0 };
57e2c84118f52cefe48fd2f751e66ad3ecd904f7b9Yann Collet    LZ4_streamHC_t* lz4Stream = &lz4Stream_body;
58e2c84118f52cefe48fd2f751e66ad3ecd904f7b9Yann Collet
59e2c84118f52cefe48fd2f751e66ad3ecd904f7b9Yann Collet    static char inpBuf[RING_BUFFER_BYTES];
60e2c84118f52cefe48fd2f751e66ad3ecd904f7b9Yann Collet    int inpOffset = 0;
61e2c84118f52cefe48fd2f751e66ad3ecd904f7b9Yann Collet
62cc21115cb4f9ff1f97322104ffb19ca89b5a0eb1Yann Collet    for(;;) {
63e2c84118f52cefe48fd2f751e66ad3ecd904f7b9Yann Collet        // Read random length ([1,MESSAGE_MAX_BYTES]) data to the ring buffer.
64e2c84118f52cefe48fd2f751e66ad3ecd904f7b9Yann Collet        char* const inpPtr = &inpBuf[inpOffset];
65e2c84118f52cefe48fd2f751e66ad3ecd904f7b9Yann Collet        const int randomLength = (rand() % MESSAGE_MAX_BYTES) + 1;
66e2c84118f52cefe48fd2f751e66ad3ecd904f7b9Yann Collet        const int inpBytes = (int) read_bin(inpFp, inpPtr, randomLength);
67e2c84118f52cefe48fd2f751e66ad3ecd904f7b9Yann Collet        if (0 == inpBytes) break;
68e2c84118f52cefe48fd2f751e66ad3ecd904f7b9Yann Collet
692fe3aa9854ef761bb66b109d623b18b9bad91a67Yann Collet#define CMPBUFSIZE (LZ4_COMPRESSBOUND(MESSAGE_MAX_BYTES))
70cc21115cb4f9ff1f97322104ffb19ca89b5a0eb1Yann Collet        {   char cmpBuf[CMPBUFSIZE];
712fe3aa9854ef761bb66b109d623b18b9bad91a67Yann Collet            const int cmpBytes = LZ4_compress_HC_continue(lz4Stream, inpPtr, cmpBuf, inpBytes, CMPBUFSIZE);
722b421e97d4e7cfbefdc007bf30133b0de7e7e14eYann Collet
73e2c84118f52cefe48fd2f751e66ad3ecd904f7b9Yann Collet            if(cmpBytes <= 0) break;
74e2c84118f52cefe48fd2f751e66ad3ecd904f7b9Yann Collet            write_int32(outFp, cmpBytes);
75e2c84118f52cefe48fd2f751e66ad3ecd904f7b9Yann Collet            write_bin(outFp, cmpBuf, cmpBytes);
76e2c84118f52cefe48fd2f751e66ad3ecd904f7b9Yann Collet
77e2c84118f52cefe48fd2f751e66ad3ecd904f7b9Yann Collet            inpOffset += inpBytes;
78e2c84118f52cefe48fd2f751e66ad3ecd904f7b9Yann Collet
79e2c84118f52cefe48fd2f751e66ad3ecd904f7b9Yann Collet            // Wraparound the ringbuffer offset
80e2c84118f52cefe48fd2f751e66ad3ecd904f7b9Yann Collet            if(inpOffset >= RING_BUFFER_BYTES - MESSAGE_MAX_BYTES)
81e2c84118f52cefe48fd2f751e66ad3ecd904f7b9Yann Collet                inpOffset = 0;
82e2c84118f52cefe48fd2f751e66ad3ecd904f7b9Yann Collet        }
83e2c84118f52cefe48fd2f751e66ad3ecd904f7b9Yann Collet    }
84e2c84118f52cefe48fd2f751e66ad3ecd904f7b9Yann Collet
85e2c84118f52cefe48fd2f751e66ad3ecd904f7b9Yann Collet    write_int32(outFp, 0);
86e2c84118f52cefe48fd2f751e66ad3ecd904f7b9Yann Collet}
87e2c84118f52cefe48fd2f751e66ad3ecd904f7b9Yann Collet
88e2c84118f52cefe48fd2f751e66ad3ecd904f7b9Yann Collet
89e2c84118f52cefe48fd2f751e66ad3ecd904f7b9Yann Colletvoid test_decompress(FILE* outFp, FILE* inpFp)
90e2c84118f52cefe48fd2f751e66ad3ecd904f7b9Yann Collet{
912b421e97d4e7cfbefdc007bf30133b0de7e7e14eYann Collet    static char decBuf[DEC_BUFFER_BYTES];
92e2c84118f52cefe48fd2f751e66ad3ecd904f7b9Yann Collet    int decOffset = 0;
93e2c84118f52cefe48fd2f751e66ad3ecd904f7b9Yann Collet    LZ4_streamDecode_t lz4StreamDecode_body = { 0 };
94e2c84118f52cefe48fd2f751e66ad3ecd904f7b9Yann Collet    LZ4_streamDecode_t* lz4StreamDecode = &lz4StreamDecode_body;
95e2c84118f52cefe48fd2f751e66ad3ecd904f7b9Yann Collet
96cc21115cb4f9ff1f97322104ffb19ca89b5a0eb1Yann Collet    for(;;) {
972b421e97d4e7cfbefdc007bf30133b0de7e7e14eYann Collet        int  cmpBytes = 0;
982fe3aa9854ef761bb66b109d623b18b9bad91a67Yann Collet        char cmpBuf[CMPBUFSIZE];
99e2c84118f52cefe48fd2f751e66ad3ecd904f7b9Yann Collet
100cc21115cb4f9ff1f97322104ffb19ca89b5a0eb1Yann Collet        {   const size_t r0 = read_int32(inpFp, &cmpBytes);
1012b421e97d4e7cfbefdc007bf30133b0de7e7e14eYann Collet            size_t r1;
1023de7f00a0b83f0f8ad861789d8da1ad697b1f05aYann Collet            if(r0 != 1 || cmpBytes <= 0)
1032b421e97d4e7cfbefdc007bf30133b0de7e7e14eYann Collet                break;
104e2c84118f52cefe48fd2f751e66ad3ecd904f7b9Yann Collet
105e2c84118f52cefe48fd2f751e66ad3ecd904f7b9Yann Collet            r1 = read_bin(inpFp, cmpBuf, cmpBytes);
1063de7f00a0b83f0f8ad861789d8da1ad697b1f05aYann Collet            if(r1 != (size_t) cmpBytes)
1072b421e97d4e7cfbefdc007bf30133b0de7e7e14eYann Collet                break;
108e2c84118f52cefe48fd2f751e66ad3ecd904f7b9Yann Collet        }
109e2c84118f52cefe48fd2f751e66ad3ecd904f7b9Yann Collet
110cc21115cb4f9ff1f97322104ffb19ca89b5a0eb1Yann Collet        {   char* const decPtr = &decBuf[decOffset];
111e2c84118f52cefe48fd2f751e66ad3ecd904f7b9Yann Collet            const int decBytes = LZ4_decompress_safe_continue(
112e2c84118f52cefe48fd2f751e66ad3ecd904f7b9Yann Collet                lz4StreamDecode, cmpBuf, decPtr, cmpBytes, MESSAGE_MAX_BYTES);
1133de7f00a0b83f0f8ad861789d8da1ad697b1f05aYann Collet            if(decBytes <= 0)
1142b421e97d4e7cfbefdc007bf30133b0de7e7e14eYann Collet                break;
1152b421e97d4e7cfbefdc007bf30133b0de7e7e14eYann Collet
116e2c84118f52cefe48fd2f751e66ad3ecd904f7b9Yann Collet            decOffset += decBytes;
117e2c84118f52cefe48fd2f751e66ad3ecd904f7b9Yann Collet            write_bin(outFp, decPtr, decBytes);
118e2c84118f52cefe48fd2f751e66ad3ecd904f7b9Yann Collet
119e2c84118f52cefe48fd2f751e66ad3ecd904f7b9Yann Collet            // Wraparound the ringbuffer offset
1203de7f00a0b83f0f8ad861789d8da1ad697b1f05aYann Collet            if(decOffset >= DEC_BUFFER_BYTES - MESSAGE_MAX_BYTES)
1212b421e97d4e7cfbefdc007bf30133b0de7e7e14eYann Collet                decOffset = 0;
122e2c84118f52cefe48fd2f751e66ad3ecd904f7b9Yann Collet        }
123e2c84118f52cefe48fd2f751e66ad3ecd904f7b9Yann Collet    }
124e2c84118f52cefe48fd2f751e66ad3ecd904f7b9Yann Collet}
125e2c84118f52cefe48fd2f751e66ad3ecd904f7b9Yann Collet
126e2c84118f52cefe48fd2f751e66ad3ecd904f7b9Yann Collet
1272b421e97d4e7cfbefdc007bf30133b0de7e7e14eYann Collet// Compare 2 files content
1282b421e97d4e7cfbefdc007bf30133b0de7e7e14eYann Collet// return 0 if identical
1292b421e97d4e7cfbefdc007bf30133b0de7e7e14eYann Collet// return ByteNb>0 if different
1302b421e97d4e7cfbefdc007bf30133b0de7e7e14eYann Colletsize_t compare(FILE* f0, FILE* f1)
131e2c84118f52cefe48fd2f751e66ad3ecd904f7b9Yann Collet{
1322b421e97d4e7cfbefdc007bf30133b0de7e7e14eYann Collet    size_t result = 1;
133e2c84118f52cefe48fd2f751e66ad3ecd904f7b9Yann Collet
134cc21115cb4f9ff1f97322104ffb19ca89b5a0eb1Yann Collet    for (;;) {
135e2c84118f52cefe48fd2f751e66ad3ecd904f7b9Yann Collet        char b0[65536];
136e2c84118f52cefe48fd2f751e66ad3ecd904f7b9Yann Collet        char b1[65536];
137e2c84118f52cefe48fd2f751e66ad3ecd904f7b9Yann Collet        const size_t r0 = fread(b0, 1, sizeof(b0), f0);
138e2c84118f52cefe48fd2f751e66ad3ecd904f7b9Yann Collet        const size_t r1 = fread(b1, 1, sizeof(b1), f1);
139e2c84118f52cefe48fd2f751e66ad3ecd904f7b9Yann Collet
1402b421e97d4e7cfbefdc007bf30133b0de7e7e14eYann Collet        if ((r0==0) && (r1==0)) return 0;   // success
141e2c84118f52cefe48fd2f751e66ad3ecd904f7b9Yann Collet
142cc21115cb4f9ff1f97322104ffb19ca89b5a0eb1Yann Collet        if (r0 != r1) {
1432b421e97d4e7cfbefdc007bf30133b0de7e7e14eYann Collet            size_t smallest = r0;
1442b421e97d4e7cfbefdc007bf30133b0de7e7e14eYann Collet            if (r1<r0) smallest = r1;
1452b421e97d4e7cfbefdc007bf30133b0de7e7e14eYann Collet            result += smallest;
1468f844fe70068d2a632e7f0e24ecfa05a1d3e1302Yann Collet            break;
147e2c84118f52cefe48fd2f751e66ad3ecd904f7b9Yann Collet        }
1482b421e97d4e7cfbefdc007bf30133b0de7e7e14eYann Collet
149cc21115cb4f9ff1f97322104ffb19ca89b5a0eb1Yann Collet        if (memcmp(b0, b1, r0)) {
1502b421e97d4e7cfbefdc007bf30133b0de7e7e14eYann Collet            unsigned errorPos = 0;
1512b421e97d4e7cfbefdc007bf30133b0de7e7e14eYann Collet            while ((errorPos < r0) && (b0[errorPos]==b1[errorPos])) errorPos++;
1522b421e97d4e7cfbefdc007bf30133b0de7e7e14eYann Collet            result += errorPos;
1538f844fe70068d2a632e7f0e24ecfa05a1d3e1302Yann Collet            break;
154e2c84118f52cefe48fd2f751e66ad3ecd904f7b9Yann Collet        }
1552b421e97d4e7cfbefdc007bf30133b0de7e7e14eYann Collet
1562b421e97d4e7cfbefdc007bf30133b0de7e7e14eYann Collet        result += sizeof(b0);
157e2c84118f52cefe48fd2f751e66ad3ecd904f7b9Yann Collet    }
158e2c84118f52cefe48fd2f751e66ad3ecd904f7b9Yann Collet
1598f844fe70068d2a632e7f0e24ecfa05a1d3e1302Yann Collet    return result;
160e2c84118f52cefe48fd2f751e66ad3ecd904f7b9Yann Collet}
161e2c84118f52cefe48fd2f751e66ad3ecd904f7b9Yann Collet
162e2c84118f52cefe48fd2f751e66ad3ecd904f7b9Yann Collet
163cc21115cb4f9ff1f97322104ffb19ca89b5a0eb1Yann Colletint main(int argc, const char** argv)
164e2c84118f52cefe48fd2f751e66ad3ecd904f7b9Yann Collet{
165e2c84118f52cefe48fd2f751e66ad3ecd904f7b9Yann Collet    char inpFilename[256] = { 0 };
166e2c84118f52cefe48fd2f751e66ad3ecd904f7b9Yann Collet    char lz4Filename[256] = { 0 };
167e2c84118f52cefe48fd2f751e66ad3ecd904f7b9Yann Collet    char decFilename[256] = { 0 };
1682b421e97d4e7cfbefdc007bf30133b0de7e7e14eYann Collet    unsigned fileID = 1;
1692b421e97d4e7cfbefdc007bf30133b0de7e7e14eYann Collet    unsigned pause = 0;
1702b421e97d4e7cfbefdc007bf30133b0de7e7e14eYann Collet
171e2c84118f52cefe48fd2f751e66ad3ecd904f7b9Yann Collet
172e2c84118f52cefe48fd2f751e66ad3ecd904f7b9Yann Collet    if(argc < 2) {
173e2c84118f52cefe48fd2f751e66ad3ecd904f7b9Yann Collet        printf("Please specify input filename\n");
174e2c84118f52cefe48fd2f751e66ad3ecd904f7b9Yann Collet        return 0;
175e2c84118f52cefe48fd2f751e66ad3ecd904f7b9Yann Collet    }
176e2c84118f52cefe48fd2f751e66ad3ecd904f7b9Yann Collet
1772b421e97d4e7cfbefdc007bf30133b0de7e7e14eYann Collet    if (!strcmp(argv[1], "-p")) pause = 1, fileID = 2;
1782b421e97d4e7cfbefdc007bf30133b0de7e7e14eYann Collet
1792b421e97d4e7cfbefdc007bf30133b0de7e7e14eYann Collet    snprintf(inpFilename, 256, "%s", argv[fileID]);
1802b421e97d4e7cfbefdc007bf30133b0de7e7e14eYann Collet    snprintf(lz4Filename, 256, "%s.lz4s-%d", argv[fileID], 9);
1812b421e97d4e7cfbefdc007bf30133b0de7e7e14eYann Collet    snprintf(decFilename, 256, "%s.lz4s-%d.dec", argv[fileID], 9);
182e2c84118f52cefe48fd2f751e66ad3ecd904f7b9Yann Collet
1833de7f00a0b83f0f8ad861789d8da1ad697b1f05aYann Collet    printf("input   = [%s]\n", inpFilename);
1843de7f00a0b83f0f8ad861789d8da1ad697b1f05aYann Collet    printf("lz4     = [%s]\n", lz4Filename);
1853de7f00a0b83f0f8ad861789d8da1ad697b1f05aYann Collet    printf("decoded = [%s]\n", decFilename);
186e2c84118f52cefe48fd2f751e66ad3ecd904f7b9Yann Collet
187e2c84118f52cefe48fd2f751e66ad3ecd904f7b9Yann Collet    // compress
188cc21115cb4f9ff1f97322104ffb19ca89b5a0eb1Yann Collet    {   FILE* const inpFp = fopen(inpFilename, "rb");
189cc21115cb4f9ff1f97322104ffb19ca89b5a0eb1Yann Collet        FILE* const outFp = fopen(lz4Filename, "wb");
190e2c84118f52cefe48fd2f751e66ad3ecd904f7b9Yann Collet
191e2c84118f52cefe48fd2f751e66ad3ecd904f7b9Yann Collet        test_compress(outFp, inpFp);
192e2c84118f52cefe48fd2f751e66ad3ecd904f7b9Yann Collet
193e2c84118f52cefe48fd2f751e66ad3ecd904f7b9Yann Collet        fclose(outFp);
194e2c84118f52cefe48fd2f751e66ad3ecd904f7b9Yann Collet        fclose(inpFp);
195e2c84118f52cefe48fd2f751e66ad3ecd904f7b9Yann Collet    }
196e2c84118f52cefe48fd2f751e66ad3ecd904f7b9Yann Collet
197e2c84118f52cefe48fd2f751e66ad3ecd904f7b9Yann Collet    // decompress
198cc21115cb4f9ff1f97322104ffb19ca89b5a0eb1Yann Collet    {   FILE* const inpFp = fopen(lz4Filename, "rb");
199cc21115cb4f9ff1f97322104ffb19ca89b5a0eb1Yann Collet        FILE* const outFp = fopen(decFilename, "wb");
200e2c84118f52cefe48fd2f751e66ad3ecd904f7b9Yann Collet
201e2c84118f52cefe48fd2f751e66ad3ecd904f7b9Yann Collet        test_decompress(outFp, inpFp);
202e2c84118f52cefe48fd2f751e66ad3ecd904f7b9Yann Collet
203e2c84118f52cefe48fd2f751e66ad3ecd904f7b9Yann Collet        fclose(outFp);
204e2c84118f52cefe48fd2f751e66ad3ecd904f7b9Yann Collet        fclose(inpFp);
205e2c84118f52cefe48fd2f751e66ad3ecd904f7b9Yann Collet    }
206e2c84118f52cefe48fd2f751e66ad3ecd904f7b9Yann Collet
207e2c84118f52cefe48fd2f751e66ad3ecd904f7b9Yann Collet    // verify
208cc21115cb4f9ff1f97322104ffb19ca89b5a0eb1Yann Collet    {   FILE* const inpFp = fopen(inpFilename, "rb");
209cc21115cb4f9ff1f97322104ffb19ca89b5a0eb1Yann Collet        FILE* const decFp = fopen(decFilename, "rb");
210e2c84118f52cefe48fd2f751e66ad3ecd904f7b9Yann Collet
2112b421e97d4e7cfbefdc007bf30133b0de7e7e14eYann Collet        const size_t cmp = compare(inpFp, decFp);
212e2c84118f52cefe48fd2f751e66ad3ecd904f7b9Yann Collet        if(0 == cmp) {
213e2c84118f52cefe48fd2f751e66ad3ecd904f7b9Yann Collet            printf("Verify : OK\n");
214e2c84118f52cefe48fd2f751e66ad3ecd904f7b9Yann Collet        } else {
2152b421e97d4e7cfbefdc007bf30133b0de7e7e14eYann Collet            printf("Verify : NG : error at pos %u\n", (unsigned)cmp-1);
216e2c84118f52cefe48fd2f751e66ad3ecd904f7b9Yann Collet        }
217e2c84118f52cefe48fd2f751e66ad3ecd904f7b9Yann Collet
218e2c84118f52cefe48fd2f751e66ad3ecd904f7b9Yann Collet        fclose(decFp);
219e2c84118f52cefe48fd2f751e66ad3ecd904f7b9Yann Collet        fclose(inpFp);
220e2c84118f52cefe48fd2f751e66ad3ecd904f7b9Yann Collet    }
221e2c84118f52cefe48fd2f751e66ad3ecd904f7b9Yann Collet
222cc21115cb4f9ff1f97322104ffb19ca89b5a0eb1Yann Collet    if (pause) {
223cc21115cb4f9ff1f97322104ffb19ca89b5a0eb1Yann Collet        int unused;
2242b421e97d4e7cfbefdc007bf30133b0de7e7e14eYann Collet        printf("Press enter to continue ...\n");
225cc21115cb4f9ff1f97322104ffb19ca89b5a0eb1Yann Collet        unused = getchar(); (void)unused;   /* silence static analyzer */
2262b421e97d4e7cfbefdc007bf30133b0de7e7e14eYann Collet    }
2272b421e97d4e7cfbefdc007bf30133b0de7e7e14eYann Collet
228e2c84118f52cefe48fd2f751e66ad3ecd904f7b9Yann Collet    return 0;
229e2c84118f52cefe48fd2f751e66ad3ecd904f7b9Yann Collet}
230