xref: /aosp_15_r20/external/curl/scripts/managen (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 Worker=begin comment
27*6236dae4SAndroid Build Coastguard Worker
28*6236dae4SAndroid Build Coastguard WorkerThis script generates the manpage.
29*6236dae4SAndroid Build Coastguard Worker
30*6236dae4SAndroid Build Coastguard WorkerExample: managen <command> [files] > curl.1
31*6236dae4SAndroid Build Coastguard Worker
32*6236dae4SAndroid Build Coastguard WorkerDev notes:
33*6236dae4SAndroid Build Coastguard Worker
34*6236dae4SAndroid Build Coastguard WorkerWe open *input* files in :crlf translation (a no-op on many platforms) in
35*6236dae4SAndroid Build Coastguard Workercase we have CRLF line endings in Windows but a perl that defaults to LF.
36*6236dae4SAndroid Build Coastguard WorkerUnfortunately it seems some perls like msysgit cannot handle a global input-only
37*6236dae4SAndroid Build Coastguard Worker:crlf so it has to be specified on each file open for text input.
38*6236dae4SAndroid Build Coastguard Worker
39*6236dae4SAndroid Build Coastguard Worker=end comment
40*6236dae4SAndroid Build Coastguard Worker=cut
41*6236dae4SAndroid Build Coastguard Worker
42*6236dae4SAndroid Build Coastguard Workermy %optshort;
43*6236dae4SAndroid Build Coastguard Workermy %optlong;
44*6236dae4SAndroid Build Coastguard Workermy %helplong;
45*6236dae4SAndroid Build Coastguard Workermy %arglong;
46*6236dae4SAndroid Build Coastguard Workermy %redirlong;
47*6236dae4SAndroid Build Coastguard Workermy %protolong;
48*6236dae4SAndroid Build Coastguard Workermy %catlong;
49*6236dae4SAndroid Build Coastguard Worker
50*6236dae4SAndroid Build Coastguard Workeruse POSIX qw(strftime);
51*6236dae4SAndroid Build Coastguard Workermy @ts;
52*6236dae4SAndroid Build Coastguard Workerif (defined($ENV{SOURCE_DATE_EPOCH})) {
53*6236dae4SAndroid Build Coastguard Worker    @ts = gmtime($ENV{SOURCE_DATE_EPOCH});
54*6236dae4SAndroid Build Coastguard Worker} else {
55*6236dae4SAndroid Build Coastguard Worker    @ts = localtime;
56*6236dae4SAndroid Build Coastguard Worker}
57*6236dae4SAndroid Build Coastguard Workermy $date = strftime "%Y-%m-%d", @ts;
58*6236dae4SAndroid Build Coastguard Workermy $year = strftime "%Y", @ts;
59*6236dae4SAndroid Build Coastguard Workermy $version = "unknown";
60*6236dae4SAndroid Build Coastguard Workermy $globals;
61*6236dae4SAndroid Build Coastguard Workermy $error = 0;
62*6236dae4SAndroid Build Coastguard Workermy $indent = 4;
63*6236dae4SAndroid Build Coastguard Worker
64*6236dae4SAndroid Build Coastguard Worker# get the long name version, return the manpage string
65*6236dae4SAndroid Build Coastguard Workersub manpageify {
66*6236dae4SAndroid Build Coastguard Worker    my ($k)=@_;
67*6236dae4SAndroid Build Coastguard Worker    my $l;
68*6236dae4SAndroid Build Coastguard Worker    my $trail;
69*6236dae4SAndroid Build Coastguard Worker    # the matching pattern might include a trailing dot that cannot be part of
70*6236dae4SAndroid Build Coastguard Worker    # the option name
71*6236dae4SAndroid Build Coastguard Worker    if($k =~ s/\.$//) {
72*6236dae4SAndroid Build Coastguard Worker        # cut off trailing dot
73*6236dae4SAndroid Build Coastguard Worker        $trail = ".";
74*6236dae4SAndroid Build Coastguard Worker    }
75*6236dae4SAndroid Build Coastguard Worker    my $klong = $k;
76*6236dae4SAndroid Build Coastguard Worker    # quote "bare" minuses in the long name
77*6236dae4SAndroid Build Coastguard Worker    $klong =~ s/-/\\-/g;
78*6236dae4SAndroid Build Coastguard Worker    if($optlong{$k}) {
79*6236dae4SAndroid Build Coastguard Worker        # both short + long
80*6236dae4SAndroid Build Coastguard Worker        $l = "\\fI-".$optlong{$k}.", \\-\\-$klong\\fP$trail";
81*6236dae4SAndroid Build Coastguard Worker    }
82*6236dae4SAndroid Build Coastguard Worker    else {
83*6236dae4SAndroid Build Coastguard Worker        # only long
84*6236dae4SAndroid Build Coastguard Worker        $l = "\\fI\\-\\-$klong\\fP$trail";
85*6236dae4SAndroid Build Coastguard Worker    }
86*6236dae4SAndroid Build Coastguard Worker    return $l;
87*6236dae4SAndroid Build Coastguard Worker}
88*6236dae4SAndroid Build Coastguard Worker
89*6236dae4SAndroid Build Coastguard Worker
90*6236dae4SAndroid Build Coastguard Workermy $colwidth=79; # max number of columns
91*6236dae4SAndroid Build Coastguard Worker
92*6236dae4SAndroid Build Coastguard Workersub prefixline {
93*6236dae4SAndroid Build Coastguard Worker    my ($num) = @_;
94*6236dae4SAndroid Build Coastguard Worker    print "\t" x ($num/8);
95*6236dae4SAndroid Build Coastguard Worker    print ' ' x ($num%8);
96*6236dae4SAndroid Build Coastguard Worker}
97*6236dae4SAndroid Build Coastguard Worker
98*6236dae4SAndroid Build Coastguard Workersub justline {
99*6236dae4SAndroid Build Coastguard Worker    my ($lvl, @line) = @_;
100*6236dae4SAndroid Build Coastguard Worker    my $w = -1;
101*6236dae4SAndroid Build Coastguard Worker    my $spaces = -1;
102*6236dae4SAndroid Build Coastguard Worker    my $width = $colwidth - ($lvl * $indent);
103*6236dae4SAndroid Build Coastguard Worker    for(@line) {
104*6236dae4SAndroid Build Coastguard Worker        $w += length($_);
105*6236dae4SAndroid Build Coastguard Worker        $w++;
106*6236dae4SAndroid Build Coastguard Worker        $spaces++;
107*6236dae4SAndroid Build Coastguard Worker    }
108*6236dae4SAndroid Build Coastguard Worker    my $inject = $width - $w;
109*6236dae4SAndroid Build Coastguard Worker    my $ratio = 0; # stay at zero if no spaces at all
110*6236dae4SAndroid Build Coastguard Worker    if($spaces) {
111*6236dae4SAndroid Build Coastguard Worker        $ratio = $inject / $spaces;
112*6236dae4SAndroid Build Coastguard Worker    }
113*6236dae4SAndroid Build Coastguard Worker    my $spare = 0;
114*6236dae4SAndroid Build Coastguard Worker    prefixline($lvl * $indent);
115*6236dae4SAndroid Build Coastguard Worker    my $prev;
116*6236dae4SAndroid Build Coastguard Worker    for(@line) {
117*6236dae4SAndroid Build Coastguard Worker        while($spare >= 0.90) {
118*6236dae4SAndroid Build Coastguard Worker            print " ";
119*6236dae4SAndroid Build Coastguard Worker            $spare--;
120*6236dae4SAndroid Build Coastguard Worker        }
121*6236dae4SAndroid Build Coastguard Worker        printf "%s%s", $prev?" ":"", $_;
122*6236dae4SAndroid Build Coastguard Worker        $prev = 1;
123*6236dae4SAndroid Build Coastguard Worker        $spare += $ratio;
124*6236dae4SAndroid Build Coastguard Worker    }
125*6236dae4SAndroid Build Coastguard Worker    print "\n";
126*6236dae4SAndroid Build Coastguard Worker}
127*6236dae4SAndroid Build Coastguard Worker
128*6236dae4SAndroid Build Coastguard Workersub lastline {
129*6236dae4SAndroid Build Coastguard Worker    my ($lvl, @line) = @_;
130*6236dae4SAndroid Build Coastguard Worker    $line[0] =~ s/^( +)//;
131*6236dae4SAndroid Build Coastguard Worker    prefixline($lvl * $indent + length($1));
132*6236dae4SAndroid Build Coastguard Worker    my $prev = 0;
133*6236dae4SAndroid Build Coastguard Worker    for(@line) {
134*6236dae4SAndroid Build Coastguard Worker        printf "%s%s", $prev?" ":"", $_;
135*6236dae4SAndroid Build Coastguard Worker        $prev = 1;
136*6236dae4SAndroid Build Coastguard Worker    }
137*6236dae4SAndroid Build Coastguard Worker    print "\n";
138*6236dae4SAndroid Build Coastguard Worker}
139*6236dae4SAndroid Build Coastguard Worker
140*6236dae4SAndroid Build Coastguard Workersub outputpara {
141*6236dae4SAndroid Build Coastguard Worker    my ($lvl, $f) = @_;
142*6236dae4SAndroid Build Coastguard Worker    $f =~ s/\n/ /g;
143*6236dae4SAndroid Build Coastguard Worker
144*6236dae4SAndroid Build Coastguard Worker    my $w = 0;
145*6236dae4SAndroid Build Coastguard Worker    my @words = split(/  */, $f);
146*6236dae4SAndroid Build Coastguard Worker    my $width = $colwidth - ($lvl * $indent);
147*6236dae4SAndroid Build Coastguard Worker
148*6236dae4SAndroid Build Coastguard Worker    my @line;
149*6236dae4SAndroid Build Coastguard Worker    for my $e (@words) {
150*6236dae4SAndroid Build Coastguard Worker        my $l = length($e);
151*6236dae4SAndroid Build Coastguard Worker        my $spaces = scalar(@line);
152*6236dae4SAndroid Build Coastguard Worker        if(($w + $l + $spaces) >= $width) {
153*6236dae4SAndroid Build Coastguard Worker            justline($lvl, @line);
154*6236dae4SAndroid Build Coastguard Worker            undef @line;
155*6236dae4SAndroid Build Coastguard Worker            $w = 0;
156*6236dae4SAndroid Build Coastguard Worker        }
157*6236dae4SAndroid Build Coastguard Worker
158*6236dae4SAndroid Build Coastguard Worker        push @line, $e;
159*6236dae4SAndroid Build Coastguard Worker        $w += $l; # new width
160*6236dae4SAndroid Build Coastguard Worker    }
161*6236dae4SAndroid Build Coastguard Worker    if($w) {
162*6236dae4SAndroid Build Coastguard Worker        lastline($lvl, @line);
163*6236dae4SAndroid Build Coastguard Worker        print "\n";
164*6236dae4SAndroid Build Coastguard Worker    }
165*6236dae4SAndroid Build Coastguard Worker}
166*6236dae4SAndroid Build Coastguard Worker
167*6236dae4SAndroid Build Coastguard Workersub printdesc {
168*6236dae4SAndroid Build Coastguard Worker    my ($manpage, $baselvl, @desc) = @_;
169*6236dae4SAndroid Build Coastguard Worker
170*6236dae4SAndroid Build Coastguard Worker    if($manpage) {
171*6236dae4SAndroid Build Coastguard Worker        for my $d (@desc) {
172*6236dae4SAndroid Build Coastguard Worker            print $d;
173*6236dae4SAndroid Build Coastguard Worker        }
174*6236dae4SAndroid Build Coastguard Worker    }
175*6236dae4SAndroid Build Coastguard Worker    else {
176*6236dae4SAndroid Build Coastguard Worker        my $p = -1;
177*6236dae4SAndroid Build Coastguard Worker        my $para;
178*6236dae4SAndroid Build Coastguard Worker        for my $l (@desc) {
179*6236dae4SAndroid Build Coastguard Worker            my $lvl;
180*6236dae4SAndroid Build Coastguard Worker            if($l !~ /^[\n\r]+/) {
181*6236dae4SAndroid Build Coastguard Worker                # get the indent level off the string
182*6236dae4SAndroid Build Coastguard Worker                $l =~ s/^\[([0-9q]*)\]//;
183*6236dae4SAndroid Build Coastguard Worker                $lvl = $1;
184*6236dae4SAndroid Build Coastguard Worker            }
185*6236dae4SAndroid Build Coastguard Worker            if(($p =~ /q/) && ($lvl !~ /q/)) {
186*6236dae4SAndroid Build Coastguard Worker                # the previous was quoted, this is not
187*6236dae4SAndroid Build Coastguard Worker                print "\n";
188*6236dae4SAndroid Build Coastguard Worker            }
189*6236dae4SAndroid Build Coastguard Worker            if($lvl != $p) {
190*6236dae4SAndroid Build Coastguard Worker                outputpara($baselvl + $p, $para);
191*6236dae4SAndroid Build Coastguard Worker                $para = "";
192*6236dae4SAndroid Build Coastguard Worker            }
193*6236dae4SAndroid Build Coastguard Worker            if($lvl =~ /q/) {
194*6236dae4SAndroid Build Coastguard Worker                # quoted, do not right-justify
195*6236dae4SAndroid Build Coastguard Worker                chomp $l;
196*6236dae4SAndroid Build Coastguard Worker                lastline($baselvl + $lvl + 1, $l);
197*6236dae4SAndroid Build Coastguard Worker                my $w = ($baselvl + $lvl + 1) * $indent + length($l);
198*6236dae4SAndroid Build Coastguard Worker                if ($w > $colwidth) {
199*6236dae4SAndroid Build Coastguard Worker                    print STDERR "ERROR: $w columns is too long\n";
200*6236dae4SAndroid Build Coastguard Worker                    print STDERR "$l\n";
201*6236dae4SAndroid Build Coastguard Worker                    $error++;
202*6236dae4SAndroid Build Coastguard Worker                }
203*6236dae4SAndroid Build Coastguard Worker            }
204*6236dae4SAndroid Build Coastguard Worker            else {
205*6236dae4SAndroid Build Coastguard Worker                $para .= $l;
206*6236dae4SAndroid Build Coastguard Worker            }
207*6236dae4SAndroid Build Coastguard Worker
208*6236dae4SAndroid Build Coastguard Worker            $p = $lvl;
209*6236dae4SAndroid Build Coastguard Worker        }
210*6236dae4SAndroid Build Coastguard Worker        outputpara($baselvl + $p, $para);
211*6236dae4SAndroid Build Coastguard Worker    }
212*6236dae4SAndroid Build Coastguard Worker}
213*6236dae4SAndroid Build Coastguard Worker
214*6236dae4SAndroid Build Coastguard Workersub seealso {
215*6236dae4SAndroid Build Coastguard Worker    my($standalone, $data)=@_;
216*6236dae4SAndroid Build Coastguard Worker    if($standalone) {
217*6236dae4SAndroid Build Coastguard Worker        return sprintf
218*6236dae4SAndroid Build Coastguard Worker            ".SH \"SEE ALSO\"\n$data\n";
219*6236dae4SAndroid Build Coastguard Worker    }
220*6236dae4SAndroid Build Coastguard Worker    else {
221*6236dae4SAndroid Build Coastguard Worker        return "See also $data. ";
222*6236dae4SAndroid Build Coastguard Worker    }
223*6236dae4SAndroid Build Coastguard Worker}
224*6236dae4SAndroid Build Coastguard Worker
225*6236dae4SAndroid Build Coastguard Workersub overrides {
226*6236dae4SAndroid Build Coastguard Worker    my ($standalone, $data)=@_;
227*6236dae4SAndroid Build Coastguard Worker    if($standalone) {
228*6236dae4SAndroid Build Coastguard Worker        return ".SH \"OVERRIDES\"\n$data\n";
229*6236dae4SAndroid Build Coastguard Worker    }
230*6236dae4SAndroid Build Coastguard Worker    else {
231*6236dae4SAndroid Build Coastguard Worker        return $data;
232*6236dae4SAndroid Build Coastguard Worker    }
233*6236dae4SAndroid Build Coastguard Worker}
234*6236dae4SAndroid Build Coastguard Worker
235*6236dae4SAndroid Build Coastguard Workersub protocols {
236*6236dae4SAndroid Build Coastguard Worker    my ($manpage, $standalone, $data)=@_;
237*6236dae4SAndroid Build Coastguard Worker    if($standalone) {
238*6236dae4SAndroid Build Coastguard Worker        return ".SH \"PROTOCOLS\"\n$data\n";
239*6236dae4SAndroid Build Coastguard Worker    }
240*6236dae4SAndroid Build Coastguard Worker    else {
241*6236dae4SAndroid Build Coastguard Worker        return "($data) " if($manpage);
242*6236dae4SAndroid Build Coastguard Worker        return "[1]($data) " if(!$manpage);
243*6236dae4SAndroid Build Coastguard Worker    }
244*6236dae4SAndroid Build Coastguard Worker}
245*6236dae4SAndroid Build Coastguard Worker
246*6236dae4SAndroid Build Coastguard Workersub too_old {
247*6236dae4SAndroid Build Coastguard Worker    my ($version)=@_;
248*6236dae4SAndroid Build Coastguard Worker    my $a = 999999;
249*6236dae4SAndroid Build Coastguard Worker    if($version =~ /^(\d+)\.(\d+)\.(\d+)/) {
250*6236dae4SAndroid Build Coastguard Worker        $a = $1 * 1000 + $2 * 10 + $3;
251*6236dae4SAndroid Build Coastguard Worker    }
252*6236dae4SAndroid Build Coastguard Worker    elsif($version =~ /^(\d+)\.(\d+)/) {
253*6236dae4SAndroid Build Coastguard Worker        $a = $1 * 1000 + $2 * 10;
254*6236dae4SAndroid Build Coastguard Worker    }
255*6236dae4SAndroid Build Coastguard Worker    if($a < 7600) {
256*6236dae4SAndroid Build Coastguard Worker        # we consider everything before 7.60.0 to be too old to mention
257*6236dae4SAndroid Build Coastguard Worker        # specific changes for
258*6236dae4SAndroid Build Coastguard Worker        return 1;
259*6236dae4SAndroid Build Coastguard Worker    }
260*6236dae4SAndroid Build Coastguard Worker    return 0;
261*6236dae4SAndroid Build Coastguard Worker}
262*6236dae4SAndroid Build Coastguard Worker
263*6236dae4SAndroid Build Coastguard Workersub added {
264*6236dae4SAndroid Build Coastguard Worker    my ($standalone, $data)=@_;
265*6236dae4SAndroid Build Coastguard Worker    if(too_old($data)) {
266*6236dae4SAndroid Build Coastguard Worker        # do not mention ancient additions
267*6236dae4SAndroid Build Coastguard Worker        return "";
268*6236dae4SAndroid Build Coastguard Worker    }
269*6236dae4SAndroid Build Coastguard Worker    if($standalone) {
270*6236dae4SAndroid Build Coastguard Worker        return ".SH \"ADDED\"\nAdded in curl version $data\n";
271*6236dae4SAndroid Build Coastguard Worker    }
272*6236dae4SAndroid Build Coastguard Worker    else {
273*6236dae4SAndroid Build Coastguard Worker        return "Added in $data. ";
274*6236dae4SAndroid Build Coastguard Worker    }
275*6236dae4SAndroid Build Coastguard Worker}
276*6236dae4SAndroid Build Coastguard Worker
277*6236dae4SAndroid Build Coastguard Workersub render {
278*6236dae4SAndroid Build Coastguard Worker    my ($manpage, $fh, $f, $line) = @_;
279*6236dae4SAndroid Build Coastguard Worker    my @desc;
280*6236dae4SAndroid Build Coastguard Worker    my $tablemode = 0;
281*6236dae4SAndroid Build Coastguard Worker    my $header = 0;
282*6236dae4SAndroid Build Coastguard Worker    # if $top is TRUE, it means a top-level page and not a command line option
283*6236dae4SAndroid Build Coastguard Worker    my $top = ($line == 1);
284*6236dae4SAndroid Build Coastguard Worker    my $quote;
285*6236dae4SAndroid Build Coastguard Worker    my $level;
286*6236dae4SAndroid Build Coastguard Worker    my $finalblank;
287*6236dae4SAndroid Build Coastguard Worker    $start = 0;
288*6236dae4SAndroid Build Coastguard Worker
289*6236dae4SAndroid Build Coastguard Worker    while(<$fh>) {
290*6236dae4SAndroid Build Coastguard Worker        my $d = $_;
291*6236dae4SAndroid Build Coastguard Worker        $line++;
292*6236dae4SAndroid Build Coastguard Worker        $finalblank = ($d eq "\n");
293*6236dae4SAndroid Build Coastguard Worker        if($d =~ /^\.(SH|BR|IP|B)/) {
294*6236dae4SAndroid Build Coastguard Worker            print STDERR "$f:$line:1:ERROR: nroff instruction in input: \".$1\"\n";
295*6236dae4SAndroid Build Coastguard Worker            return 4;
296*6236dae4SAndroid Build Coastguard Worker        }
297*6236dae4SAndroid Build Coastguard Worker        if(/^ *<!--/) {
298*6236dae4SAndroid Build Coastguard Worker            # skip comments
299*6236dae4SAndroid Build Coastguard Worker            next;
300*6236dae4SAndroid Build Coastguard Worker        }
301*6236dae4SAndroid Build Coastguard Worker        if((!$start) && ($_ =~ /^[\r\n]*\z/)) {
302*6236dae4SAndroid Build Coastguard Worker            # skip leading blank lines
303*6236dae4SAndroid Build Coastguard Worker            next;
304*6236dae4SAndroid Build Coastguard Worker        }
305*6236dae4SAndroid Build Coastguard Worker        $start = 1;
306*6236dae4SAndroid Build Coastguard Worker        if(/^# (.*)/) {
307*6236dae4SAndroid Build Coastguard Worker            $header = 1;
308*6236dae4SAndroid Build Coastguard Worker            if($top != 1) {
309*6236dae4SAndroid Build Coastguard Worker                # ignored for command line options
310*6236dae4SAndroid Build Coastguard Worker                $blankline++;
311*6236dae4SAndroid Build Coastguard Worker                next;
312*6236dae4SAndroid Build Coastguard Worker            }
313*6236dae4SAndroid Build Coastguard Worker            push @desc, ".SH $1\n" if($manpage);
314*6236dae4SAndroid Build Coastguard Worker            push @desc, "[0]$1\n" if(!$manpage);
315*6236dae4SAndroid Build Coastguard Worker            next;
316*6236dae4SAndroid Build Coastguard Worker        }
317*6236dae4SAndroid Build Coastguard Worker        elsif(/^###/) {
318*6236dae4SAndroid Build Coastguard Worker            print STDERR "$f:$line:1:ERROR: ### header is not supported\n";
319*6236dae4SAndroid Build Coastguard Worker            exit 3;
320*6236dae4SAndroid Build Coastguard Worker        }
321*6236dae4SAndroid Build Coastguard Worker        elsif(/^## (.*)/) {
322*6236dae4SAndroid Build Coastguard Worker            my $word = $1;
323*6236dae4SAndroid Build Coastguard Worker            # if there are enclosing quotes, remove them first
324*6236dae4SAndroid Build Coastguard Worker            $word =~ s/[\"\'](.*)[\"\']\z/$1/;
325*6236dae4SAndroid Build Coastguard Worker
326*6236dae4SAndroid Build Coastguard Worker            # remove backticks from headers
327*6236dae4SAndroid Build Coastguard Worker            $word =~ s/\`//g;
328*6236dae4SAndroid Build Coastguard Worker
329*6236dae4SAndroid Build Coastguard Worker            # if there is a space, it needs quotes for manpage
330*6236dae4SAndroid Build Coastguard Worker            if(($word =~ / /) && $manpage) {
331*6236dae4SAndroid Build Coastguard Worker                $word = "\"$word\"";
332*6236dae4SAndroid Build Coastguard Worker            }
333*6236dae4SAndroid Build Coastguard Worker            $level = 1;
334*6236dae4SAndroid Build Coastguard Worker            if($top == 1) {
335*6236dae4SAndroid Build Coastguard Worker                push @desc, ".IP $word\n" if($manpage);
336*6236dae4SAndroid Build Coastguard Worker                push @desc, "\n" if(!$manpage);
337*6236dae4SAndroid Build Coastguard Worker                push @desc, "[1]$word\n" if(!$manpage);
338*6236dae4SAndroid Build Coastguard Worker            }
339*6236dae4SAndroid Build Coastguard Worker            else {
340*6236dae4SAndroid Build Coastguard Worker                if(!$tablemode) {
341*6236dae4SAndroid Build Coastguard Worker                    push @desc, ".RS\n" if($manpage);
342*6236dae4SAndroid Build Coastguard Worker                    $tablemode = 1;
343*6236dae4SAndroid Build Coastguard Worker                }
344*6236dae4SAndroid Build Coastguard Worker                push @desc, ".IP $word\n" if($manpage);
345*6236dae4SAndroid Build Coastguard Worker                push @desc, "\n" if(!$manpage);
346*6236dae4SAndroid Build Coastguard Worker                push @desc, "[1]$word\n" if(!$manpage);
347*6236dae4SAndroid Build Coastguard Worker            }
348*6236dae4SAndroid Build Coastguard Worker            $header = 1;
349*6236dae4SAndroid Build Coastguard Worker            next;
350*6236dae4SAndroid Build Coastguard Worker        }
351*6236dae4SAndroid Build Coastguard Worker        elsif(/^##/) {
352*6236dae4SAndroid Build Coastguard Worker            if($top == 1) {
353*6236dae4SAndroid Build Coastguard Worker                print STDERR "$f:$line:1:ERROR: ## empty header top-level mode\n";
354*6236dae4SAndroid Build Coastguard Worker                exit 3;
355*6236dae4SAndroid Build Coastguard Worker            }
356*6236dae4SAndroid Build Coastguard Worker            if($tablemode) {
357*6236dae4SAndroid Build Coastguard Worker                # end of table
358*6236dae4SAndroid Build Coastguard Worker                push @desc, ".RE\n.IP\n" if($manpage);
359*6236dae4SAndroid Build Coastguard Worker                $tablemode = 0;
360*6236dae4SAndroid Build Coastguard Worker            }
361*6236dae4SAndroid Build Coastguard Worker            $header = 1;
362*6236dae4SAndroid Build Coastguard Worker            next;
363*6236dae4SAndroid Build Coastguard Worker        }
364*6236dae4SAndroid Build Coastguard Worker        elsif(/^\.(IP|RS|RE)/) {
365*6236dae4SAndroid Build Coastguard Worker            my ($cmd) = ($1);
366*6236dae4SAndroid Build Coastguard Worker            print STDERR "$f:$line:1:ERROR: $cmd detected, use ##-style\n";
367*6236dae4SAndroid Build Coastguard Worker            return 3;
368*6236dae4SAndroid Build Coastguard Worker        }
369*6236dae4SAndroid Build Coastguard Worker        elsif(/^[ \t]*\n/) {
370*6236dae4SAndroid Build Coastguard Worker            # count and ignore blank lines
371*6236dae4SAndroid Build Coastguard Worker            $blankline++;
372*6236dae4SAndroid Build Coastguard Worker            next;
373*6236dae4SAndroid Build Coastguard Worker        }
374*6236dae4SAndroid Build Coastguard Worker        elsif($d =~ /^    (.*)/) {
375*6236dae4SAndroid Build Coastguard Worker            my $word = $1;
376*6236dae4SAndroid Build Coastguard Worker            if(!$quote && $manpage) {
377*6236dae4SAndroid Build Coastguard Worker                push @desc, "\n" if($blankline);
378*6236dae4SAndroid Build Coastguard Worker                push @desc, ".nf\n";
379*6236dae4SAndroid Build Coastguard Worker                $blankline = 0;
380*6236dae4SAndroid Build Coastguard Worker            }
381*6236dae4SAndroid Build Coastguard Worker            $quote = 1;
382*6236dae4SAndroid Build Coastguard Worker            $d = "$word\n";
383*6236dae4SAndroid Build Coastguard Worker        }
384*6236dae4SAndroid Build Coastguard Worker        elsif($quote && ($d !~ /^    (.*)/)) {
385*6236dae4SAndroid Build Coastguard Worker            # end of quote
386*6236dae4SAndroid Build Coastguard Worker            push @desc, ".fi\n" if($manpage);
387*6236dae4SAndroid Build Coastguard Worker            $quote = 0;
388*6236dae4SAndroid Build Coastguard Worker        }
389*6236dae4SAndroid Build Coastguard Worker
390*6236dae4SAndroid Build Coastguard Worker        $d =~ s/`%DATE`/$date/g;
391*6236dae4SAndroid Build Coastguard Worker        $d =~ s/`%VERSION`/$version/g;
392*6236dae4SAndroid Build Coastguard Worker        $d =~ s/`%GLOBALS`/$globals/g;
393*6236dae4SAndroid Build Coastguard Worker
394*6236dae4SAndroid Build Coastguard Worker        # convert backticks to double quotes
395*6236dae4SAndroid Build Coastguard Worker        $d =~ s/\`/\"/g;
396*6236dae4SAndroid Build Coastguard Worker
397*6236dae4SAndroid Build Coastguard Worker        if($d =~ /\(added in(.*)/i) {
398*6236dae4SAndroid Build Coastguard Worker            if(length($1) < 2) {
399*6236dae4SAndroid Build Coastguard Worker                print STDERR "$f:$line:1:ERROR: broken up added-in line:\n";
400*6236dae4SAndroid Build Coastguard Worker                print STDERR "$f:$line:1:ERROR: $d";
401*6236dae4SAndroid Build Coastguard Worker                return 3;
402*6236dae4SAndroid Build Coastguard Worker            }
403*6236dae4SAndroid Build Coastguard Worker        }
404*6236dae4SAndroid Build Coastguard Worker      again:
405*6236dae4SAndroid Build Coastguard Worker        if($d =~ /\(Added in ([0-9.]+)\)/i) {
406*6236dae4SAndroid Build Coastguard Worker            my $ver = $1;
407*6236dae4SAndroid Build Coastguard Worker            if(too_old($ver)) {
408*6236dae4SAndroid Build Coastguard Worker                $d =~ s/ *\(Added in $ver\)//gi;
409*6236dae4SAndroid Build Coastguard Worker                goto again;
410*6236dae4SAndroid Build Coastguard Worker            }
411*6236dae4SAndroid Build Coastguard Worker        }
412*6236dae4SAndroid Build Coastguard Worker
413*6236dae4SAndroid Build Coastguard Worker        if(!$quote) {
414*6236dae4SAndroid Build Coastguard Worker            if($d =~ /^(.*)  /) {
415*6236dae4SAndroid Build Coastguard Worker                printf STDERR "$f:$line:%d:ERROR: 2 spaces detected\n",
416*6236dae4SAndroid Build Coastguard Worker                    length($1);
417*6236dae4SAndroid Build Coastguard Worker                return 3;
418*6236dae4SAndroid Build Coastguard Worker            }
419*6236dae4SAndroid Build Coastguard Worker            elsif($d =~ /[^\\][\<\>]/) {
420*6236dae4SAndroid Build Coastguard Worker                print STDERR "$f:$line:1:WARN: un-escaped < or > used\n";
421*6236dae4SAndroid Build Coastguard Worker                return 3;
422*6236dae4SAndroid Build Coastguard Worker            }
423*6236dae4SAndroid Build Coastguard Worker        }
424*6236dae4SAndroid Build Coastguard Worker        # convert backslash-'<' or '> to just the second character
425*6236dae4SAndroid Build Coastguard Worker        $d =~ s/\\([><])/$1/g;
426*6236dae4SAndroid Build Coastguard Worker        # convert single backslash to double-backslash
427*6236dae4SAndroid Build Coastguard Worker        $d =~ s/\\/\\\\/g if($manpage);
428*6236dae4SAndroid Build Coastguard Worker
429*6236dae4SAndroid Build Coastguard Worker
430*6236dae4SAndroid Build Coastguard Worker        if($manpage) {
431*6236dae4SAndroid Build Coastguard Worker            if(!$quote && $d =~ /--/) {
432*6236dae4SAndroid Build Coastguard Worker                $d =~ s/--([a-z0-9.-]+)/manpageify($1)/ge;
433*6236dae4SAndroid Build Coastguard Worker            }
434*6236dae4SAndroid Build Coastguard Worker
435*6236dae4SAndroid Build Coastguard Worker            # quote minuses in the output
436*6236dae4SAndroid Build Coastguard Worker            $d =~ s/([^\\])-/$1\\-/g;
437*6236dae4SAndroid Build Coastguard Worker            # replace single quotes
438*6236dae4SAndroid Build Coastguard Worker            $d =~ s/\'/\\(aq/g;
439*6236dae4SAndroid Build Coastguard Worker            # handle double quotes or periods first on the line
440*6236dae4SAndroid Build Coastguard Worker            $d =~ s/^([\.\"])/\\&$1/;
441*6236dae4SAndroid Build Coastguard Worker            # **bold**
442*6236dae4SAndroid Build Coastguard Worker            $d =~ s/\*\*(\S.*?)\*\*/\\fB$1\\fP/g;
443*6236dae4SAndroid Build Coastguard Worker            # *italics*
444*6236dae4SAndroid Build Coastguard Worker            $d =~ s/\*(\S.*?)\*/\\fI$1\\fP/g;
445*6236dae4SAndroid Build Coastguard Worker        }
446*6236dae4SAndroid Build Coastguard Worker        else {
447*6236dae4SAndroid Build Coastguard Worker            # **bold**
448*6236dae4SAndroid Build Coastguard Worker            $d =~ s/\*\*(\S.*?)\*\*/$1/g;
449*6236dae4SAndroid Build Coastguard Worker            # *italics*
450*6236dae4SAndroid Build Coastguard Worker            $d =~ s/\*(\S.*?)\*/$1/g;
451*6236dae4SAndroid Build Coastguard Worker        }
452*6236dae4SAndroid Build Coastguard Worker        # trim trailing spaces
453*6236dae4SAndroid Build Coastguard Worker        $d =~ s/[ \t]+\z//;
454*6236dae4SAndroid Build Coastguard Worker        push @desc, "\n" if($blankline && !$header);
455*6236dae4SAndroid Build Coastguard Worker        $blankline = 0;
456*6236dae4SAndroid Build Coastguard Worker        push @desc, $d if($manpage);
457*6236dae4SAndroid Build Coastguard Worker        my $qstr = $quote ? "q": "";
458*6236dae4SAndroid Build Coastguard Worker        push @desc, "[".(1 + $level)."$qstr]$d" if(!$manpage);
459*6236dae4SAndroid Build Coastguard Worker        $header = 0;
460*6236dae4SAndroid Build Coastguard Worker
461*6236dae4SAndroid Build Coastguard Worker    }
462*6236dae4SAndroid Build Coastguard Worker    if($finalblank) {
463*6236dae4SAndroid Build Coastguard Worker        print STDERR "$f:$line:1:ERROR: trailing blank line\n";
464*6236dae4SAndroid Build Coastguard Worker        exit 3;
465*6236dae4SAndroid Build Coastguard Worker    }
466*6236dae4SAndroid Build Coastguard Worker    if($quote) {
467*6236dae4SAndroid Build Coastguard Worker        # don't leave the quote "hanging"
468*6236dae4SAndroid Build Coastguard Worker        push @desc, ".fi\n" if($manpage);
469*6236dae4SAndroid Build Coastguard Worker    }
470*6236dae4SAndroid Build Coastguard Worker    if($tablemode) {
471*6236dae4SAndroid Build Coastguard Worker        # end of table
472*6236dae4SAndroid Build Coastguard Worker        push @desc, ".RE\n.IP\n" if($manpage);
473*6236dae4SAndroid Build Coastguard Worker    }
474*6236dae4SAndroid Build Coastguard Worker    return @desc;
475*6236dae4SAndroid Build Coastguard Worker}
476*6236dae4SAndroid Build Coastguard Worker
477*6236dae4SAndroid Build Coastguard Workersub maybespace {
478*6236dae4SAndroid Build Coastguard Worker    my ($string) = @_;
479*6236dae4SAndroid Build Coastguard Worker
480*6236dae4SAndroid Build Coastguard Worker    if(($string =~ /(.* )(.*)/) &&
481*6236dae4SAndroid Build Coastguard Worker       (length($2) <= 20)) {
482*6236dae4SAndroid Build Coastguard Worker        return $1;
483*6236dae4SAndroid Build Coastguard Worker    }
484*6236dae4SAndroid Build Coastguard Worker    if(($string =~ /(.*:)(.*)/) &&
485*6236dae4SAndroid Build Coastguard Worker       (length($2) <= 20)) {
486*6236dae4SAndroid Build Coastguard Worker        return $1;
487*6236dae4SAndroid Build Coastguard Worker    }
488*6236dae4SAndroid Build Coastguard Worker    return $string;
489*6236dae4SAndroid Build Coastguard Worker}
490*6236dae4SAndroid Build Coastguard Worker
491*6236dae4SAndroid Build Coastguard Workersub single {
492*6236dae4SAndroid Build Coastguard Worker    my ($dir, $manpage, $f, $standalone)=@_;
493*6236dae4SAndroid Build Coastguard Worker    my $fh;
494*6236dae4SAndroid Build Coastguard Worker    open($fh, "<:crlf", "$dir/$f") ||
495*6236dae4SAndroid Build Coastguard Worker        die "could not find $dir/$f";
496*6236dae4SAndroid Build Coastguard Worker    my $short;
497*6236dae4SAndroid Build Coastguard Worker    my $long;
498*6236dae4SAndroid Build Coastguard Worker    my $tags;
499*6236dae4SAndroid Build Coastguard Worker    my $added;
500*6236dae4SAndroid Build Coastguard Worker    my $protocols;
501*6236dae4SAndroid Build Coastguard Worker    my $arg;
502*6236dae4SAndroid Build Coastguard Worker    my $mutexed;
503*6236dae4SAndroid Build Coastguard Worker    my $requires;
504*6236dae4SAndroid Build Coastguard Worker    my $category;
505*6236dae4SAndroid Build Coastguard Worker    my @seealso;
506*6236dae4SAndroid Build Coastguard Worker    my $copyright;
507*6236dae4SAndroid Build Coastguard Worker    my $spdx;
508*6236dae4SAndroid Build Coastguard Worker    my @examples; # there can be more than one
509*6236dae4SAndroid Build Coastguard Worker    my $magic; # cmdline special option
510*6236dae4SAndroid Build Coastguard Worker    my $line;
511*6236dae4SAndroid Build Coastguard Worker    my $dline;
512*6236dae4SAndroid Build Coastguard Worker    my $multi;
513*6236dae4SAndroid Build Coastguard Worker    my $scope;
514*6236dae4SAndroid Build Coastguard Worker    my $experimental;
515*6236dae4SAndroid Build Coastguard Worker    my $start;
516*6236dae4SAndroid Build Coastguard Worker    my $list; # identifies the list, 1 example, 2 see-also
517*6236dae4SAndroid Build Coastguard Worker    while(<$fh>) {
518*6236dae4SAndroid Build Coastguard Worker        $line++;
519*6236dae4SAndroid Build Coastguard Worker        if(/^ *<!--/) {
520*6236dae4SAndroid Build Coastguard Worker            next;
521*6236dae4SAndroid Build Coastguard Worker        }
522*6236dae4SAndroid Build Coastguard Worker        if(!$start) {
523*6236dae4SAndroid Build Coastguard Worker            if(/^---/) {
524*6236dae4SAndroid Build Coastguard Worker                $start = 1;
525*6236dae4SAndroid Build Coastguard Worker            }
526*6236dae4SAndroid Build Coastguard Worker            next;
527*6236dae4SAndroid Build Coastguard Worker        }
528*6236dae4SAndroid Build Coastguard Worker        if(/^Short: *(.)/i) {
529*6236dae4SAndroid Build Coastguard Worker            $short=$1;
530*6236dae4SAndroid Build Coastguard Worker        }
531*6236dae4SAndroid Build Coastguard Worker        elsif(/^Long: *(.*)/i) {
532*6236dae4SAndroid Build Coastguard Worker            $long=$1;
533*6236dae4SAndroid Build Coastguard Worker        }
534*6236dae4SAndroid Build Coastguard Worker        elsif(/^Added: *(.*)/i) {
535*6236dae4SAndroid Build Coastguard Worker            $added=$1;
536*6236dae4SAndroid Build Coastguard Worker        }
537*6236dae4SAndroid Build Coastguard Worker        elsif(/^Tags: *(.*)/i) {
538*6236dae4SAndroid Build Coastguard Worker            $tags=$1;
539*6236dae4SAndroid Build Coastguard Worker        }
540*6236dae4SAndroid Build Coastguard Worker        elsif(/^Arg: *(.*)/i) {
541*6236dae4SAndroid Build Coastguard Worker            $arg=$1;
542*6236dae4SAndroid Build Coastguard Worker        }
543*6236dae4SAndroid Build Coastguard Worker        elsif(/^Magic: *(.*)/i) {
544*6236dae4SAndroid Build Coastguard Worker            $magic=$1;
545*6236dae4SAndroid Build Coastguard Worker        }
546*6236dae4SAndroid Build Coastguard Worker        elsif(/^Mutexed: *(.*)/i) {
547*6236dae4SAndroid Build Coastguard Worker            $mutexed=$1;
548*6236dae4SAndroid Build Coastguard Worker        }
549*6236dae4SAndroid Build Coastguard Worker        elsif(/^Protocols: *(.*)/i) {
550*6236dae4SAndroid Build Coastguard Worker            $protocols=$1;
551*6236dae4SAndroid Build Coastguard Worker        }
552*6236dae4SAndroid Build Coastguard Worker        elsif(/^See-also: +(.+)/i) {
553*6236dae4SAndroid Build Coastguard Worker            if($seealso) {
554*6236dae4SAndroid Build Coastguard Worker                print STDERR "ERROR: duplicated See-also in $f\n";
555*6236dae4SAndroid Build Coastguard Worker                return 1;
556*6236dae4SAndroid Build Coastguard Worker            }
557*6236dae4SAndroid Build Coastguard Worker            push @seealso, $1;
558*6236dae4SAndroid Build Coastguard Worker        }
559*6236dae4SAndroid Build Coastguard Worker        elsif(/^See-also:/i) {
560*6236dae4SAndroid Build Coastguard Worker            $list=2;
561*6236dae4SAndroid Build Coastguard Worker        }
562*6236dae4SAndroid Build Coastguard Worker        elsif(/^  *- (.*)/i && ($list == 2)) {
563*6236dae4SAndroid Build Coastguard Worker            push @seealso, $1;
564*6236dae4SAndroid Build Coastguard Worker        }
565*6236dae4SAndroid Build Coastguard Worker        elsif(/^Requires: *(.*)/i) {
566*6236dae4SAndroid Build Coastguard Worker            $requires=$1;
567*6236dae4SAndroid Build Coastguard Worker        }
568*6236dae4SAndroid Build Coastguard Worker        elsif(/^Category: *(.*)/i) {
569*6236dae4SAndroid Build Coastguard Worker            $category=$1;
570*6236dae4SAndroid Build Coastguard Worker        }
571*6236dae4SAndroid Build Coastguard Worker        elsif(/^Example: +(.+)/i) {
572*6236dae4SAndroid Build Coastguard Worker            push @examples, $1;
573*6236dae4SAndroid Build Coastguard Worker        }
574*6236dae4SAndroid Build Coastguard Worker        elsif(/^Example:/i) {
575*6236dae4SAndroid Build Coastguard Worker            # '1' is the example list
576*6236dae4SAndroid Build Coastguard Worker            $list = 1;
577*6236dae4SAndroid Build Coastguard Worker        }
578*6236dae4SAndroid Build Coastguard Worker        elsif(/^  *- (.*)/i && ($list == 1)) {
579*6236dae4SAndroid Build Coastguard Worker            push @examples, $1;
580*6236dae4SAndroid Build Coastguard Worker        }
581*6236dae4SAndroid Build Coastguard Worker        elsif(/^Multi: *(.*)/i) {
582*6236dae4SAndroid Build Coastguard Worker            $multi=$1;
583*6236dae4SAndroid Build Coastguard Worker        }
584*6236dae4SAndroid Build Coastguard Worker        elsif(/^Scope: *(.*)/i) {
585*6236dae4SAndroid Build Coastguard Worker            $scope=$1;
586*6236dae4SAndroid Build Coastguard Worker        }
587*6236dae4SAndroid Build Coastguard Worker        elsif(/^Experimental: yes/i) {
588*6236dae4SAndroid Build Coastguard Worker            $experimental=1;
589*6236dae4SAndroid Build Coastguard Worker        }
590*6236dae4SAndroid Build Coastguard Worker        elsif(/^C: (.*)/i) {
591*6236dae4SAndroid Build Coastguard Worker            $copyright=$1;
592*6236dae4SAndroid Build Coastguard Worker        }
593*6236dae4SAndroid Build Coastguard Worker        elsif(/^SPDX-License-Identifier: (.*)/i) {
594*6236dae4SAndroid Build Coastguard Worker            $spdx=$1;
595*6236dae4SAndroid Build Coastguard Worker        }
596*6236dae4SAndroid Build Coastguard Worker        elsif(/^Help: *(.*)/i) {
597*6236dae4SAndroid Build Coastguard Worker            ;
598*6236dae4SAndroid Build Coastguard Worker        }
599*6236dae4SAndroid Build Coastguard Worker        elsif(/^---/) {
600*6236dae4SAndroid Build Coastguard Worker            $start++;
601*6236dae4SAndroid Build Coastguard Worker            if(!$long) {
602*6236dae4SAndroid Build Coastguard Worker                print STDERR "ERROR: no 'Long:' in $f\n";
603*6236dae4SAndroid Build Coastguard Worker                return 1;
604*6236dae4SAndroid Build Coastguard Worker            }
605*6236dae4SAndroid Build Coastguard Worker            if(!$category) {
606*6236dae4SAndroid Build Coastguard Worker                print STDERR "ERROR: no 'Category:' in $f\n";
607*6236dae4SAndroid Build Coastguard Worker                return 2;
608*6236dae4SAndroid Build Coastguard Worker            }
609*6236dae4SAndroid Build Coastguard Worker            if(!$examples[0]) {
610*6236dae4SAndroid Build Coastguard Worker                print STDERR "$f:$line:1:ERROR: no 'Example:' present\n";
611*6236dae4SAndroid Build Coastguard Worker                return 2;
612*6236dae4SAndroid Build Coastguard Worker            }
613*6236dae4SAndroid Build Coastguard Worker            if(!$added) {
614*6236dae4SAndroid Build Coastguard Worker                print STDERR "$f:$line:1:ERROR: no 'Added:' version present\n";
615*6236dae4SAndroid Build Coastguard Worker                return 2;
616*6236dae4SAndroid Build Coastguard Worker            }
617*6236dae4SAndroid Build Coastguard Worker            if(!$seealso[0]) {
618*6236dae4SAndroid Build Coastguard Worker                print STDERR "$f:$line:1:ERROR: no 'See-also:' field present\n";
619*6236dae4SAndroid Build Coastguard Worker                return 2;
620*6236dae4SAndroid Build Coastguard Worker            }
621*6236dae4SAndroid Build Coastguard Worker            if(!$copyright) {
622*6236dae4SAndroid Build Coastguard Worker                print STDERR "$f:$line:1:ERROR: no 'C:' field present\n";
623*6236dae4SAndroid Build Coastguard Worker                return 2;
624*6236dae4SAndroid Build Coastguard Worker            }
625*6236dae4SAndroid Build Coastguard Worker            if(!$spdx) {
626*6236dae4SAndroid Build Coastguard Worker                print STDERR "$f:$line:1:ERROR: no 'SPDX-License-Identifier:' field present\n";
627*6236dae4SAndroid Build Coastguard Worker                return 2;
628*6236dae4SAndroid Build Coastguard Worker            }
629*6236dae4SAndroid Build Coastguard Worker            last;
630*6236dae4SAndroid Build Coastguard Worker        }
631*6236dae4SAndroid Build Coastguard Worker        else {
632*6236dae4SAndroid Build Coastguard Worker            chomp;
633*6236dae4SAndroid Build Coastguard Worker            print STDERR "$f:$line:1:WARN: unrecognized line in $f, ignoring:\n:'$_';"
634*6236dae4SAndroid Build Coastguard Worker        }
635*6236dae4SAndroid Build Coastguard Worker    }
636*6236dae4SAndroid Build Coastguard Worker
637*6236dae4SAndroid Build Coastguard Worker    if($start < 2) {
638*6236dae4SAndroid Build Coastguard Worker        print STDERR "$f:1:1:ERROR: no proper meta-data header\n";
639*6236dae4SAndroid Build Coastguard Worker        return 2;
640*6236dae4SAndroid Build Coastguard Worker    }
641*6236dae4SAndroid Build Coastguard Worker
642*6236dae4SAndroid Build Coastguard Worker    my @desc = render($manpage, $fh, $f, $line);
643*6236dae4SAndroid Build Coastguard Worker    close($fh);
644*6236dae4SAndroid Build Coastguard Worker    if($tablemode) {
645*6236dae4SAndroid Build Coastguard Worker        # end of table
646*6236dae4SAndroid Build Coastguard Worker        push @desc, ".RE\n.IP\n";
647*6236dae4SAndroid Build Coastguard Worker    }
648*6236dae4SAndroid Build Coastguard Worker    my $opt;
649*6236dae4SAndroid Build Coastguard Worker
650*6236dae4SAndroid Build Coastguard Worker    if(defined($short) && $long) {
651*6236dae4SAndroid Build Coastguard Worker        $opt = "-$short, --$long";
652*6236dae4SAndroid Build Coastguard Worker    }
653*6236dae4SAndroid Build Coastguard Worker    elsif($short && !$long) {
654*6236dae4SAndroid Build Coastguard Worker        $opt = "-$short";
655*6236dae4SAndroid Build Coastguard Worker    }
656*6236dae4SAndroid Build Coastguard Worker    elsif($long && !$short) {
657*6236dae4SAndroid Build Coastguard Worker        $opt = "--$long";
658*6236dae4SAndroid Build Coastguard Worker    }
659*6236dae4SAndroid Build Coastguard Worker
660*6236dae4SAndroid Build Coastguard Worker    if($arg) {
661*6236dae4SAndroid Build Coastguard Worker        $opt .= " $arg";
662*6236dae4SAndroid Build Coastguard Worker    }
663*6236dae4SAndroid Build Coastguard Worker
664*6236dae4SAndroid Build Coastguard Worker    # quote "bare" minuses in opt
665*6236dae4SAndroid Build Coastguard Worker    $opt =~ s/-/\\-/g if($manpage);
666*6236dae4SAndroid Build Coastguard Worker    if($standalone) {
667*6236dae4SAndroid Build Coastguard Worker        print ".TH curl 1 \"30 Nov 2016\" \"curl 7.52.0\" \"curl manual\"\n";
668*6236dae4SAndroid Build Coastguard Worker        print ".SH OPTION\n";
669*6236dae4SAndroid Build Coastguard Worker        print "curl $opt\n";
670*6236dae4SAndroid Build Coastguard Worker    }
671*6236dae4SAndroid Build Coastguard Worker    elsif($manpage) {
672*6236dae4SAndroid Build Coastguard Worker        print ".IP \"$opt\"\n";
673*6236dae4SAndroid Build Coastguard Worker    }
674*6236dae4SAndroid Build Coastguard Worker    else {
675*6236dae4SAndroid Build Coastguard Worker        lastline(1, $opt);
676*6236dae4SAndroid Build Coastguard Worker    }
677*6236dae4SAndroid Build Coastguard Worker    my @leading;
678*6236dae4SAndroid Build Coastguard Worker    if($protocols) {
679*6236dae4SAndroid Build Coastguard Worker        push @leading, protocols($manpage, $standalone, $protocols);
680*6236dae4SAndroid Build Coastguard Worker    }
681*6236dae4SAndroid Build Coastguard Worker
682*6236dae4SAndroid Build Coastguard Worker    if($standalone) {
683*6236dae4SAndroid Build Coastguard Worker        print ".SH DESCRIPTION\n";
684*6236dae4SAndroid Build Coastguard Worker    }
685*6236dae4SAndroid Build Coastguard Worker
686*6236dae4SAndroid Build Coastguard Worker    if($experimental) {
687*6236dae4SAndroid Build Coastguard Worker        push @leading, "**WARNING**: this option is experimental. Do not use in production.\n\n";
688*6236dae4SAndroid Build Coastguard Worker    }
689*6236dae4SAndroid Build Coastguard Worker
690*6236dae4SAndroid Build Coastguard Worker    my $pre = $manpage ? "\n": "[1]";
691*6236dae4SAndroid Build Coastguard Worker
692*6236dae4SAndroid Build Coastguard Worker    if($scope) {
693*6236dae4SAndroid Build Coastguard Worker        if($category !~ /global/) {
694*6236dae4SAndroid Build Coastguard Worker            print STDERR "$f:$line:1:ERROR: global scope option does not have global category\n";
695*6236dae4SAndroid Build Coastguard Worker            return 2;
696*6236dae4SAndroid Build Coastguard Worker        }
697*6236dae4SAndroid Build Coastguard Worker        if($scope eq "global") {
698*6236dae4SAndroid Build Coastguard Worker            push @desc, "\n" if(!$manpage);
699*6236dae4SAndroid Build Coastguard Worker            push @desc, "${pre}This option is global and does not need to be specified for each use of --next.\n";
700*6236dae4SAndroid Build Coastguard Worker        }
701*6236dae4SAndroid Build Coastguard Worker        else {
702*6236dae4SAndroid Build Coastguard Worker            print STDERR "$f:$line:1:ERROR: unrecognized scope: '$scope'\n";
703*6236dae4SAndroid Build Coastguard Worker            return 2;
704*6236dae4SAndroid Build Coastguard Worker        }
705*6236dae4SAndroid Build Coastguard Worker    }
706*6236dae4SAndroid Build Coastguard Worker
707*6236dae4SAndroid Build Coastguard Worker    my @extra;
708*6236dae4SAndroid Build Coastguard Worker    if($multi eq "single") {
709*6236dae4SAndroid Build Coastguard Worker        push @extra, "${pre}If --$long is provided several times, the last set ".
710*6236dae4SAndroid Build Coastguard Worker            "value is used.\n";
711*6236dae4SAndroid Build Coastguard Worker    }
712*6236dae4SAndroid Build Coastguard Worker    elsif($multi eq "append") {
713*6236dae4SAndroid Build Coastguard Worker        push @extra, "${pre}--$long can be used several times in a command line\n";
714*6236dae4SAndroid Build Coastguard Worker    }
715*6236dae4SAndroid Build Coastguard Worker    elsif($multi eq "boolean") {
716*6236dae4SAndroid Build Coastguard Worker        my $rev = "no-$long";
717*6236dae4SAndroid Build Coastguard Worker        # for options that start with "no-" the reverse is then without
718*6236dae4SAndroid Build Coastguard Worker        # the no- prefix
719*6236dae4SAndroid Build Coastguard Worker        if($long =~ /^no-/) {
720*6236dae4SAndroid Build Coastguard Worker            $rev = $long;
721*6236dae4SAndroid Build Coastguard Worker            $rev =~ s/^no-//;
722*6236dae4SAndroid Build Coastguard Worker        }
723*6236dae4SAndroid Build Coastguard Worker        my $dashes = $manpage ? "\\-\\-" : "--";
724*6236dae4SAndroid Build Coastguard Worker        push @extra,
725*6236dae4SAndroid Build Coastguard Worker            "${pre}Providing --$long multiple times has no extra effect.\n".
726*6236dae4SAndroid Build Coastguard Worker            "Disable it again with $dashes$rev.\n";
727*6236dae4SAndroid Build Coastguard Worker    }
728*6236dae4SAndroid Build Coastguard Worker    elsif($multi eq "mutex") {
729*6236dae4SAndroid Build Coastguard Worker        push @extra,
730*6236dae4SAndroid Build Coastguard Worker            "${pre}Providing --$long multiple times has no extra effect.\n";
731*6236dae4SAndroid Build Coastguard Worker    }
732*6236dae4SAndroid Build Coastguard Worker    elsif($multi eq "custom") {
733*6236dae4SAndroid Build Coastguard Worker        ; # left for the text to describe
734*6236dae4SAndroid Build Coastguard Worker    }
735*6236dae4SAndroid Build Coastguard Worker    elsif($multi eq "per-URL") {
736*6236dae4SAndroid Build Coastguard Worker        push @extra,
737*6236dae4SAndroid Build Coastguard Worker            "${pre}--$long is associated with a single URL. Use it once per URL ".
738*6236dae4SAndroid Build Coastguard Worker            "when you use several URLs in a command line.\n";
739*6236dae4SAndroid Build Coastguard Worker    }
740*6236dae4SAndroid Build Coastguard Worker    else {
741*6236dae4SAndroid Build Coastguard Worker        print STDERR "$f:$line:1:ERROR: unrecognized Multi: '$multi'\n";
742*6236dae4SAndroid Build Coastguard Worker        return 2;
743*6236dae4SAndroid Build Coastguard Worker    }
744*6236dae4SAndroid Build Coastguard Worker
745*6236dae4SAndroid Build Coastguard Worker    printdesc($manpage, 2, (@leading, @desc, @extra));
746*6236dae4SAndroid Build Coastguard Worker    undef @desc;
747*6236dae4SAndroid Build Coastguard Worker
748*6236dae4SAndroid Build Coastguard Worker    my @foot;
749*6236dae4SAndroid Build Coastguard Worker
750*6236dae4SAndroid Build Coastguard Worker    my $mstr;
751*6236dae4SAndroid Build Coastguard Worker    my $and = 0;
752*6236dae4SAndroid Build Coastguard Worker    my $num = scalar(@seealso);
753*6236dae4SAndroid Build Coastguard Worker    if($num > 2) {
754*6236dae4SAndroid Build Coastguard Worker        # use commas up to this point
755*6236dae4SAndroid Build Coastguard Worker        $and = $num - 1;
756*6236dae4SAndroid Build Coastguard Worker    }
757*6236dae4SAndroid Build Coastguard Worker    my $i = 0;
758*6236dae4SAndroid Build Coastguard Worker    for my $k (@seealso) {
759*6236dae4SAndroid Build Coastguard Worker        if(!$helplong{$k}) {
760*6236dae4SAndroid Build Coastguard Worker            print STDERR "$f:$line:1:WARN: see-also a non-existing option: $k\n";
761*6236dae4SAndroid Build Coastguard Worker        }
762*6236dae4SAndroid Build Coastguard Worker        my $l = $manpage ? manpageify($k) : "--$k";
763*6236dae4SAndroid Build Coastguard Worker        my $sep = " and";
764*6236dae4SAndroid Build Coastguard Worker        if($and && ($i < $and)) {
765*6236dae4SAndroid Build Coastguard Worker            $sep = ",";
766*6236dae4SAndroid Build Coastguard Worker        }
767*6236dae4SAndroid Build Coastguard Worker        $mstr .= sprintf "%s$l", $mstr?"$sep ":"";
768*6236dae4SAndroid Build Coastguard Worker        $i++;
769*6236dae4SAndroid Build Coastguard Worker    }
770*6236dae4SAndroid Build Coastguard Worker
771*6236dae4SAndroid Build Coastguard Worker    if($requires) {
772*6236dae4SAndroid Build Coastguard Worker        my $l = $manpage ? manpageify($long) : "--$long";
773*6236dae4SAndroid Build Coastguard Worker        push @foot, "$l requires that libcurl".
774*6236dae4SAndroid Build Coastguard Worker            " is built to support $requires.\n";
775*6236dae4SAndroid Build Coastguard Worker    }
776*6236dae4SAndroid Build Coastguard Worker    if($mutexed) {
777*6236dae4SAndroid Build Coastguard Worker        my @m=split(/ /, $mutexed);
778*6236dae4SAndroid Build Coastguard Worker        my $mstr;
779*6236dae4SAndroid Build Coastguard Worker        my $num = scalar(@m);
780*6236dae4SAndroid Build Coastguard Worker        my $count;
781*6236dae4SAndroid Build Coastguard Worker        for my $k (@m) {
782*6236dae4SAndroid Build Coastguard Worker            if(!$helplong{$k}) {
783*6236dae4SAndroid Build Coastguard Worker                print STDERR "WARN: $f mutexes a non-existing option: $k\n";
784*6236dae4SAndroid Build Coastguard Worker            }
785*6236dae4SAndroid Build Coastguard Worker            my $l = $manpage ? manpageify($k) : "--$k";
786*6236dae4SAndroid Build Coastguard Worker            my $sep = ", ";
787*6236dae4SAndroid Build Coastguard Worker            if($count == ($num -1)) {
788*6236dae4SAndroid Build Coastguard Worker                $sep = " and ";
789*6236dae4SAndroid Build Coastguard Worker            }
790*6236dae4SAndroid Build Coastguard Worker            $mstr .= sprintf "%s$l", $mstr?$sep:"";
791*6236dae4SAndroid Build Coastguard Worker            $count++;
792*6236dae4SAndroid Build Coastguard Worker        }
793*6236dae4SAndroid Build Coastguard Worker        push @foot, overrides($standalone,
794*6236dae4SAndroid Build Coastguard Worker                              "This option is mutually exclusive with $mstr.\n");
795*6236dae4SAndroid Build Coastguard Worker    }
796*6236dae4SAndroid Build Coastguard Worker    if($examples[0]) {
797*6236dae4SAndroid Build Coastguard Worker        my $s ="";
798*6236dae4SAndroid Build Coastguard Worker        $s="s" if($examples[1]);
799*6236dae4SAndroid Build Coastguard Worker        if($manpage) {
800*6236dae4SAndroid Build Coastguard Worker            print "\nExample$s:\n";
801*6236dae4SAndroid Build Coastguard Worker            print ".nf\n";
802*6236dae4SAndroid Build Coastguard Worker            foreach my $e (@examples) {
803*6236dae4SAndroid Build Coastguard Worker                $e =~ s!\$URL!https://example.com!g;
804*6236dae4SAndroid Build Coastguard Worker                # convert single backslahes to doubles
805*6236dae4SAndroid Build Coastguard Worker                $e =~ s/\\/\\\\/g;
806*6236dae4SAndroid Build Coastguard Worker                print "curl $e\n";
807*6236dae4SAndroid Build Coastguard Worker            }
808*6236dae4SAndroid Build Coastguard Worker            print ".fi\n";
809*6236dae4SAndroid Build Coastguard Worker        }
810*6236dae4SAndroid Build Coastguard Worker        else {
811*6236dae4SAndroid Build Coastguard Worker            my @ex;
812*6236dae4SAndroid Build Coastguard Worker            push @ex, "[0q]Example$s:\n";
813*6236dae4SAndroid Build Coastguard Worker            #
814*6236dae4SAndroid Build Coastguard Worker            # long ASCII examples are wrapped. Preferably at the last space
815*6236dae4SAndroid Build Coastguard Worker            # before the margin. Or at a colon. Otherwise it just cuts at the
816*6236dae4SAndroid Build Coastguard Worker            # exact boundary.
817*6236dae4SAndroid Build Coastguard Worker            #
818*6236dae4SAndroid Build Coastguard Worker            foreach my $e (@examples) {
819*6236dae4SAndroid Build Coastguard Worker                $e =~ s!\$URL!https://example.com!g;
820*6236dae4SAndroid Build Coastguard Worker                my $maxwidth = 60; # plus the "    curl " 18 col prefix
821*6236dae4SAndroid Build Coastguard Worker                if(length($e) > $maxwidth) {
822*6236dae4SAndroid Build Coastguard Worker                    # a long example, shorten it
823*6236dae4SAndroid Build Coastguard Worker                    my $p = substr($e, 0, $maxwidth);
824*6236dae4SAndroid Build Coastguard Worker                    $p = maybespace($p);
825*6236dae4SAndroid Build Coastguard Worker                    push @ex, "[0q] curl ".$p."\\";
826*6236dae4SAndroid Build Coastguard Worker                    $e = substr($e, length($p));
827*6236dae4SAndroid Build Coastguard Worker                    do {
828*6236dae4SAndroid Build Coastguard Worker                        my $r = substr($e, 0, $maxwidth);
829*6236dae4SAndroid Build Coastguard Worker                        if(length($e) > $maxwidth) {
830*6236dae4SAndroid Build Coastguard Worker                            $r = maybespace($r);
831*6236dae4SAndroid Build Coastguard Worker                        }
832*6236dae4SAndroid Build Coastguard Worker                        my $slash ="";
833*6236dae4SAndroid Build Coastguard Worker                        $e = substr($e, length($r));
834*6236dae4SAndroid Build Coastguard Worker                        if(length($e) > 0) {
835*6236dae4SAndroid Build Coastguard Worker                            $slash = "\\";
836*6236dae4SAndroid Build Coastguard Worker                        }
837*6236dae4SAndroid Build Coastguard Worker
838*6236dae4SAndroid Build Coastguard Worker                        push @ex, "[0q]      $r$slash" if($r);
839*6236dae4SAndroid Build Coastguard Worker                    } while(length($e));
840*6236dae4SAndroid Build Coastguard Worker                }
841*6236dae4SAndroid Build Coastguard Worker                else {
842*6236dae4SAndroid Build Coastguard Worker                    push @ex, "[0q] curl $e\n";
843*6236dae4SAndroid Build Coastguard Worker                }
844*6236dae4SAndroid Build Coastguard Worker            }
845*6236dae4SAndroid Build Coastguard Worker            printdesc($manpage, 2, @ex);
846*6236dae4SAndroid Build Coastguard Worker        }
847*6236dae4SAndroid Build Coastguard Worker    }
848*6236dae4SAndroid Build Coastguard Worker    if($added) {
849*6236dae4SAndroid Build Coastguard Worker        push @foot, added($standalone, $added);
850*6236dae4SAndroid Build Coastguard Worker    }
851*6236dae4SAndroid Build Coastguard Worker    push @foot, seealso($standalone, $mstr);
852*6236dae4SAndroid Build Coastguard Worker
853*6236dae4SAndroid Build Coastguard Worker    print "\n";
854*6236dae4SAndroid Build Coastguard Worker    my $f = join("", @foot);
855*6236dae4SAndroid Build Coastguard Worker    if($manpage) {
856*6236dae4SAndroid Build Coastguard Worker        $f =~ s/ +\z//; # remove trailing space
857*6236dae4SAndroid Build Coastguard Worker        print "$f\n";
858*6236dae4SAndroid Build Coastguard Worker    }
859*6236dae4SAndroid Build Coastguard Worker    else {
860*6236dae4SAndroid Build Coastguard Worker        printdesc($manpage, 2, "[1]$f");
861*6236dae4SAndroid Build Coastguard Worker    }
862*6236dae4SAndroid Build Coastguard Worker    return 0;
863*6236dae4SAndroid Build Coastguard Worker}
864*6236dae4SAndroid Build Coastguard Worker
865*6236dae4SAndroid Build Coastguard Workersub getshortlong {
866*6236dae4SAndroid Build Coastguard Worker    my ($dir, $f)=@_;
867*6236dae4SAndroid Build Coastguard Worker    $f =~ s/^.*\///;
868*6236dae4SAndroid Build Coastguard Worker    open(F, "<:crlf", "$dir/$f") ||
869*6236dae4SAndroid Build Coastguard Worker        die "could not find $dir/$f";
870*6236dae4SAndroid Build Coastguard Worker    my $short;
871*6236dae4SAndroid Build Coastguard Worker    my $long;
872*6236dae4SAndroid Build Coastguard Worker    my $help;
873*6236dae4SAndroid Build Coastguard Worker    my $arg;
874*6236dae4SAndroid Build Coastguard Worker    my $protocols;
875*6236dae4SAndroid Build Coastguard Worker    my $category;
876*6236dae4SAndroid Build Coastguard Worker    my $start = 0;
877*6236dae4SAndroid Build Coastguard Worker    my $line = 0;
878*6236dae4SAndroid Build Coastguard Worker    while(<F>) {
879*6236dae4SAndroid Build Coastguard Worker        $line++;
880*6236dae4SAndroid Build Coastguard Worker        if(!$start) {
881*6236dae4SAndroid Build Coastguard Worker            if(/^---/) {
882*6236dae4SAndroid Build Coastguard Worker                $start = 1;
883*6236dae4SAndroid Build Coastguard Worker            }
884*6236dae4SAndroid Build Coastguard Worker            next;
885*6236dae4SAndroid Build Coastguard Worker        }
886*6236dae4SAndroid Build Coastguard Worker        if(/^Short: (.)/i) {
887*6236dae4SAndroid Build Coastguard Worker            $short=$1;
888*6236dae4SAndroid Build Coastguard Worker        }
889*6236dae4SAndroid Build Coastguard Worker        elsif(/^Long: (.*)/i) {
890*6236dae4SAndroid Build Coastguard Worker            $long=$1;
891*6236dae4SAndroid Build Coastguard Worker        }
892*6236dae4SAndroid Build Coastguard Worker        elsif(/^Help: (.*)/i) {
893*6236dae4SAndroid Build Coastguard Worker            $help=$1;
894*6236dae4SAndroid Build Coastguard Worker            my $len = length($help);
895*6236dae4SAndroid Build Coastguard Worker            if($len >= 49) {
896*6236dae4SAndroid Build Coastguard Worker                printf STDERR "$f:$line:1:WARN: oversized help text: %d characters\n",
897*6236dae4SAndroid Build Coastguard Worker                    $len;
898*6236dae4SAndroid Build Coastguard Worker            }
899*6236dae4SAndroid Build Coastguard Worker        }
900*6236dae4SAndroid Build Coastguard Worker        elsif(/^Arg: (.*)/i) {
901*6236dae4SAndroid Build Coastguard Worker            $arg=$1;
902*6236dae4SAndroid Build Coastguard Worker        }
903*6236dae4SAndroid Build Coastguard Worker        elsif(/^Protocols: (.*)/i) {
904*6236dae4SAndroid Build Coastguard Worker            $protocols=$1;
905*6236dae4SAndroid Build Coastguard Worker        }
906*6236dae4SAndroid Build Coastguard Worker        elsif(/^Category: (.*)/i) {
907*6236dae4SAndroid Build Coastguard Worker            $category=$1;
908*6236dae4SAndroid Build Coastguard Worker        }
909*6236dae4SAndroid Build Coastguard Worker        elsif(/^---/) {
910*6236dae4SAndroid Build Coastguard Worker            last;
911*6236dae4SAndroid Build Coastguard Worker        }
912*6236dae4SAndroid Build Coastguard Worker    }
913*6236dae4SAndroid Build Coastguard Worker    close(F);
914*6236dae4SAndroid Build Coastguard Worker    if($short) {
915*6236dae4SAndroid Build Coastguard Worker        $optshort{$short}=$long;
916*6236dae4SAndroid Build Coastguard Worker    }
917*6236dae4SAndroid Build Coastguard Worker    if($long) {
918*6236dae4SAndroid Build Coastguard Worker        $optlong{$long}=$short;
919*6236dae4SAndroid Build Coastguard Worker        $helplong{$long}=$help;
920*6236dae4SAndroid Build Coastguard Worker        $arglong{$long}=$arg;
921*6236dae4SAndroid Build Coastguard Worker        $protolong{$long}=$protocols;
922*6236dae4SAndroid Build Coastguard Worker        $catlong{$long}=$category;
923*6236dae4SAndroid Build Coastguard Worker    }
924*6236dae4SAndroid Build Coastguard Worker}
925*6236dae4SAndroid Build Coastguard Worker
926*6236dae4SAndroid Build Coastguard Workersub indexoptions {
927*6236dae4SAndroid Build Coastguard Worker    my ($dir, @files) = @_;
928*6236dae4SAndroid Build Coastguard Worker    foreach my $f (@files) {
929*6236dae4SAndroid Build Coastguard Worker        getshortlong($dir, $f);
930*6236dae4SAndroid Build Coastguard Worker    }
931*6236dae4SAndroid Build Coastguard Worker}
932*6236dae4SAndroid Build Coastguard Worker
933*6236dae4SAndroid Build Coastguard Workersub header {
934*6236dae4SAndroid Build Coastguard Worker    my ($dir, $manpage, $f)=@_;
935*6236dae4SAndroid Build Coastguard Worker    my $fh;
936*6236dae4SAndroid Build Coastguard Worker    open($fh, "<:crlf", "$dir/$f") ||
937*6236dae4SAndroid Build Coastguard Worker        die "could not find $dir/$f";
938*6236dae4SAndroid Build Coastguard Worker    my @d = render($manpage, $fh, $f, 1);
939*6236dae4SAndroid Build Coastguard Worker    close($fh);
940*6236dae4SAndroid Build Coastguard Worker    printdesc($manpage, 0, @d);
941*6236dae4SAndroid Build Coastguard Worker}
942*6236dae4SAndroid Build Coastguard Worker
943*6236dae4SAndroid Build Coastguard Worker
944*6236dae4SAndroid Build Coastguard Workersub sourcecategories {
945*6236dae4SAndroid Build Coastguard Worker    my ($dir) = @_;
946*6236dae4SAndroid Build Coastguard Worker    my %cats;
947*6236dae4SAndroid Build Coastguard Worker    open(H, "<$dir/../../src/tool_help.h") ||
948*6236dae4SAndroid Build Coastguard Worker        die "can't find the header file";
949*6236dae4SAndroid Build Coastguard Worker    while(<H>) {
950*6236dae4SAndroid Build Coastguard Worker        if(/^\#define CURLHELP_([A-Z0-9]*)/) {
951*6236dae4SAndroid Build Coastguard Worker            $cats{lc($1)}++;
952*6236dae4SAndroid Build Coastguard Worker        }
953*6236dae4SAndroid Build Coastguard Worker    }
954*6236dae4SAndroid Build Coastguard Worker    close(H);
955*6236dae4SAndroid Build Coastguard Worker    return %cats;
956*6236dae4SAndroid Build Coastguard Worker}
957*6236dae4SAndroid Build Coastguard Worker
958*6236dae4SAndroid Build Coastguard Workersub listhelp {
959*6236dae4SAndroid Build Coastguard Worker    my ($dir) = @_;
960*6236dae4SAndroid Build Coastguard Worker    my %cats = sourcecategories($dir);
961*6236dae4SAndroid Build Coastguard Worker
962*6236dae4SAndroid Build Coastguard Worker    print <<HEAD
963*6236dae4SAndroid Build Coastguard Worker/***************************************************************************
964*6236dae4SAndroid Build Coastguard Worker *                                  _   _ ____  _
965*6236dae4SAndroid Build Coastguard Worker *  Project                     ___| | | |  _ \\| |
966*6236dae4SAndroid Build Coastguard Worker *                             / __| | | | |_) | |
967*6236dae4SAndroid Build Coastguard Worker *                            | (__| |_| |  _ <| |___
968*6236dae4SAndroid Build Coastguard Worker *                             \\___|\\___/|_| \\_\\_____|
969*6236dae4SAndroid Build Coastguard Worker *
970*6236dae4SAndroid Build Coastguard Worker * Copyright (C) Daniel Stenberg, <daniel\@haxx.se>, et al.
971*6236dae4SAndroid Build Coastguard Worker *
972*6236dae4SAndroid Build Coastguard Worker * This software is licensed as described in the file COPYING, which
973*6236dae4SAndroid Build Coastguard Worker * you should have received as part of this distribution. The terms
974*6236dae4SAndroid Build Coastguard Worker * are also available at https://curl.se/docs/copyright.html.
975*6236dae4SAndroid Build Coastguard Worker *
976*6236dae4SAndroid Build Coastguard Worker * You may opt to use, copy, modify, merge, publish, distribute and/or sell
977*6236dae4SAndroid Build Coastguard Worker * copies of the Software, and permit persons to whom the Software is
978*6236dae4SAndroid Build Coastguard Worker * furnished to do so, under the terms of the COPYING file.
979*6236dae4SAndroid Build Coastguard Worker *
980*6236dae4SAndroid Build Coastguard Worker * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
981*6236dae4SAndroid Build Coastguard Worker * KIND, either express or implied.
982*6236dae4SAndroid Build Coastguard Worker *
983*6236dae4SAndroid Build Coastguard Worker * SPDX-License-Identifier: curl
984*6236dae4SAndroid Build Coastguard Worker *
985*6236dae4SAndroid Build Coastguard Worker ***************************************************************************/
986*6236dae4SAndroid Build Coastguard Worker#include "tool_setup.h"
987*6236dae4SAndroid Build Coastguard Worker#include "tool_help.h"
988*6236dae4SAndroid Build Coastguard Worker
989*6236dae4SAndroid Build Coastguard Worker/*
990*6236dae4SAndroid Build Coastguard Worker * DO NOT edit tool_listhelp.c manually.
991*6236dae4SAndroid Build Coastguard Worker * This source file is generated with the following command in an autotools
992*6236dae4SAndroid Build Coastguard Worker * build:
993*6236dae4SAndroid Build Coastguard Worker *
994*6236dae4SAndroid Build Coastguard Worker * "make listhelp"
995*6236dae4SAndroid Build Coastguard Worker */
996*6236dae4SAndroid Build Coastguard Worker
997*6236dae4SAndroid Build Coastguard Workerconst struct helptxt helptext[] = {
998*6236dae4SAndroid Build Coastguard WorkerHEAD
999*6236dae4SAndroid Build Coastguard Worker        ;
1000*6236dae4SAndroid Build Coastguard Worker    foreach my $f (sort keys %helplong) {
1001*6236dae4SAndroid Build Coastguard Worker        my $long = $f;
1002*6236dae4SAndroid Build Coastguard Worker        my $short = $optlong{$long};
1003*6236dae4SAndroid Build Coastguard Worker        my @categories = split ' ', $catlong{$long};
1004*6236dae4SAndroid Build Coastguard Worker        my $bitmask = ' ';
1005*6236dae4SAndroid Build Coastguard Worker        my $opt;
1006*6236dae4SAndroid Build Coastguard Worker
1007*6236dae4SAndroid Build Coastguard Worker        if(defined($short) && $long) {
1008*6236dae4SAndroid Build Coastguard Worker            $opt = "-$short, --$long";
1009*6236dae4SAndroid Build Coastguard Worker        }
1010*6236dae4SAndroid Build Coastguard Worker        elsif($long && !$short) {
1011*6236dae4SAndroid Build Coastguard Worker            $opt = "    --$long";
1012*6236dae4SAndroid Build Coastguard Worker        }
1013*6236dae4SAndroid Build Coastguard Worker        for my $i (0 .. $#categories) {
1014*6236dae4SAndroid Build Coastguard Worker            if(!$cats{ $categories[$i] }) {
1015*6236dae4SAndroid Build Coastguard Worker                printf STDERR "$f.md:ERROR: Unknown category '%s'\n",
1016*6236dae4SAndroid Build Coastguard Worker                    $categories[$i];
1017*6236dae4SAndroid Build Coastguard Worker                exit 3;
1018*6236dae4SAndroid Build Coastguard Worker            }
1019*6236dae4SAndroid Build Coastguard Worker
1020*6236dae4SAndroid Build Coastguard Worker            $bitmask .= 'CURLHELP_' . uc $categories[$i];
1021*6236dae4SAndroid Build Coastguard Worker            # If not last element, append |
1022*6236dae4SAndroid Build Coastguard Worker            if($i < $#categories) {
1023*6236dae4SAndroid Build Coastguard Worker                $bitmask .= ' | ';
1024*6236dae4SAndroid Build Coastguard Worker            }
1025*6236dae4SAndroid Build Coastguard Worker        }
1026*6236dae4SAndroid Build Coastguard Worker        $bitmask =~ s/(?=.{76}).{1,76}\|/$&\n  /g;
1027*6236dae4SAndroid Build Coastguard Worker        my $arg = $arglong{$long};
1028*6236dae4SAndroid Build Coastguard Worker        if($arg) {
1029*6236dae4SAndroid Build Coastguard Worker            $opt .= " $arg";
1030*6236dae4SAndroid Build Coastguard Worker        }
1031*6236dae4SAndroid Build Coastguard Worker        my $desc = $helplong{$f};
1032*6236dae4SAndroid Build Coastguard Worker        $desc =~ s/\"/\\\"/g; # escape double quotes
1033*6236dae4SAndroid Build Coastguard Worker
1034*6236dae4SAndroid Build Coastguard Worker        my $line = sprintf "  {\"%s\",\n   \"%s\",\n  %s},\n", $opt, $desc, $bitmask;
1035*6236dae4SAndroid Build Coastguard Worker
1036*6236dae4SAndroid Build Coastguard Worker        if(length($opt) > 78) {
1037*6236dae4SAndroid Build Coastguard Worker            print STDERR "WARN: the --$long name is too long\n";
1038*6236dae4SAndroid Build Coastguard Worker        }
1039*6236dae4SAndroid Build Coastguard Worker        elsif(length($desc) > 78) {
1040*6236dae4SAndroid Build Coastguard Worker            print STDERR "WARN: the --$long description is too long\n";
1041*6236dae4SAndroid Build Coastguard Worker        }
1042*6236dae4SAndroid Build Coastguard Worker        print $line;
1043*6236dae4SAndroid Build Coastguard Worker    }
1044*6236dae4SAndroid Build Coastguard Worker    print <<FOOT
1045*6236dae4SAndroid Build Coastguard Worker  { NULL, NULL, 0 }
1046*6236dae4SAndroid Build Coastguard Worker};
1047*6236dae4SAndroid Build Coastguard WorkerFOOT
1048*6236dae4SAndroid Build Coastguard Worker        ;
1049*6236dae4SAndroid Build Coastguard Worker}
1050*6236dae4SAndroid Build Coastguard Worker
1051*6236dae4SAndroid Build Coastguard Workersub listcats {
1052*6236dae4SAndroid Build Coastguard Worker    my %allcats;
1053*6236dae4SAndroid Build Coastguard Worker    foreach my $f (sort keys %helplong) {
1054*6236dae4SAndroid Build Coastguard Worker        my @categories = split ' ', $catlong{$f};
1055*6236dae4SAndroid Build Coastguard Worker        foreach (@categories) {
1056*6236dae4SAndroid Build Coastguard Worker            $allcats{$_} = undef;
1057*6236dae4SAndroid Build Coastguard Worker        }
1058*6236dae4SAndroid Build Coastguard Worker    }
1059*6236dae4SAndroid Build Coastguard Worker    my @categories;
1060*6236dae4SAndroid Build Coastguard Worker    foreach my $key (keys %allcats) {
1061*6236dae4SAndroid Build Coastguard Worker        push @categories, $key;
1062*6236dae4SAndroid Build Coastguard Worker    }
1063*6236dae4SAndroid Build Coastguard Worker    @categories = sort @categories;
1064*6236dae4SAndroid Build Coastguard Worker    for my $i (0..$#categories) {
1065*6236dae4SAndroid Build Coastguard Worker        printf("#define CURLHELP_%-10s (%s)\n",
1066*6236dae4SAndroid Build Coastguard Worker               uc($categories[$i]), "1u << ${i}u");
1067*6236dae4SAndroid Build Coastguard Worker    }
1068*6236dae4SAndroid Build Coastguard Worker}
1069*6236dae4SAndroid Build Coastguard Worker
1070*6236dae4SAndroid Build Coastguard Workersub listglobals {
1071*6236dae4SAndroid Build Coastguard Worker    my ($dir, @files) = @_;
1072*6236dae4SAndroid Build Coastguard Worker    my @globalopts;
1073*6236dae4SAndroid Build Coastguard Worker
1074*6236dae4SAndroid Build Coastguard Worker    # Find all global options and output them
1075*6236dae4SAndroid Build Coastguard Worker    foreach my $f (sort @files) {
1076*6236dae4SAndroid Build Coastguard Worker        open(F, "<:crlf", "$dir/$f") ||
1077*6236dae4SAndroid Build Coastguard Worker            die "could not read $dir/$f";
1078*6236dae4SAndroid Build Coastguard Worker        my $long;
1079*6236dae4SAndroid Build Coastguard Worker        my $start = 0;
1080*6236dae4SAndroid Build Coastguard Worker        while(<F>) {
1081*6236dae4SAndroid Build Coastguard Worker            if(/^---/) {
1082*6236dae4SAndroid Build Coastguard Worker                if(!$start) {
1083*6236dae4SAndroid Build Coastguard Worker                    $start = 1;
1084*6236dae4SAndroid Build Coastguard Worker                    next;
1085*6236dae4SAndroid Build Coastguard Worker                }
1086*6236dae4SAndroid Build Coastguard Worker                else {
1087*6236dae4SAndroid Build Coastguard Worker                    last;
1088*6236dae4SAndroid Build Coastguard Worker                }
1089*6236dae4SAndroid Build Coastguard Worker            }
1090*6236dae4SAndroid Build Coastguard Worker            if(/^Long: *(.*)/i) {
1091*6236dae4SAndroid Build Coastguard Worker                $long=$1;
1092*6236dae4SAndroid Build Coastguard Worker            }
1093*6236dae4SAndroid Build Coastguard Worker            elsif(/^Scope: global/i) {
1094*6236dae4SAndroid Build Coastguard Worker                push @globalopts, $long;
1095*6236dae4SAndroid Build Coastguard Worker                last;
1096*6236dae4SAndroid Build Coastguard Worker            }
1097*6236dae4SAndroid Build Coastguard Worker        }
1098*6236dae4SAndroid Build Coastguard Worker        close(F);
1099*6236dae4SAndroid Build Coastguard Worker    }
1100*6236dae4SAndroid Build Coastguard Worker    return $ret if($ret);
1101*6236dae4SAndroid Build Coastguard Worker    for my $e (0 .. $#globalopts) {
1102*6236dae4SAndroid Build Coastguard Worker        $globals .= sprintf "%s--%s",  $e?($globalopts[$e+1] ? ", " : " and "):"",
1103*6236dae4SAndroid Build Coastguard Worker            $globalopts[$e],;
1104*6236dae4SAndroid Build Coastguard Worker    }
1105*6236dae4SAndroid Build Coastguard Worker}
1106*6236dae4SAndroid Build Coastguard Worker
1107*6236dae4SAndroid Build Coastguard Workersub noext {
1108*6236dae4SAndroid Build Coastguard Worker    my $in = $_[0];
1109*6236dae4SAndroid Build Coastguard Worker    $in =~ s/\.md//;
1110*6236dae4SAndroid Build Coastguard Worker    return $in;
1111*6236dae4SAndroid Build Coastguard Worker}
1112*6236dae4SAndroid Build Coastguard Worker
1113*6236dae4SAndroid Build Coastguard Workersub sortnames {
1114*6236dae4SAndroid Build Coastguard Worker    return noext($a) cmp noext($b);
1115*6236dae4SAndroid Build Coastguard Worker}
1116*6236dae4SAndroid Build Coastguard Worker
1117*6236dae4SAndroid Build Coastguard Workersub mainpage {
1118*6236dae4SAndroid Build Coastguard Worker    my ($dir, $manpage, @files) = @_;
1119*6236dae4SAndroid Build Coastguard Worker    # $manpage is 1 for nroff, 0 for ASCII
1120*6236dae4SAndroid Build Coastguard Worker    my $ret;
1121*6236dae4SAndroid Build Coastguard Worker    my $fh;
1122*6236dae4SAndroid Build Coastguard Worker    open($fh, "<:crlf", "$dir/mainpage.idx") ||
1123*6236dae4SAndroid Build Coastguard Worker        die "no $dir/mainpage.idx file";
1124*6236dae4SAndroid Build Coastguard Worker
1125*6236dae4SAndroid Build Coastguard Worker    print <<HEADER
1126*6236dae4SAndroid Build Coastguard Worker.\\" **************************************************************************
1127*6236dae4SAndroid Build Coastguard Worker.\\" *                                  _   _ ____  _
1128*6236dae4SAndroid Build Coastguard Worker.\\" *  Project                     ___| | | |  _ \\| |
1129*6236dae4SAndroid Build Coastguard Worker.\\" *                             / __| | | | |_) | |
1130*6236dae4SAndroid Build Coastguard Worker.\\" *                            | (__| |_| |  _ <| |___
1131*6236dae4SAndroid Build Coastguard Worker.\\" *                             \\___|\\___/|_| \\_\\_____|
1132*6236dae4SAndroid Build Coastguard Worker.\\" *
1133*6236dae4SAndroid Build Coastguard Worker.\\" * Copyright (C) Daniel Stenberg, <daniel\@haxx.se>, et al.
1134*6236dae4SAndroid Build Coastguard Worker.\\" *
1135*6236dae4SAndroid Build Coastguard Worker.\\" * This software is licensed as described in the file COPYING, which
1136*6236dae4SAndroid Build Coastguard Worker.\\" * you should have received as part of this distribution. The terms
1137*6236dae4SAndroid Build Coastguard Worker.\\" * are also available at https://curl.se/docs/copyright.html.
1138*6236dae4SAndroid Build Coastguard Worker.\\" *
1139*6236dae4SAndroid Build Coastguard Worker.\\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
1140*6236dae4SAndroid Build Coastguard Worker.\\" * copies of the Software, and permit persons to whom the Software is
1141*6236dae4SAndroid Build Coastguard Worker.\\" * furnished to do so, under the terms of the COPYING file.
1142*6236dae4SAndroid Build Coastguard Worker.\\" *
1143*6236dae4SAndroid Build Coastguard Worker.\\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
1144*6236dae4SAndroid Build Coastguard Worker.\\" * KIND, either express or implied.
1145*6236dae4SAndroid Build Coastguard Worker.\\" *
1146*6236dae4SAndroid Build Coastguard Worker.\\" * SPDX-License-Identifier: curl
1147*6236dae4SAndroid Build Coastguard Worker.\\" *
1148*6236dae4SAndroid Build Coastguard Worker.\\" **************************************************************************
1149*6236dae4SAndroid Build Coastguard Worker.\\"
1150*6236dae4SAndroid Build Coastguard Worker.\\" DO NOT EDIT. Generated by the curl project managen manpage generator.
1151*6236dae4SAndroid Build Coastguard Worker.\\"
1152*6236dae4SAndroid Build Coastguard Worker.TH curl 1 "$date" "curl $version" "curl Manual"
1153*6236dae4SAndroid Build Coastguard WorkerHEADER
1154*6236dae4SAndroid Build Coastguard Worker        if ($manpage);
1155*6236dae4SAndroid Build Coastguard Worker
1156*6236dae4SAndroid Build Coastguard Worker    while(<$fh>) {
1157*6236dae4SAndroid Build Coastguard Worker        my $f = $_;
1158*6236dae4SAndroid Build Coastguard Worker        chomp $f;
1159*6236dae4SAndroid Build Coastguard Worker        if($f =~ /^#/) {
1160*6236dae4SAndroid Build Coastguard Worker            # standard comment
1161*6236dae4SAndroid Build Coastguard Worker            next;
1162*6236dae4SAndroid Build Coastguard Worker        }
1163*6236dae4SAndroid Build Coastguard Worker        if(/^%options/) {
1164*6236dae4SAndroid Build Coastguard Worker            # output docs for all options
1165*6236dae4SAndroid Build Coastguard Worker            foreach my $f (sort sortnames @files) {
1166*6236dae4SAndroid Build Coastguard Worker                $ret += single($dir, $manpage, $f, 0);
1167*6236dae4SAndroid Build Coastguard Worker            }
1168*6236dae4SAndroid Build Coastguard Worker        }
1169*6236dae4SAndroid Build Coastguard Worker        else {
1170*6236dae4SAndroid Build Coastguard Worker            # render the file
1171*6236dae4SAndroid Build Coastguard Worker            header($dir, $manpage, $f);
1172*6236dae4SAndroid Build Coastguard Worker        }
1173*6236dae4SAndroid Build Coastguard Worker    }
1174*6236dae4SAndroid Build Coastguard Worker    close($fh);
1175*6236dae4SAndroid Build Coastguard Worker    exit $ret if($ret);
1176*6236dae4SAndroid Build Coastguard Worker}
1177*6236dae4SAndroid Build Coastguard Worker
1178*6236dae4SAndroid Build Coastguard Workersub showonly {
1179*6236dae4SAndroid Build Coastguard Worker    my ($f) = @_;
1180*6236dae4SAndroid Build Coastguard Worker    if(single($f, 1)) {
1181*6236dae4SAndroid Build Coastguard Worker        print STDERR "$f: failed\n";
1182*6236dae4SAndroid Build Coastguard Worker    }
1183*6236dae4SAndroid Build Coastguard Worker}
1184*6236dae4SAndroid Build Coastguard Worker
1185*6236dae4SAndroid Build Coastguard Workersub showprotocols {
1186*6236dae4SAndroid Build Coastguard Worker    my %prots;
1187*6236dae4SAndroid Build Coastguard Worker    foreach my $f (keys %optlong) {
1188*6236dae4SAndroid Build Coastguard Worker        my @p = split(/ /, $protolong{$f});
1189*6236dae4SAndroid Build Coastguard Worker        for my $p (@p) {
1190*6236dae4SAndroid Build Coastguard Worker            $prots{$p}++;
1191*6236dae4SAndroid Build Coastguard Worker        }
1192*6236dae4SAndroid Build Coastguard Worker    }
1193*6236dae4SAndroid Build Coastguard Worker    for(sort keys %prots) {
1194*6236dae4SAndroid Build Coastguard Worker        printf "$_ (%d options)\n", $prots{$_};
1195*6236dae4SAndroid Build Coastguard Worker    }
1196*6236dae4SAndroid Build Coastguard Worker}
1197*6236dae4SAndroid Build Coastguard Worker
1198*6236dae4SAndroid Build Coastguard Workersub getargs {
1199*6236dae4SAndroid Build Coastguard Worker    my ($dir, $f, @s) = @_;
1200*6236dae4SAndroid Build Coastguard Worker    if($f eq "mainpage") {
1201*6236dae4SAndroid Build Coastguard Worker        listglobals($dir, @s);
1202*6236dae4SAndroid Build Coastguard Worker        mainpage($dir, 1, @s);
1203*6236dae4SAndroid Build Coastguard Worker        return;
1204*6236dae4SAndroid Build Coastguard Worker    }
1205*6236dae4SAndroid Build Coastguard Worker    elsif($f eq "ascii") {
1206*6236dae4SAndroid Build Coastguard Worker        listglobals($dir, @s);
1207*6236dae4SAndroid Build Coastguard Worker        mainpage($dir, 0, @s);
1208*6236dae4SAndroid Build Coastguard Worker        return;
1209*6236dae4SAndroid Build Coastguard Worker    }
1210*6236dae4SAndroid Build Coastguard Worker    elsif($f eq "listhelp") {
1211*6236dae4SAndroid Build Coastguard Worker        listhelp($dir);
1212*6236dae4SAndroid Build Coastguard Worker        return;
1213*6236dae4SAndroid Build Coastguard Worker    }
1214*6236dae4SAndroid Build Coastguard Worker    elsif($f eq "single") {
1215*6236dae4SAndroid Build Coastguard Worker        showonly($s[0]);
1216*6236dae4SAndroid Build Coastguard Worker        return;
1217*6236dae4SAndroid Build Coastguard Worker    }
1218*6236dae4SAndroid Build Coastguard Worker    elsif($f eq "protos") {
1219*6236dae4SAndroid Build Coastguard Worker        showprotocols();
1220*6236dae4SAndroid Build Coastguard Worker        return;
1221*6236dae4SAndroid Build Coastguard Worker    }
1222*6236dae4SAndroid Build Coastguard Worker    elsif($f eq "listcats") {
1223*6236dae4SAndroid Build Coastguard Worker        listcats();
1224*6236dae4SAndroid Build Coastguard Worker        return;
1225*6236dae4SAndroid Build Coastguard Worker    }
1226*6236dae4SAndroid Build Coastguard Worker
1227*6236dae4SAndroid Build Coastguard Worker    print "Usage: managen ".
1228*6236dae4SAndroid Build Coastguard Worker        "[-d dir] <mainpage/ascii/listhelp/single FILE/protos/listcats> [files]\n";
1229*6236dae4SAndroid Build Coastguard Worker}
1230*6236dae4SAndroid Build Coastguard Worker
1231*6236dae4SAndroid Build Coastguard Worker#------------------------------------------------------------------------
1232*6236dae4SAndroid Build Coastguard Worker
1233*6236dae4SAndroid Build Coastguard Workermy $dir = ".";
1234*6236dae4SAndroid Build Coastguard Workermy $include = "../../include";
1235*6236dae4SAndroid Build Coastguard Workermy $cmd = shift @ARGV;
1236*6236dae4SAndroid Build Coastguard Worker
1237*6236dae4SAndroid Build Coastguard Worker check:
1238*6236dae4SAndroid Build Coastguard Workerif($cmd eq "-d") {
1239*6236dae4SAndroid Build Coastguard Worker    # specifies source directory
1240*6236dae4SAndroid Build Coastguard Worker    $dir = shift @ARGV;
1241*6236dae4SAndroid Build Coastguard Worker    $cmd = shift @ARGV;
1242*6236dae4SAndroid Build Coastguard Worker    goto check;
1243*6236dae4SAndroid Build Coastguard Worker}
1244*6236dae4SAndroid Build Coastguard Workerelsif($cmd eq "-I") {
1245*6236dae4SAndroid Build Coastguard Worker    # include path root
1246*6236dae4SAndroid Build Coastguard Worker    $include = shift @ARGV;
1247*6236dae4SAndroid Build Coastguard Worker    $cmd = shift @ARGV;
1248*6236dae4SAndroid Build Coastguard Worker    goto check;
1249*6236dae4SAndroid Build Coastguard Worker}
1250*6236dae4SAndroid Build Coastguard Workerelsif($cmd eq "-c") {
1251*6236dae4SAndroid Build Coastguard Worker    # Column width
1252*6236dae4SAndroid Build Coastguard Worker    $colwidth = 0 + shift @ARGV;
1253*6236dae4SAndroid Build Coastguard Worker    $cmd = shift @ARGV;
1254*6236dae4SAndroid Build Coastguard Worker    goto check;
1255*6236dae4SAndroid Build Coastguard Worker}
1256*6236dae4SAndroid Build Coastguard Worker
1257*6236dae4SAndroid Build Coastguard Workermy @files = @ARGV; # the rest are the files
1258*6236dae4SAndroid Build Coastguard Worker
1259*6236dae4SAndroid Build Coastguard Worker# can be overridden for releases
1260*6236dae4SAndroid Build Coastguard Workerif($ENV{'CURL_MAKETGZ_VERSION'}) {
1261*6236dae4SAndroid Build Coastguard Worker    $version = $ENV{'CURL_MAKETGZ_VERSION'};
1262*6236dae4SAndroid Build Coastguard Worker}
1263*6236dae4SAndroid Build Coastguard Workerelse {
1264*6236dae4SAndroid Build Coastguard Worker    open(INC, "<$include/curl/curlver.h");
1265*6236dae4SAndroid Build Coastguard Worker    while(<INC>) {
1266*6236dae4SAndroid Build Coastguard Worker        if($_ =~ /^#define LIBCURL_VERSION \"([0-9.]*)/) {
1267*6236dae4SAndroid Build Coastguard Worker            $version = $1;
1268*6236dae4SAndroid Build Coastguard Worker            last;
1269*6236dae4SAndroid Build Coastguard Worker        }
1270*6236dae4SAndroid Build Coastguard Worker    }
1271*6236dae4SAndroid Build Coastguard Worker    close(INC);
1272*6236dae4SAndroid Build Coastguard Worker}
1273*6236dae4SAndroid Build Coastguard Worker
1274*6236dae4SAndroid Build Coastguard Worker# learn all existing options
1275*6236dae4SAndroid Build Coastguard Workerindexoptions($dir, @files);
1276*6236dae4SAndroid Build Coastguard Worker
1277*6236dae4SAndroid Build Coastguard Workergetargs($dir, $cmd, @files);
1278*6236dae4SAndroid Build Coastguard Worker
1279*6236dae4SAndroid Build Coastguard Workerexit $error;
1280