xref: /aosp_15_r20/external/lz4/tests/fullbench.c (revision 27162e4e17433d5aa7cb38e7b6a433a09405fc7f)
1*27162e4eSAndroid Build Coastguard Worker /*
2*27162e4eSAndroid Build Coastguard Worker     bench.c - Demo program to benchmark open-source compression algorithm
3*27162e4eSAndroid Build Coastguard Worker     Copyright (C) Yann Collet 2012-2020
4*27162e4eSAndroid Build Coastguard Worker 
5*27162e4eSAndroid Build Coastguard Worker     GPL v2 License
6*27162e4eSAndroid Build Coastguard Worker 
7*27162e4eSAndroid Build Coastguard Worker     This program is free software; you can redistribute it and/or modify
8*27162e4eSAndroid Build Coastguard Worker     it under the terms of the GNU General Public License as published by
9*27162e4eSAndroid Build Coastguard Worker     the Free Software Foundation; either version 2 of the License, or
10*27162e4eSAndroid Build Coastguard Worker     (at your option) any later version.
11*27162e4eSAndroid Build Coastguard Worker 
12*27162e4eSAndroid Build Coastguard Worker     This program is distributed in the hope that it will be useful,
13*27162e4eSAndroid Build Coastguard Worker     but WITHOUT ANY WARRANTY; without even the implied warranty of
14*27162e4eSAndroid Build Coastguard Worker     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15*27162e4eSAndroid Build Coastguard Worker     GNU General Public License for more details.
16*27162e4eSAndroid Build Coastguard Worker 
17*27162e4eSAndroid Build Coastguard Worker     You should have received a copy of the GNU General Public License along
18*27162e4eSAndroid Build Coastguard Worker     with this program; if not, write to the Free Software Foundation, Inc.,
19*27162e4eSAndroid Build Coastguard Worker     51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
20*27162e4eSAndroid Build Coastguard Worker 
21*27162e4eSAndroid Build Coastguard Worker     You can contact the author at :
22*27162e4eSAndroid Build Coastguard Worker     - LZ4 source repository : https://github.com/lz4/lz4
23*27162e4eSAndroid Build Coastguard Worker     - LZ4 public forum : https://groups.google.com/forum/#!forum/lz4c
24*27162e4eSAndroid Build Coastguard Worker */
25*27162e4eSAndroid Build Coastguard Worker 
26*27162e4eSAndroid Build Coastguard Worker 
27*27162e4eSAndroid Build Coastguard Worker #if defined(_MSC_VER) || defined(_WIN32)
28*27162e4eSAndroid Build Coastguard Worker    /* S_ISREG & gettimeofday() are not supported by MSVC */
29*27162e4eSAndroid Build Coastguard Worker #  define BMK_LEGACY_TIMER 1
30*27162e4eSAndroid Build Coastguard Worker #endif
31*27162e4eSAndroid Build Coastguard Worker 
32*27162e4eSAndroid Build Coastguard Worker 
33*27162e4eSAndroid Build Coastguard Worker /**************************************
34*27162e4eSAndroid Build Coastguard Worker *  Includes
35*27162e4eSAndroid Build Coastguard Worker **************************************/
36*27162e4eSAndroid Build Coastguard Worker #include "platform.h"    /* _CRT_SECURE_NO_WARNINGS, Large Files support */
37*27162e4eSAndroid Build Coastguard Worker #include "util.h"        /* U32, UTIL_getFileSize */
38*27162e4eSAndroid Build Coastguard Worker #include <stdlib.h>      /* malloc, free */
39*27162e4eSAndroid Build Coastguard Worker #include <stdio.h>       /* fprintf, fopen, ftello */
40*27162e4eSAndroid Build Coastguard Worker #include <sys/types.h>   /* stat64 */
41*27162e4eSAndroid Build Coastguard Worker #include <sys/stat.h>    /* stat64 */
42*27162e4eSAndroid Build Coastguard Worker #include <string.h>      /* strcmp */
43*27162e4eSAndroid Build Coastguard Worker #include <time.h>        /* clock_t, clock(), CLOCKS_PER_SEC */
44*27162e4eSAndroid Build Coastguard Worker 
45*27162e4eSAndroid Build Coastguard Worker #define LZ4_DISABLE_DEPRECATE_WARNINGS   /* LZ4_decompress_fast */
46*27162e4eSAndroid Build Coastguard Worker #include "lz4.h"
47*27162e4eSAndroid Build Coastguard Worker #include "lz4hc.h"
48*27162e4eSAndroid Build Coastguard Worker #include "lz4frame.h"
49*27162e4eSAndroid Build Coastguard Worker 
50*27162e4eSAndroid Build Coastguard Worker #include "xxhash.h"
51*27162e4eSAndroid Build Coastguard Worker 
52*27162e4eSAndroid Build Coastguard Worker 
53*27162e4eSAndroid Build Coastguard Worker /**************************************
54*27162e4eSAndroid Build Coastguard Worker *  Constants
55*27162e4eSAndroid Build Coastguard Worker **************************************/
56*27162e4eSAndroid Build Coastguard Worker #define PROGRAM_DESCRIPTION "LZ4 speed analyzer"
57*27162e4eSAndroid Build Coastguard Worker #define AUTHOR "Yann Collet"
58*27162e4eSAndroid Build Coastguard Worker #define WELCOME_MESSAGE "*** %s v%s %i-bits, by %s ***\n", PROGRAM_DESCRIPTION, LZ4_VERSION_STRING, (int)(sizeof(void*)*8), AUTHOR
59*27162e4eSAndroid Build Coastguard Worker 
60*27162e4eSAndroid Build Coastguard Worker #define NBLOOPS    6
61*27162e4eSAndroid Build Coastguard Worker #define TIMELOOP   (CLOCKS_PER_SEC * 19 / 10)
62*27162e4eSAndroid Build Coastguard Worker 
63*27162e4eSAndroid Build Coastguard Worker #define KB *(1 <<10)
64*27162e4eSAndroid Build Coastguard Worker #define MB *(1 <<20)
65*27162e4eSAndroid Build Coastguard Worker #define GB *(1U<<30)
66*27162e4eSAndroid Build Coastguard Worker 
67*27162e4eSAndroid Build Coastguard Worker #define KNUTH      2654435761U
68*27162e4eSAndroid Build Coastguard Worker #define MAX_MEM    (1920 MB)
69*27162e4eSAndroid Build Coastguard Worker #define DEFAULT_CHUNKSIZE   (4 MB)
70*27162e4eSAndroid Build Coastguard Worker 
71*27162e4eSAndroid Build Coastguard Worker #define ALL_COMPRESSORS 0
72*27162e4eSAndroid Build Coastguard Worker #define ALL_DECOMPRESSORS 0
73*27162e4eSAndroid Build Coastguard Worker 
74*27162e4eSAndroid Build Coastguard Worker 
75*27162e4eSAndroid Build Coastguard Worker /**************************************
76*27162e4eSAndroid Build Coastguard Worker *  Local structures
77*27162e4eSAndroid Build Coastguard Worker **************************************/
78*27162e4eSAndroid Build Coastguard Worker struct chunkParameters
79*27162e4eSAndroid Build Coastguard Worker {
80*27162e4eSAndroid Build Coastguard Worker     U32   id;
81*27162e4eSAndroid Build Coastguard Worker     char* origBuffer;
82*27162e4eSAndroid Build Coastguard Worker     char* compressedBuffer;
83*27162e4eSAndroid Build Coastguard Worker     int   origSize;
84*27162e4eSAndroid Build Coastguard Worker     int   compressedSize;
85*27162e4eSAndroid Build Coastguard Worker };
86*27162e4eSAndroid Build Coastguard Worker 
87*27162e4eSAndroid Build Coastguard Worker 
88*27162e4eSAndroid Build Coastguard Worker /**************************************
89*27162e4eSAndroid Build Coastguard Worker *  Macros
90*27162e4eSAndroid Build Coastguard Worker **************************************/
91*27162e4eSAndroid Build Coastguard Worker #define DISPLAY(...) fprintf(stderr, __VA_ARGS__)
92*27162e4eSAndroid Build Coastguard Worker #define PROGRESS(...) g_noPrompt ? 0 : DISPLAY(__VA_ARGS__)
93*27162e4eSAndroid Build Coastguard Worker 
94*27162e4eSAndroid Build Coastguard Worker 
95*27162e4eSAndroid Build Coastguard Worker /**************************************
96*27162e4eSAndroid Build Coastguard Worker *  Benchmark Parameters
97*27162e4eSAndroid Build Coastguard Worker **************************************/
98*27162e4eSAndroid Build Coastguard Worker static int g_chunkSize = DEFAULT_CHUNKSIZE;
99*27162e4eSAndroid Build Coastguard Worker static int g_nbIterations = NBLOOPS;
100*27162e4eSAndroid Build Coastguard Worker static int g_pause = 0;
101*27162e4eSAndroid Build Coastguard Worker static int g_compressionTest = 1;
102*27162e4eSAndroid Build Coastguard Worker static int g_compressionAlgo = ALL_COMPRESSORS;
103*27162e4eSAndroid Build Coastguard Worker static int g_decompressionTest = 1;
104*27162e4eSAndroid Build Coastguard Worker static int g_decompressionAlgo = ALL_DECOMPRESSORS;
105*27162e4eSAndroid Build Coastguard Worker static int g_noPrompt = 0;
106*27162e4eSAndroid Build Coastguard Worker 
BMK_setBlocksize(int bsize)107*27162e4eSAndroid Build Coastguard Worker static void BMK_setBlocksize(int bsize)
108*27162e4eSAndroid Build Coastguard Worker {
109*27162e4eSAndroid Build Coastguard Worker     g_chunkSize = bsize;
110*27162e4eSAndroid Build Coastguard Worker     DISPLAY("-Using Block Size of %i KB-\n", g_chunkSize>>10);
111*27162e4eSAndroid Build Coastguard Worker }
112*27162e4eSAndroid Build Coastguard Worker 
BMK_setNbIterations(int nbLoops)113*27162e4eSAndroid Build Coastguard Worker static void BMK_setNbIterations(int nbLoops)
114*27162e4eSAndroid Build Coastguard Worker {
115*27162e4eSAndroid Build Coastguard Worker     g_nbIterations = nbLoops;
116*27162e4eSAndroid Build Coastguard Worker     DISPLAY("- %i iterations -\n", g_nbIterations);
117*27162e4eSAndroid Build Coastguard Worker }
118*27162e4eSAndroid Build Coastguard Worker 
BMK_setPause(void)119*27162e4eSAndroid Build Coastguard Worker static void BMK_setPause(void)
120*27162e4eSAndroid Build Coastguard Worker {
121*27162e4eSAndroid Build Coastguard Worker     g_pause = 1;
122*27162e4eSAndroid Build Coastguard Worker }
123*27162e4eSAndroid Build Coastguard Worker 
124*27162e4eSAndroid Build Coastguard Worker 
125*27162e4eSAndroid Build Coastguard Worker /*********************************************************
126*27162e4eSAndroid Build Coastguard Worker *  Private functions
127*27162e4eSAndroid Build Coastguard Worker *********************************************************/
BMK_GetClockSpan(clock_t clockStart)128*27162e4eSAndroid Build Coastguard Worker static clock_t BMK_GetClockSpan( clock_t clockStart )
129*27162e4eSAndroid Build Coastguard Worker {
130*27162e4eSAndroid Build Coastguard Worker     return clock() - clockStart;   /* works even if overflow; max span ~30 mn */
131*27162e4eSAndroid Build Coastguard Worker }
132*27162e4eSAndroid Build Coastguard Worker 
133*27162e4eSAndroid Build Coastguard Worker 
BMK_findMaxMem(U64 requiredMem)134*27162e4eSAndroid Build Coastguard Worker static size_t BMK_findMaxMem(U64 requiredMem)
135*27162e4eSAndroid Build Coastguard Worker {
136*27162e4eSAndroid Build Coastguard Worker     size_t step = 64 MB;
137*27162e4eSAndroid Build Coastguard Worker     BYTE* testmem = NULL;
138*27162e4eSAndroid Build Coastguard Worker 
139*27162e4eSAndroid Build Coastguard Worker     requiredMem = (((requiredMem >> 26) + 1) << 26);
140*27162e4eSAndroid Build Coastguard Worker     requiredMem += 2*step;
141*27162e4eSAndroid Build Coastguard Worker     if (requiredMem > MAX_MEM) requiredMem = MAX_MEM;
142*27162e4eSAndroid Build Coastguard Worker 
143*27162e4eSAndroid Build Coastguard Worker     while (!testmem) {
144*27162e4eSAndroid Build Coastguard Worker         if (requiredMem > step) requiredMem -= step;
145*27162e4eSAndroid Build Coastguard Worker         else requiredMem >>= 1;
146*27162e4eSAndroid Build Coastguard Worker         testmem = (BYTE*) malloc ((size_t)requiredMem);
147*27162e4eSAndroid Build Coastguard Worker     }
148*27162e4eSAndroid Build Coastguard Worker     free (testmem);
149*27162e4eSAndroid Build Coastguard Worker 
150*27162e4eSAndroid Build Coastguard Worker     /* keep some space available */
151*27162e4eSAndroid Build Coastguard Worker     if (requiredMem > step) requiredMem -= step;
152*27162e4eSAndroid Build Coastguard Worker     else requiredMem >>= 1;
153*27162e4eSAndroid Build Coastguard Worker 
154*27162e4eSAndroid Build Coastguard Worker     return (size_t)requiredMem;
155*27162e4eSAndroid Build Coastguard Worker }
156*27162e4eSAndroid Build Coastguard Worker 
157*27162e4eSAndroid Build Coastguard Worker 
158*27162e4eSAndroid Build Coastguard Worker /*********************************************************
159*27162e4eSAndroid Build Coastguard Worker *  Memory management, to test LZ4_USER_MEMORY_FUNCTIONS
160*27162e4eSAndroid Build Coastguard Worker *********************************************************/
LZ4_malloc(size_t s)161*27162e4eSAndroid Build Coastguard Worker void* LZ4_malloc(size_t s) { return malloc(s); }
LZ4_calloc(size_t n,size_t s)162*27162e4eSAndroid Build Coastguard Worker void* LZ4_calloc(size_t n, size_t s) { return calloc(n,s); }
LZ4_free(void * p)163*27162e4eSAndroid Build Coastguard Worker void  LZ4_free(void* p) { free(p); }
164*27162e4eSAndroid Build Coastguard Worker 
165*27162e4eSAndroid Build Coastguard Worker 
166*27162e4eSAndroid Build Coastguard Worker /*********************************************************
167*27162e4eSAndroid Build Coastguard Worker *  Benchmark function
168*27162e4eSAndroid Build Coastguard Worker *********************************************************/
169*27162e4eSAndroid Build Coastguard Worker static LZ4_stream_t LZ4_stream;
local_LZ4_resetDictT(void)170*27162e4eSAndroid Build Coastguard Worker static void local_LZ4_resetDictT(void)
171*27162e4eSAndroid Build Coastguard Worker {
172*27162e4eSAndroid Build Coastguard Worker     void* const r = LZ4_initStream(&LZ4_stream, sizeof(LZ4_stream));
173*27162e4eSAndroid Build Coastguard Worker     assert(r != NULL); (void)r;
174*27162e4eSAndroid Build Coastguard Worker }
175*27162e4eSAndroid Build Coastguard Worker 
local_LZ4_createStream(void)176*27162e4eSAndroid Build Coastguard Worker static void local_LZ4_createStream(void)
177*27162e4eSAndroid Build Coastguard Worker {
178*27162e4eSAndroid Build Coastguard Worker     void* const r = LZ4_initStream(&LZ4_stream, sizeof(LZ4_stream));
179*27162e4eSAndroid Build Coastguard Worker     assert(r != NULL); (void)r;
180*27162e4eSAndroid Build Coastguard Worker }
181*27162e4eSAndroid Build Coastguard Worker 
182*27162e4eSAndroid Build Coastguard Worker static void* g_chunk0 = NULL;
183*27162e4eSAndroid Build Coastguard Worker static size_t g_chunk0Size = 0;
local_LZ4_saveDict_init(void)184*27162e4eSAndroid Build Coastguard Worker static void local_LZ4_saveDict_init(void)
185*27162e4eSAndroid Build Coastguard Worker {
186*27162e4eSAndroid Build Coastguard Worker     LZ4_loadDict(&LZ4_stream, (const char*)g_chunk0, (int)g_chunk0Size);
187*27162e4eSAndroid Build Coastguard Worker }
188*27162e4eSAndroid Build Coastguard Worker 
local_LZ4_saveDict(const char * in,char * out,int inSize)189*27162e4eSAndroid Build Coastguard Worker static int local_LZ4_saveDict(const char* in, char* out, int inSize)
190*27162e4eSAndroid Build Coastguard Worker {
191*27162e4eSAndroid Build Coastguard Worker     (void)in;
192*27162e4eSAndroid Build Coastguard Worker     return LZ4_saveDict(&LZ4_stream, out, inSize);
193*27162e4eSAndroid Build Coastguard Worker }
194*27162e4eSAndroid Build Coastguard Worker 
local_LZ4_compress_default_large(const char * in,char * out,int inSize)195*27162e4eSAndroid Build Coastguard Worker static int local_LZ4_compress_default_large(const char* in, char* out, int inSize)
196*27162e4eSAndroid Build Coastguard Worker {
197*27162e4eSAndroid Build Coastguard Worker     return LZ4_compress_default(in, out, inSize, LZ4_compressBound(inSize));
198*27162e4eSAndroid Build Coastguard Worker }
199*27162e4eSAndroid Build Coastguard Worker 
local_LZ4_compress_default_small(const char * in,char * out,int inSize)200*27162e4eSAndroid Build Coastguard Worker static int local_LZ4_compress_default_small(const char* in, char* out, int inSize)
201*27162e4eSAndroid Build Coastguard Worker {
202*27162e4eSAndroid Build Coastguard Worker     return LZ4_compress_default(in, out, inSize, LZ4_compressBound(inSize)-1);
203*27162e4eSAndroid Build Coastguard Worker }
204*27162e4eSAndroid Build Coastguard Worker 
local_LZ4_compress_destSize(const char * in,char * out,int inSize)205*27162e4eSAndroid Build Coastguard Worker static int local_LZ4_compress_destSize(const char* in, char* out, int inSize)
206*27162e4eSAndroid Build Coastguard Worker {
207*27162e4eSAndroid Build Coastguard Worker     return LZ4_compress_destSize(in, out, &inSize, LZ4_compressBound(inSize)-1);
208*27162e4eSAndroid Build Coastguard Worker }
209*27162e4eSAndroid Build Coastguard Worker 
local_LZ4_compress_fast0(const char * in,char * out,int inSize)210*27162e4eSAndroid Build Coastguard Worker static int local_LZ4_compress_fast0(const char* in, char* out, int inSize)
211*27162e4eSAndroid Build Coastguard Worker {
212*27162e4eSAndroid Build Coastguard Worker     return LZ4_compress_fast(in, out, inSize, LZ4_compressBound(inSize), 0);
213*27162e4eSAndroid Build Coastguard Worker }
214*27162e4eSAndroid Build Coastguard Worker 
local_LZ4_compress_fast1(const char * in,char * out,int inSize)215*27162e4eSAndroid Build Coastguard Worker static int local_LZ4_compress_fast1(const char* in, char* out, int inSize)
216*27162e4eSAndroid Build Coastguard Worker {
217*27162e4eSAndroid Build Coastguard Worker     return LZ4_compress_fast(in, out, inSize, LZ4_compressBound(inSize), 1);
218*27162e4eSAndroid Build Coastguard Worker }
219*27162e4eSAndroid Build Coastguard Worker 
local_LZ4_compress_fast2(const char * in,char * out,int inSize)220*27162e4eSAndroid Build Coastguard Worker static int local_LZ4_compress_fast2(const char* in, char* out, int inSize)
221*27162e4eSAndroid Build Coastguard Worker {
222*27162e4eSAndroid Build Coastguard Worker     return LZ4_compress_fast(in, out, inSize, LZ4_compressBound(inSize), 2);
223*27162e4eSAndroid Build Coastguard Worker }
224*27162e4eSAndroid Build Coastguard Worker 
local_LZ4_compress_fast17(const char * in,char * out,int inSize)225*27162e4eSAndroid Build Coastguard Worker static int local_LZ4_compress_fast17(const char* in, char* out, int inSize)
226*27162e4eSAndroid Build Coastguard Worker {
227*27162e4eSAndroid Build Coastguard Worker     return LZ4_compress_fast(in, out, inSize, LZ4_compressBound(inSize), 17);
228*27162e4eSAndroid Build Coastguard Worker }
229*27162e4eSAndroid Build Coastguard Worker 
local_LZ4_compress_fast_extState0(const char * in,char * out,int inSize)230*27162e4eSAndroid Build Coastguard Worker static int local_LZ4_compress_fast_extState0(const char* in, char* out, int inSize)
231*27162e4eSAndroid Build Coastguard Worker {
232*27162e4eSAndroid Build Coastguard Worker     return LZ4_compress_fast_extState(&LZ4_stream, in, out, inSize, LZ4_compressBound(inSize), 0);
233*27162e4eSAndroid Build Coastguard Worker }
234*27162e4eSAndroid Build Coastguard Worker 
local_LZ4_compress_fast_continue0(const char * in,char * out,int inSize)235*27162e4eSAndroid Build Coastguard Worker static int local_LZ4_compress_fast_continue0(const char* in, char* out, int inSize)
236*27162e4eSAndroid Build Coastguard Worker {
237*27162e4eSAndroid Build Coastguard Worker     return LZ4_compress_fast_continue(&LZ4_stream, in, out, inSize, LZ4_compressBound(inSize), 0);
238*27162e4eSAndroid Build Coastguard Worker }
239*27162e4eSAndroid Build Coastguard Worker 
240*27162e4eSAndroid Build Coastguard Worker #ifndef LZ4_DLL_IMPORT
241*27162e4eSAndroid Build Coastguard Worker #if defined (__cplusplus)
242*27162e4eSAndroid Build Coastguard Worker extern "C" {
243*27162e4eSAndroid Build Coastguard Worker #endif
244*27162e4eSAndroid Build Coastguard Worker 
245*27162e4eSAndroid Build Coastguard Worker /* declare hidden function */
246*27162e4eSAndroid Build Coastguard Worker extern int LZ4_compress_forceExtDict (LZ4_stream_t* LZ4_stream, const char* source, char* dest, int inputSize);
247*27162e4eSAndroid Build Coastguard Worker 
248*27162e4eSAndroid Build Coastguard Worker #if defined (__cplusplus)
249*27162e4eSAndroid Build Coastguard Worker }
250*27162e4eSAndroid Build Coastguard Worker #endif
251*27162e4eSAndroid Build Coastguard Worker 
local_LZ4_compress_forceDict(const char * in,char * out,int inSize)252*27162e4eSAndroid Build Coastguard Worker static int local_LZ4_compress_forceDict(const char* in, char* out, int inSize)
253*27162e4eSAndroid Build Coastguard Worker {
254*27162e4eSAndroid Build Coastguard Worker     return LZ4_compress_forceExtDict(&LZ4_stream, in, out, inSize);
255*27162e4eSAndroid Build Coastguard Worker }
256*27162e4eSAndroid Build Coastguard Worker #endif
257*27162e4eSAndroid Build Coastguard Worker 
258*27162e4eSAndroid Build Coastguard Worker 
259*27162e4eSAndroid Build Coastguard Worker /* HC compression functions */
260*27162e4eSAndroid Build Coastguard Worker LZ4_streamHC_t LZ4_streamHC;
local_LZ4_resetStreamHC(void)261*27162e4eSAndroid Build Coastguard Worker static void local_LZ4_resetStreamHC(void)
262*27162e4eSAndroid Build Coastguard Worker {
263*27162e4eSAndroid Build Coastguard Worker     LZ4_initStreamHC(&LZ4_streamHC, sizeof(LZ4_streamHC));
264*27162e4eSAndroid Build Coastguard Worker }
265*27162e4eSAndroid Build Coastguard Worker 
local_LZ4_saveDictHC_init(void)266*27162e4eSAndroid Build Coastguard Worker static void local_LZ4_saveDictHC_init(void)
267*27162e4eSAndroid Build Coastguard Worker {
268*27162e4eSAndroid Build Coastguard Worker     LZ4_loadDictHC(&LZ4_streamHC, (const char*)g_chunk0, (int)g_chunk0Size);
269*27162e4eSAndroid Build Coastguard Worker }
270*27162e4eSAndroid Build Coastguard Worker 
local_LZ4_saveDictHC(const char * in,char * out,int inSize)271*27162e4eSAndroid Build Coastguard Worker static int local_LZ4_saveDictHC(const char* in, char* out, int inSize)
272*27162e4eSAndroid Build Coastguard Worker {
273*27162e4eSAndroid Build Coastguard Worker     (void)in;
274*27162e4eSAndroid Build Coastguard Worker     return LZ4_saveDictHC(&LZ4_streamHC, out, inSize);
275*27162e4eSAndroid Build Coastguard Worker }
276*27162e4eSAndroid Build Coastguard Worker 
local_LZ4_compress_HC(const char * in,char * out,int inSize)277*27162e4eSAndroid Build Coastguard Worker static int local_LZ4_compress_HC(const char* in, char* out, int inSize)
278*27162e4eSAndroid Build Coastguard Worker {
279*27162e4eSAndroid Build Coastguard Worker     return LZ4_compress_HC(in, out, inSize, LZ4_compressBound(inSize), 9);
280*27162e4eSAndroid Build Coastguard Worker }
281*27162e4eSAndroid Build Coastguard Worker 
local_LZ4_compress_HC_extStateHC(const char * in,char * out,int inSize)282*27162e4eSAndroid Build Coastguard Worker static int local_LZ4_compress_HC_extStateHC(const char* in, char* out, int inSize)
283*27162e4eSAndroid Build Coastguard Worker {
284*27162e4eSAndroid Build Coastguard Worker     return LZ4_compress_HC_extStateHC(&LZ4_streamHC, in, out, inSize, LZ4_compressBound(inSize), 9);
285*27162e4eSAndroid Build Coastguard Worker }
286*27162e4eSAndroid Build Coastguard Worker 
local_LZ4_compress_HC_continue(const char * in,char * out,int inSize)287*27162e4eSAndroid Build Coastguard Worker static int local_LZ4_compress_HC_continue(const char* in, char* out, int inSize)
288*27162e4eSAndroid Build Coastguard Worker {
289*27162e4eSAndroid Build Coastguard Worker     return LZ4_compress_HC_continue(&LZ4_streamHC, in, out, inSize, LZ4_compressBound(inSize));
290*27162e4eSAndroid Build Coastguard Worker }
291*27162e4eSAndroid Build Coastguard Worker 
292*27162e4eSAndroid Build Coastguard Worker 
293*27162e4eSAndroid Build Coastguard Worker /* decompression functions */
local_LZ4_decompress_fast(const char * in,char * out,int inSize,int outSize)294*27162e4eSAndroid Build Coastguard Worker static int local_LZ4_decompress_fast(const char* in, char* out, int inSize, int outSize)
295*27162e4eSAndroid Build Coastguard Worker {
296*27162e4eSAndroid Build Coastguard Worker     (void)inSize;
297*27162e4eSAndroid Build Coastguard Worker     LZ4_decompress_fast(in, out, outSize);
298*27162e4eSAndroid Build Coastguard Worker     return outSize;
299*27162e4eSAndroid Build Coastguard Worker }
300*27162e4eSAndroid Build Coastguard Worker 
local_LZ4_decompress_fast_usingDict_prefix(const char * in,char * out,int inSize,int outSize)301*27162e4eSAndroid Build Coastguard Worker static int local_LZ4_decompress_fast_usingDict_prefix(const char* in, char* out, int inSize, int outSize)
302*27162e4eSAndroid Build Coastguard Worker {
303*27162e4eSAndroid Build Coastguard Worker     (void)inSize;
304*27162e4eSAndroid Build Coastguard Worker     LZ4_decompress_fast_usingDict(in, out, outSize, out - 65536, 65536);
305*27162e4eSAndroid Build Coastguard Worker     return outSize;
306*27162e4eSAndroid Build Coastguard Worker }
307*27162e4eSAndroid Build Coastguard Worker 
local_LZ4_decompress_fast_usingExtDict(const char * in,char * out,int inSize,int outSize)308*27162e4eSAndroid Build Coastguard Worker static int local_LZ4_decompress_fast_usingExtDict(const char* in, char* out, int inSize, int outSize)
309*27162e4eSAndroid Build Coastguard Worker {
310*27162e4eSAndroid Build Coastguard Worker     (void)inSize;
311*27162e4eSAndroid Build Coastguard Worker     LZ4_decompress_fast_usingDict(in, out, outSize, out - 65536, 65535);
312*27162e4eSAndroid Build Coastguard Worker     return outSize;
313*27162e4eSAndroid Build Coastguard Worker }
314*27162e4eSAndroid Build Coastguard Worker 
local_LZ4_decompress_safe(const char * in,char * out,int inSize,int outSize)315*27162e4eSAndroid Build Coastguard Worker static int local_LZ4_decompress_safe(const char* in, char* out, int inSize, int outSize)
316*27162e4eSAndroid Build Coastguard Worker {
317*27162e4eSAndroid Build Coastguard Worker     return LZ4_decompress_safe(in, out, inSize, outSize);
318*27162e4eSAndroid Build Coastguard Worker }
319*27162e4eSAndroid Build Coastguard Worker 
local_LZ4_decompress_safe_withPrefix64k(const char * in,char * out,int inSize,int outSize)320*27162e4eSAndroid Build Coastguard Worker static int local_LZ4_decompress_safe_withPrefix64k(const char* in, char* out, int inSize, int outSize)
321*27162e4eSAndroid Build Coastguard Worker {
322*27162e4eSAndroid Build Coastguard Worker     LZ4_decompress_safe_withPrefix64k(in, out, inSize, outSize);
323*27162e4eSAndroid Build Coastguard Worker     return outSize;
324*27162e4eSAndroid Build Coastguard Worker }
325*27162e4eSAndroid Build Coastguard Worker 
local_LZ4_decompress_safe_usingDict(const char * in,char * out,int inSize,int outSize)326*27162e4eSAndroid Build Coastguard Worker static int local_LZ4_decompress_safe_usingDict(const char* in, char* out, int inSize, int outSize)
327*27162e4eSAndroid Build Coastguard Worker {
328*27162e4eSAndroid Build Coastguard Worker     LZ4_decompress_safe_usingDict(in, out, inSize, outSize, out - 65536, 65536);
329*27162e4eSAndroid Build Coastguard Worker     return outSize;
330*27162e4eSAndroid Build Coastguard Worker }
331*27162e4eSAndroid Build Coastguard Worker 
local_LZ4_decompress_safe_partial_usingDict(const char * in,char * out,int inSize,int outSize)332*27162e4eSAndroid Build Coastguard Worker static int local_LZ4_decompress_safe_partial_usingDict(const char* in, char* out, int inSize, int outSize)
333*27162e4eSAndroid Build Coastguard Worker {
334*27162e4eSAndroid Build Coastguard Worker     int result = LZ4_decompress_safe_partial_usingDict(in, out, inSize, outSize - 5, outSize, out - 65536, 65536);
335*27162e4eSAndroid Build Coastguard Worker     if (result < 0) return result;
336*27162e4eSAndroid Build Coastguard Worker     return outSize;
337*27162e4eSAndroid Build Coastguard Worker }
338*27162e4eSAndroid Build Coastguard Worker 
339*27162e4eSAndroid Build Coastguard Worker #ifndef LZ4_DLL_IMPORT
340*27162e4eSAndroid Build Coastguard Worker #if defined (__cplusplus)
341*27162e4eSAndroid Build Coastguard Worker extern "C" {
342*27162e4eSAndroid Build Coastguard Worker #endif
343*27162e4eSAndroid Build Coastguard Worker 
344*27162e4eSAndroid Build Coastguard Worker extern int LZ4_decompress_safe_forceExtDict(const char* in, char* out, int inSize, int outSize, const void* dict, size_t dictSize);
345*27162e4eSAndroid Build Coastguard Worker 
346*27162e4eSAndroid Build Coastguard Worker #if defined (__cplusplus)
347*27162e4eSAndroid Build Coastguard Worker }
348*27162e4eSAndroid Build Coastguard Worker #endif
349*27162e4eSAndroid Build Coastguard Worker 
local_LZ4_decompress_safe_forceExtDict(const char * in,char * out,int inSize,int outSize)350*27162e4eSAndroid Build Coastguard Worker static int local_LZ4_decompress_safe_forceExtDict(const char* in, char* out, int inSize, int outSize)
351*27162e4eSAndroid Build Coastguard Worker {
352*27162e4eSAndroid Build Coastguard Worker     LZ4_decompress_safe_forceExtDict(in, out, inSize, outSize, out - 65536, 65536);
353*27162e4eSAndroid Build Coastguard Worker     return outSize;
354*27162e4eSAndroid Build Coastguard Worker }
355*27162e4eSAndroid Build Coastguard Worker #endif
356*27162e4eSAndroid Build Coastguard Worker 
357*27162e4eSAndroid Build Coastguard Worker #ifndef LZ4_DLL_IMPORT
358*27162e4eSAndroid Build Coastguard Worker #if defined (__cplusplus)
359*27162e4eSAndroid Build Coastguard Worker extern "C" {
360*27162e4eSAndroid Build Coastguard Worker #endif
361*27162e4eSAndroid Build Coastguard Worker 
362*27162e4eSAndroid Build Coastguard Worker extern int LZ4_decompress_safe_partial_forceExtDict(const char* in, char* out, int inSize, int targetOutputSize, int dstCapacity, const void* dict, size_t dictSize);
363*27162e4eSAndroid Build Coastguard Worker 
364*27162e4eSAndroid Build Coastguard Worker #if defined (__cplusplus)
365*27162e4eSAndroid Build Coastguard Worker }
366*27162e4eSAndroid Build Coastguard Worker #endif
367*27162e4eSAndroid Build Coastguard Worker 
local_LZ4_decompress_safe_partial_forceExtDict(const char * in,char * out,int inSize,int outSize)368*27162e4eSAndroid Build Coastguard Worker static int local_LZ4_decompress_safe_partial_forceExtDict(const char* in, char* out, int inSize, int outSize)
369*27162e4eSAndroid Build Coastguard Worker {
370*27162e4eSAndroid Build Coastguard Worker     int result = LZ4_decompress_safe_partial_forceExtDict(in, out, inSize, outSize - 5, outSize, out - 65536, 65536);
371*27162e4eSAndroid Build Coastguard Worker     if (result < 0) return result;
372*27162e4eSAndroid Build Coastguard Worker     return outSize;
373*27162e4eSAndroid Build Coastguard Worker }
374*27162e4eSAndroid Build Coastguard Worker #endif
375*27162e4eSAndroid Build Coastguard Worker 
local_LZ4_decompress_safe_partial(const char * in,char * out,int inSize,int outSize)376*27162e4eSAndroid Build Coastguard Worker static int local_LZ4_decompress_safe_partial(const char* in, char* out, int inSize, int outSize)
377*27162e4eSAndroid Build Coastguard Worker {
378*27162e4eSAndroid Build Coastguard Worker     int result = LZ4_decompress_safe_partial(in, out, inSize, outSize - 5, outSize);
379*27162e4eSAndroid Build Coastguard Worker     if (result < 0) return result;
380*27162e4eSAndroid Build Coastguard Worker     return outSize;
381*27162e4eSAndroid Build Coastguard Worker }
382*27162e4eSAndroid Build Coastguard Worker 
383*27162e4eSAndroid Build Coastguard Worker 
384*27162e4eSAndroid Build Coastguard Worker /* frame functions */
local_LZ4F_compressFrame(const char * in,char * out,int inSize)385*27162e4eSAndroid Build Coastguard Worker static int local_LZ4F_compressFrame(const char* in, char* out, int inSize)
386*27162e4eSAndroid Build Coastguard Worker {
387*27162e4eSAndroid Build Coastguard Worker     assert(inSize >= 0);
388*27162e4eSAndroid Build Coastguard Worker     return (int)LZ4F_compressFrame(out, LZ4F_compressFrameBound((size_t)inSize, NULL), in, (size_t)inSize, NULL);
389*27162e4eSAndroid Build Coastguard Worker }
390*27162e4eSAndroid Build Coastguard Worker 
391*27162e4eSAndroid Build Coastguard Worker LZ4F_cctx* g_cctx = NULL;
local_LZ4F_compress(const char * in,char * out,int inSize)392*27162e4eSAndroid Build Coastguard Worker static int local_LZ4F_compress(const char* in, char* out, int inSize)
393*27162e4eSAndroid Build Coastguard Worker {
394*27162e4eSAndroid Build Coastguard Worker     /* output buffer size is assumed */
395*27162e4eSAndroid Build Coastguard Worker     size_t const outSize = LZ4F_compressFrameBound((size_t)inSize, NULL);
396*27162e4eSAndroid Build Coastguard Worker     size_t cSize = 0;
397*27162e4eSAndroid Build Coastguard Worker     assert(inSize >= 0);
398*27162e4eSAndroid Build Coastguard Worker     if (g_cctx == NULL) {
399*27162e4eSAndroid Build Coastguard Worker         /* create and initialize LZ4F compression context the first time */
400*27162e4eSAndroid Build Coastguard Worker         LZ4F_createCompressionContext(&g_cctx, LZ4F_VERSION);
401*27162e4eSAndroid Build Coastguard Worker         assert(g_cctx != NULL);
402*27162e4eSAndroid Build Coastguard Worker     } /* re-use existing compression context otherwise */
403*27162e4eSAndroid Build Coastguard Worker     {   size_t const cbSize = LZ4F_compressBegin(g_cctx, out, outSize, NULL);
404*27162e4eSAndroid Build Coastguard Worker         assert(!LZ4F_isError(cbSize));
405*27162e4eSAndroid Build Coastguard Worker         cSize += cbSize;
406*27162e4eSAndroid Build Coastguard Worker     }
407*27162e4eSAndroid Build Coastguard Worker     {   size_t const cuSize = LZ4F_compressUpdate(g_cctx, out+cSize, outSize-cSize, in, (size_t)inSize, NULL);
408*27162e4eSAndroid Build Coastguard Worker         assert(!LZ4F_isError(cuSize));
409*27162e4eSAndroid Build Coastguard Worker         cSize += cuSize;
410*27162e4eSAndroid Build Coastguard Worker     }
411*27162e4eSAndroid Build Coastguard Worker     {   size_t const ceSize = LZ4F_compressEnd(g_cctx, out+cSize, outSize-cSize, NULL);
412*27162e4eSAndroid Build Coastguard Worker         assert(!LZ4F_isError(ceSize));
413*27162e4eSAndroid Build Coastguard Worker         cSize += ceSize;
414*27162e4eSAndroid Build Coastguard Worker     }
415*27162e4eSAndroid Build Coastguard Worker     return (int)cSize;
416*27162e4eSAndroid Build Coastguard Worker }
417*27162e4eSAndroid Build Coastguard Worker 
418*27162e4eSAndroid Build Coastguard Worker static LZ4F_decompressionContext_t g_dCtx;
419*27162e4eSAndroid Build Coastguard Worker 
local_LZ4F_decompress(const char * in,char * out,int inSize,int outSize)420*27162e4eSAndroid Build Coastguard Worker static int local_LZ4F_decompress(const char* in, char* out, int inSize, int outSize)
421*27162e4eSAndroid Build Coastguard Worker {
422*27162e4eSAndroid Build Coastguard Worker     size_t srcSize = (size_t)inSize;
423*27162e4eSAndroid Build Coastguard Worker     size_t dstSize = (size_t)outSize;
424*27162e4eSAndroid Build Coastguard Worker     size_t result;
425*27162e4eSAndroid Build Coastguard Worker     assert(inSize >= 0);
426*27162e4eSAndroid Build Coastguard Worker     assert(outSize >= 0);
427*27162e4eSAndroid Build Coastguard Worker     result = LZ4F_decompress(g_dCtx, out, &dstSize, in, &srcSize, NULL);
428*27162e4eSAndroid Build Coastguard Worker     if (result!=0) { DISPLAY("Error decompressing frame : unfinished frame \n"); exit(8); }
429*27162e4eSAndroid Build Coastguard Worker     if (srcSize != (size_t)inSize) { DISPLAY("Error decompressing frame : read size incorrect \n"); exit(9); }
430*27162e4eSAndroid Build Coastguard Worker     return (int)dstSize;
431*27162e4eSAndroid Build Coastguard Worker }
432*27162e4eSAndroid Build Coastguard Worker 
local_LZ4F_decompress_followHint(const char * src,char * dst,int srcSize,int dstSize)433*27162e4eSAndroid Build Coastguard Worker static int local_LZ4F_decompress_followHint(const char* src, char* dst, int srcSize, int dstSize)
434*27162e4eSAndroid Build Coastguard Worker {
435*27162e4eSAndroid Build Coastguard Worker     size_t totalInSize = (size_t)srcSize;
436*27162e4eSAndroid Build Coastguard Worker     size_t maxOutSize = (size_t)dstSize;
437*27162e4eSAndroid Build Coastguard Worker 
438*27162e4eSAndroid Build Coastguard Worker     size_t inPos = 0;
439*27162e4eSAndroid Build Coastguard Worker     size_t inSize = 0;
440*27162e4eSAndroid Build Coastguard Worker     size_t outPos = 0;
441*27162e4eSAndroid Build Coastguard Worker     size_t outRemaining = maxOutSize - outPos;
442*27162e4eSAndroid Build Coastguard Worker 
443*27162e4eSAndroid Build Coastguard Worker     for (;;) {
444*27162e4eSAndroid Build Coastguard Worker         size_t const sizeHint =
445*27162e4eSAndroid Build Coastguard Worker             LZ4F_decompress(g_dCtx, dst+outPos, &outRemaining, src+inPos, &inSize, NULL);
446*27162e4eSAndroid Build Coastguard Worker         assert(!LZ4F_isError(sizeHint));
447*27162e4eSAndroid Build Coastguard Worker 
448*27162e4eSAndroid Build Coastguard Worker         inPos += inSize;
449*27162e4eSAndroid Build Coastguard Worker         inSize = sizeHint;
450*27162e4eSAndroid Build Coastguard Worker 
451*27162e4eSAndroid Build Coastguard Worker         outPos += outRemaining;
452*27162e4eSAndroid Build Coastguard Worker         outRemaining = maxOutSize - outPos;
453*27162e4eSAndroid Build Coastguard Worker 
454*27162e4eSAndroid Build Coastguard Worker         if (!sizeHint) break;
455*27162e4eSAndroid Build Coastguard Worker     }
456*27162e4eSAndroid Build Coastguard Worker 
457*27162e4eSAndroid Build Coastguard Worker     /* frame completed */
458*27162e4eSAndroid Build Coastguard Worker     if (inPos != totalInSize) {
459*27162e4eSAndroid Build Coastguard Worker         DISPLAY("Error decompressing frame : must read (%u) full frame (%u) \n",
460*27162e4eSAndroid Build Coastguard Worker                 (unsigned)inPos, (unsigned)totalInSize);
461*27162e4eSAndroid Build Coastguard Worker         exit(10);
462*27162e4eSAndroid Build Coastguard Worker     }
463*27162e4eSAndroid Build Coastguard Worker     return (int)outPos;
464*27162e4eSAndroid Build Coastguard Worker 
465*27162e4eSAndroid Build Coastguard Worker }
466*27162e4eSAndroid Build Coastguard Worker 
467*27162e4eSAndroid Build Coastguard Worker /* always provide input by block of 64 KB */
local_LZ4F_decompress_noHint(const char * src,char * dst,int srcSize,int dstSize)468*27162e4eSAndroid Build Coastguard Worker static int local_LZ4F_decompress_noHint(const char* src, char* dst, int srcSize, int dstSize)
469*27162e4eSAndroid Build Coastguard Worker {
470*27162e4eSAndroid Build Coastguard Worker     size_t totalInSize = (size_t)srcSize;
471*27162e4eSAndroid Build Coastguard Worker     size_t maxOutSize = (size_t)dstSize;
472*27162e4eSAndroid Build Coastguard Worker 
473*27162e4eSAndroid Build Coastguard Worker     size_t inPos = 0;
474*27162e4eSAndroid Build Coastguard Worker     size_t inSize = 64 KB;
475*27162e4eSAndroid Build Coastguard Worker     size_t outPos = 0;
476*27162e4eSAndroid Build Coastguard Worker     size_t outRemaining = maxOutSize - outPos;
477*27162e4eSAndroid Build Coastguard Worker 
478*27162e4eSAndroid Build Coastguard Worker     for (;;) {
479*27162e4eSAndroid Build Coastguard Worker         size_t const sizeHint = LZ4F_decompress(g_dCtx, dst+outPos, &outRemaining, src+inPos, &inSize, NULL);
480*27162e4eSAndroid Build Coastguard Worker         assert(!LZ4F_isError(sizeHint));
481*27162e4eSAndroid Build Coastguard Worker 
482*27162e4eSAndroid Build Coastguard Worker         inPos += inSize;
483*27162e4eSAndroid Build Coastguard Worker         inSize = (inPos + 64 KB <= totalInSize) ? 64 KB : totalInSize - inPos;
484*27162e4eSAndroid Build Coastguard Worker 
485*27162e4eSAndroid Build Coastguard Worker         outPos += outRemaining;
486*27162e4eSAndroid Build Coastguard Worker         outRemaining = maxOutSize - outPos;
487*27162e4eSAndroid Build Coastguard Worker 
488*27162e4eSAndroid Build Coastguard Worker         if (!sizeHint) break;
489*27162e4eSAndroid Build Coastguard Worker     }
490*27162e4eSAndroid Build Coastguard Worker 
491*27162e4eSAndroid Build Coastguard Worker     /* frame completed */
492*27162e4eSAndroid Build Coastguard Worker     if (inPos != totalInSize) {
493*27162e4eSAndroid Build Coastguard Worker         DISPLAY("Error decompressing frame : must read (%u) full frame (%u) \n",
494*27162e4eSAndroid Build Coastguard Worker                 (unsigned)inPos, (unsigned)totalInSize);
495*27162e4eSAndroid Build Coastguard Worker         exit(10);
496*27162e4eSAndroid Build Coastguard Worker     }
497*27162e4eSAndroid Build Coastguard Worker     return (int)outPos;
498*27162e4eSAndroid Build Coastguard Worker 
499*27162e4eSAndroid Build Coastguard Worker }
500*27162e4eSAndroid Build Coastguard Worker 
501*27162e4eSAndroid Build Coastguard Worker typedef struct {
502*27162e4eSAndroid Build Coastguard Worker     const char* name;
503*27162e4eSAndroid Build Coastguard Worker     int (*compressionF)(const char*, char*, int);
504*27162e4eSAndroid Build Coastguard Worker     void (*initFunction)(void);
505*27162e4eSAndroid Build Coastguard Worker     int singleChunk;
506*27162e4eSAndroid Build Coastguard Worker } CompressionDesc;
507*27162e4eSAndroid Build Coastguard Worker 
508*27162e4eSAndroid Build Coastguard Worker static const CompressionDesc compDescArray[] = {
509*27162e4eSAndroid Build Coastguard Worker     { NULL, NULL, NULL, 0 },
510*27162e4eSAndroid Build Coastguard Worker     { "LZ4_compress_default", local_LZ4_compress_default_large, NULL, 0 },
511*27162e4eSAndroid Build Coastguard Worker     { "LZ4_compress_default(small dst)", local_LZ4_compress_default_small, NULL, 0 },
512*27162e4eSAndroid Build Coastguard Worker     { "LZ4_compress_destSize", local_LZ4_compress_destSize, NULL, 0 },
513*27162e4eSAndroid Build Coastguard Worker     { "LZ4_compress_fast(0)", local_LZ4_compress_fast0, NULL, 0 },
514*27162e4eSAndroid Build Coastguard Worker     { "LZ4_compress_fast(1)", local_LZ4_compress_fast1, NULL, 0 },
515*27162e4eSAndroid Build Coastguard Worker     { "LZ4_compress_fast(2)", local_LZ4_compress_fast2, NULL, 0 },
516*27162e4eSAndroid Build Coastguard Worker     { "LZ4_compress_fast(17)", local_LZ4_compress_fast17, NULL, 0 },
517*27162e4eSAndroid Build Coastguard Worker     { "LZ4_compress_fast_extState(0)", local_LZ4_compress_fast_extState0, NULL, 0 },
518*27162e4eSAndroid Build Coastguard Worker     { "LZ4_compress_fast_continue(0)", local_LZ4_compress_fast_continue0, local_LZ4_createStream, 0 },
519*27162e4eSAndroid Build Coastguard Worker     { "LZ4_compress_HC", local_LZ4_compress_HC, NULL, 0 },
520*27162e4eSAndroid Build Coastguard Worker     { "LZ4_compress_HC_extStateHC", local_LZ4_compress_HC_extStateHC, NULL, 0 },
521*27162e4eSAndroid Build Coastguard Worker     { "LZ4_compress_HC_continue", local_LZ4_compress_HC_continue, local_LZ4_resetStreamHC, 0 },
522*27162e4eSAndroid Build Coastguard Worker #ifndef LZ4_DLL_IMPORT
523*27162e4eSAndroid Build Coastguard Worker     { "LZ4_compress_forceDict", local_LZ4_compress_forceDict, local_LZ4_resetDictT, 0 },
524*27162e4eSAndroid Build Coastguard Worker #endif
525*27162e4eSAndroid Build Coastguard Worker     { "LZ4F_compressFrame", local_LZ4F_compressFrame, NULL, 1 },
526*27162e4eSAndroid Build Coastguard Worker     { "LZ4F_compressUpdate", local_LZ4F_compress, NULL, 1 },
527*27162e4eSAndroid Build Coastguard Worker     { "LZ4_saveDict", local_LZ4_saveDict, local_LZ4_saveDict_init, 0 },
528*27162e4eSAndroid Build Coastguard Worker     { "LZ4_saveDictHC", local_LZ4_saveDictHC, local_LZ4_saveDictHC_init, 0 },
529*27162e4eSAndroid Build Coastguard Worker 
530*27162e4eSAndroid Build Coastguard Worker };
531*27162e4eSAndroid Build Coastguard Worker 
532*27162e4eSAndroid Build Coastguard Worker typedef struct {
533*27162e4eSAndroid Build Coastguard Worker     const char* name;
534*27162e4eSAndroid Build Coastguard Worker     int (*decompressionF)(const char*, char*, int, int);
535*27162e4eSAndroid Build Coastguard Worker     int checkResult;
536*27162e4eSAndroid Build Coastguard Worker     int frameFormat;
537*27162e4eSAndroid Build Coastguard Worker } DecompressionDesc;
538*27162e4eSAndroid Build Coastguard Worker 
539*27162e4eSAndroid Build Coastguard Worker static const DecompressionDesc decDescArray[] = {
540*27162e4eSAndroid Build Coastguard Worker     { NULL, NULL, 0, 0 },
541*27162e4eSAndroid Build Coastguard Worker     { "LZ4_decompress_fast", local_LZ4_decompress_fast, 1, 0 },
542*27162e4eSAndroid Build Coastguard Worker     { "LZ4_decompress_fast_usingDict(prefix)", local_LZ4_decompress_fast_usingDict_prefix, 1, 0 },
543*27162e4eSAndroid Build Coastguard Worker     { "LZ4_decompress_fast_using(Ext)Dict", local_LZ4_decompress_fast_usingExtDict, 1, 0 },
544*27162e4eSAndroid Build Coastguard Worker     { "LZ4_decompress_safe", local_LZ4_decompress_safe, 1, 0 },
545*27162e4eSAndroid Build Coastguard Worker     { "LZ4_decompress_safe_withPrefix64k", local_LZ4_decompress_safe_withPrefix64k, 1, 0 },
546*27162e4eSAndroid Build Coastguard Worker     { "LZ4_decompress_safe_usingDict", local_LZ4_decompress_safe_usingDict, 1, 0 },
547*27162e4eSAndroid Build Coastguard Worker     { "LZ4_decompress_safe_partial", local_LZ4_decompress_safe_partial, 0, 0 },
548*27162e4eSAndroid Build Coastguard Worker     { "LZ4_decompress_safe_partial_usingDict", local_LZ4_decompress_safe_partial_usingDict, 0, 0 },
549*27162e4eSAndroid Build Coastguard Worker #ifndef LZ4_DLL_IMPORT
550*27162e4eSAndroid Build Coastguard Worker     { "LZ4_decompress_safe_partial_forceExtDict", local_LZ4_decompress_safe_partial_forceExtDict, 0, 0 },
551*27162e4eSAndroid Build Coastguard Worker     { "LZ4_decompress_safe_forceExtDict", local_LZ4_decompress_safe_forceExtDict, 1, 0 },
552*27162e4eSAndroid Build Coastguard Worker #endif
553*27162e4eSAndroid Build Coastguard Worker     { "LZ4F_decompress", local_LZ4F_decompress, 1, 1 },
554*27162e4eSAndroid Build Coastguard Worker     { "LZ4F_decompLZ4F_decompress_followHintress", local_LZ4F_decompress_followHint, 1, 1 },
555*27162e4eSAndroid Build Coastguard Worker     { "LZ4F_decompress_noHint", local_LZ4F_decompress_noHint, 1, 1 },
556*27162e4eSAndroid Build Coastguard Worker };
557*27162e4eSAndroid Build Coastguard Worker 
558*27162e4eSAndroid Build Coastguard Worker #define ARRAY_SIZE(a) (sizeof(a) / (sizeof((a)[0])))
559*27162e4eSAndroid Build Coastguard Worker 
560*27162e4eSAndroid Build Coastguard Worker #define NB_COMPRESSION_ALGORITHMS ARRAY_SIZE(compDescArray)
561*27162e4eSAndroid Build Coastguard Worker #define NB_DECOMPRESSION_ALGORITHMS ARRAY_SIZE(decDescArray)
562*27162e4eSAndroid Build Coastguard Worker 
fullSpeedBench(const char ** fileNamesTable,int nbFiles)563*27162e4eSAndroid Build Coastguard Worker int fullSpeedBench(const char** fileNamesTable, int nbFiles)
564*27162e4eSAndroid Build Coastguard Worker {
565*27162e4eSAndroid Build Coastguard Worker     int fileIdx=0;
566*27162e4eSAndroid Build Coastguard Worker     clock_t loopDuration = TIMELOOP;
567*27162e4eSAndroid Build Coastguard Worker 
568*27162e4eSAndroid Build Coastguard Worker     if (g_nbIterations==0) {
569*27162e4eSAndroid Build Coastguard Worker         loopDuration = CLOCKS_PER_SEC / 50 + 1;
570*27162e4eSAndroid Build Coastguard Worker         g_nbIterations = 1;
571*27162e4eSAndroid Build Coastguard Worker     }
572*27162e4eSAndroid Build Coastguard Worker 
573*27162e4eSAndroid Build Coastguard Worker     /* Init */
574*27162e4eSAndroid Build Coastguard Worker     { size_t const errorCode = LZ4F_createDecompressionContext(&g_dCtx, LZ4F_VERSION);
575*27162e4eSAndroid Build Coastguard Worker       if (LZ4F_isError(errorCode)) { DISPLAY("dctx allocation issue \n"); return 10; } }
576*27162e4eSAndroid Build Coastguard Worker 
577*27162e4eSAndroid Build Coastguard Worker     /* Loop for each fileName */
578*27162e4eSAndroid Build Coastguard Worker     while (fileIdx<nbFiles) {
579*27162e4eSAndroid Build Coastguard Worker       char* orig_buff = NULL;
580*27162e4eSAndroid Build Coastguard Worker       struct chunkParameters* chunkP = NULL;
581*27162e4eSAndroid Build Coastguard Worker       char* compressed_buff=NULL;
582*27162e4eSAndroid Build Coastguard Worker       const char* const inFileName = fileNamesTable[fileIdx++];
583*27162e4eSAndroid Build Coastguard Worker       FILE* const inFile = fopen( inFileName, "rb" );
584*27162e4eSAndroid Build Coastguard Worker       U64 const inFileSize = UTIL_getFileSize(inFileName);
585*27162e4eSAndroid Build Coastguard Worker       size_t benchedSize = BMK_findMaxMem(inFileSize*2) / 2;   /* because 2 buffers */
586*27162e4eSAndroid Build Coastguard Worker       int nbChunks;
587*27162e4eSAndroid Build Coastguard Worker       int maxCompressedChunkSize;
588*27162e4eSAndroid Build Coastguard Worker       size_t readSize;
589*27162e4eSAndroid Build Coastguard Worker       int compressedBuffSize;
590*27162e4eSAndroid Build Coastguard Worker       U32 crcOriginal;
591*27162e4eSAndroid Build Coastguard Worker 
592*27162e4eSAndroid Build Coastguard Worker       /* Check infile pre-requisites */
593*27162e4eSAndroid Build Coastguard Worker       if (inFile==NULL) { DISPLAY("Pb opening %s \n", inFileName); return 11; }
594*27162e4eSAndroid Build Coastguard Worker       if (inFileSize==0) { DISPLAY("file is empty \n"); fclose(inFile); return 11; }
595*27162e4eSAndroid Build Coastguard Worker       if (benchedSize==0) { DISPLAY("not enough memory \n"); fclose(inFile); return 11; }
596*27162e4eSAndroid Build Coastguard Worker 
597*27162e4eSAndroid Build Coastguard Worker       /* Memory size adjustments */
598*27162e4eSAndroid Build Coastguard Worker       if ((U64)benchedSize > inFileSize) benchedSize = (size_t)inFileSize;
599*27162e4eSAndroid Build Coastguard Worker       if (benchedSize < inFileSize) {
600*27162e4eSAndroid Build Coastguard Worker           DISPLAY("Not enough memory for '%s' full size; testing %i MB only... \n",
601*27162e4eSAndroid Build Coastguard Worker                 inFileName, (int)(benchedSize>>20));
602*27162e4eSAndroid Build Coastguard Worker       }
603*27162e4eSAndroid Build Coastguard Worker       if (benchedSize < 8 || g_chunkSize < 8) {
604*27162e4eSAndroid Build Coastguard Worker         DISPLAY(" cannot bench using less then 8 bytes \n");
605*27162e4eSAndroid Build Coastguard Worker         return 1;
606*27162e4eSAndroid Build Coastguard Worker       }
607*27162e4eSAndroid Build Coastguard Worker 
608*27162e4eSAndroid Build Coastguard Worker       /* Allocation */
609*27162e4eSAndroid Build Coastguard Worker       nbChunks = (int) ((benchedSize + (size_t)g_chunkSize - 1) / (size_t)g_chunkSize);
610*27162e4eSAndroid Build Coastguard Worker       chunkP = (struct chunkParameters*) malloc((size_t)nbChunks * sizeof(chunkP[0]));
611*27162e4eSAndroid Build Coastguard Worker       orig_buff = (char*) malloc(benchedSize);
612*27162e4eSAndroid Build Coastguard Worker       maxCompressedChunkSize = LZ4_compressBound(g_chunkSize);
613*27162e4eSAndroid Build Coastguard Worker       compressedBuffSize = nbChunks * maxCompressedChunkSize;
614*27162e4eSAndroid Build Coastguard Worker       compressed_buff = (char*)malloc((size_t)compressedBuffSize);
615*27162e4eSAndroid Build Coastguard Worker       if(!chunkP || !orig_buff || !compressed_buff) {
616*27162e4eSAndroid Build Coastguard Worker           DISPLAY("\nError: not enough memory! \n");
617*27162e4eSAndroid Build Coastguard Worker           fclose(inFile);
618*27162e4eSAndroid Build Coastguard Worker           free(orig_buff);
619*27162e4eSAndroid Build Coastguard Worker           free(compressed_buff);
620*27162e4eSAndroid Build Coastguard Worker           free(chunkP);
621*27162e4eSAndroid Build Coastguard Worker           return(12);
622*27162e4eSAndroid Build Coastguard Worker       }
623*27162e4eSAndroid Build Coastguard Worker 
624*27162e4eSAndroid Build Coastguard Worker       /* Fill in src buffer */
625*27162e4eSAndroid Build Coastguard Worker       DISPLAY("Loading %s...       \r", inFileName);
626*27162e4eSAndroid Build Coastguard Worker       readSize = fread(orig_buff, 1, benchedSize, inFile);
627*27162e4eSAndroid Build Coastguard Worker       fclose(inFile);
628*27162e4eSAndroid Build Coastguard Worker 
629*27162e4eSAndroid Build Coastguard Worker       if (readSize != benchedSize) {
630*27162e4eSAndroid Build Coastguard Worker         DISPLAY("\nError: problem reading file '%s' !!    \n", inFileName);
631*27162e4eSAndroid Build Coastguard Worker         free(orig_buff);
632*27162e4eSAndroid Build Coastguard Worker         free(compressed_buff);
633*27162e4eSAndroid Build Coastguard Worker         free(chunkP);
634*27162e4eSAndroid Build Coastguard Worker         return 13;
635*27162e4eSAndroid Build Coastguard Worker       }
636*27162e4eSAndroid Build Coastguard Worker 
637*27162e4eSAndroid Build Coastguard Worker       /* Calculating input Checksum */
638*27162e4eSAndroid Build Coastguard Worker       crcOriginal = XXH32(orig_buff, benchedSize,0);
639*27162e4eSAndroid Build Coastguard Worker 
640*27162e4eSAndroid Build Coastguard Worker       /* Bench */
641*27162e4eSAndroid Build Coastguard Worker       { int loopNb, nb_loops, chunkNb, cAlgNb, dAlgNb;
642*27162e4eSAndroid Build Coastguard Worker         size_t cSize=0;
643*27162e4eSAndroid Build Coastguard Worker         double ratio=0.;
644*27162e4eSAndroid Build Coastguard Worker 
645*27162e4eSAndroid Build Coastguard Worker         DISPLAY("\r%79s\r", "");
646*27162e4eSAndroid Build Coastguard Worker         DISPLAY(" %s : \n", inFileName);
647*27162e4eSAndroid Build Coastguard Worker 
648*27162e4eSAndroid Build Coastguard Worker         /* Bench Compression Algorithms */
649*27162e4eSAndroid Build Coastguard Worker         for (cAlgNb=0; (cAlgNb <= (int)NB_COMPRESSION_ALGORITHMS) && (g_compressionTest); cAlgNb++) {
650*27162e4eSAndroid Build Coastguard Worker             const char* compressorName;
651*27162e4eSAndroid Build Coastguard Worker             int (*compressionFunction)(const char*, char*, int);
652*27162e4eSAndroid Build Coastguard Worker             void (*initFunction)(void) = NULL;
653*27162e4eSAndroid Build Coastguard Worker             double bestTime = 100000000.;
654*27162e4eSAndroid Build Coastguard Worker 
655*27162e4eSAndroid Build Coastguard Worker             /* filter compressionAlgo only */
656*27162e4eSAndroid Build Coastguard Worker             if ((g_compressionAlgo != ALL_COMPRESSORS) && (g_compressionAlgo != cAlgNb)) continue;
657*27162e4eSAndroid Build Coastguard Worker 
658*27162e4eSAndroid Build Coastguard Worker             /* Init data chunks */
659*27162e4eSAndroid Build Coastguard Worker             {   int i;
660*27162e4eSAndroid Build Coastguard Worker                 size_t remaining = benchedSize;
661*27162e4eSAndroid Build Coastguard Worker                 char* in = orig_buff;
662*27162e4eSAndroid Build Coastguard Worker                 char* out = compressed_buff;
663*27162e4eSAndroid Build Coastguard Worker                 assert(nbChunks >= 1);
664*27162e4eSAndroid Build Coastguard Worker                 for (i=0; i<nbChunks; i++) {
665*27162e4eSAndroid Build Coastguard Worker                     chunkP[i].id = (U32)i;
666*27162e4eSAndroid Build Coastguard Worker                     chunkP[i].origBuffer = in; in += g_chunkSize;
667*27162e4eSAndroid Build Coastguard Worker                     assert(g_chunkSize > 0);
668*27162e4eSAndroid Build Coastguard Worker                     if (remaining > (size_t)g_chunkSize) {
669*27162e4eSAndroid Build Coastguard Worker                         chunkP[i].origSize = g_chunkSize;
670*27162e4eSAndroid Build Coastguard Worker                         remaining -= (size_t)g_chunkSize;
671*27162e4eSAndroid Build Coastguard Worker                     } else {
672*27162e4eSAndroid Build Coastguard Worker                         chunkP[i].origSize = (int)remaining;
673*27162e4eSAndroid Build Coastguard Worker                         remaining = 0;
674*27162e4eSAndroid Build Coastguard Worker                     }
675*27162e4eSAndroid Build Coastguard Worker                     chunkP[i].compressedBuffer = out; out += maxCompressedChunkSize;
676*27162e4eSAndroid Build Coastguard Worker                     chunkP[i].compressedSize = 0;
677*27162e4eSAndroid Build Coastguard Worker                 }
678*27162e4eSAndroid Build Coastguard Worker             }
679*27162e4eSAndroid Build Coastguard Worker             g_chunk0 = chunkP[0].origBuffer;
680*27162e4eSAndroid Build Coastguard Worker             g_chunk0Size = (size_t)chunkP[0].origSize;
681*27162e4eSAndroid Build Coastguard Worker 
682*27162e4eSAndroid Build Coastguard Worker             if (cAlgNb==0) {
683*27162e4eSAndroid Build Coastguard Worker                 DISPLAY("Compression functions : \n");
684*27162e4eSAndroid Build Coastguard Worker                 continue;
685*27162e4eSAndroid Build Coastguard Worker             }
686*27162e4eSAndroid Build Coastguard Worker             if (cAlgNb >= (int)NB_COMPRESSION_ALGORITHMS) {
687*27162e4eSAndroid Build Coastguard Worker                 continue;
688*27162e4eSAndroid Build Coastguard Worker             }
689*27162e4eSAndroid Build Coastguard Worker             compressorName = compDescArray[cAlgNb].name;
690*27162e4eSAndroid Build Coastguard Worker             compressionFunction = compDescArray[cAlgNb].compressionF;
691*27162e4eSAndroid Build Coastguard Worker             initFunction = compDescArray[cAlgNb].initFunction;
692*27162e4eSAndroid Build Coastguard Worker             if (compDescArray[cAlgNb].singleChunk) {
693*27162e4eSAndroid Build Coastguard Worker                 nbChunks=1;
694*27162e4eSAndroid Build Coastguard Worker                 chunkP[0].origSize = (int)benchedSize;
695*27162e4eSAndroid Build Coastguard Worker             }
696*27162e4eSAndroid Build Coastguard Worker             if (compressorName==NULL || compressionFunction==NULL) {
697*27162e4eSAndroid Build Coastguard Worker                 continue;
698*27162e4eSAndroid Build Coastguard Worker             }
699*27162e4eSAndroid Build Coastguard Worker 
700*27162e4eSAndroid Build Coastguard Worker             for (loopNb = 1; loopNb <= g_nbIterations; loopNb++) {
701*27162e4eSAndroid Build Coastguard Worker                 double averageTime;
702*27162e4eSAndroid Build Coastguard Worker                 clock_t clockTime;
703*27162e4eSAndroid Build Coastguard Worker 
704*27162e4eSAndroid Build Coastguard Worker                 PROGRESS("%2i-%-34.34s :%10i ->\r", loopNb, compressorName, (int)benchedSize);
705*27162e4eSAndroid Build Coastguard Worker                 { size_t i; for (i=0; i<benchedSize; i++) compressed_buff[i]=(char)i; }     /* warming up memory */
706*27162e4eSAndroid Build Coastguard Worker 
707*27162e4eSAndroid Build Coastguard Worker                 nb_loops = 0;
708*27162e4eSAndroid Build Coastguard Worker                 clockTime = clock();
709*27162e4eSAndroid Build Coastguard Worker                 while(clock() == clockTime);
710*27162e4eSAndroid Build Coastguard Worker                 clockTime = clock();
711*27162e4eSAndroid Build Coastguard Worker                 while(BMK_GetClockSpan(clockTime) < loopDuration) {
712*27162e4eSAndroid Build Coastguard Worker                     if (initFunction!=NULL) initFunction();
713*27162e4eSAndroid Build Coastguard Worker                     for (chunkNb=0; chunkNb<nbChunks; chunkNb++) {
714*27162e4eSAndroid Build Coastguard Worker                         chunkP[chunkNb].compressedSize = compressionFunction(chunkP[chunkNb].origBuffer, chunkP[chunkNb].compressedBuffer, chunkP[chunkNb].origSize);
715*27162e4eSAndroid Build Coastguard Worker                         if (chunkP[chunkNb].compressedSize==0) {
716*27162e4eSAndroid Build Coastguard Worker                             DISPLAY("ERROR ! %s() = 0 !! \n", compressorName);
717*27162e4eSAndroid Build Coastguard Worker                             exit(1);
718*27162e4eSAndroid Build Coastguard Worker                     }   }
719*27162e4eSAndroid Build Coastguard Worker                     nb_loops++;
720*27162e4eSAndroid Build Coastguard Worker                 }
721*27162e4eSAndroid Build Coastguard Worker                 clockTime = BMK_GetClockSpan(clockTime);
722*27162e4eSAndroid Build Coastguard Worker 
723*27162e4eSAndroid Build Coastguard Worker                 nb_loops += !nb_loops;   /* avoid division by zero */
724*27162e4eSAndroid Build Coastguard Worker                 averageTime = ((double)clockTime) / nb_loops / CLOCKS_PER_SEC;
725*27162e4eSAndroid Build Coastguard Worker                 if (averageTime < bestTime) bestTime = averageTime;
726*27162e4eSAndroid Build Coastguard Worker                 cSize=0; for (chunkNb=0; chunkNb<nbChunks; chunkNb++) cSize += (size_t)chunkP[chunkNb].compressedSize;
727*27162e4eSAndroid Build Coastguard Worker                 ratio = (double)cSize/(double)benchedSize*100.;
728*27162e4eSAndroid Build Coastguard Worker                 PROGRESS("%2i-%-34.34s :%10i ->%9i (%5.2f%%),%7.1f MB/s\r", loopNb, compressorName, (int)benchedSize, (int)cSize, ratio, (double)benchedSize / bestTime / 1000000);
729*27162e4eSAndroid Build Coastguard Worker             }
730*27162e4eSAndroid Build Coastguard Worker 
731*27162e4eSAndroid Build Coastguard Worker             if (ratio<100.)
732*27162e4eSAndroid Build Coastguard Worker                 DISPLAY("%2i-%-34.34s :%10i ->%9i (%5.2f%%),%7.1f MB/s\n", cAlgNb, compressorName, (int)benchedSize, (int)cSize, ratio, (double)benchedSize / bestTime / 1000000);
733*27162e4eSAndroid Build Coastguard Worker             else
734*27162e4eSAndroid Build Coastguard Worker                 DISPLAY("%2i-%-34.34s :%10i ->%9i (%5.1f%%),%7.1f MB/s\n", cAlgNb, compressorName, (int)benchedSize, (int)cSize, ratio, (double)benchedSize / bestTime / 100000);
735*27162e4eSAndroid Build Coastguard Worker         }
736*27162e4eSAndroid Build Coastguard Worker 
737*27162e4eSAndroid Build Coastguard Worker         /* Prepare layout for decompression */
738*27162e4eSAndroid Build Coastguard Worker         /* Init data chunks */
739*27162e4eSAndroid Build Coastguard Worker         { int i;
740*27162e4eSAndroid Build Coastguard Worker           size_t remaining = benchedSize;
741*27162e4eSAndroid Build Coastguard Worker           char* in = orig_buff;
742*27162e4eSAndroid Build Coastguard Worker           char* out = compressed_buff;
743*27162e4eSAndroid Build Coastguard Worker 
744*27162e4eSAndroid Build Coastguard Worker           nbChunks = (int) (((int)benchedSize + (g_chunkSize-1))/ g_chunkSize);
745*27162e4eSAndroid Build Coastguard Worker           for (i=0; i<nbChunks; i++) {
746*27162e4eSAndroid Build Coastguard Worker               chunkP[i].id = (U32)i;
747*27162e4eSAndroid Build Coastguard Worker               chunkP[i].origBuffer = in; in += g_chunkSize;
748*27162e4eSAndroid Build Coastguard Worker               if ((int)remaining > g_chunkSize) {
749*27162e4eSAndroid Build Coastguard Worker                   chunkP[i].origSize = g_chunkSize;
750*27162e4eSAndroid Build Coastguard Worker                   remaining -= (size_t)g_chunkSize;
751*27162e4eSAndroid Build Coastguard Worker               } else {
752*27162e4eSAndroid Build Coastguard Worker                   chunkP[i].origSize = (int)remaining;
753*27162e4eSAndroid Build Coastguard Worker                   remaining = 0;
754*27162e4eSAndroid Build Coastguard Worker               }
755*27162e4eSAndroid Build Coastguard Worker               chunkP[i].compressedBuffer = out; out += maxCompressedChunkSize;
756*27162e4eSAndroid Build Coastguard Worker               chunkP[i].compressedSize = 0;
757*27162e4eSAndroid Build Coastguard Worker           }
758*27162e4eSAndroid Build Coastguard Worker         }
759*27162e4eSAndroid Build Coastguard Worker         for (chunkNb=0; chunkNb<nbChunks; chunkNb++) {
760*27162e4eSAndroid Build Coastguard Worker             chunkP[chunkNb].compressedSize = LZ4_compress_default(chunkP[chunkNb].origBuffer, chunkP[chunkNb].compressedBuffer, chunkP[chunkNb].origSize, maxCompressedChunkSize);
761*27162e4eSAndroid Build Coastguard Worker             if (chunkP[chunkNb].compressedSize==0) {
762*27162e4eSAndroid Build Coastguard Worker                 DISPLAY("ERROR ! %s() = 0 !! \n", "LZ4_compress");
763*27162e4eSAndroid Build Coastguard Worker                 exit(1);
764*27162e4eSAndroid Build Coastguard Worker         }   }
765*27162e4eSAndroid Build Coastguard Worker 
766*27162e4eSAndroid Build Coastguard Worker         /* Decompression Algorithms */
767*27162e4eSAndroid Build Coastguard Worker         for (dAlgNb=0; (dAlgNb <= (int)NB_DECOMPRESSION_ALGORITHMS) && g_decompressionTest; dAlgNb++) {
768*27162e4eSAndroid Build Coastguard Worker             const char* dName = NULL;
769*27162e4eSAndroid Build Coastguard Worker             int (*decompressionFunction)(const char*, char*, int, int) = NULL;
770*27162e4eSAndroid Build Coastguard Worker             double bestTime = 100000000.;
771*27162e4eSAndroid Build Coastguard Worker             int checkResult = 1;
772*27162e4eSAndroid Build Coastguard Worker 
773*27162e4eSAndroid Build Coastguard Worker             if ((g_decompressionAlgo != ALL_DECOMPRESSORS) && (g_decompressionAlgo != dAlgNb)) continue;
774*27162e4eSAndroid Build Coastguard Worker 
775*27162e4eSAndroid Build Coastguard Worker             if (dAlgNb==0) { /* just for display */
776*27162e4eSAndroid Build Coastguard Worker                 DISPLAY("Decompression functions : \n");
777*27162e4eSAndroid Build Coastguard Worker                 continue;
778*27162e4eSAndroid Build Coastguard Worker             }
779*27162e4eSAndroid Build Coastguard Worker             if (dAlgNb >= (int)NB_DECOMPRESSION_ALGORITHMS)
780*27162e4eSAndroid Build Coastguard Worker                 continue;
781*27162e4eSAndroid Build Coastguard Worker             dName = decDescArray[dAlgNb].name;
782*27162e4eSAndroid Build Coastguard Worker             decompressionFunction = decDescArray[dAlgNb].decompressionF;
783*27162e4eSAndroid Build Coastguard Worker             if (dName==NULL || decompressionFunction == NULL)
784*27162e4eSAndroid Build Coastguard Worker                 continue;
785*27162e4eSAndroid Build Coastguard Worker             checkResult = decDescArray[dAlgNb].checkResult;
786*27162e4eSAndroid Build Coastguard Worker             if (decDescArray[dAlgNb].frameFormat) {
787*27162e4eSAndroid Build Coastguard Worker                 /* prepare compressed data using LZ4F frame format */
788*27162e4eSAndroid Build Coastguard Worker                 size_t const fcsize = LZ4F_compressFrame(compressed_buff, (size_t)compressedBuffSize, orig_buff, benchedSize, NULL);
789*27162e4eSAndroid Build Coastguard Worker                 assert(!LZ4F_isError(fcsize));
790*27162e4eSAndroid Build Coastguard Worker                 chunkP[0].origSize = (int)benchedSize;
791*27162e4eSAndroid Build Coastguard Worker                 chunkP[0].compressedSize = (int)fcsize;
792*27162e4eSAndroid Build Coastguard Worker                 nbChunks = 1;
793*27162e4eSAndroid Build Coastguard Worker             }
794*27162e4eSAndroid Build Coastguard Worker 
795*27162e4eSAndroid Build Coastguard Worker             { size_t i; for (i=0; i<benchedSize; i++) orig_buff[i]=0; }     /* zeroing source area, for CRC checking */
796*27162e4eSAndroid Build Coastguard Worker 
797*27162e4eSAndroid Build Coastguard Worker             for (loopNb = 1; loopNb <= g_nbIterations; loopNb++) {
798*27162e4eSAndroid Build Coastguard Worker                 double averageTime;
799*27162e4eSAndroid Build Coastguard Worker                 clock_t clockTime;
800*27162e4eSAndroid Build Coastguard Worker                 U32 crcDecoded;
801*27162e4eSAndroid Build Coastguard Worker 
802*27162e4eSAndroid Build Coastguard Worker                 PROGRESS("%2i-%-34.34s :%10i ->\r", loopNb, dName, (int)benchedSize);
803*27162e4eSAndroid Build Coastguard Worker 
804*27162e4eSAndroid Build Coastguard Worker                 nb_loops = 0;
805*27162e4eSAndroid Build Coastguard Worker                 clockTime = clock();
806*27162e4eSAndroid Build Coastguard Worker                 while(clock() == clockTime);
807*27162e4eSAndroid Build Coastguard Worker                 clockTime = clock();
808*27162e4eSAndroid Build Coastguard Worker                 while(BMK_GetClockSpan(clockTime) < loopDuration) {
809*27162e4eSAndroid Build Coastguard Worker                     for (chunkNb=0; chunkNb<nbChunks; chunkNb++) {
810*27162e4eSAndroid Build Coastguard Worker                         int const decodedSize = decompressionFunction(chunkP[chunkNb].compressedBuffer, chunkP[chunkNb].origBuffer,
811*27162e4eSAndroid Build Coastguard Worker                                                                       chunkP[chunkNb].compressedSize, chunkP[chunkNb].origSize);
812*27162e4eSAndroid Build Coastguard Worker                         if (chunkP[chunkNb].origSize != decodedSize) {
813*27162e4eSAndroid Build Coastguard Worker                             DISPLAY("ERROR ! %s() == %i != %i !! \n",
814*27162e4eSAndroid Build Coastguard Worker                                     dName, decodedSize, chunkP[chunkNb].origSize);
815*27162e4eSAndroid Build Coastguard Worker                             exit(1);
816*27162e4eSAndroid Build Coastguard Worker                     }   }
817*27162e4eSAndroid Build Coastguard Worker                     nb_loops++;
818*27162e4eSAndroid Build Coastguard Worker                 }
819*27162e4eSAndroid Build Coastguard Worker                 clockTime = BMK_GetClockSpan(clockTime);
820*27162e4eSAndroid Build Coastguard Worker 
821*27162e4eSAndroid Build Coastguard Worker                 nb_loops += !nb_loops;   /* Avoid division by zero */
822*27162e4eSAndroid Build Coastguard Worker                 averageTime = (double)clockTime / nb_loops / CLOCKS_PER_SEC;
823*27162e4eSAndroid Build Coastguard Worker                 if (averageTime < bestTime) bestTime = averageTime;
824*27162e4eSAndroid Build Coastguard Worker 
825*27162e4eSAndroid Build Coastguard Worker                 PROGRESS("%2i-%-34.34s :%10i -> %7.1f MB/s\r", loopNb, dName, (int)benchedSize, (double)benchedSize / bestTime / 1000000);
826*27162e4eSAndroid Build Coastguard Worker 
827*27162e4eSAndroid Build Coastguard Worker                 /* CRC Checking */
828*27162e4eSAndroid Build Coastguard Worker                 crcDecoded = XXH32(orig_buff, benchedSize, 0);
829*27162e4eSAndroid Build Coastguard Worker                 if (checkResult && (crcOriginal!=crcDecoded)) {
830*27162e4eSAndroid Build Coastguard Worker                     DISPLAY("\n!!! WARNING !!! %14s : Invalid Checksum : %x != %x\n",
831*27162e4eSAndroid Build Coastguard Worker                             inFileName, (unsigned)crcOriginal, (unsigned)crcDecoded);
832*27162e4eSAndroid Build Coastguard Worker                     exit(1);
833*27162e4eSAndroid Build Coastguard Worker             }   }
834*27162e4eSAndroid Build Coastguard Worker 
835*27162e4eSAndroid Build Coastguard Worker             DISPLAY("%2i-%-34.34s :%10i -> %7.1f MB/s\n", dAlgNb, dName, (int)benchedSize, (double)benchedSize / bestTime / 1000000);
836*27162e4eSAndroid Build Coastguard Worker         }
837*27162e4eSAndroid Build Coastguard Worker       }
838*27162e4eSAndroid Build Coastguard Worker       free(orig_buff);
839*27162e4eSAndroid Build Coastguard Worker       free(compressed_buff);
840*27162e4eSAndroid Build Coastguard Worker       free(chunkP);
841*27162e4eSAndroid Build Coastguard Worker     }
842*27162e4eSAndroid Build Coastguard Worker 
843*27162e4eSAndroid Build Coastguard Worker     LZ4F_freeDecompressionContext(g_dCtx);
844*27162e4eSAndroid Build Coastguard Worker     if (g_pause) { printf("press enter...\n"); (void)getchar(); }
845*27162e4eSAndroid Build Coastguard Worker 
846*27162e4eSAndroid Build Coastguard Worker     return 0;
847*27162e4eSAndroid Build Coastguard Worker }
848*27162e4eSAndroid Build Coastguard Worker 
list(void)849*27162e4eSAndroid Build Coastguard Worker static int list(void)
850*27162e4eSAndroid Build Coastguard Worker {
851*27162e4eSAndroid Build Coastguard Worker     size_t n;
852*27162e4eSAndroid Build Coastguard Worker     DISPLAY("Compression Algorithm ids: \n");
853*27162e4eSAndroid Build Coastguard Worker     for (n=0; n<NB_COMPRESSION_ALGORITHMS; n++) {
854*27162e4eSAndroid Build Coastguard Worker         if (compDescArray[n].name) {
855*27162e4eSAndroid Build Coastguard Worker             DISPLAY("%2u: %s \n", (unsigned)n, compDescArray[n].name);
856*27162e4eSAndroid Build Coastguard Worker         }
857*27162e4eSAndroid Build Coastguard Worker     }
858*27162e4eSAndroid Build Coastguard Worker     DISPLAY("Decompression Algorithm ids: \n");
859*27162e4eSAndroid Build Coastguard Worker     for (n=0; n<NB_DECOMPRESSION_ALGORITHMS; n++) {
860*27162e4eSAndroid Build Coastguard Worker         if (decDescArray[n].name) {
861*27162e4eSAndroid Build Coastguard Worker             DISPLAY("%2u: %s \n", (unsigned)n, decDescArray[n].name);
862*27162e4eSAndroid Build Coastguard Worker         }
863*27162e4eSAndroid Build Coastguard Worker     }
864*27162e4eSAndroid Build Coastguard Worker     return 0;
865*27162e4eSAndroid Build Coastguard Worker }
866*27162e4eSAndroid Build Coastguard Worker 
usage(const char * exename)867*27162e4eSAndroid Build Coastguard Worker static int usage(const char* exename)
868*27162e4eSAndroid Build Coastguard Worker {
869*27162e4eSAndroid Build Coastguard Worker     DISPLAY( "Usage :\n");
870*27162e4eSAndroid Build Coastguard Worker     DISPLAY( "      %s [arg] file1 file2 ... fileX\n", exename);
871*27162e4eSAndroid Build Coastguard Worker     DISPLAY( "Arguments :\n");
872*27162e4eSAndroid Build Coastguard Worker     DISPLAY( " -c     : compression tests only\n");
873*27162e4eSAndroid Build Coastguard Worker     DISPLAY( " -d     : decompression tests only\n");
874*27162e4eSAndroid Build Coastguard Worker     DISPLAY( " -H/-h  : Help (this text + advanced options)\n");
875*27162e4eSAndroid Build Coastguard Worker     return 0;
876*27162e4eSAndroid Build Coastguard Worker }
877*27162e4eSAndroid Build Coastguard Worker 
usage_advanced(void)878*27162e4eSAndroid Build Coastguard Worker static int usage_advanced(void)
879*27162e4eSAndroid Build Coastguard Worker {
880*27162e4eSAndroid Build Coastguard Worker     DISPLAY( "\nAdvanced options :\n");
881*27162e4eSAndroid Build Coastguard Worker     DISPLAY( " -c#    : test only compression function # [1-%i]\n", (int)NB_COMPRESSION_ALGORITHMS);
882*27162e4eSAndroid Build Coastguard Worker     DISPLAY( " -d#    : test only decompression function # [1-%i]\n", (int)NB_DECOMPRESSION_ALGORITHMS);
883*27162e4eSAndroid Build Coastguard Worker     DISPLAY( " -i#    : iteration loops [1-9](default : %i)\n", NBLOOPS);
884*27162e4eSAndroid Build Coastguard Worker     DISPLAY( " -B#    : Block size [4-7](default : 7)\n");
885*27162e4eSAndroid Build Coastguard Worker     return list();
886*27162e4eSAndroid Build Coastguard Worker }
887*27162e4eSAndroid Build Coastguard Worker 
badusage(const char * exename)888*27162e4eSAndroid Build Coastguard Worker static int badusage(const char* exename)
889*27162e4eSAndroid Build Coastguard Worker {
890*27162e4eSAndroid Build Coastguard Worker     DISPLAY("Wrong parameters\n");
891*27162e4eSAndroid Build Coastguard Worker     usage(exename);
892*27162e4eSAndroid Build Coastguard Worker     return 0;
893*27162e4eSAndroid Build Coastguard Worker }
894*27162e4eSAndroid Build Coastguard Worker 
main(int argc,const char ** argv)895*27162e4eSAndroid Build Coastguard Worker int main(int argc, const char** argv)
896*27162e4eSAndroid Build Coastguard Worker {
897*27162e4eSAndroid Build Coastguard Worker     int i,
898*27162e4eSAndroid Build Coastguard Worker         filenamesStart=2;
899*27162e4eSAndroid Build Coastguard Worker     const char* exename = argv[0];
900*27162e4eSAndroid Build Coastguard Worker     const char* input_filename=0;
901*27162e4eSAndroid Build Coastguard Worker 
902*27162e4eSAndroid Build Coastguard Worker     // Welcome message
903*27162e4eSAndroid Build Coastguard Worker     DISPLAY(WELCOME_MESSAGE);
904*27162e4eSAndroid Build Coastguard Worker 
905*27162e4eSAndroid Build Coastguard Worker     if (argc<2) { badusage(exename); return 1; }
906*27162e4eSAndroid Build Coastguard Worker 
907*27162e4eSAndroid Build Coastguard Worker     for(i=1; i<argc; i++) {
908*27162e4eSAndroid Build Coastguard Worker         const char* argument = argv[i];
909*27162e4eSAndroid Build Coastguard Worker 
910*27162e4eSAndroid Build Coastguard Worker         if(!argument) continue;   // Protection if argument empty
911*27162e4eSAndroid Build Coastguard Worker         if (!strcmp(argument, "--no-prompt")) {
912*27162e4eSAndroid Build Coastguard Worker             g_noPrompt = 1;
913*27162e4eSAndroid Build Coastguard Worker             continue;
914*27162e4eSAndroid Build Coastguard Worker         }
915*27162e4eSAndroid Build Coastguard Worker 
916*27162e4eSAndroid Build Coastguard Worker         // Decode command (note : aggregated commands are allowed)
917*27162e4eSAndroid Build Coastguard Worker         if (argument[0]=='-') {
918*27162e4eSAndroid Build Coastguard Worker             while (argument[1]!=0) {
919*27162e4eSAndroid Build Coastguard Worker                 argument ++;
920*27162e4eSAndroid Build Coastguard Worker 
921*27162e4eSAndroid Build Coastguard Worker                 switch(argument[0])
922*27162e4eSAndroid Build Coastguard Worker                 {
923*27162e4eSAndroid Build Coastguard Worker                     // Select compression algorithm only
924*27162e4eSAndroid Build Coastguard Worker                 case 'c':
925*27162e4eSAndroid Build Coastguard Worker                     g_decompressionTest = 0;
926*27162e4eSAndroid Build Coastguard Worker                     while ((argument[1]>= '0') && (argument[1]<= '9')) {
927*27162e4eSAndroid Build Coastguard Worker                         g_compressionAlgo *= 10;
928*27162e4eSAndroid Build Coastguard Worker                         g_compressionAlgo += argument[1] - '0';
929*27162e4eSAndroid Build Coastguard Worker                         argument++;
930*27162e4eSAndroid Build Coastguard Worker                     }
931*27162e4eSAndroid Build Coastguard Worker                     break;
932*27162e4eSAndroid Build Coastguard Worker 
933*27162e4eSAndroid Build Coastguard Worker                     // Select decompression algorithm only
934*27162e4eSAndroid Build Coastguard Worker                 case 'd':
935*27162e4eSAndroid Build Coastguard Worker                     g_compressionTest = 0;
936*27162e4eSAndroid Build Coastguard Worker                     while ((argument[1]>= '0') && (argument[1]<= '9')) {
937*27162e4eSAndroid Build Coastguard Worker                         g_decompressionAlgo *= 10;
938*27162e4eSAndroid Build Coastguard Worker                         g_decompressionAlgo += argument[1] - '0';
939*27162e4eSAndroid Build Coastguard Worker                         argument++;
940*27162e4eSAndroid Build Coastguard Worker                     }
941*27162e4eSAndroid Build Coastguard Worker                     break;
942*27162e4eSAndroid Build Coastguard Worker 
943*27162e4eSAndroid Build Coastguard Worker                     // Display help on usage
944*27162e4eSAndroid Build Coastguard Worker                 case 'h' :
945*27162e4eSAndroid Build Coastguard Worker                 case 'H': usage(exename); return usage_advanced();
946*27162e4eSAndroid Build Coastguard Worker                 case 'l': return list();
947*27162e4eSAndroid Build Coastguard Worker 
948*27162e4eSAndroid Build Coastguard Worker                     // Modify Block Properties
949*27162e4eSAndroid Build Coastguard Worker                 case 'B':
950*27162e4eSAndroid Build Coastguard Worker                     while (argument[1]!=0)
951*27162e4eSAndroid Build Coastguard Worker                     switch(argument[1])
952*27162e4eSAndroid Build Coastguard Worker                     {
953*27162e4eSAndroid Build Coastguard Worker                     case '4':
954*27162e4eSAndroid Build Coastguard Worker                     case '5':
955*27162e4eSAndroid Build Coastguard Worker                     case '6':
956*27162e4eSAndroid Build Coastguard Worker                     case '7':
957*27162e4eSAndroid Build Coastguard Worker                     {   int B = argument[1] - '0';
958*27162e4eSAndroid Build Coastguard Worker                         int S = 1 << (8 + 2*B);
959*27162e4eSAndroid Build Coastguard Worker                         BMK_setBlocksize(S);
960*27162e4eSAndroid Build Coastguard Worker                         argument++;
961*27162e4eSAndroid Build Coastguard Worker                         break;
962*27162e4eSAndroid Build Coastguard Worker                     }
963*27162e4eSAndroid Build Coastguard Worker                     case 'D': argument++; break;
964*27162e4eSAndroid Build Coastguard Worker                     default : goto _exit_blockProperties;
965*27162e4eSAndroid Build Coastguard Worker                     }
966*27162e4eSAndroid Build Coastguard Worker _exit_blockProperties:
967*27162e4eSAndroid Build Coastguard Worker                     break;
968*27162e4eSAndroid Build Coastguard Worker 
969*27162e4eSAndroid Build Coastguard Worker                     // Modify Nb Iterations
970*27162e4eSAndroid Build Coastguard Worker                 case 'i':
971*27162e4eSAndroid Build Coastguard Worker                     if ((argument[1] >='0') && (argument[1] <='9')) {
972*27162e4eSAndroid Build Coastguard Worker                         int iters = argument[1] - '0';
973*27162e4eSAndroid Build Coastguard Worker                         BMK_setNbIterations(iters);
974*27162e4eSAndroid Build Coastguard Worker                         argument++;
975*27162e4eSAndroid Build Coastguard Worker                     }
976*27162e4eSAndroid Build Coastguard Worker                     break;
977*27162e4eSAndroid Build Coastguard Worker 
978*27162e4eSAndroid Build Coastguard Worker                     // Pause at the end (hidden option)
979*27162e4eSAndroid Build Coastguard Worker                 case 'p': BMK_setPause(); break;
980*27162e4eSAndroid Build Coastguard Worker 
981*27162e4eSAndroid Build Coastguard Worker                     // Unknown command
982*27162e4eSAndroid Build Coastguard Worker                 default : badusage(exename); return 1;
983*27162e4eSAndroid Build Coastguard Worker                 }
984*27162e4eSAndroid Build Coastguard Worker             }
985*27162e4eSAndroid Build Coastguard Worker             continue;
986*27162e4eSAndroid Build Coastguard Worker         }
987*27162e4eSAndroid Build Coastguard Worker 
988*27162e4eSAndroid Build Coastguard Worker         // first provided filename is input
989*27162e4eSAndroid Build Coastguard Worker         if (!input_filename) { input_filename=argument; filenamesStart=i; continue; }
990*27162e4eSAndroid Build Coastguard Worker 
991*27162e4eSAndroid Build Coastguard Worker     }
992*27162e4eSAndroid Build Coastguard Worker 
993*27162e4eSAndroid Build Coastguard Worker     // No input filename ==> Error
994*27162e4eSAndroid Build Coastguard Worker     if(!input_filename) { badusage(exename); return 1; }
995*27162e4eSAndroid Build Coastguard Worker 
996*27162e4eSAndroid Build Coastguard Worker     return fullSpeedBench(argv+filenamesStart, argc-filenamesStart);
997*27162e4eSAndroid Build Coastguard Worker 
998*27162e4eSAndroid Build Coastguard Worker }
999