Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // LZ4 streaming API example
- #define _CRT_SECURE_NO_WARNINGS // for MSVC
- #include "lz4.h"
- #include <stdio.h>
- #include <stdint.h>
- #include <stdlib.h>
- #include <string.h>
- //#define BLOCK_BYTES (1024*64)
- #define BLOCK_BYTES (1024*8)
- size_t write_int32(FILE* fp, int32_t i) {
- return fwrite(&i, sizeof(i), 1, fp);
- }
- size_t write_bin(FILE* fp, const void* array, int arrayBytes) {
- return fwrite(array, 1, arrayBytes, fp);
- }
- size_t read_int32(FILE* fp, int32_t* i) {
- return fread(i, sizeof(*i), 1, fp);
- }
- size_t read_bin(FILE* fp, void* array, int arrayBytes) {
- return fread(array, 1, arrayBytes, fp);
- }
- void test_compress(FILE* outFp, FILE* inpFp)
- {
- LZ4_stream_t lz4Stream_body = { 0 };
- LZ4_stream_t* lz4Stream = &lz4Stream_body;
- char inpBuf[2][BLOCK_BYTES] = { 0 };
- int inpBufIndex = 0;
- for(;;)
- {
- char* const inpPtr = inpBuf[inpBufIndex];
- const int inpBytes = (int) read_bin(inpFp, inpPtr, BLOCK_BYTES);
- if (inpBytes==0) break;
- {
- char cmpBuf[LZ4_COMPRESSBOUND(BLOCK_BYTES)];
- const int cmpBytes = LZ4_compress_continue(lz4Stream, inpPtr, cmpBuf, inpBytes);
- if(cmpBytes <= 0) break;
- write_int32(outFp, cmpBytes);
- write_bin(outFp, cmpBuf, cmpBytes);
- }
- inpBufIndex ^= 1;
- }
- write_int32(outFp, 0);
- }
- void test_decompress(FILE* outFp, FILE* inpFp)
- {
- char decBuf[2][BLOCK_BYTES] = { 0 };
- int decBufIndex = 0;
- LZ4_streamDecode_t ctx = { 0 };
- for(;;) {
- char cmpBuf[LZ4_COMPRESSBOUND(BLOCK_BYTES)];
- int cmpBytes = 0;
- {
- const size_t readCount0 = read_int32(inpFp, &cmpBytes);
- if(readCount0 != 1 || cmpBytes <= 0) break;
- const size_t readCount1 = read_bin(inpFp, cmpBuf, cmpBytes);
- if(readCount1 != (size_t) cmpBytes) break;
- }
- {
- char* const decPtr = decBuf[decBufIndex];
- const int decBytes = LZ4_decompress_safe_continue(
- &ctx, cmpBuf, decPtr, cmpBytes, BLOCK_BYTES);
- if(decBytes <= 0) break;
- write_bin(outFp, decPtr, decBytes);
- decBufIndex = (decBufIndex + 1) % 2;
- }
- }
- }
- int compare(FILE* f0, FILE* f1)
- {
- int result = 0;
- while(0 == result) {
- char b0[65536];
- char b1[65536];
- const size_t r0 = fread(b0, 1, sizeof(b0), f0);
- const size_t r1 = fread(b1, 1, sizeof(b1), f1);
- result = (int) r0 - (int) r1;
- if(0 == r0 || 0 == r1) {
- break;
- }
- if(0 == result) {
- result = memcmp(b0, b1, r0);
- }
- }
- return result;
- }
- int main(int argc, char** argv[])
- {
- char inpFilename[256] = { 0 };
- char lz4Filename[256] = { 0 };
- char decFilename[256] = { 0 };
- if(argc < 2) {
- printf("Please specify input filename\n");
- return 0;
- }
- sprintf(inpFilename, "%s", argv[1]);
- sprintf(lz4Filename, "%s.lz4s-%d", argv[1], BLOCK_BYTES);
- sprintf(decFilename, "%s.lz4s-%d.dec", argv[1], BLOCK_BYTES);
- printf("inp = [%s]\n", inpFilename);
- printf("lz4 = [%s]\n", lz4Filename);
- printf("dec = [%s]\n", decFilename);
- // compress
- {
- FILE* inpFp = fopen(inpFilename, "rb");
- FILE* outFp = fopen(lz4Filename, "wb");
- test_compress(outFp, inpFp);
- fclose(outFp);
- fclose(inpFp);
- }
- // decompress
- {
- FILE* inpFp = fopen(lz4Filename, "rb");
- FILE* outFp = fopen(decFilename, "wb");
- test_decompress(outFp, inpFp);
- fclose(outFp);
- fclose(inpFp);
- }
- // verify
- {
- FILE* inpFp = fopen(inpFilename, "rb");
- FILE* decFp = fopen(decFilename, "rb");
- const int cmp = compare(inpFp, decFp);
- if(0 == cmp) {
- printf("OK\n");
- } else {
- printf("NG\n");
- }
- fclose(decFp);
- fclose(inpFp);
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement