static unsigned g_useProgressBar = 1;
static UTIL_freq_t g_ticksPerSecond;
static unsigned g_forceCompressionLevel = 0;
+static unsigned g_minCLevel = 1;
+static unsigned g_maxCLevel = 22;
typedef struct {
void* start;
/* use whichever one waited less because it was slower */
double const completion = MAX(createWaitCompressionCompletion, writeWaitCompressionCompletion);
unsigned const change = convertCompletionToChange(completion);
- unsigned const boundChange = MIN(change, ctx->compressionLevel - 1);
+ unsigned const boundChange = ctx->compressionLevel >= g_minCLevel ? MIN(change, ctx->compressionLevel - g_minCLevel) : 0;
if (ctx->convergenceCounter >= CONVERGENCE_LOWER_BOUND && boundChange != 0) {
/* reset convergence counter, might have been a spike */
ctx->convergenceCounter = 0;
/* compress waiting on write */
double const completion = MIN(compressWaitWriteCompletion, compressWaitCreateCompletion);
unsigned const change = convertCompletionToChange(completion);
- unsigned const boundChange = MIN(change, ZSTD_maxCLevel() - ctx->compressionLevel);
+ unsigned const boundChange = g_maxCLevel >= ctx->compressionLevel ? MIN(change, g_maxCLevel - ctx->compressionLevel) : 0;
if (ctx->convergenceCounter >= CONVERGENCE_LOWER_BOUND && boundChange != 0) {
/* reset convergence counter, might have been a spike */
ctx->convergenceCounter = 0;
static void displayProgress(unsigned cLevel, unsigned last)
{
if (!g_useProgressBar) return;
- UTIL_time_t currTime;
- UTIL_getTime(&currTime);
- double const timeElapsed = (double)(UTIL_getSpanTimeMicro(g_ticksPerSecond, g_startTime, currTime) / 1000.0);
- double const sizeMB = (double)g_streamedSize / (1 << 20);
- double const avgCompRate = sizeMB * 1000 / timeElapsed;
- fprintf(stderr, "\r| Comp. Level: %2u | Time Elapsed: %7.2f s | Data Size: %7.1f MB | Avg Comp. Rate: %6.2f MB/s |", cLevel, timeElapsed/1000.0, sizeMB, avgCompRate);
- if (last) {
- fprintf(stderr, "\n");
- }
- else {
- fflush(stderr);
+ {
+ UTIL_time_t currTime;
+ UTIL_getTime(&currTime);
+ double const timeElapsed = (double)(UTIL_getSpanTimeMicro(g_ticksPerSecond, g_startTime, currTime) / 1000.0);
+ double const sizeMB = (double)g_streamedSize / (1 << 20);
+ double const avgCompRate = sizeMB * 1000 / timeElapsed;
+ fprintf(stderr, "\r| Comp. Level: %2u | Time Elapsed: %7.2f s | Data Size: %7.1f MB | Avg Comp. Rate: %6.2f MB/s |", cLevel, timeElapsed/1000.0, sizeMB, avgCompRate);
+ if (last) {
+ fprintf(stderr, "\n");
+ }
+ else {
+ fflush(stderr);
+ }
}
}
static int compressFilename(const char* const srcFilename, const char* const dstFilenameOrNull)
{
int ret = 0;
+ fcResources fcr = createFileCompressionResources(srcFilename, dstFilenameOrNull);
UTIL_getTime(&g_startTime);
g_streamedSize = 0;
- fcResources fcr = createFileCompressionResources(srcFilename, dstFilenameOrNull);
ret |= performCompression(fcr.ctx, fcr.srcFile, fcr.otArg);
ret |= freeFileCompressionResources(&fcr);
return ret;
return result;
}
-static void help()
+static void help(void)
{
PRINT("Usage:\n");
PRINT(" ./multi [options] [file(s)]\n");
PRINT(" -c : force write to stdout\n");
PRINT(" -p : hide progress bar\n");
PRINT(" -q : quiet mode -- do not show progress bar or other information\n");
+ PRINT(" -l# : provide lower bound for compression level\n");
+ PRINT(" -u# : provide upper bound for compression level\n");
}
/* return 0 if successful, else return error */
int main(int argCount, const char* argv[])
const char* outFilename = NULL;
const char** filenameTable = (const char**)malloc(argCount*sizeof(const char*));
unsigned filenameIdx = 0;
- filenameTable[0] = stdinmark;
unsigned forceStdout = 0;
int ret = 0;
int argNum;
+ filenameTable[0] = stdinmark;
UTIL_initTimer(&g_ticksPerSecond);
g_useProgressBar = 0;
g_displayLevel = 0;
break;
+ case 'l':
+ argument += 2;
+ g_minCLevel = readU32FromChar(&argument);
+ break;
+ case 'u':
+ argument += 2;
+ g_maxCLevel = readU32FromChar(&argument);
+ break;
default:
DISPLAY("Error: invalid argument provided\n");
ret = 1;