diff options
Diffstat (limited to 'src/mkhelp.pl')
-rw-r--r-- | src/mkhelp.pl | 232 |
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 + ; +} |