summaryrefslogtreecommitdiff
path: root/src/mkhelp.pl
diff options
context:
space:
mode:
Diffstat (limited to 'src/mkhelp.pl')
-rw-r--r--src/mkhelp.pl232
1 files changed, 232 insertions, 0 deletions
diff --git a/src/mkhelp.pl b/src/mkhelp.pl
new file mode 100644
index 000000000..03c884fe9
--- /dev/null
+++ b/src/mkhelp.pl
@@ -0,0 +1,232 @@
+#!/usr/local/bin/perl
+
+# 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";
+ exit;
+}
+
+
+push @out, " _ _ ____ _\n";
+push @out, " Project ___| | | | _ \\| |\n";
+push @out, " / __| | | | |_) | |\n";
+push @out, " | (__| |_| | _ <| |___\n";
+push @out, " \\___|\\___/|_| \\_\\_____|\n";
+
+my $olen=0;
+while (<STDIN>) {
+ my $line = $_;
+
+ # this should be removed:
+ $line =~ s/(.|_)//g;
+
+ if($line =~ /^([ \t]*\n|curl)/i) {
+ # cut off headers and empty lines
+ $wline++; # count number of cut off lines
+ next;
+ }
+
+ my $text = $line;
+ $text =~ s/^\s+//g; # cut off preceeding...
+ $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) {
+ # we only make one empty line max
+ $wline = 0;
+ push @out, "\n";
+ }
+ push @out, $line;
+}
+push @out, "\n"; # just an extra newline
+
+open(READ, "<$README") ||
+ die "couldn't read the README infile $README";
+
+while(<READ>) {
+ push @out, $_;
+}
+close(READ);
+
+# if compressed
+if($c) {
+ my @test = `gzip --version 2>&1`;
+ if($test[0] =~ /gzip/) {
+ open(GZIP, ">dumpit") ||
+ die "can't create the dumpit file, try without -c";
+ binmode GZIP;
+ for(@out) {
+ print GZIP $_;
+ $gzip += length($_);
+ }
+ close(GZIP);
+
+ system("gzip --best --no-name dumpit");
+
+ open(GZIP, "<dumpit.gz") ||
+ die "can't read the dumpit.gz file, try without -c";
+ binmode GZIP;
+ while(<GZIP>) {
+ push @gzip, $_;
+ $gzipped += length($_);
+ }
+ close(GZIP);
+
+ unlink("dumpit.gz");
+ }
+ else {
+ # no gzip, no compression!
+ undef $c;
+ print STDERR "MEEEP: Couldn't find gzip, disable compression\n";
+ }
+}
+
+$now = localtime;
+print <<HEAD
+/*
+ * NEVER EVER edit this manually, fix the mkhelp.pl script instead!
+ * Generation time: $now
+ */
+#include "setup.h"
+#ifdef USE_MANUAL
+#include "hugehelp.h"
+#include <stdio.h>
+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.
+ Thanks to this operation, the size of this data shrunk 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;
+ print " ";
+ for(@gzip) {
+ my @all=split(//, $_);
+ for(@all) {
+ my $num=ord($_);
+ printf(" 0x%02x,", 0+$num);
+ if(++$c>11) {
+ print "\n ";
+ $c=0;
+ }
+ }
+ }
+ print "\n};\n";
+
+ print <<EOF
+#define BUF_SIZE 0x10000
+/* Decompress and send to stdout a gzip-compressed buffer */
+void hugehelp(void)
+{
+ unsigned char* buf;
+ int status,headerlen;
+ z_stream z;
+
+ /* Make sure no gzip options are set */
+ if (hugehelpgz[3] & 0xfe)
+ return;
+
+ headerlen = 10;
+ 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;
+
+ 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 <<HEAD
+void hugehelp(void)
+{
+ fputs(
+HEAD
+ ;
+}
+
+$outsize=0;
+for(@out) {
+ chop;
+
+ $new = $_;
+
+ $outsize += length($new)+1; # one for the newline
+
+ $new =~ s/\\/\\\\/g;
+ $new =~ s/\"/\\\"/g;
+
+ # gcc 2.96 claims ISO C89 only is required to support 509 letter strings
+ if($outsize > 500) {
+ # terminate and make another fputs() call here
+ print ", stdout);\n fputs(\n";
+ $outsize=length($new)+1;
+ }
+ printf("\"%s\\n\"\n", $new);
+
+}
+
+print ", stdout) ;\n}\n";
+
+foot();
+
+sub foot {
+ print <<FOOT
+#endif /* USE_MANUAL */
+FOOT
+ ;
+}