• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1#!/usr/bin/env perl
2#***************************************************************************
3#                                  _   _ ____  _
4#  Project                     ___| | | |  _ \| |
5#                             / __| | | | |_) | |
6#                            | (__| |_| |  _ <| |___
7#                             \___|\___/|_| \_\_____|
8#
9# Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@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
31if($ARGV[0] eq "-c") {
32    $c=1;
33    shift @ARGV;
34}
35
36push @out, "                                  _   _ ____  _\n";
37push @out, "  Project                     ___| | | |  _ \\| |\n";
38push @out, "                             / __| | | | |_) | |\n";
39push @out, "                            | (__| |_| |  _ <| |___\n";
40push @out, "                             \\___|\\___/|_| \\_\\_____|\n";
41
42my $olen=0;
43while (<STDIN>) {
44    my $line = $_;
45
46    # this should be removed:
47    $line =~ s/(.|_)//g;
48
49    # remove trailing CR from line. msysgit checks out files as line+CRLF
50    $line =~ s/\r$//;
51
52    if($line =~ /^([ \t]*\n|curl)/i) {
53        # cut off headers and empty lines
54        $wline++; # count number of cut off lines
55        next;
56    }
57
58    my $text = $line;
59    $text =~ s/^\s+//g; # cut off preceding...
60    $text =~ s/\s+$//g; # and trailing whitespaces
61
62    $tlen = length($text);
63
64    if($wline && ($olen == $tlen)) {
65        # if the previous line with contents was exactly as long as
66        # this line, then we ignore the newlines!
67
68        # We do this magic because a header may abort a paragraph at
69        # any line, but we don't want that to be noticed in the output
70        # here
71        $wline=0;
72    }
73    $olen = $tlen;
74
75    if($wline) {
76        # we only make one empty line max
77        $wline = 0;
78        push @out, "\n";
79    }
80    push @out, $line;
81}
82push @out, "\n"; # just an extra newline
83
84print <<HEAD
85/*
86 * NEVER EVER edit this manually, fix the mkhelp.pl script instead!
87 */
88#ifdef USE_MANUAL
89#include "tool_hugehelp.h"
90HEAD
91    ;
92if($c) {
93    # If compression requested, check that the Gzip module is available
94    # or else disable compression
95    $c = eval
96    {
97      require IO::Compress::Gzip;
98      IO::Compress::Gzip->import();
99      1;
100    };
101    print STDERR "Warning: compression requested but Gzip is not available\n" if (!$c)
102}
103
104if($c)
105{
106    my $content = join("", @out);
107    my $gzippedContent;
108    IO::Compress::Gzip::gzip(
109        \$content, \$gzippedContent, Level => 9, TextFlag => 1, Time=>0) or die "gzip failed:";
110    $gzip = length($content);
111    $gzipped = length($gzippedContent);
112
113    print <<HEAD
114#include <zlib.h>
115#include "memdebug.h" /* keep this as LAST include */
116static const unsigned char hugehelpgz[] = {
117  /* This mumbo-jumbo is the huge help text compressed with gzip.
118     Thanks to this operation, the size of this data shrank from $gzip
119     to $gzipped bytes. You can disable the use of compressed help
120     texts by NOT passing -c to the mkhelp.pl tool. */
121HEAD
122;
123
124    my $c=0;
125    print " ";
126    for(split(//, $gzippedContent)) {
127        my $num=ord($_);
128        printf(" 0x%02x,", 0+$num);
129        if(!(++$c % 12)) {
130            print "\n ";
131        }
132    }
133    print "\n};\n";
134
135    print <<EOF
136#define BUF_SIZE 0x10000
137static voidpf zalloc_func(voidpf opaque, unsigned int items, unsigned int size)
138{
139  (void) opaque;
140  /* not a typo, keep it calloc() */
141  return (voidpf) calloc(items, size);
142}
143static void zfree_func(voidpf opaque, voidpf ptr)
144{
145  (void) opaque;
146  free(ptr);
147}
148/* Decompress and send to stdout a gzip-compressed buffer */
149void hugehelp(void)
150{
151  unsigned char* buf;
152  int status,headerlen;
153  z_stream z;
154
155  /* Make sure no gzip options are set */
156  if (hugehelpgz[3] & 0xfe)
157    return;
158
159  headerlen = 10;
160  memset(&z, 0, sizeof(z_stream));
161  z.zalloc = (alloc_func)zalloc_func;
162  z.zfree = (free_func)zfree_func;
163  z.avail_in = (unsigned int)(sizeof(hugehelpgz) - headerlen);
164  z.next_in = (unsigned char *)hugehelpgz + headerlen;
165
166  if (inflateInit2(&z, -MAX_WBITS) != Z_OK)
167    return;
168
169  buf = malloc(BUF_SIZE);
170  if (buf) {
171    while(1) {
172      z.avail_out = BUF_SIZE;
173      z.next_out = buf;
174      status = inflate(&z, Z_SYNC_FLUSH);
175      if (status == Z_OK || status == Z_STREAM_END) {
176        fwrite(buf, BUF_SIZE - z.avail_out, 1, stdout);
177        if (status == Z_STREAM_END)
178          break;
179      }
180      else
181        break;    /* Error */
182    }
183    free(buf);
184  }
185  inflateEnd(&z);
186}
187EOF
188    ;
189foot();
190exit;
191}
192else {
193    print <<HEAD
194void hugehelp(void)
195{
196   fputs(
197HEAD
198         ;
199}
200
201$outsize=0;
202for(@out) {
203    chop;
204
205    $new = $_;
206
207    $outsize += length($new)+1; # one for the newline
208
209    $new =~ s/\\/\\\\/g;
210    $new =~ s/\"/\\\"/g;
211
212    # gcc 2.96 claims ISO C89 only is required to support 509 letter strings
213    if($outsize > 500) {
214        # terminate and make another fputs() call here
215        print ", stdout);\n fputs(\n";
216        $outsize=length($new)+1;
217    }
218    printf("\"%s\\n\"\n", $new);
219
220}
221
222print ", stdout) ;\n}\n";
223
224foot();
225
226sub foot {
227  print <<FOOT
228#else /* !USE_MANUAL */
229/* built-in manual is disabled, blank function */
230#include "tool_hugehelp.h"
231void hugehelp(void) {}
232#endif /* USE_MANUAL */
233FOOT
234  ;
235}
236