| #!/usr/bin/env perl | 
 | #*************************************************************************** | 
 | #                                  _   _ ____  _ | 
 | #  Project                     ___| | | |  _ \| | | 
 | #                             / __| | | | |_) | | | 
 | #                            | (__| |_| |  _ <| |___ | 
 | #                             \___|\___/|_| \_\_____| | 
 | # | 
 | # Copyright (C) 1998 - 2022, 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.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. | 
 | # | 
 | # SPDX-License-Identifier: curl | 
 | # | 
 | ########################################################################### | 
 |  | 
 | # 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; | 
 | } | 
 |  | 
 | 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; | 
 |  | 
 |     # remove trailing CR from line. msysgit checks out files as line+CRLF | 
 |     $line =~ s/\r$//; | 
 |  | 
 |     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 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) { | 
 |         # we only make one empty line max | 
 |         $wline = 0; | 
 |         push @out, "\n"; | 
 |     } | 
 |     push @out, $line; | 
 | } | 
 | push @out, "\n"; # just an extra newline | 
 |  | 
 | print <<HEAD | 
 | /* | 
 |  * NEVER EVER edit this manually, fix the mkhelp.pl script instead! | 
 |  */ | 
 | #ifdef USE_MANUAL | 
 | #include "tool_hugehelp.h" | 
 | HEAD | 
 |     ; | 
 | if($c) { | 
 |     # 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; | 
 |     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; | 
 |   int status,headerlen; | 
 |   z_stream z; | 
 |  | 
 |   /* Make sure no gzip options are set */ | 
 |   if (hugehelpgz[3] & 0xfe) | 
 |     return; | 
 |  | 
 |   headerlen = 10; | 
 |   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; | 
 |  | 
 |   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 | 
 |   ; | 
 | } |