diff options
author | Dan Fandrich <dan@coneharvesters.com> | 2008-04-21 23:17:20 +0000 |
---|---|---|
committer | Dan Fandrich <dan@coneharvesters.com> | 2008-04-21 23:17:20 +0000 |
commit | 7076505c2495d2804a0b8f8f9b5901aa8f5dbf16 (patch) | |
tree | 7dfc12793f0cee8f03263bd51a70c2af68f642ba | |
parent | 5825cf9457f2e6f327bd1f6bebbc8e925df13c16 (diff) |
Allocate the decompression buffer for the --manual option on the heap
instead of the stack.
-rw-r--r-- | src/mkhelp.pl | 28 |
1 files changed, 17 insertions, 11 deletions
diff --git a/src/mkhelp.pl b/src/mkhelp.pl index 871aabcb3..7fb37db58 100644 --- a/src/mkhelp.pl +++ b/src/mkhelp.pl @@ -120,6 +120,7 @@ HEAD ; if($c) { print <<HEAD +#include <stdlib.h> #include <zlib.h> static const unsigned char hugehelpgz[] = { /* This mumbo-jumbo is the huge help text compressed with gzip. @@ -144,10 +145,11 @@ HEAD print "\n};\n"; print <<EOF +#define BUF_SIZE 0x10000 /* Decompress and send to stdout a gzip-compressed buffer */ void hugehelp(void) { - unsigned char buf[0x10000]; + unsigned char* buf; int status,headerlen; z_stream z; @@ -165,17 +167,21 @@ void hugehelp(void) if (inflateInit2(&z, -MAX_WBITS) != Z_OK) return; - while(1) { - z.avail_out = (int)sizeof(buf); - z.next_out = buf; - status = inflate(&z, Z_SYNC_FLUSH); - if (status == Z_OK || status == Z_STREAM_END) { - fwrite(buf, sizeof(buf) - z.avail_out, 1, stdout); - if (status == Z_STREAM_END) - break; + buf = malloc(BUF_SIZE); + if (buf) { + while(1) { + z.avail_out = BUF_SIZE; + z.next_out = buf; + status = inflate(&z, Z_SYNC_FLUSH); + if (status == Z_OK || status == Z_STREAM_END) { + fwrite(buf, BUF_SIZE - z.avail_out, 1, stdout); + if (status == Z_STREAM_END) + break; + } + else + break; /* Error */ } - else - break; /* Error */ + free(buf); } inflateEnd(&z); } |