| #!/usr/bin/env perl | |
| #*************************************************************************** | |
| # _ _ ____ _ | |
| # Project ___| | | | _ \| | | |
| # / __| | | | |_) | | | |
| # | (__| |_| | _ <| |___ | |
| # \___|\___/|_| \_\_____| | |
| # | |
| # Copyright (C) Daniel Stenberg, <daniel@haxx.se>, et al. | |
| # | |
| # This software is licensed as described in the file COPYING, which | |
| # you should have received as part of this distribution. The terms | |
| # are also available at https://curl.se/docs/copyright.html. | |
| # | |
| # You may opt to use, copy, modify, merge, publish, distribute and/or sell | |
| # copies of the Software, and permit persons to whom the Software is | |
| # furnished to do so, under the terms of the COPYING file. | |
| # | |
| # This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY | |
| # KIND, either express or implied. | |
| # | |
| # SPDX-License-Identifier: curl | |
| # | |
| ########################################################################### | |
| my @files = @ARGV; | |
| my $cfile = "test.c"; | |
| my $check = "./scripts/checksrc.pl"; | |
| my $error; | |
| if($files[0] eq "-h") { | |
| print "Usage: verify-synopsis [man pages]\n"; | |
| exit; | |
| } | |
| sub testcompile { | |
| my $rc = system("gcc -c test.c -DCURL_DISABLE_TYPECHECK -DCURL_ALLOW_OLD_MULTI_SOCKET -DCURL_DISABLE_DEPRECATION -Wunused -Werror -Wno-unused-but-set-variable -I include") >> 8; | |
| return $rc; | |
| } | |
| sub checksrc { | |
| my $rc = system("$check test.c") >> 8; | |
| return $rc; | |
| } | |
| sub extract { | |
| my($f) = @_; | |
| my $syn = 0; | |
| my $l = 0; | |
| my $iline = 0; | |
| my $fail = 0; | |
| open(F, "<$f") or die "failed opening input file $f : $!"; | |
| open(O, ">$cfile") or die "failed opening output file $cfile : $!"; | |
| print O "#include <curl/curl.h>\n"; | |
| while(<F>) { | |
| $iline++; | |
| if(/^.SH EXAMPLE/) { | |
| $syn = 1 | |
| } | |
| elsif($syn == 1) { | |
| if(/^.nf/) { | |
| $syn++; | |
| print O "/* !checksrc! disable UNUSEDIGNORE all */\n"; | |
| print O "/* !checksrc! disable COPYRIGHT all */\n"; | |
| print O "/* !checksrc! disable FOPENMODE all */\n"; | |
| printf O "#line %d \"$f\"\n", $iline+1; | |
| } | |
| } | |
| elsif($syn == 2) { | |
| if(/^.fi/) { | |
| last; | |
| } | |
| if(/(?<!\\)(?:\\{2})*\\(?!\\)/) { | |
| print STDERR | |
| "Error while processing file $f line $iline:\n$_" . | |
| "Error: Single backslashes \\ are not properly shown in " . | |
| "manpage EXAMPLE output unless they are escaped \\\\.\n"; | |
| $fail = 1; | |
| $error = 1; | |
| last; | |
| } | |
| # two backslashes become one | |
| $_ =~ s/\\\\/\\/g; | |
| print O $_; | |
| $l++; | |
| } | |
| } | |
| close(F); | |
| close(O); | |
| return ($fail ? 0 : $l); | |
| } | |
| my $count; | |
| for my $m (@files) { | |
| #print "Verify $m\n"; | |
| my $out = extract($m); | |
| if($out) { | |
| $error |= testcompile($m); | |
| $error |= checksrc($m); | |
| } | |
| $count++; | |
| } | |
| if(!$error) { | |
| print "Verified $count man pages ok\n"; | |
| } | |
| else { | |
| print "Detected problems\n"; | |
| } | |
| exit $error; |