Home | History | Annotate | Download | only in src
      1 #!/usr/bin/env perl
      2 #***************************************************************************
      3 #                                  _   _ ____  _
      4 #  Project                     ___| | | |  _ \| |
      5 #                             / __| | | | |_) | |
      6 #                            | (__| |_| |  _ <| |___
      7 #                             \___|\___/|_| \_\_____|
      8 #
      9 # Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel (at] haxx.se>, et al.
     10 #
     11 # This software is licensed as described in the file COPYING, which
     12 # you should have received as part of this distribution. The terms
     13 # are also available at https://curl.haxx.se/docs/copyright.html.
     14 #
     15 # You may opt to use, copy, modify, merge, publish, distribute and/or sell
     16 # copies of the Software, and permit persons to whom the Software is
     17 # furnished to do so, under the terms of the COPYING file.
     18 #
     19 # This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
     20 # KIND, either express or implied.
     21 #
     22 ###########################################################################
     23 
     24 # Yeah, I know, probably 1000 other persons already wrote a script like
     25 # this, but I'll tell ya:
     26 
     27 # THEY DON'T FIT ME :-)
     28 
     29 # Get readme file as parameter:
     30 
     31 if($ARGV[0] eq "-c") {
     32     $c=1;
     33     shift @ARGV;
     34 }
     35 
     36 my $README = $ARGV[0];
     37 
     38 if($README eq "") {
     39     print "usage: mkhelp.pl [-c] <README> < manpage\n";
     40     exit;
     41 }
     42 
     43 
     44 push @out, "                                  _   _ ____  _\n";
     45 push @out, "  Project                     ___| | | |  _ \\| |\n";
     46 push @out, "                             / __| | | | |_) | |\n";
     47 push @out, "                            | (__| |_| |  _ <| |___\n";
     48 push @out, "                             \\___|\\___/|_| \\_\\_____|\n";
     49 
     50 my $olen=0;
     51 while (<STDIN>) {
     52     my $line = $_;
     53 
     54     # this should be removed:
     55     $line =~ s/(.|_)//g;
     56 
     57     # remove trailing CR from line. msysgit checks out files as line+CRLF
     58     $line =~ s/\r$//;
     59 
     60     if($line =~ /^([ \t]*\n|curl)/i) {
     61         # cut off headers and empty lines
     62         $wline++; # count number of cut off lines
     63         next;
     64     }
     65 
     66     my $text = $line;
     67     $text =~ s/^\s+//g; # cut off preceding...
     68     $text =~ s/\s+$//g; # and trailing whitespaces
     69 
     70     $tlen = length($text);
     71 
     72     if($wline && ($olen == $tlen)) {
     73         # if the previous line with contents was exactly as long as
     74         # this line, then we ignore the newlines!
     75 
     76         # We do this magic because a header may abort a paragraph at
     77         # any line, but we don't want that to be noticed in the output
     78         # here
     79         $wline=0;
     80     }
     81     $olen = $tlen;
     82 
     83     if($wline) {
     84         # we only make one empty line max
     85         $wline = 0;
     86         push @out, "\n";
     87     }
     88     push @out, $line;
     89 }
     90 push @out, "\n"; # just an extra newline
     91 
     92 open(READ, "<$README") ||
     93     die "couldn't read the README infile $README";
     94 
     95 while(<READ>) {
     96     my $line = $_;
     97 
     98     # remove trailing CR from line. msysgit checks out files as line+CRLF
     99     $line =~ s/\r$//;
    100 
    101     push @out, $line;
    102 }
    103 close(READ);
    104 
    105 print <<HEAD
    106 /*
    107  * NEVER EVER edit this manually, fix the mkhelp.pl script instead!
    108  */
    109 #ifdef USE_MANUAL
    110 #include "tool_hugehelp.h"
    111 HEAD
    112     ;
    113 if($c) {
    114     # If compression requested, check that the Gzip module is available
    115     # or else disable compression
    116     $c = eval
    117     {
    118       require IO::Compress::Gzip;
    119       IO::Compress::Gzip->import();
    120       1;
    121     };
    122     print STDERR "Warning: compression requested but Gzip is not available\n" if (!$c)
    123 }
    124 
    125 if($c)
    126 {
    127     my $content = join("", @out);
    128     my $gzippedContent;
    129     IO::Compress::Gzip::gzip(
    130         \$content, \$gzippedContent, Level => 9, TextFlag => 1, Time=>0) or die "gzip failed:";
    131     $gzip = length($content);
    132     $gzipped = length($gzippedContent);
    133 
    134     print <<HEAD
    135 #include <zlib.h>
    136 #include "memdebug.h" /* keep this as LAST include */
    137 static const unsigned char hugehelpgz[] = {
    138   /* This mumbo-jumbo is the huge help text compressed with gzip.
    139      Thanks to this operation, the size of this data shrank from $gzip
    140      to $gzipped bytes. You can disable the use of compressed help
    141      texts by NOT passing -c to the mkhelp.pl tool. */
    142 HEAD
    143 ;
    144 
    145     my $c=0;
    146     print " ";
    147     for(split(//, $gzippedContent)) {
    148         my $num=ord($_);
    149         printf(" 0x%02x,", 0+$num);
    150         if(!(++$c % 12)) {
    151             print "\n ";
    152         }
    153     }
    154     print "\n};\n";
    155 
    156     print <<EOF
    157 #define BUF_SIZE 0x10000
    158 static voidpf zalloc_func(voidpf opaque, unsigned int items, unsigned int size)
    159 {
    160   (void) opaque;
    161   /* not a typo, keep it calloc() */
    162   return (voidpf) calloc(items, size);
    163 }
    164 static void zfree_func(voidpf opaque, voidpf ptr)
    165 {
    166   (void) opaque;
    167   free(ptr);
    168 }
    169 /* Decompress and send to stdout a gzip-compressed buffer */
    170 void hugehelp(void)
    171 {
    172   unsigned char* buf;
    173   int status,headerlen;
    174   z_stream z;
    175 
    176   /* Make sure no gzip options are set */
    177   if (hugehelpgz[3] & 0xfe)
    178     return;
    179 
    180   headerlen = 10;
    181   memset(&z, 0, sizeof(z_stream));
    182   z.zalloc = (alloc_func)zalloc_func;
    183   z.zfree = (free_func)zfree_func;
    184   z.avail_in = (unsigned int)(sizeof(hugehelpgz) - headerlen);
    185   z.next_in = (unsigned char *)hugehelpgz + headerlen;
    186 
    187   if (inflateInit2(&z, -MAX_WBITS) != Z_OK)
    188     return;
    189 
    190   buf = malloc(BUF_SIZE);
    191   if (buf) {
    192     while(1) {
    193       z.avail_out = BUF_SIZE;
    194       z.next_out = buf;
    195       status = inflate(&z, Z_SYNC_FLUSH);
    196       if (status == Z_OK || status == Z_STREAM_END) {
    197         fwrite(buf, BUF_SIZE - z.avail_out, 1, stdout);
    198         if (status == Z_STREAM_END)
    199           break;
    200       }
    201       else
    202         break;    /* Error */
    203     }
    204     free(buf);
    205   }
    206   inflateEnd(&z);
    207 }
    208 EOF
    209     ;
    210 foot();
    211 exit;
    212 }
    213 else {
    214     print <<HEAD
    215 void hugehelp(void)
    216 {
    217    fputs(
    218 HEAD
    219          ;
    220 }
    221 
    222 $outsize=0;
    223 for(@out) {
    224     chop;
    225 
    226     $new = $_;
    227 
    228     $outsize += length($new)+1; # one for the newline
    229 
    230     $new =~ s/\\/\\\\/g;
    231     $new =~ s/\"/\\\"/g;
    232 
    233     # gcc 2.96 claims ISO C89 only is required to support 509 letter strings
    234     if($outsize > 500) {
    235         # terminate and make another fputs() call here
    236         print ", stdout);\n fputs(\n";
    237         $outsize=length($new)+1;
    238     }
    239     printf("\"%s\\n\"\n", $new);
    240 
    241 }
    242 
    243 print ", stdout) ;\n}\n";
    244 
    245 foot();
    246 
    247 sub foot {
    248   print <<FOOT
    249 #else /* !USE_MANUAL */
    250 /* built-in manual is disabled, blank function */
    251 #include "tool_hugehelp.h"
    252 void hugehelp(void) {}
    253 #endif /* USE_MANUAL */
    254 FOOT
    255   ;
    256 }
    257