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