#!/usr/bin/perl -w
use strict;

my %options = ();
my %descOptions = ();
my %torrcSampleOptions = ();
my %torrcCompleteOptions = ();
my %manPageOptions = ();

# Load the canonical list as actually accepted by Tor.
my $mostRecentOption;
open(F, "./src/or/tor --list-torrc-options |") or die;
while (<F>) {
    next if m!\[notice\] Tor v0\.!;
    if (m!^([A-Za-z0-9_]+)!) {
        $mostRecentOption = lc $1;
        $options{$mostRecentOption} = 1;
    } elsif (m!^    !) {
        $descOptions{$mostRecentOption} = 1;
        if (m!\{DEPRECATED\}!) {
            delete $descOptions{$mostRecentOption};
            delete $options{$mostRecentOption};
        }
    } else {
        print "Unrecognized output> ";
        print;
    }
}
close F;

# Load the contents of torrc.sample and torrc.complete
sub loadTorrc {
    my ($fname, $options) = @_;
    local *F;
    open(F, "$fname") or die;
    while (<F>) {
        next if (m!##+!);
        if (m!#([A-Za-z0-9_]+)!) {
            $options->{lc $1} = 1;
        }
    }
    close F;
    0;
}

loadTorrc("./src/config/torrc.sample.in", \%torrcSampleOptions);
loadTorrc("./src/config/torrc.complete.in", \%torrcCompleteOptions);

# Try to figure out what's in the man page.

my $considerNextLine = 0;
open(F, "./doc/tor.1.in") or die;
while (<F>) {
    if ($considerNextLine and
        m!^\\fB([A-Za-z0-9_]+)!) {
        $manPageOptions{lc $1} = 1;
	next;
    }

    if (m!^\.(?:SH|TP|PP)!) {
        $considerNextLine = 1; next;
    } else {
        $considerNextLine = 0;
    }
}
close F;

# Now, display differences:

sub subtractHashes {
    my ($s, $a, $b) = @_;
    my @lst = ();
    for my $k (keys %$a) {
        push @lst, $k unless (exists $b->{$k});
    }
    print "$s: ", join(' ', sort @lst), "\n\n";
    0;
}

subtractHashes("No online docs", \%options, \%descOptions);
# subtractHashes("Orphaned online docs", \%descOptions, \%options);

subtractHashes("Not in torrc.complete.in", \%options, \%torrcCompleteOptions);
subtractHashes("Orphaned in torrc.complete.in", \%torrcCompleteOptions, \%options);
subtractHashes("Orphaned in torrc.sample.in", \%torrcSampleOptions, \%options);

subtractHashes("Not in man page", \%options, \%manPageOptions);
subtractHashes("Orphaned in man page", \%manPageOptions, \%options);


