2 #***************************************************************************
4 # Project ___| | | | _ \| |
6 # | (__| |_| | _ <| |___
7 # \___|\___/|_| \_\_____|
9 # Copyright (C) 2016, 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
11 # This software is licensed as described in the file COPYING, which
12 # you should have received as part of this distribution. The terms
13 # are also available at https://curl.haxx.se/docs/copyright.html.
15 # You may opt to use, copy, modify, merge, publish, distribute and/or sell
16 # copies of the Software, and permit persons to whom the Software is
17 # furnished to do so, under the terms of the COPYING file.
19 # This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
20 # KIND, either express or implied.
22 ###########################################################################
24 # Scan symbols-in-version (which is verified to be correct by test 1119), then
25 # verify that each option mention in there that should have its own man page
28 # In addition, make sure that every current option to curl_easy_setopt,
29 # curl_easy_getinfo and curl_multi_setopt are also mentioned in their
30 # corresponding main (index) man page.
32 # src/tool_getparam.c lists all options curl can parse
33 # docs/curl.1 documents all command line options
34 # src/tool_help.c outputs all options with curl -h
35 # - make sure they're all in sync
37 # Output all deviances to stderr.
42 # we may get the dir roots pointed out
43 my $root=$ARGV[0] || ".";
44 my $buildroot=$ARGV[1] || ".";
45 my $syms = "$root/docs/libcurl/symbols-in-versions";
46 my $curlh = "$root/include/curl/curl.h";
49 # the prepopulated alias list is the CURLINFO_* defines that are used for the
50 # debug function callback and the fact that they use the same prefix as the
51 # curl_easy_getinfo options was a mistake.
53 'CURLINFO_DATA_IN' => 'none',
54 'CURLINFO_DATA_OUT' => 'none',
55 'CURLINFO_END' => 'none',
56 'CURLINFO_HEADER_IN' => 'none',
57 'CURLINFO_HEADER_OUT' => 'none',
58 'CURLINFO_LASTONE' => 'none',
59 'CURLINFO_NONE' => 'none',
60 'CURLINFO_SSL_DATA_IN' => 'none',
61 'CURLINFO_SSL_DATA_OUT' => 'none',
62 'CURLINFO_TEXT' => 'none'
66 my ($file, @words) = @_;
72 foreach my $m (@words) {
74 my @g = grep(/^\.IP $m/, @m);
76 print STDERR "Missing mention of $m in $file\n";
82 # check for define alises
86 if(/^\#define (CURL(OPT|INFO|MOPT)_\w+) (.*)/) {
100 if($l =~ /(CURL(OPT|INFO|MOPT)_\w+) *([0-9.]*) *([0-9.-]*) *([0-9.]*)/) {
101 my ($opt, $type, $add, $dep, $rem) = ($1, $2, $3, $4, $5);
104 #print "$opt => $alias{$opt}\n";
107 # $opt was removed in $rem
108 # so don't check for that
114 elsif($type eq "INFO") {
115 push @curlinfo, $opt,
117 elsif($type eq "MOPT") {
118 push @curlmopt, $opt,
120 if(! -f "$root/docs/libcurl/opts/$opt.3") {
121 print STDERR "Missing $opt.3\n";
129 scanmanpage("$root/docs/libcurl/curl_easy_setopt.3", @curlopt);
130 scanmanpage("$root/docs/libcurl/curl_easy_getinfo.3", @curlinfo);
131 scanmanpage("$root/docs/libcurl/curl_multi_setopt.3", @curlmopt);
133 # using this hash array, we can whitelist specific options
135 # pretend these --no options exists in tool_getparam.c
138 '-N, --no-buffer' => 1,
139 '--no-sessionid' => 1,
140 '--no-keepalive' => 1,
142 # pretend these options without -no exist in curl.1 and tool_help.c
151 # deprecated options do not need to be in tool_help.c nor curl.1
154 '--ftp-ssl-reqd' => 6,
156 # for tests and debug only, can remain hidden
162 #########################################################################
163 # parse the curl code that parses the command line arguments!
164 open(R, "<$root/src/tool_getparam.c") ||
167 my @getparam; # store all parsed parameters
172 if(/struct LongShort aliases/) {
176 if( /^ \{([^,]*), *([^ ]*)/) {
177 my ($s, $l)=($1, $2);
181 if($l =~ /\"(.*)\"/) {
186 if($s =~ /\"(.)\"/) {
189 $title="-$sh, $title";
191 push @getparam, $title;
198 #########################################################################
199 # parse the curl.1 man page, extract all documented command line options
200 # The man page may or may not be rebuilt, so check both possible locations
201 open(R, "<$buildroot/docs/curl.1") || open(R, "<$root/docs/curl.1") ||
203 my @manpage; # store all parsed parameters
207 if(/^\.IP \"(-[^\"]*)\"/) {
210 if($str =~ /^-(.), --([a-z0-9.-]*)/) {
211 # figure out the -short, --long combo
212 $combo = "-$1, --$2";
214 elsif($str =~ /^--([a-z0-9.-]*)/) {
215 # figure out the --long name
219 push @manpage, $combo;
227 #########################################################################
228 # parse the curl code that outputs the curl -h list
229 open(R, "<$root/src/tool_help.c") ||
231 my @toolhelp; # store all parsed parameters
238 if($str =~ /^-(.), --([a-z0-9.-]*)/) {
239 # figure out the -short, --long combo
240 $combo = "-$1, --$2";
242 elsif($str =~ /^--([a-z0-9.-]*)/) {
243 # figure out the --long name
247 push @toolhelp, $combo;
256 # Now we have three arrays with options to cross-reference.
258 foreach my $o (keys %opts) {
259 my $where = $opts{$o};
262 # this is not in all three places
267 $exists=" tool_getparam.c";
270 $missing=" tool_getparam.c";
276 $missing.= " curl.1";
279 $exists .= " tool_help.c";
282 $missing .= " tool_help.c";
285 print STDERR "$o is not in$missing (but in$exists)\n";