xref: /aosp_15_r20/external/curl/src/mkhelp.pl (revision 6236dae45794135f37c4eb022389c904c8b0090d)
1*6236dae4SAndroid Build Coastguard Worker#!/usr/bin/env perl
2*6236dae4SAndroid Build Coastguard Worker#***************************************************************************
3*6236dae4SAndroid Build Coastguard Worker#                                  _   _ ____  _
4*6236dae4SAndroid Build Coastguard Worker#  Project                     ___| | | |  _ \| |
5*6236dae4SAndroid Build Coastguard Worker#                             / __| | | | |_) | |
6*6236dae4SAndroid Build Coastguard Worker#                            | (__| |_| |  _ <| |___
7*6236dae4SAndroid Build Coastguard Worker#                             \___|\___/|_| \_\_____|
8*6236dae4SAndroid Build Coastguard Worker#
9*6236dae4SAndroid Build Coastguard Worker# Copyright (C) Daniel Stenberg, <[email protected]>, et al.
10*6236dae4SAndroid Build Coastguard Worker#
11*6236dae4SAndroid Build Coastguard Worker# This software is licensed as described in the file COPYING, which
12*6236dae4SAndroid Build Coastguard Worker# you should have received as part of this distribution. The terms
13*6236dae4SAndroid Build Coastguard Worker# are also available at https://curl.se/docs/copyright.html.
14*6236dae4SAndroid Build Coastguard Worker#
15*6236dae4SAndroid Build Coastguard Worker# You may opt to use, copy, modify, merge, publish, distribute and/or sell
16*6236dae4SAndroid Build Coastguard Worker# copies of the Software, and permit persons to whom the Software is
17*6236dae4SAndroid Build Coastguard Worker# furnished to do so, under the terms of the COPYING file.
18*6236dae4SAndroid Build Coastguard Worker#
19*6236dae4SAndroid Build Coastguard Worker# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
20*6236dae4SAndroid Build Coastguard Worker# KIND, either express or implied.
21*6236dae4SAndroid Build Coastguard Worker#
22*6236dae4SAndroid Build Coastguard Worker# SPDX-License-Identifier: curl
23*6236dae4SAndroid Build Coastguard Worker#
24*6236dae4SAndroid Build Coastguard Worker###########################################################################
25*6236dae4SAndroid Build Coastguard Worker
26*6236dae4SAndroid Build Coastguard Workerif($ARGV[0] eq "-c") {
27*6236dae4SAndroid Build Coastguard Worker    $c=1;
28*6236dae4SAndroid Build Coastguard Worker    shift @ARGV;
29*6236dae4SAndroid Build Coastguard Worker}
30*6236dae4SAndroid Build Coastguard Worker
31*6236dae4SAndroid Build Coastguard Workerpush @out, "          _   _ ____  _\n";
32*6236dae4SAndroid Build Coastguard Workerpush @out, "      ___| | | |  _ \\| |\n";
33*6236dae4SAndroid Build Coastguard Workerpush @out, "     / __| | | | |_) | |\n";
34*6236dae4SAndroid Build Coastguard Workerpush @out, "    | (__| |_| |  _ <| |___\n";
35*6236dae4SAndroid Build Coastguard Workerpush @out, "     \\___|\\___/|_| \\_\\_____|\n";
36*6236dae4SAndroid Build Coastguard Worker
37*6236dae4SAndroid Build Coastguard Workerwhile (<STDIN>) {
38*6236dae4SAndroid Build Coastguard Worker    my $line = $_;
39*6236dae4SAndroid Build Coastguard Worker    push @out, $line;
40*6236dae4SAndroid Build Coastguard Worker}
41*6236dae4SAndroid Build Coastguard Worker
42*6236dae4SAndroid Build Coastguard Workerprint <<HEAD
43*6236dae4SAndroid Build Coastguard Worker/*
44*6236dae4SAndroid Build Coastguard Worker * NEVER EVER edit this manually, fix the mkhelp.pl script instead!
45*6236dae4SAndroid Build Coastguard Worker */
46*6236dae4SAndroid Build Coastguard Worker#ifdef USE_MANUAL
47*6236dae4SAndroid Build Coastguard Worker#include "tool_hugehelp.h"
48*6236dae4SAndroid Build Coastguard Worker#include "tool_help.h"
49*6236dae4SAndroid Build Coastguard Worker
50*6236dae4SAndroid Build Coastguard WorkerHEAD
51*6236dae4SAndroid Build Coastguard Worker    ;
52*6236dae4SAndroid Build Coastguard Workerif($c) {
53*6236dae4SAndroid Build Coastguard Worker    # If compression requested, check that the Gzip module is available
54*6236dae4SAndroid Build Coastguard Worker    # or else disable compression
55*6236dae4SAndroid Build Coastguard Worker    $c = eval
56*6236dae4SAndroid Build Coastguard Worker    {
57*6236dae4SAndroid Build Coastguard Worker      require IO::Compress::Gzip;
58*6236dae4SAndroid Build Coastguard Worker      IO::Compress::Gzip->import();
59*6236dae4SAndroid Build Coastguard Worker      1;
60*6236dae4SAndroid Build Coastguard Worker    };
61*6236dae4SAndroid Build Coastguard Worker    print STDERR "Warning: compression requested but Gzip is not available\n" if (!$c)
62*6236dae4SAndroid Build Coastguard Worker}
63*6236dae4SAndroid Build Coastguard Worker
64*6236dae4SAndroid Build Coastguard Workerif($c)
65*6236dae4SAndroid Build Coastguard Worker{
66*6236dae4SAndroid Build Coastguard Worker    my $content = join("", @out);
67*6236dae4SAndroid Build Coastguard Worker    my $gzippedContent;
68*6236dae4SAndroid Build Coastguard Worker    IO::Compress::Gzip::gzip(
69*6236dae4SAndroid Build Coastguard Worker        \$content, \$gzippedContent, Level => 9, TextFlag => 1, Time=>0) or die "gzip failed:";
70*6236dae4SAndroid Build Coastguard Worker    $gzip = length($content);
71*6236dae4SAndroid Build Coastguard Worker    $gzipped = length($gzippedContent);
72*6236dae4SAndroid Build Coastguard Worker
73*6236dae4SAndroid Build Coastguard Worker    print <<HEAD
74*6236dae4SAndroid Build Coastguard Worker#include <zlib.h>
75*6236dae4SAndroid Build Coastguard Worker#include "memdebug.h" /* keep this as LAST include */
76*6236dae4SAndroid Build Coastguard Workerstatic const unsigned char hugehelpgz[] = {
77*6236dae4SAndroid Build Coastguard Worker  /* This mumbo-jumbo is the huge help text compressed with gzip.
78*6236dae4SAndroid Build Coastguard Worker     Thanks to this operation, the size of this data shrank from $gzip
79*6236dae4SAndroid Build Coastguard Worker     to $gzipped bytes. You can disable the use of compressed help
80*6236dae4SAndroid Build Coastguard Worker     texts by NOT passing -c to the mkhelp.pl tool. */
81*6236dae4SAndroid Build Coastguard WorkerHEAD
82*6236dae4SAndroid Build Coastguard Worker;
83*6236dae4SAndroid Build Coastguard Worker
84*6236dae4SAndroid Build Coastguard Worker    my $c=0;
85*6236dae4SAndroid Build Coastguard Worker    print " ";
86*6236dae4SAndroid Build Coastguard Worker    for(split(//, $gzippedContent)) {
87*6236dae4SAndroid Build Coastguard Worker        my $num=ord($_);
88*6236dae4SAndroid Build Coastguard Worker        printf(" 0x%02x,", 0+$num);
89*6236dae4SAndroid Build Coastguard Worker        if(!(++$c % 12)) {
90*6236dae4SAndroid Build Coastguard Worker            print "\n ";
91*6236dae4SAndroid Build Coastguard Worker        }
92*6236dae4SAndroid Build Coastguard Worker    }
93*6236dae4SAndroid Build Coastguard Worker    print "\n};\n";
94*6236dae4SAndroid Build Coastguard Worker
95*6236dae4SAndroid Build Coastguard Worker    print <<EOF
96*6236dae4SAndroid Build Coastguard Worker#define BUF_SIZE 0x10000
97*6236dae4SAndroid Build Coastguard Workerstatic voidpf zalloc_func(voidpf opaque, unsigned int items, unsigned int size)
98*6236dae4SAndroid Build Coastguard Worker{
99*6236dae4SAndroid Build Coastguard Worker  (void) opaque;
100*6236dae4SAndroid Build Coastguard Worker  /* not a typo, keep it calloc() */
101*6236dae4SAndroid Build Coastguard Worker  return (voidpf) calloc(items, size);
102*6236dae4SAndroid Build Coastguard Worker}
103*6236dae4SAndroid Build Coastguard Workerstatic void zfree_func(voidpf opaque, voidpf ptr)
104*6236dae4SAndroid Build Coastguard Worker{
105*6236dae4SAndroid Build Coastguard Worker  (void) opaque;
106*6236dae4SAndroid Build Coastguard Worker  free(ptr);
107*6236dae4SAndroid Build Coastguard Worker}
108*6236dae4SAndroid Build Coastguard Worker
109*6236dae4SAndroid Build Coastguard Worker#define HEADERLEN 10
110*6236dae4SAndroid Build Coastguard Worker
111*6236dae4SAndroid Build Coastguard Worker/* Decompress and send to stdout a gzip-compressed buffer */
112*6236dae4SAndroid Build Coastguard Workervoid hugehelp(void)
113*6236dae4SAndroid Build Coastguard Worker{
114*6236dae4SAndroid Build Coastguard Worker  unsigned char *buf;
115*6236dae4SAndroid Build Coastguard Worker  int status;
116*6236dae4SAndroid Build Coastguard Worker  z_stream z;
117*6236dae4SAndroid Build Coastguard Worker
118*6236dae4SAndroid Build Coastguard Worker  /* Make sure no gzip options are set */
119*6236dae4SAndroid Build Coastguard Worker  if(hugehelpgz[3] & 0xfe)
120*6236dae4SAndroid Build Coastguard Worker    return;
121*6236dae4SAndroid Build Coastguard Worker
122*6236dae4SAndroid Build Coastguard Worker  memset(&z, 0, sizeof(z_stream));
123*6236dae4SAndroid Build Coastguard Worker  z.zalloc = (alloc_func)zalloc_func;
124*6236dae4SAndroid Build Coastguard Worker  z.zfree = (free_func)zfree_func;
125*6236dae4SAndroid Build Coastguard Worker  z.avail_in = (unsigned int)(sizeof(hugehelpgz) - HEADERLEN);
126*6236dae4SAndroid Build Coastguard Worker  z.next_in = (unsigned char *)hugehelpgz + HEADERLEN;
127*6236dae4SAndroid Build Coastguard Worker
128*6236dae4SAndroid Build Coastguard Worker  if(inflateInit2(&z, -MAX_WBITS) != Z_OK)
129*6236dae4SAndroid Build Coastguard Worker    return;
130*6236dae4SAndroid Build Coastguard Worker
131*6236dae4SAndroid Build Coastguard Worker  buf = malloc(BUF_SIZE);
132*6236dae4SAndroid Build Coastguard Worker  if(buf) {
133*6236dae4SAndroid Build Coastguard Worker    while(1) {
134*6236dae4SAndroid Build Coastguard Worker      z.avail_out = BUF_SIZE;
135*6236dae4SAndroid Build Coastguard Worker      z.next_out = buf;
136*6236dae4SAndroid Build Coastguard Worker      status = inflate(&z, Z_SYNC_FLUSH);
137*6236dae4SAndroid Build Coastguard Worker      if(status == Z_OK || status == Z_STREAM_END) {
138*6236dae4SAndroid Build Coastguard Worker        fwrite(buf, BUF_SIZE - z.avail_out, 1, stdout);
139*6236dae4SAndroid Build Coastguard Worker        if(status == Z_STREAM_END)
140*6236dae4SAndroid Build Coastguard Worker          break;
141*6236dae4SAndroid Build Coastguard Worker      }
142*6236dae4SAndroid Build Coastguard Worker      else
143*6236dae4SAndroid Build Coastguard Worker        break;    /* error */
144*6236dae4SAndroid Build Coastguard Worker    }
145*6236dae4SAndroid Build Coastguard Worker    free(buf);
146*6236dae4SAndroid Build Coastguard Worker  }
147*6236dae4SAndroid Build Coastguard Worker  inflateEnd(&z);
148*6236dae4SAndroid Build Coastguard Worker}
149*6236dae4SAndroid Build Coastguard Worker/* Show the help text for the 'arg' curl argument on stdout */
150*6236dae4SAndroid Build Coastguard Workervoid showhelp(const char *trigger, const char *arg, const char *endarg)
151*6236dae4SAndroid Build Coastguard Worker{
152*6236dae4SAndroid Build Coastguard Worker  unsigned char *buf;
153*6236dae4SAndroid Build Coastguard Worker  int status;
154*6236dae4SAndroid Build Coastguard Worker  z_stream z;
155*6236dae4SAndroid Build Coastguard Worker  struct scan_ctx ctx;
156*6236dae4SAndroid Build Coastguard Worker  inithelpscan(&ctx, trigger, arg, endarg);
157*6236dae4SAndroid Build Coastguard Worker
158*6236dae4SAndroid Build Coastguard Worker  /* Make sure no gzip options are set */
159*6236dae4SAndroid Build Coastguard Worker  if(hugehelpgz[3] & 0xfe)
160*6236dae4SAndroid Build Coastguard Worker    return;
161*6236dae4SAndroid Build Coastguard Worker
162*6236dae4SAndroid Build Coastguard Worker  memset(&z, 0, sizeof(z_stream));
163*6236dae4SAndroid Build Coastguard Worker  z.zalloc = (alloc_func)zalloc_func;
164*6236dae4SAndroid Build Coastguard Worker  z.zfree = (free_func)zfree_func;
165*6236dae4SAndroid Build Coastguard Worker  z.avail_in = (unsigned int)(sizeof(hugehelpgz) - HEADERLEN);
166*6236dae4SAndroid Build Coastguard Worker  z.next_in = (unsigned char *)hugehelpgz + HEADERLEN;
167*6236dae4SAndroid Build Coastguard Worker
168*6236dae4SAndroid Build Coastguard Worker  if(inflateInit2(&z, -MAX_WBITS) != Z_OK)
169*6236dae4SAndroid Build Coastguard Worker    return;
170*6236dae4SAndroid Build Coastguard Worker
171*6236dae4SAndroid Build Coastguard Worker  buf = malloc(BUF_SIZE);
172*6236dae4SAndroid Build Coastguard Worker  if(buf) {
173*6236dae4SAndroid Build Coastguard Worker    while(1) {
174*6236dae4SAndroid Build Coastguard Worker      z.avail_out = BUF_SIZE;
175*6236dae4SAndroid Build Coastguard Worker      z.next_out = buf;
176*6236dae4SAndroid Build Coastguard Worker      status = inflate(&z, Z_SYNC_FLUSH);
177*6236dae4SAndroid Build Coastguard Worker      if(status == Z_OK || status == Z_STREAM_END) {
178*6236dae4SAndroid Build Coastguard Worker        size_t len = BUF_SIZE - z.avail_out;
179*6236dae4SAndroid Build Coastguard Worker        if(!helpscan(buf, len, &ctx))
180*6236dae4SAndroid Build Coastguard Worker          break;
181*6236dae4SAndroid Build Coastguard Worker        if(status == Z_STREAM_END)
182*6236dae4SAndroid Build Coastguard Worker          break;
183*6236dae4SAndroid Build Coastguard Worker      }
184*6236dae4SAndroid Build Coastguard Worker      else
185*6236dae4SAndroid Build Coastguard Worker        break;    /* error */
186*6236dae4SAndroid Build Coastguard Worker    }
187*6236dae4SAndroid Build Coastguard Worker    free(buf);
188*6236dae4SAndroid Build Coastguard Worker  }
189*6236dae4SAndroid Build Coastguard Worker  inflateEnd(&z);
190*6236dae4SAndroid Build Coastguard Worker}
191*6236dae4SAndroid Build Coastguard WorkerEOF
192*6236dae4SAndroid Build Coastguard Worker    ;
193*6236dae4SAndroid Build Coastguard Workerfoot();
194*6236dae4SAndroid Build Coastguard Workerexit;
195*6236dae4SAndroid Build Coastguard Worker}
196*6236dae4SAndroid Build Coastguard Workerelse {
197*6236dae4SAndroid Build Coastguard Worker    print <<HEAD
198*6236dae4SAndroid Build Coastguard Workerstatic const char * const curlman[] = {
199*6236dae4SAndroid Build Coastguard WorkerHEAD
200*6236dae4SAndroid Build Coastguard Worker        ;
201*6236dae4SAndroid Build Coastguard Worker}
202*6236dae4SAndroid Build Coastguard Worker
203*6236dae4SAndroid Build Coastguard Workermy $blank;
204*6236dae4SAndroid Build Coastguard Workerfor my $n (@out) {
205*6236dae4SAndroid Build Coastguard Worker    chomp $n;
206*6236dae4SAndroid Build Coastguard Worker    $n =~ s/\\/\\\\/g;
207*6236dae4SAndroid Build Coastguard Worker    $n =~ s/\"/\\\"/g;
208*6236dae4SAndroid Build Coastguard Worker    $n =~ s/\t/\\t/g;
209*6236dae4SAndroid Build Coastguard Worker
210*6236dae4SAndroid Build Coastguard Worker    if(!$n) {
211*6236dae4SAndroid Build Coastguard Worker        $blank++;
212*6236dae4SAndroid Build Coastguard Worker    }
213*6236dae4SAndroid Build Coastguard Worker    else {
214*6236dae4SAndroid Build Coastguard Worker        $n =~ s/        /\\t/g;
215*6236dae4SAndroid Build Coastguard Worker        printf("  \"%s%s\",\n", $blank?"\\n":"", $n);
216*6236dae4SAndroid Build Coastguard Worker        $blank = 0;
217*6236dae4SAndroid Build Coastguard Worker    }
218*6236dae4SAndroid Build Coastguard Worker}
219*6236dae4SAndroid Build Coastguard Worker
220*6236dae4SAndroid Build Coastguard Workerprint <<ENDLINE
221*6236dae4SAndroid Build Coastguard Worker  NULL
222*6236dae4SAndroid Build Coastguard Worker};
223*6236dae4SAndroid Build Coastguard Workervoid hugehelp(void)
224*6236dae4SAndroid Build Coastguard Worker{
225*6236dae4SAndroid Build Coastguard Worker  int i = 0;
226*6236dae4SAndroid Build Coastguard Worker  while(curlman[i])
227*6236dae4SAndroid Build Coastguard Worker    puts(curlman[i++]);
228*6236dae4SAndroid Build Coastguard Worker}
229*6236dae4SAndroid Build Coastguard Worker
230*6236dae4SAndroid Build Coastguard Worker/* Show the help text for the 'arg' curl argument on stdout */
231*6236dae4SAndroid Build Coastguard Workervoid showhelp(const char *trigger, const char *arg, const char *endarg)
232*6236dae4SAndroid Build Coastguard Worker{
233*6236dae4SAndroid Build Coastguard Worker  int i = 0;
234*6236dae4SAndroid Build Coastguard Worker  struct scan_ctx ctx;
235*6236dae4SAndroid Build Coastguard Worker  inithelpscan(&ctx, trigger, arg, endarg);
236*6236dae4SAndroid Build Coastguard Worker  while(curlman[i]) {
237*6236dae4SAndroid Build Coastguard Worker    size_t len = strlen(curlman[i]);
238*6236dae4SAndroid Build Coastguard Worker    if(!helpscan((unsigned char *)curlman[i], len, &ctx) ||
239*6236dae4SAndroid Build Coastguard Worker       !helpscan((unsigned char *)"\\n", 1, &ctx))
240*6236dae4SAndroid Build Coastguard Worker      break;
241*6236dae4SAndroid Build Coastguard Worker    i++;
242*6236dae4SAndroid Build Coastguard Worker  }
243*6236dae4SAndroid Build Coastguard Worker}
244*6236dae4SAndroid Build Coastguard WorkerENDLINE
245*6236dae4SAndroid Build Coastguard Worker    ;
246*6236dae4SAndroid Build Coastguard Worker
247*6236dae4SAndroid Build Coastguard Workerfoot();
248*6236dae4SAndroid Build Coastguard Worker
249*6236dae4SAndroid Build Coastguard Workersub foot {
250*6236dae4SAndroid Build Coastguard Worker    print <<FOOT
251*6236dae4SAndroid Build Coastguard Worker#endif /* USE_MANUAL */
252*6236dae4SAndroid Build Coastguard WorkerFOOT
253*6236dae4SAndroid Build Coastguard Worker  ;
254*6236dae4SAndroid Build Coastguard Worker}
255