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