xref: /aosp_15_r20/external/curl/tests/test1173.pl (revision 6236dae45794135f37c4eb022389c904c8b0090d)
1*6236dae4SAndroid Build Coastguard Worker#!/usr/bin/env perl
2*6236dae4SAndroid Build Coastguard Worker#***************************************************************************
3*6236dae4SAndroid Build Coastguard Worker#                                  _   _ ____  _
4*6236dae4SAndroid Build Coastguard Worker#  Project                     ___| | | |  _ \| |
5*6236dae4SAndroid Build Coastguard Worker#                             / __| | | | |_) | |
6*6236dae4SAndroid Build Coastguard Worker#                            | (__| |_| |  _ <| |___
7*6236dae4SAndroid Build Coastguard Worker#                             \___|\___/|_| \_\_____|
8*6236dae4SAndroid Build Coastguard Worker#
9*6236dae4SAndroid Build Coastguard Worker# Copyright (C) Daniel Stenberg, <[email protected]>, et al.
10*6236dae4SAndroid Build Coastguard Worker#
11*6236dae4SAndroid Build Coastguard Worker# This software is licensed as described in the file COPYING, which
12*6236dae4SAndroid Build Coastguard Worker# you should have received as part of this distribution. The terms
13*6236dae4SAndroid Build Coastguard Worker# are also available at https://curl.se/docs/copyright.html.
14*6236dae4SAndroid Build Coastguard Worker#
15*6236dae4SAndroid Build Coastguard Worker# You may opt to use, copy, modify, merge, publish, distribute and/or sell
16*6236dae4SAndroid Build Coastguard Worker# copies of the Software, and permit persons to whom the Software is
17*6236dae4SAndroid Build Coastguard Worker# furnished to do so, under the terms of the COPYING file.
18*6236dae4SAndroid Build Coastguard Worker#
19*6236dae4SAndroid Build Coastguard Worker# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
20*6236dae4SAndroid Build Coastguard Worker# KIND, either express or implied.
21*6236dae4SAndroid Build Coastguard Worker#
22*6236dae4SAndroid Build Coastguard Worker# SPDX-License-Identifier: curl
23*6236dae4SAndroid Build Coastguard Worker#
24*6236dae4SAndroid Build Coastguard Worker###########################################################################
25*6236dae4SAndroid Build Coastguard Worker#
26*6236dae4SAndroid Build Coastguard Worker# Scan manpage(s) and detect some simple and yet common formatting mistakes.
27*6236dae4SAndroid Build Coastguard Worker#
28*6236dae4SAndroid Build Coastguard Worker# Output all deviances to stderr.
29*6236dae4SAndroid Build Coastguard Worker
30*6236dae4SAndroid Build Coastguard Workeruse strict;
31*6236dae4SAndroid Build Coastguard Workeruse warnings;
32*6236dae4SAndroid Build Coastguard Workeruse File::Basename;
33*6236dae4SAndroid Build Coastguard Worker
34*6236dae4SAndroid Build Coastguard Worker# get the file name first
35*6236dae4SAndroid Build Coastguard Workermy $symbolsinversions=shift @ARGV;
36*6236dae4SAndroid Build Coastguard Worker
37*6236dae4SAndroid Build Coastguard Worker# we may get the dir roots pointed out
38*6236dae4SAndroid Build Coastguard Workermy @manpages=@ARGV;
39*6236dae4SAndroid Build Coastguard Workermy $errors = 0;
40*6236dae4SAndroid Build Coastguard Worker
41*6236dae4SAndroid Build Coastguard Workermy %docsdirs;
42*6236dae4SAndroid Build Coastguard Workermy %optblessed;
43*6236dae4SAndroid Build Coastguard Workermy %funcblessed;
44*6236dae4SAndroid Build Coastguard Workermy @optorder = (
45*6236dae4SAndroid Build Coastguard Worker    'NAME',
46*6236dae4SAndroid Build Coastguard Worker    'SYNOPSIS',
47*6236dae4SAndroid Build Coastguard Worker    'DESCRIPTION',
48*6236dae4SAndroid Build Coastguard Worker     #'DEFAULT', # CURLINFO_ has no default
49*6236dae4SAndroid Build Coastguard Worker    'PROTOCOLS',
50*6236dae4SAndroid Build Coastguard Worker    'EXAMPLE',
51*6236dae4SAndroid Build Coastguard Worker    'AVAILABILITY',
52*6236dae4SAndroid Build Coastguard Worker    'RETURN VALUE',
53*6236dae4SAndroid Build Coastguard Worker    'SEE ALSO'
54*6236dae4SAndroid Build Coastguard Worker    );
55*6236dae4SAndroid Build Coastguard Workermy @funcorder = (
56*6236dae4SAndroid Build Coastguard Worker    'NAME',
57*6236dae4SAndroid Build Coastguard Worker    'SYNOPSIS',
58*6236dae4SAndroid Build Coastguard Worker    'DESCRIPTION',
59*6236dae4SAndroid Build Coastguard Worker    'EXAMPLE',
60*6236dae4SAndroid Build Coastguard Worker    'AVAILABILITY',
61*6236dae4SAndroid Build Coastguard Worker    'RETURN VALUE',
62*6236dae4SAndroid Build Coastguard Worker    'SEE ALSO'
63*6236dae4SAndroid Build Coastguard Worker    );
64*6236dae4SAndroid Build Coastguard Workermy %shline; # section => line number
65*6236dae4SAndroid Build Coastguard Worker
66*6236dae4SAndroid Build Coastguard Workermy %symbol;
67*6236dae4SAndroid Build Coastguard Worker
68*6236dae4SAndroid Build Coastguard Worker# some CURLINFO_ symbols are not actual options for curl_easy_getinfo,
69*6236dae4SAndroid Build Coastguard Worker# mark them as "deprecated" to hide them from link-warnings
70*6236dae4SAndroid Build Coastguard Workermy %deprecated = (
71*6236dae4SAndroid Build Coastguard Worker    CURLINFO_TEXT => 1,
72*6236dae4SAndroid Build Coastguard Worker    CURLINFO_HEADER_IN => 1,
73*6236dae4SAndroid Build Coastguard Worker    CURLINFO_HEADER_OUT => 1,
74*6236dae4SAndroid Build Coastguard Worker    CURLINFO_DATA_IN => 1,
75*6236dae4SAndroid Build Coastguard Worker    CURLINFO_DATA_OUT => 1,
76*6236dae4SAndroid Build Coastguard Worker    CURLINFO_SSL_DATA_IN => 1,
77*6236dae4SAndroid Build Coastguard Worker    CURLINFO_SSL_DATA_OUT => 1,
78*6236dae4SAndroid Build Coastguard Worker    CURLOPT_EGDSOCKET => 1,
79*6236dae4SAndroid Build Coastguard Worker    CURLOPT_RANDOM_FILE => 1,
80*6236dae4SAndroid Build Coastguard Worker    );
81*6236dae4SAndroid Build Coastguard Workersub allsymbols {
82*6236dae4SAndroid Build Coastguard Worker    open(my $f, "<", "$symbolsinversions") ||
83*6236dae4SAndroid Build Coastguard Worker        die "$symbolsinversions: $|";
84*6236dae4SAndroid Build Coastguard Worker    while(<$f>) {
85*6236dae4SAndroid Build Coastguard Worker        if($_ =~ /^([^ ]*) +(.*)/) {
86*6236dae4SAndroid Build Coastguard Worker            my ($name, $info) = ($1, $2);
87*6236dae4SAndroid Build Coastguard Worker            $symbol{$name}=$name;
88*6236dae4SAndroid Build Coastguard Worker
89*6236dae4SAndroid Build Coastguard Worker            if($info =~ /([0-9.]+) +([0-9.]+)/) {
90*6236dae4SAndroid Build Coastguard Worker                $deprecated{$name}=$info;
91*6236dae4SAndroid Build Coastguard Worker            }
92*6236dae4SAndroid Build Coastguard Worker        }
93*6236dae4SAndroid Build Coastguard Worker    }
94*6236dae4SAndroid Build Coastguard Worker    close($f);
95*6236dae4SAndroid Build Coastguard Worker}
96*6236dae4SAndroid Build Coastguard Worker
97*6236dae4SAndroid Build Coastguard Worker
98*6236dae4SAndroid Build Coastguard Workermy %ref = (
99*6236dae4SAndroid Build Coastguard Worker    'curl.1' => 1
100*6236dae4SAndroid Build Coastguard Worker    );
101*6236dae4SAndroid Build Coastguard Workersub checkref {
102*6236dae4SAndroid Build Coastguard Worker    my ($f, $sec, $file, $line)=@_;
103*6236dae4SAndroid Build Coastguard Worker    my $present = 0;
104*6236dae4SAndroid Build Coastguard Worker    #print STDERR "check $f.$sec\n";
105*6236dae4SAndroid Build Coastguard Worker    if($ref{"$f.$sec"}) {
106*6236dae4SAndroid Build Coastguard Worker        # present
107*6236dae4SAndroid Build Coastguard Worker        return;
108*6236dae4SAndroid Build Coastguard Worker    }
109*6236dae4SAndroid Build Coastguard Worker    foreach my $d (keys %docsdirs) {
110*6236dae4SAndroid Build Coastguard Worker        if( -f "$d/$f.$sec") {
111*6236dae4SAndroid Build Coastguard Worker            $present = 1;
112*6236dae4SAndroid Build Coastguard Worker            $ref{"$f.$sec"}=1;
113*6236dae4SAndroid Build Coastguard Worker            last;
114*6236dae4SAndroid Build Coastguard Worker        }
115*6236dae4SAndroid Build Coastguard Worker    }
116*6236dae4SAndroid Build Coastguard Worker    if(!$present) {
117*6236dae4SAndroid Build Coastguard Worker        print STDERR "$file:$line broken reference to $f($sec)\n";
118*6236dae4SAndroid Build Coastguard Worker        $errors++;
119*6236dae4SAndroid Build Coastguard Worker    }
120*6236dae4SAndroid Build Coastguard Worker}
121*6236dae4SAndroid Build Coastguard Worker
122*6236dae4SAndroid Build Coastguard Workersub scanmanpage {
123*6236dae4SAndroid Build Coastguard Worker    my ($file) = @_;
124*6236dae4SAndroid Build Coastguard Worker    my $reqex = 0;
125*6236dae4SAndroid Build Coastguard Worker    my $inseealso = 0;
126*6236dae4SAndroid Build Coastguard Worker    my $inex = 0;
127*6236dae4SAndroid Build Coastguard Worker    my $insynop = 0;
128*6236dae4SAndroid Build Coastguard Worker    my $exsize = 0;
129*6236dae4SAndroid Build Coastguard Worker    my $synopsize = 0;
130*6236dae4SAndroid Build Coastguard Worker    my $shc = 0;
131*6236dae4SAndroid Build Coastguard Worker    my $optpage = 0; # option or function
132*6236dae4SAndroid Build Coastguard Worker    my @sh;
133*6236dae4SAndroid Build Coastguard Worker    my $SH="";
134*6236dae4SAndroid Build Coastguard Worker    my @separators;
135*6236dae4SAndroid Build Coastguard Worker    my @sepline;
136*6236dae4SAndroid Build Coastguard Worker
137*6236dae4SAndroid Build Coastguard Worker    open(my $m, "<", "$file") ||
138*6236dae4SAndroid Build Coastguard Worker        die "test1173.pl could not open $file";
139*6236dae4SAndroid Build Coastguard Worker    if($file =~ /[\/\\](CURL|curl_)([^\/\\]*).3/) {
140*6236dae4SAndroid Build Coastguard Worker        # This is a manpage for libcurl. It requires an example unless it's
141*6236dae4SAndroid Build Coastguard Worker        # considered deprecated.
142*6236dae4SAndroid Build Coastguard Worker        $reqex = 1 unless defined $deprecated{'CURL'.$2};
143*6236dae4SAndroid Build Coastguard Worker        if($1 eq "CURL") {
144*6236dae4SAndroid Build Coastguard Worker            $optpage = 1;
145*6236dae4SAndroid Build Coastguard Worker        }
146*6236dae4SAndroid Build Coastguard Worker    }
147*6236dae4SAndroid Build Coastguard Worker    my $line = 1;
148*6236dae4SAndroid Build Coastguard Worker    while(<$m>) {
149*6236dae4SAndroid Build Coastguard Worker        chomp;
150*6236dae4SAndroid Build Coastguard Worker        if($_ =~ /^.so /) {
151*6236dae4SAndroid Build Coastguard Worker            # this manpage is just a referral
152*6236dae4SAndroid Build Coastguard Worker            close($m);
153*6236dae4SAndroid Build Coastguard Worker            return;
154*6236dae4SAndroid Build Coastguard Worker        }
155*6236dae4SAndroid Build Coastguard Worker        if(($_ =~ /^\.SH SYNOPSIS/i) && ($reqex)) {
156*6236dae4SAndroid Build Coastguard Worker            # this is for libcurl manpage SYNOPSIS checks
157*6236dae4SAndroid Build Coastguard Worker            $insynop = 1;
158*6236dae4SAndroid Build Coastguard Worker            $inex = 0;
159*6236dae4SAndroid Build Coastguard Worker        }
160*6236dae4SAndroid Build Coastguard Worker        elsif($_ =~ /^\.SH EXAMPLE/i) {
161*6236dae4SAndroid Build Coastguard Worker            $insynop = 0;
162*6236dae4SAndroid Build Coastguard Worker            $inex = 1;
163*6236dae4SAndroid Build Coastguard Worker        }
164*6236dae4SAndroid Build Coastguard Worker        elsif($_ =~ /^\.SH \"SEE ALSO\"/i) {
165*6236dae4SAndroid Build Coastguard Worker            $inseealso = 1;
166*6236dae4SAndroid Build Coastguard Worker        }
167*6236dae4SAndroid Build Coastguard Worker        elsif($_ =~ /^\.SH/i) {
168*6236dae4SAndroid Build Coastguard Worker            $insynop = 0;
169*6236dae4SAndroid Build Coastguard Worker            $inex = 0;
170*6236dae4SAndroid Build Coastguard Worker        }
171*6236dae4SAndroid Build Coastguard Worker        elsif($inseealso) {
172*6236dae4SAndroid Build Coastguard Worker            if($_ =~ /^\.BR (.*)/i) {
173*6236dae4SAndroid Build Coastguard Worker                my $f = $1;
174*6236dae4SAndroid Build Coastguard Worker                if($f =~ /^(lib|)curl/i) {
175*6236dae4SAndroid Build Coastguard Worker                    $f =~ s/[\n\r]//g;
176*6236dae4SAndroid Build Coastguard Worker                    if($f =~ s/([a-z_0-9-]*) \(([13])\)([, ]*)//i) {
177*6236dae4SAndroid Build Coastguard Worker                        push @separators, $3;
178*6236dae4SAndroid Build Coastguard Worker                        push @sepline, $line;
179*6236dae4SAndroid Build Coastguard Worker                        checkref($1, $2, $file, $line);
180*6236dae4SAndroid Build Coastguard Worker                    }
181*6236dae4SAndroid Build Coastguard Worker                    if($f !~ /^ *$/) {
182*6236dae4SAndroid Build Coastguard Worker                        print STDERR "$file:$line bad SEE ALSO format\n";
183*6236dae4SAndroid Build Coastguard Worker                        $errors++;
184*6236dae4SAndroid Build Coastguard Worker                    }
185*6236dae4SAndroid Build Coastguard Worker                }
186*6236dae4SAndroid Build Coastguard Worker                else {
187*6236dae4SAndroid Build Coastguard Worker                    if($f =~ /.*(, *)\z/) {
188*6236dae4SAndroid Build Coastguard Worker                        push @separators, $1;
189*6236dae4SAndroid Build Coastguard Worker                        push @sepline, $line;
190*6236dae4SAndroid Build Coastguard Worker                    }
191*6236dae4SAndroid Build Coastguard Worker                    else {
192*6236dae4SAndroid Build Coastguard Worker                        push @separators, " ";
193*6236dae4SAndroid Build Coastguard Worker                        push @sepline, $line;
194*6236dae4SAndroid Build Coastguard Worker                    }
195*6236dae4SAndroid Build Coastguard Worker                }
196*6236dae4SAndroid Build Coastguard Worker            }
197*6236dae4SAndroid Build Coastguard Worker        }
198*6236dae4SAndroid Build Coastguard Worker        elsif($inex)  {
199*6236dae4SAndroid Build Coastguard Worker            $exsize++;
200*6236dae4SAndroid Build Coastguard Worker            if($_ =~ /[^\\]\\n/) {
201*6236dae4SAndroid Build Coastguard Worker                print STDERR "$file:$line '\\n' need to be '\\\\n'!\n";
202*6236dae4SAndroid Build Coastguard Worker            }
203*6236dae4SAndroid Build Coastguard Worker        }
204*6236dae4SAndroid Build Coastguard Worker        elsif($insynop)  {
205*6236dae4SAndroid Build Coastguard Worker            $synopsize++;
206*6236dae4SAndroid Build Coastguard Worker            if(($synopsize == 1) && ($_ !~ /\.nf/)) {
207*6236dae4SAndroid Build Coastguard Worker                print STDERR "$file:$line:1:ERROR: be .nf for proper formatting\n";
208*6236dae4SAndroid Build Coastguard Worker            }
209*6236dae4SAndroid Build Coastguard Worker        }
210*6236dae4SAndroid Build Coastguard Worker        if($_ =~ /^\.SH ([^\r\n]*)/i) {
211*6236dae4SAndroid Build Coastguard Worker            my $n = $1;
212*6236dae4SAndroid Build Coastguard Worker            # remove enclosing quotes
213*6236dae4SAndroid Build Coastguard Worker            $n =~ s/\"(.*)\"\z/$1/;
214*6236dae4SAndroid Build Coastguard Worker            push @sh, $n;
215*6236dae4SAndroid Build Coastguard Worker            $shline{$n} = $line;
216*6236dae4SAndroid Build Coastguard Worker            $SH = $n;
217*6236dae4SAndroid Build Coastguard Worker        }
218*6236dae4SAndroid Build Coastguard Worker
219*6236dae4SAndroid Build Coastguard Worker        if($_ =~ /^\'/) {
220*6236dae4SAndroid Build Coastguard Worker            print STDERR "$file:$line line starts with single quote!\n";
221*6236dae4SAndroid Build Coastguard Worker            $errors++;
222*6236dae4SAndroid Build Coastguard Worker        }
223*6236dae4SAndroid Build Coastguard Worker        if($_ =~ /\\f([BI])(.*)/) {
224*6236dae4SAndroid Build Coastguard Worker            my ($format, $rest) = ($1, $2);
225*6236dae4SAndroid Build Coastguard Worker            if($rest !~ /\\fP/) {
226*6236dae4SAndroid Build Coastguard Worker                print STDERR "$file:$line missing \\f${format} terminator!\n";
227*6236dae4SAndroid Build Coastguard Worker                $errors++;
228*6236dae4SAndroid Build Coastguard Worker            }
229*6236dae4SAndroid Build Coastguard Worker        }
230*6236dae4SAndroid Build Coastguard Worker        my $c = $_;
231*6236dae4SAndroid Build Coastguard Worker        while($c =~ s/\\f([BI])((lib|)curl[a-z_0-9-]*)\(([13])\)//i) {
232*6236dae4SAndroid Build Coastguard Worker            checkref($2, $4, $file, $line);
233*6236dae4SAndroid Build Coastguard Worker        }
234*6236dae4SAndroid Build Coastguard Worker        if(($_ =~ /\\f([BI])((libcurl|CURLOPT_|CURLSHOPT_|CURLINFO_|CURLMOPT_|curl_easy_|curl_multi_|curl_url|curl_mime|curl_global|curl_share)[a-zA-Z_0-9-]+)(.)/) &&
235*6236dae4SAndroid Build Coastguard Worker           ($4 ne "(")) {
236*6236dae4SAndroid Build Coastguard Worker            print STDERR "$file:$line curl ref to $2 without section\n";
237*6236dae4SAndroid Build Coastguard Worker            $errors++;
238*6236dae4SAndroid Build Coastguard Worker        }
239*6236dae4SAndroid Build Coastguard Worker        if($_ =~ /(.*)\\f([^BIP])/) {
240*6236dae4SAndroid Build Coastguard Worker            my ($pre, $format) = ($1, $2);
241*6236dae4SAndroid Build Coastguard Worker            if($pre !~ /\\\z/) {
242*6236dae4SAndroid Build Coastguard Worker                # only if there wasn't another backslash before the \f
243*6236dae4SAndroid Build Coastguard Worker                print STDERR "$file:$line suspicious \\f format!\n";
244*6236dae4SAndroid Build Coastguard Worker                $errors++;
245*6236dae4SAndroid Build Coastguard Worker            }
246*6236dae4SAndroid Build Coastguard Worker        }
247*6236dae4SAndroid Build Coastguard Worker        if(($SH =~ /^(DESCRIPTION|RETURN VALUE|AVAILABILITY)/i) &&
248*6236dae4SAndroid Build Coastguard Worker           ($_ =~ /(.*)((curl_multi|curl_easy|curl_url|curl_global|curl_url|curl_share)[a-zA-Z_0-9-]+)/) &&
249*6236dae4SAndroid Build Coastguard Worker           ($1 !~ /\\fI$/)) {
250*6236dae4SAndroid Build Coastguard Worker            print STDERR "$file:$line unrefed curl call: $2\n";
251*6236dae4SAndroid Build Coastguard Worker            $errors++;
252*6236dae4SAndroid Build Coastguard Worker        }
253*6236dae4SAndroid Build Coastguard Worker
254*6236dae4SAndroid Build Coastguard Worker
255*6236dae4SAndroid Build Coastguard Worker        if($optpage && $SH && ($SH !~ /^(SYNOPSIS|EXAMPLE|NAME|SEE ALSO)/i) &&
256*6236dae4SAndroid Build Coastguard Worker           ($_ =~ /(.*)(CURL(OPT_|MOPT_|INFO_|SHOPT_)[A-Z0-9_]*)/)) {
257*6236dae4SAndroid Build Coastguard Worker            # an option with its own manpage, check that it is tagged
258*6236dae4SAndroid Build Coastguard Worker            # for linking
259*6236dae4SAndroid Build Coastguard Worker            my ($pref, $symbol) = ($1, $2);
260*6236dae4SAndroid Build Coastguard Worker            if($deprecated{$symbol}) {
261*6236dae4SAndroid Build Coastguard Worker                # let it be
262*6236dae4SAndroid Build Coastguard Worker            }
263*6236dae4SAndroid Build Coastguard Worker            elsif($pref !~ /\\fI\z/) {
264*6236dae4SAndroid Build Coastguard Worker                print STDERR "$file:$line option $symbol missing \\fI tagging\n";
265*6236dae4SAndroid Build Coastguard Worker                $errors++;
266*6236dae4SAndroid Build Coastguard Worker            }
267*6236dae4SAndroid Build Coastguard Worker        }
268*6236dae4SAndroid Build Coastguard Worker        if($_ =~ /[ \t]+$/) {
269*6236dae4SAndroid Build Coastguard Worker            print STDERR "$file:$line trailing whitespace\n";
270*6236dae4SAndroid Build Coastguard Worker            $errors++;
271*6236dae4SAndroid Build Coastguard Worker        }
272*6236dae4SAndroid Build Coastguard Worker        $line++;
273*6236dae4SAndroid Build Coastguard Worker    }
274*6236dae4SAndroid Build Coastguard Worker    close($m);
275*6236dae4SAndroid Build Coastguard Worker
276*6236dae4SAndroid Build Coastguard Worker    if(@separators) {
277*6236dae4SAndroid Build Coastguard Worker        # all except the last one need comma
278*6236dae4SAndroid Build Coastguard Worker        for(0 .. $#separators - 1) {
279*6236dae4SAndroid Build Coastguard Worker            my $l = $_;
280*6236dae4SAndroid Build Coastguard Worker            my $sep = $separators[$l];
281*6236dae4SAndroid Build Coastguard Worker            if($sep ne ",") {
282*6236dae4SAndroid Build Coastguard Worker                printf STDERR "$file:%d: bad not-last SEE ALSO separator: '%s'\n",
283*6236dae4SAndroid Build Coastguard Worker                    $sepline[$l], $sep;
284*6236dae4SAndroid Build Coastguard Worker                $errors++;
285*6236dae4SAndroid Build Coastguard Worker            }
286*6236dae4SAndroid Build Coastguard Worker        }
287*6236dae4SAndroid Build Coastguard Worker        # the last one should not do comma
288*6236dae4SAndroid Build Coastguard Worker        my $sep = $separators[$#separators];
289*6236dae4SAndroid Build Coastguard Worker        if($sep eq ",") {
290*6236dae4SAndroid Build Coastguard Worker            printf STDERR "$file:%d: superfluous comma separator\n",
291*6236dae4SAndroid Build Coastguard Worker                $sepline[$#separators];
292*6236dae4SAndroid Build Coastguard Worker            $errors++;
293*6236dae4SAndroid Build Coastguard Worker        }
294*6236dae4SAndroid Build Coastguard Worker    }
295*6236dae4SAndroid Build Coastguard Worker
296*6236dae4SAndroid Build Coastguard Worker    if($reqex) {
297*6236dae4SAndroid Build Coastguard Worker        # only for libcurl options man-pages
298*6236dae4SAndroid Build Coastguard Worker
299*6236dae4SAndroid Build Coastguard Worker        my $shcount = scalar(@sh); # before @sh gets shifted
300*6236dae4SAndroid Build Coastguard Worker        if($exsize < 2) {
301*6236dae4SAndroid Build Coastguard Worker            print STDERR "$file:$line missing EXAMPLE section\n";
302*6236dae4SAndroid Build Coastguard Worker            $errors++;
303*6236dae4SAndroid Build Coastguard Worker        }
304*6236dae4SAndroid Build Coastguard Worker
305*6236dae4SAndroid Build Coastguard Worker        if($shcount < 3) {
306*6236dae4SAndroid Build Coastguard Worker            print STDERR "$file:$line too few manpage sections!\n";
307*6236dae4SAndroid Build Coastguard Worker            $errors++;
308*6236dae4SAndroid Build Coastguard Worker            return;
309*6236dae4SAndroid Build Coastguard Worker        }
310*6236dae4SAndroid Build Coastguard Worker
311*6236dae4SAndroid Build Coastguard Worker        my $got = "start";
312*6236dae4SAndroid Build Coastguard Worker        my $i = 0;
313*6236dae4SAndroid Build Coastguard Worker        my $shused = 1;
314*6236dae4SAndroid Build Coastguard Worker        my @shorig = @sh;
315*6236dae4SAndroid Build Coastguard Worker        my @order = $optpage ? @optorder : @funcorder;
316*6236dae4SAndroid Build Coastguard Worker        my $blessed = $optpage ? \%optblessed : \%funcblessed;
317*6236dae4SAndroid Build Coastguard Worker
318*6236dae4SAndroid Build Coastguard Worker        while($got) {
319*6236dae4SAndroid Build Coastguard Worker            my $finesh;
320*6236dae4SAndroid Build Coastguard Worker            $got = shift(@sh);
321*6236dae4SAndroid Build Coastguard Worker            if($got) {
322*6236dae4SAndroid Build Coastguard Worker                if($$blessed{$got}) {
323*6236dae4SAndroid Build Coastguard Worker                    $i = $$blessed{$got};
324*6236dae4SAndroid Build Coastguard Worker                    $finesh = $got; # a mandatory one
325*6236dae4SAndroid Build Coastguard Worker                }
326*6236dae4SAndroid Build Coastguard Worker            }
327*6236dae4SAndroid Build Coastguard Worker            if($i && defined($finesh)) {
328*6236dae4SAndroid Build Coastguard Worker                # mandatory section
329*6236dae4SAndroid Build Coastguard Worker
330*6236dae4SAndroid Build Coastguard Worker                if($i != $shused) {
331*6236dae4SAndroid Build Coastguard Worker                    printf STDERR "$file:%u Got %s, when %s was expected\n",
332*6236dae4SAndroid Build Coastguard Worker                        $shline{$finesh},
333*6236dae4SAndroid Build Coastguard Worker                        $finesh,
334*6236dae4SAndroid Build Coastguard Worker                        $order[$shused-1];
335*6236dae4SAndroid Build Coastguard Worker                    $errors++;
336*6236dae4SAndroid Build Coastguard Worker                    return;
337*6236dae4SAndroid Build Coastguard Worker                }
338*6236dae4SAndroid Build Coastguard Worker                $shused++;
339*6236dae4SAndroid Build Coastguard Worker                if($i == scalar(@order)) {
340*6236dae4SAndroid Build Coastguard Worker                    # last mandatory one, exit
341*6236dae4SAndroid Build Coastguard Worker                    last;
342*6236dae4SAndroid Build Coastguard Worker                }
343*6236dae4SAndroid Build Coastguard Worker            }
344*6236dae4SAndroid Build Coastguard Worker        }
345*6236dae4SAndroid Build Coastguard Worker
346*6236dae4SAndroid Build Coastguard Worker        if($i != scalar(@order)) {
347*6236dae4SAndroid Build Coastguard Worker            printf STDERR "$file:$line missing mandatory section: %s\n",
348*6236dae4SAndroid Build Coastguard Worker                $order[$i];
349*6236dae4SAndroid Build Coastguard Worker            printf STDERR "$file:$line section found at index %u: '%s'\n",
350*6236dae4SAndroid Build Coastguard Worker                $i, $shorig[$i];
351*6236dae4SAndroid Build Coastguard Worker            printf STDERR " Found %u used sections\n", $shcount;
352*6236dae4SAndroid Build Coastguard Worker            $errors++;
353*6236dae4SAndroid Build Coastguard Worker        }
354*6236dae4SAndroid Build Coastguard Worker    }
355*6236dae4SAndroid Build Coastguard Worker}
356*6236dae4SAndroid Build Coastguard Worker
357*6236dae4SAndroid Build Coastguard Workerallsymbols();
358*6236dae4SAndroid Build Coastguard Worker
359*6236dae4SAndroid Build Coastguard Workerif(!$symbol{'CURLALTSVC_H1'}) {
360*6236dae4SAndroid Build Coastguard Worker    print STDERR "didn't get the symbols-in-version!\n";
361*6236dae4SAndroid Build Coastguard Worker    exit;
362*6236dae4SAndroid Build Coastguard Worker}
363*6236dae4SAndroid Build Coastguard Worker
364*6236dae4SAndroid Build Coastguard Workermy $ind = 1;
365*6236dae4SAndroid Build Coastguard Workerfor my $s (@optorder) {
366*6236dae4SAndroid Build Coastguard Worker    $optblessed{$s} = $ind++
367*6236dae4SAndroid Build Coastguard Worker}
368*6236dae4SAndroid Build Coastguard Worker$ind = 1;
369*6236dae4SAndroid Build Coastguard Workerfor my $s (@funcorder) {
370*6236dae4SAndroid Build Coastguard Worker    $funcblessed{$s} = $ind++
371*6236dae4SAndroid Build Coastguard Worker}
372*6236dae4SAndroid Build Coastguard Worker
373*6236dae4SAndroid Build Coastguard Workerfor my $m (@manpages) {
374*6236dae4SAndroid Build Coastguard Worker    $docsdirs{dirname($m)}++;
375*6236dae4SAndroid Build Coastguard Worker}
376*6236dae4SAndroid Build Coastguard Worker
377*6236dae4SAndroid Build Coastguard Workerfor my $m (@manpages) {
378*6236dae4SAndroid Build Coastguard Worker    scanmanpage($m);
379*6236dae4SAndroid Build Coastguard Worker}
380*6236dae4SAndroid Build Coastguard Worker
381*6236dae4SAndroid Build Coastguard Workerprint STDERR "ok\n" if(!$errors);
382*6236dae4SAndroid Build Coastguard Worker
383*6236dae4SAndroid Build Coastguard Workerexit $errors;
384