#!/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
#
###########################################################################

# Check that libcurl-errors.3 and the public header files have the same set of
# error codes.

use strict;
use warnings;

# we may get the directory roots pointed out
my $root = $ARGV[0] || ".";
my $buildroot = $ARGV[1] || ".";
my $manpge = "$buildroot/docs/libcurl/libcurl-errors.3";
my $curlh = "$root/include/curl";
my $errors = 0;

my @hnames;
my %wherefrom;
my @mnames;
my %manfrom;

sub scanheader {
    my ($file) = @_;
    open H, "<$file";
    my $line = 0;
    while(<H>) {
        $line++;
        if($_ =~ /^  (CURL(E|UE|SHE|HE|M)_[A-Z0-9_]*)/) {
            my ($name) = ($1);
            if(($name !~ /(OBSOLETE|CURLE_RESERVED)/) && ($name !~ /_LAST\z/)) {
                push @hnames, $name;
                if($wherefrom{$name}) {
                    print STDERR "double: $name\n";
                }
                $wherefrom{$name} = "$file:$line";
            }
        }
    }
    close(H);
}

sub scanmanpage {
    my ($file) = @_;
    open H, "<$file";
    my $line = 0;
    while(<H>) {
        $line++;
        if($_ =~ /^\.IP \"(CURL(E|UE|SHE|HE|M)_[A-Z0-9_]*)/) {
            my ($name) = ($1);
            if($name !~ /(CURLM_CALL_MULTI_SOCKET)/) {
                push @mnames, $name;
                $manfrom{$name} = "$file:$line";
            }
        }
    }
    close(H);
}

opendir(my $dh, $curlh) || die "Cannot opendir $curlh: $!";
my @hfiles = grep { /\.h$/ } readdir($dh);
closedir $dh;

for(sort @hfiles) {
    scanheader("$curlh/$_");
}
scanmanpage($manpge);

print "Result\n";
for my $h (sort @hnames) {
    if(!$manfrom{$h}) {
        printf "$h from %s, not in man page\n", $wherefrom{$h};
    }
}

for my $m (sort @mnames) {
    if(!$wherefrom{$m}) {
        printf "$m from %s, not in any header\n", $manfrom{$m};
    }
}
