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