2 #***************************************************************************
4 # Project ___| | | | _ \| |
6 # | (__| |_| | _ <| |___
7 # \___|\___/|_| \_\_____|
9 # Copyright (C) 2016, 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 root pointed out
43 my $root=$ARGV[0] || ".";
44 my $syms = "$root/docs/libcurl/symbols-in-versions";
45 my $curlh = "$root/include/curl/curl.h";
48 # the prepopulated alias list is the CURLINFO_* defines that are used for the
49 # debug function callback and the fact that they use the same prefix as the
50 # curl_easy_getinfo options was a mistake.
52 'CURLINFO_DATA_IN' => 'none',
53 'CURLINFO_DATA_OUT' => 'none',
54 'CURLINFO_END' => 'none',
55 'CURLINFO_HEADER_IN' => 'none',
56 'CURLINFO_HEADER_OUT' => 'none',
57 'CURLINFO_LASTONE' => 'none',
58 'CURLINFO_NONE' => 'none',
59 'CURLINFO_SSL_DATA_IN' => 'none',
60 'CURLINFO_SSL_DATA_OUT' => 'none',
61 'CURLINFO_TEXT' => 'none'
65 my ($file, @words) = @_;
71 foreach my $m (@words) {
73 my @g = grep(/^\.IP $m/, @m);
75 print STDERR "Missing mention of $m in $file\n";
81 # check for define alises
85 if(/^\#define (CURL(OPT|INFO|MOPT)_\w+) (.*)/) {
99 if($l =~ /(CURL(OPT|INFO|MOPT)_\w+) *([0-9.]*) *([0-9.-]*) *([0-9.]*)/) {
100 my ($opt, $type, $add, $dep, $rem) = ($1, $2, $3, $4, $5);
103 #print "$opt => $alias{$opt}\n";
106 # $opt was removed in $rem
107 # so don't check for that
113 elsif($type eq "INFO") {
114 push @curlinfo, $opt,
116 elsif($type eq "MOPT") {
117 push @curlmopt, $opt,
119 if(! -f "$root/docs/libcurl/opts/$opt.3") {
120 print STDERR "Missing $opt.3\n";
128 scanmanpage("$root/docs/libcurl/curl_easy_setopt.3", @curlopt);
129 scanmanpage("$root/docs/libcurl/curl_easy_getinfo.3", @curlinfo);
130 scanmanpage("$root/docs/libcurl/curl_multi_setopt.3", @curlmopt);
132 # using this hash array, we can whitelist specific options
134 # pretend these --no options exists in tool_getparam.c
137 '-N, --no-buffer' => 1,
138 '--no-sessionid' => 1,
139 '--no-keepalive' => 1,
141 # pretend these options without -no exist in curl.1 and tool_help.c
150 # deprecated options do not need to be in curl -h output
153 '--ftp-ssl-reqd' => 4,
155 # for tests and debug only, can remain hidden
161 #########################################################################
162 # parse the curl code that parses the command line arguments!
163 open(R, "<$root/src/tool_getparam.c") ||
166 my @getparam; # store all parsed parameters
171 if(/struct LongShort aliases/) {
175 if( /^ \{([^,]*), *([^ ]*)/) {
176 my ($s, $l)=($1, $2);
180 if($l =~ /\"(.*)\"/) {
185 if($s =~ /\"(.)\"/) {
188 $title="-$sh, $title";
190 push @getparam, $title;
197 #########################################################################
198 # parse the curl.1 man page, extract all documented command line options
199 open(R, "<$root/docs/curl.1") ||
201 my @manpage; # store all parsed parameters
205 if(/^\.IP \"(-[^\"]*)\"/) {
208 if($str =~ /^-(.), --([a-z0-9.-]*)/) {
209 # figure out the -short, --long combo
210 $combo = "-$1, --$2";
212 elsif($str =~ /^--([a-z0-9.-]*)/) {
213 # figure out the --long name
217 push @manpage, $combo;
225 #########################################################################
226 # parse the curl code that outputs the curl -h list
227 open(R, "<$root/src/tool_help.c") ||
229 my @toolhelp; # store all parsed parameters
236 if($str =~ /^-(.), --([a-z0-9.-]*)/) {
237 # figure out the -short, --long combo
238 $combo = "-$1, --$2";
240 elsif($str =~ /^--([a-z0-9.-]*)/) {
241 # figure out the --long name
245 push @toolhelp, $combo;
254 # Now we have three arrays with options to cross-reference.
256 foreach my $o (keys %opts) {
257 my $where = $opts{$o};
260 # this is not in all three places
265 $exists=" tool_getparam.c";
268 $missing=" tool_getparam.c";
274 $missing.= " curl.1";
277 $exists .= " tool_help.c";
280 $missing .= " tool_help.c";
283 print STDERR "$o is not in$missing (but in$exists)\n";