break loadFile_orDie() into 2: loadFile_orDie() loads file into a pre-allocated memory buffer, mallocAndLoadFile_orDie() allocates memory first, then calls loadFile_orDie()

This commit is contained in:
Yi Jin 2018-12-17 16:54:55 -08:00
parent 452689678b
commit bc4dc606de
6 changed files with 41 additions and 28 deletions

View File

@ -21,7 +21,7 @@ static ZSTD_CDict* createCDict_orDie(const char* dictFileName, int cLevel)
{
size_t dictSize;
printf("loading dictionary %s \n", dictFileName);
void* const dictBuffer = loadFile_orDie(dictFileName, &dictSize, 0, 0);
void* const dictBuffer = mallocAndLoadFile_orDie(dictFileName, &dictSize);
ZSTD_CDict* const cdict = ZSTD_createCDict(dictBuffer, dictSize, cLevel);
if (!cdict) {
fprintf(stderr, "ZSTD_createCDict error \n");
@ -35,7 +35,7 @@ static ZSTD_CDict* createCDict_orDie(const char* dictFileName, int cLevel)
static void compress(const char* fname, const char* oname, const ZSTD_CDict* cdict)
{
size_t fSize;
void* const fBuff = loadFile_orDie(fname, &fSize, 0, 0);
void* const fBuff = mallocAndLoadFile_orDie(fname, &fSize);
size_t const cBuffSize = ZSTD_compressBound(fSize);
void* const cBuff = malloc_orDie(cBuffSize);

View File

@ -25,7 +25,7 @@ static ZSTD_DDict* createDict_orDie(const char* dictFileName)
{
size_t dictSize;
printf("loading dictionary %s \n", dictFileName);
void* const dictBuffer = loadFile_orDie(dictFileName, &dictSize, 0, 0);
void* const dictBuffer = mallocAndLoadFile_orDie(dictFileName, &dictSize);
ZSTD_DDict* const ddict = ZSTD_createDDict(dictBuffer, dictSize);
if (ddict==NULL) { fprintf(stderr, "ZSTD_createDDict error \n"); exit(5); }
free(dictBuffer);
@ -35,7 +35,7 @@ static ZSTD_DDict* createDict_orDie(const char* dictFileName)
static void decompress(const char* fname, const ZSTD_DDict* ddict)
{
size_t cSize;
void* const cBuff = loadFile_orDie(fname, &cSize, 0, 0);
void* const cBuff = mallocAndLoadFile_orDie(fname, &cSize);
unsigned long long const rSize = ZSTD_findDecompressedSize(cBuff, cSize);
if (rSize==ZSTD_CONTENTSIZE_ERROR) {
fprintf(stderr, "%s : it was not compressed by zstd.\n", fname);

View File

@ -26,9 +26,9 @@ typedef struct {
/*
* allocate memory for buffers big enough to compress all files
* as well as memory for output file name (outFilename)
* as well as memory for output file name (ofn)
*/
static resources createResources_orDie(int argc, const char** argv, char **outFilename)
static resources createResources_orDie(int argc, const char** argv, char **ofn, int* ofnBufferLen)
{
size_t maxFilenameLength=0;
size_t maxFileSize = 0;
@ -47,7 +47,8 @@ static resources createResources_orDie(int argc, const char** argv, char **outFi
ress.fBufferSize = maxFileSize;
ress.cBufferSize = ZSTD_compressBound(maxFileSize);
*outFilename = (char*)malloc_orDie(maxFilenameLength + 5);
*ofnBufferLen = maxFilenameLength + 5;
*ofn = (char*)malloc_orDie(*ofnBufferLen);
ress.fBuffer = malloc_orDie(ress.fBufferSize);
ress.cBuffer = malloc_orDie(ress.cBufferSize);
ress.cctx = ZSTD_createCCtx();
@ -66,8 +67,7 @@ static void freeResources(resources ress, char *outFilename)
/* compress with pre-allocated context (ZSTD_CCtx) and input/output buffers*/
static void compressFile_orDie(resources ress, const char* fname, const char* oname)
{
size_t fSize;
loadFile_orDie(fname, &fSize, ress.fBuffer, ress.fBufferSize);
size_t fSize = loadFile_orDie(fname, ress.fBuffer, ress.fBufferSize);
size_t const cSize = ZSTD_compressCCtx(ress.cctx, ress.cBuffer, ress.cBufferSize, ress.fBuffer, fSize, 1);
if (ZSTD_isError(cSize)) {
@ -94,15 +94,17 @@ int main(int argc, const char** argv)
/* memory allocation for outFilename and resources */
char* outFilename;
resources ress = createResources_orDie(argc, argv, &outFilename);
int outFilenameBufferLen;
resources const ress = createResources_orDie(argc, argv, &outFilename, &outFilenameBufferLen);
/* compress files with shared context, input and output buffers */
int argNb;
for (argNb = 1; argNb < argc; argNb++) {
const char* const inFilename = argv[argNb];
memset(outFilename, 0, 1);
strcat(outFilename, inFilename);
strcat(outFilename, ".zst");
int inFilenameLen = strlen(inFilename);
assert(inFilenameLen + 5 <= outFilenameBufferLen);
memcpy(outFilename, inFilename, inFilenameLen);
memcpy(outFilename+inFilenameLen, ".zst", 5);
compressFile_orDie(ress, inFilename, outFilename);
}

View File

@ -19,7 +19,7 @@
static void compress_orDie(const char* fname, const char* oname)
{
size_t fSize;
void* const fBuff = loadFile_orDie(fname, &fSize, 0, 0);
void* const fBuff = mallocAndLoadFile_orDie(fname, &fSize);
size_t const cBuffSize = ZSTD_compressBound(fSize);
void* const cBuff = malloc_orDie(cBuffSize);

View File

@ -20,7 +20,7 @@
static void decompress(const char* fname)
{
size_t cSize;
void* const cBuff = loadFile_orDie(fname, &cSize, 0, 0);
void* const cBuff = mallocAndLoadFile_orDie(fname, &cSize);
unsigned long long const rSize = ZSTD_findDecompressedSize(cBuff, cSize);
if (rSize==ZSTD_CONTENTSIZE_ERROR) {
fprintf(stderr, "%s : it was not compressed by zstd.\n", fname);

View File

@ -18,6 +18,7 @@
#include <stdio.h> // fprintf, perror, fopen, etc.
#include <string.h> // strlen, strcat, memset, strerror
#include <errno.h> // errno
#include <assert.h> // assert
#include <sys/stat.h> // stat
/*
@ -141,33 +142,43 @@ static void* malloc_orDie(size_t size)
}
/*! loadFile_orDie() :
* Read size bytes from a file. If buffer is not provided (i.e., buffer == null),
* malloc will be called to allocate one.
* load file into buffer (memory).
*
* Note: This function will send an error to stderr and exit if it
* cannot read data from the given file path.
*
* @return If successful this function will return a pointer to read
* data otherwise it will printout an error to stderr and exit.
* @return If successful this function will load file into buffer and
* return file size, otherwise it will printout an error to stderr and exit.
*/
static void* loadFile_orDie(const char* fileName, size_t* size, void* buffer, int bufferSize)
static size_t loadFile_orDie(const char* fileName, void* buffer, int bufferSize)
{
size_t const fileSize = fsize_orDie(fileName);
assert(fileSize <= bufferSize);
FILE* const inFile = fopen_orDie(fileName, "rb");
if (!buffer) {
buffer = malloc_orDie(fileSize);
}
else if (bufferSize < fileSize) {
fprintf(stderr, "%s : filesize bigger than provided buffer.\n", fileName);
exit(ERROR_largeFile);
}
size_t const readSize = fread(buffer, 1, fileSize, inFile);
if (readSize != (size_t)fileSize) {
fprintf(stderr, "fread: %s : %s \n", fileName, strerror(errno));
exit(ERROR_fread);
}
fclose(inFile); /* can't fail, read only */
*size = fileSize;
return fileSize;
}
/*! mallocAndLoadFile_orDie() :
* allocate memory buffer and then load file into it.
*
* Note: This function will send an error to stderr and exit if memory allocation
* fails or it cannot read data from the given file path.
*
* @return If successful this function will return buffer and bufferSize(=fileSize),
* otherwise it will printout an error to stderr and exit.
*/
static void* mallocAndLoadFile_orDie(const char* fileName, size_t* bufferSize) {
size_t const fileSize = fsize_orDie(fileName);
*bufferSize = fileSize;
void* const buffer = malloc_orDie(*bufferSize);
loadFile_orDie(fileName, buffer, *bufferSize);
return buffer;
}