aboutsummaryrefslogtreecommitdiff
path: root/src/zopfli/zopfli_bin.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/zopfli/zopfli_bin.c')
-rw-r--r--src/zopfli/zopfli_bin.c46
1 files changed, 31 insertions, 15 deletions
diff --git a/src/zopfli/zopfli_bin.c b/src/zopfli/zopfli_bin.c
index 8a147ef..a42bade 100644
--- a/src/zopfli/zopfli_bin.c
+++ b/src/zopfli/zopfli_bin.c
@@ -33,20 +33,30 @@ decompressor.
#include "gzip_container.h"
#include "zlib_container.h"
+/* Windows workaround for stdout output. */
+#if _WIN32
+#include <fcntl.h>
+#endif
+
/*
-Loads a file into a memory array.
+Loads a file into a memory array. Returns 1 on success, 0 if file doesn't exist
+or couldn't be opened.
*/
-static void LoadFile(const char* filename,
- unsigned char** out, size_t* outsize) {
+static int LoadFile(const char* filename,
+ unsigned char** out, size_t* outsize) {
FILE* file;
*out = 0;
*outsize = 0;
file = fopen(filename, "rb");
- if (!file) return;
+ if (!file) return 0;
fseek(file , 0 , SEEK_END);
*outsize = ftell(file);
+ if(*outsize > 2147483647) {
+ fprintf(stderr,"Files larger than 2GB are not supported.\n");
+ exit(EXIT_FAILURE);
+ }
rewind(file);
*out = (unsigned char*)malloc(*outsize);
@@ -58,11 +68,14 @@ static void LoadFile(const char* filename,
free(*out);
*out = 0;
*outsize = 0;
+ fclose(file);
+ return 0;
}
}
assert(!(*outsize) || out); /* If size is not zero, out must be allocated. */
fclose(file);
+ return 1;
}
/*
@@ -71,6 +84,10 @@ Saves a file from a memory array, overwriting the file if it existed.
static void SaveFile(const char* filename,
const unsigned char* in, size_t insize) {
FILE* file = fopen(filename, "wb" );
+ if (file == NULL) {
+ fprintf(stderr,"Error: Cannot write to output file, terminating.\n");
+ exit (EXIT_FAILURE);
+ }
assert(file);
fwrite((char*)in, 1, insize, file);
fclose(file);
@@ -87,8 +104,7 @@ static void CompressFile(const ZopfliOptions* options,
size_t insize;
unsigned char* out = 0;
size_t outsize = 0;
- LoadFile(infilename, &in, &insize);
- if (insize == 0) {
+ if (!LoadFile(infilename, &in, &insize)) {
fprintf(stderr, "Invalid filename: %s\n", infilename);
return;
}
@@ -98,11 +114,11 @@ static void CompressFile(const ZopfliOptions* options,
if (outfilename) {
SaveFile(outfilename, out, outsize);
} else {
- size_t i;
- for (i = 0; i < outsize; i++) {
- /* Works only if terminal does not convert newlines. */
- printf("%c", out[i]);
- }
+#if _WIN32
+ /* Windows workaround for stdout output. */
+ _setmode(_fileno(stdout), _O_BINARY);
+#endif
+ fwrite(out, 1, outsize, stdout);
}
free(out);
@@ -143,14 +159,14 @@ int main(int argc, char* argv[]) {
}
else if (StringsEqual(arg, "--zlib")) output_type = ZOPFLI_FORMAT_ZLIB;
else if (StringsEqual(arg, "--gzip")) output_type = ZOPFLI_FORMAT_GZIP;
- else if (StringsEqual(arg, "--splitlast")) options.blocksplittinglast = 1;
+ else if (StringsEqual(arg, "--splitlast")) /* Ignore */;
else if (arg[0] == '-' && arg[1] == '-' && arg[2] == 'i'
&& arg[3] >= '0' && arg[3] <= '9') {
options.numiterations = atoi(arg + 3);
}
else if (StringsEqual(arg, "-h")) {
fprintf(stderr,
- "Usage: zopfli [OPTION]... FILE\n"
+ "Usage: zopfli [OPTION]... FILE...\n"
" -h gives this help\n"
" -c write the result on standard output, instead of disk"
" filename + '.gz'\n"
@@ -162,13 +178,13 @@ int main(int argc, char* argv[]) {
" --gzip output to gzip format (default)\n"
" --zlib output to zlib format instead of gzip\n"
" --deflate output to deflate format instead of gzip\n"
- " --splitlast do block splitting last instead of first\n");
+ " --splitlast ignored, left for backwards compatibility\n");
return 0;
}
}
if (options.numiterations < 1) {
- fprintf(stderr, "Error: must have 1 or more iterations");
+ fprintf(stderr, "Error: must have 1 or more iterations\n");
return 0;
}