-#!/usr/local/bin/perl
+#!/usr/bin/env perl
+#***************************************************************************
+# _ _ ____ _
+# Project ___| | | | _ \| |
+# / __| | | | |_) | |
+# | (__| |_| | _ <| |___
+# \___|\___/|_| \_\_____|
+#
+# Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+#
+# This software is licensed as described in the file COPYING, which
+# you should have received as part of this distribution. The terms
+# are also available at https://curl.haxx.se/docs/copyright.html.
+#
+# You may opt to use, copy, modify, merge, publish, distribute and/or sell
+# copies of the Software, and permit persons to whom the Software is
+# furnished to do so, under the terms of the COPYING file.
+#
+# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+# KIND, either express or implied.
+#
+###########################################################################
# Yeah, I know, probably 1000 other persons already wrote a script like
# this, but I'll tell ya:
# THEY DON'T FIT ME :-)
# Get readme file as parameter:
+
+if($ARGV[0] eq "-c") {
+ $c=1;
+ shift @ARGV;
+}
+
my $README = $ARGV[0];
if($README eq "") {
- print "usage: mkreadme.pl [-c] <README> < manpage\n";
+ print "usage: mkhelp.pl [-c] <README> < manpage\n";
exit;
}
-push @out, " _ _ ____ _ \n";
-push @out, " Project ___| | | | _ \\| | \n";
-push @out, " / __| | | | |_) | | \n";
-push @out, " | (__| |_| | _ <| |___ \n";
+push @out, " _ _ ____ _\n";
+push @out, " Project ___| | | | _ \\| |\n";
+push @out, " / __| | | | |_) | |\n";
+push @out, " | (__| |_| | _ <| |___\n";
push @out, " \\___|\\___/|_| \\_\\_____|\n";
-my $head=0;
-
+my $olen=0;
while (<STDIN>) {
- $line = $_;
+ my $line = $_;
- # this kind should be removed first:
- $line =~ s/_\b//g;
+ # this should be removed:
+ $line =~ s/(\b.|_\b)//g;
- # then this:
- $line =~ s/\b.//g;
+ # remove trailing CR from line. msysgit checks out files as line+CRLF
+ $line =~ s/\r$//;
- if($line =~ /^curl/i) {
- # cut off the page headers
- $head=1;
- next;
- }
+ if($line =~ /^([ \t]*\n|curl)/i) {
+ # cut off headers and empty lines
+ $wline++; # count number of cut off lines
+ next;
+ }
- if($line =~ /^[ \t]*\n/) {
- $wline++;
- # we only make one empty line max
- next;
+ my $text = $line;
+ $text =~ s/^\s+//g; # cut off preceding...
+ $text =~ s/\s+$//g; # and trailing whitespaces
+
+ $tlen = length($text);
+
+ if($wline && ($olen == $tlen)) {
+ # if the previous line with contents was exactly as long as
+ # this line, then we ignore the newlines!
+
+ # We do this magic because a header may abort a paragraph at
+ # any line, but we don't want that to be noticed in the output
+ # here
+ $wline=0;
}
+ $olen = $tlen;
+
if($wline) {
- $wline = 0;
- if(!$head) {
- push @out, "\n";
- }
- $head =0;
+ # we only make one empty line max
+ $wline = 0;
+ push @out, "\n";
}
push @out, $line;
}
die "couldn't read the README infile $README";
while(<READ>) {
- push @out, $_;
-}
-close(READ);
+ my $line = $_;
-# if compressed
-if($c) {
- my @test = `gzip --version 2>&1`;
- if($test[0] =~ /gzip/) {
- open(GZIP, "|gzip -9 >dumpit.gz");
- binmode GZIP;
- for(@out) {
- print GZIP $_;
- $gzip += length($_);
- }
- close(GZIP);
-
- open(GZIP, "<dumpit.gz");
- binmode GZIP;
- while(<GZIP>) {
- push @gzip, $_;
- $gzipped += length($_);
- }
- close(GZIP);
- }
- else {
- # no gzip, no compression!
- undef $c;
- print STDERR "MEEEP: Couldn't find gzip, disable compression\n";
- }
+ # remove trailing CR from line. msysgit checks out files as line+CRLF
+ $line =~ s/\r$//;
+
+ push @out, $line;
}
+close(READ);
-$now = localtime;
print <<HEAD
/*
* NEVER EVER edit this manually, fix the mkhelp.pl script instead!
- * Generation time: $now
*/
-#include <stdio.h>
+#ifdef USE_MANUAL
+#include "tool_hugehelp.h"
HEAD
;
if($c) {
- print "/* gzip shrunk this data from $gzip to $gzipped bytes */\n",
- "#include <zlib.h>\nstatic const unsigned char hugehelpgz[] = {\n ";
+ # If compression requested, check that the Gzip module is available
+ # or else disable compression
+ $c = eval
+ {
+ require IO::Compress::Gzip;
+ IO::Compress::Gzip->import();
+ 1;
+ };
+ print STDERR "Warning: compression requested but Gzip is not available\n" if (!$c)
+}
+
+if($c)
+{
+ my $content = join("", @out);
+ my $gzippedContent;
+ IO::Compress::Gzip::gzip(
+ \$content, \$gzippedContent, Level => 9, TextFlag => 1, Time=>0) or die "gzip failed:";
+ $gzip = length($content);
+ $gzipped = length($gzippedContent);
+
+ print <<HEAD
+#include <zlib.h>
+#include "memdebug.h" /* keep this as LAST include */
+static const unsigned char hugehelpgz[] = {
+ /* This mumbo-jumbo is the huge help text compressed with gzip.
+ Thanks to this operation, the size of this data shrank from $gzip
+ to $gzipped bytes. You can disable the use of compressed help
+ texts by NOT passing -c to the mkhelp.pl tool. */
+HEAD
+;
+
my $c=0;
- for(@gzip) {
- my @all=split(//, $_);
- for(@all) {
- my $num=ord($_);
- printf("0x%02x, ", 0+$num);
- if(++$c>11) {
- print "\n ";
- $c=0;
- }
+ print " ";
+ for(split(//, $gzippedContent)) {
+ my $num=ord($_);
+ printf(" 0x%02x,", 0+$num);
+ if(!(++$c % 12)) {
+ print "\n ";
}
}
print "\n};\n";
print <<EOF
+#define BUF_SIZE 0x10000
+static voidpf zalloc_func(voidpf opaque, unsigned int items, unsigned int size)
+{
+ (void) opaque;
+ /* not a typo, keep it calloc() */
+ return (voidpf) calloc(items, size);
+}
+static void zfree_func(voidpf opaque, voidpf ptr)
+{
+ (void) opaque;
+ free(ptr);
+}
/* 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;
return;
headerlen = 10;
- z.avail_in = sizeof(hugehelpgz) - headerlen;
+ memset(&z, 0, sizeof(z_stream));
+ z.zalloc = (alloc_func)zalloc_func;
+ z.zfree = (free_func)zfree_func;
+ z.avail_in = (unsigned int)(sizeof(hugehelpgz) - headerlen);
z.next_in = (unsigned char *)hugehelpgz + headerlen;
- z.zalloc = (alloc_func)Z_NULL;
- z.zfree = (free_func)Z_NULL;
- z.opaque = 0;
if (inflateInit2(&z, -MAX_WBITS) != Z_OK)
return;
- for (;;) {
- 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;
- } else
- break; /* Error */
+ 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 */
+ }
+ free(buf);
}
inflateEnd(&z);
}
EOF
;
+foot();
exit;
}
else {
}
-print ", stdout) ;\n}\n"
-
+print ", stdout) ;\n}\n";
+
+foot();
+
+sub foot {
+ print <<FOOT
+#else /* !USE_MANUAL */
+/* built-in manual is disabled, blank function */
+#include "tool_hugehelp.h"
+void hugehelp(void) {}
+#endif /* USE_MANUAL */
+FOOT
+ ;
+}