Blame local/minimalist/feature-makedocs

Packit fcad23
#!/usr/bin/perl
Packit fcad23
Packit fcad23
use strict;
Packit fcad23
use IO::File;
Packit fcad23
use Getopt::Std;
Packit fcad23
our %opts = (W => 2);
Packit fcad23
Packit fcad23
getopts('ohwW:', \%opts) || usage();
Packit fcad23
Packit fcad23
usage() if ($opts{'h'});
Packit fcad23
Packit fcad23
usage() if ($#ARGV != 1);
Packit fcad23
Packit fcad23
# should be the feature-details.h file
Packit fcad23
my $inputfile = shift @ARGV;
Packit fcad23
my $outputfile = shift @ARGV;
Packit fcad23
Packit fcad23
my %features;
Packit fcad23
my %top;
Packit fcad23
my %files;
Packit fcad23
my $reqfile;
Packit fcad23
Packit fcad23
gather_data($inputfile);
Packit fcad23
if ($opts{'w'}) {
Packit fcad23
    print_wiki_mode($outputfile);
Packit fcad23
} else {
Packit fcad23
    print_org_mode($outputfile);
Packit fcad23
}
Packit fcad23
Packit fcad23
sub gather_data {
Packit fcad23
    my ($inputfile) = @_;
Packit fcad23
Packit fcad23
    open(I, $inputfile);
Packit fcad23
    while() {
Packit fcad23
	if (/(required|provided|wanted) by (.*) \*/) {
Packit fcad23
	    $reqfile = $2;
Packit fcad23
	} elsif (/define NETSNMP_FEATURE_PROVIDE_(.*) 1/) {
Packit fcad23
	    my $lc = lc($1);
Packit fcad23
	    die "no reqfile currently set; bug!" if (!defined($reqfile));
Packit fcad23
Packit fcad23
	    add($lc);
Packit fcad23
Packit fcad23
	    push @{$files{$reqfile}{'provides'}}, $lc;
Packit fcad23
	    push @{$features{$lc}{'providedby'}}, $reqfile;
Packit fcad23
Packit fcad23
	} elsif (/define NETSNMP_FEATURE_REQUIRE_(.*) 1/) {
Packit fcad23
	    my $lc = lc($1);
Packit fcad23
	    die "no reqfile currently set; bug!" if (!defined($reqfile));
Packit fcad23
Packit fcad23
	    add($lc);
Packit fcad23
Packit fcad23
	    push @{$files{$reqfile}{'requires'}}, $lc;
Packit fcad23
	    push @{$features{$lc}{'requiredby'}}, $reqfile;
Packit fcad23
Packit fcad23
	} elsif (/define NETSNMP_FEATURE_WANT_(.*) 1/) {
Packit fcad23
	    my $lc = lc($1);
Packit fcad23
	    die "no reqfile currently set; bug!" if (!defined($reqfile));
Packit fcad23
Packit fcad23
	    add($lc);
Packit fcad23
Packit fcad23
	    push @{$files{$reqfile}{'wants'}}, $lc;
Packit fcad23
	    push @{$features{$lc}{'wantedby'}}, $reqfile;
Packit fcad23
	} elsif (/define NETSNMP_FEATURE_(.*)_CHILD_OF_(.*) 1/) {
Packit fcad23
	    my $child = lc($1);
Packit fcad23
	    my $parent = lc($2);
Packit fcad23
Packit fcad23
	    add_child($child, $parent);
Packit fcad23
	}
Packit fcad23
    }
Packit fcad23
}
Packit fcad23
Packit fcad23
sub add {
Packit fcad23
    my ($name) = @_;
Packit fcad23
    if (!exists($features{$name})) {
Packit fcad23
	# new feature entirely, mark it as a top node
Packit fcad23
	$top{$name} = 1;
Packit fcad23
    }
Packit fcad23
}
Packit fcad23
Packit fcad23
sub add_child {
Packit fcad23
    my ($child, $parent) = @_;
Packit fcad23
Packit fcad23
    add($parent);
Packit fcad23
Packit fcad23
    if (exists($top{$child})) {
Packit fcad23
	# it's no longer a top node if it's a child of something else
Packit fcad23
	delete $top{$child};
Packit fcad23
    }
Packit fcad23
    $features{$parent}{'children'}{$child}++;
Packit fcad23
Packit fcad23
    $features{$child}{'providedby'}, $reqfile;
Packit fcad23
}
Packit fcad23
Packit fcad23
######################################################################
Packit fcad23
# org-mode output
Packit fcad23
#
Packit fcad23
sub print_org_mode {
Packit fcad23
    my ($outputfile) = @_;
Packit fcad23
Packit fcad23
    my $fh = new IO::File;
Packit fcad23
Packit fcad23
    if (!$fh->open("> $outputfile")) {
Packit fcad23
	die "error!\n";
Packit fcad23
    }
Packit fcad23
Packit fcad23
    foreach my $node (sort keys(%top)) {
Packit fcad23
	print_org_node($fh, $node, "*");
Packit fcad23
    }
Packit fcad23
}
Packit fcad23
Packit fcad23
sub print_org_node {
Packit fcad23
    my ($fh, $node, $prefix) = @_;
Packit fcad23
Packit fcad23
    my $spaces = $prefix;
Packit fcad23
    $spaces =~ s/./ /g;
Packit fcad23
Packit fcad23
    print $fh "$prefix $node\n";
Packit fcad23
    if (exists($features{$node}{'providedby'})) {
Packit fcad23
	print $fh "$spaces + provided in file: " .
Packit fcad23
	    join(", ", org_link_files(@{$features{$node}{'providedby'}})) . "\n";
Packit fcad23
    }
Packit fcad23
    if (exists($features{$node}{'requiredby'})) {
Packit fcad23
	print $fh "$spaces + required in file: " .
Packit fcad23
	    join(", ", org_link_files(@{$features{$node}{'requiredby'}})) . "\n";
Packit fcad23
    }
Packit fcad23
    if (exists($features{$node}{'wantedby'})) {
Packit fcad23
	print $fh "$spaces + wanted in file: " .
Packit fcad23
	    join(", ", org_link_files(@{$features{$node}{'wantedby'}})) . "\n";
Packit fcad23
    }
Packit fcad23
    if (exists($features{$node}{'children'})) {
Packit fcad23
	foreach my $child (sort keys(%{$features{$node}{'children'}})) {
Packit fcad23
	    print_org_node($fh, $child, $prefix . "*");
Packit fcad23
	}
Packit fcad23
    }
Packit fcad23
}
Packit fcad23
Packit fcad23
sub org_link_files {
Packit fcad23
    my @files = @_;
Packit fcad23
    map { $_ = "[[file:$_][$_]]"; } @files;
Packit fcad23
    return @files;
Packit fcad23
}
Packit fcad23
Packit fcad23
######################################################################
Packit fcad23
# wiki output
Packit fcad23
#
Packit fcad23
sub print_wiki_mode {
Packit fcad23
    my ($outputfile) = @_;
Packit fcad23
Packit fcad23
    my $fh = new IO::File;
Packit fcad23
    my $depth = 0;
Packit fcad23
Packit fcad23
    if (!$fh->open("> $outputfile")) {
Packit fcad23
	die "error!\n";
Packit fcad23
    }
Packit fcad23
Packit fcad23
    print $fh "'''The contents of this page is auto-generated from local/minimalist/feature-makedocs; do not edit by hand (changes will be lost)'''\n\n";
Packit fcad23
    print $fh "Details of the feature marking system and how it is used can be found at [[Feature Marking and Selection]]\n\n";
Packit fcad23
Packit fcad23
    foreach my $node (sort keys(%top)) {
Packit fcad23
	print_wiki_node($fh, $node, $depth+1);
Packit fcad23
    }
Packit fcad23
}
Packit fcad23
Packit fcad23
sub print_wiki_node {
Packit fcad23
    my ($fh, $node, $depth) = @_;
Packit fcad23
Packit fcad23
    my $dataheader;
Packit fcad23
    my $depthincrease = 1;
Packit fcad23
Packit fcad23
    if ($depth > $opts{'W'}) {
Packit fcad23
	print $fh "*" x ($depth - $opts{'W'} + 1) . " $node\n";
Packit fcad23
	$dataheader = "*" x ($depth - $opts{'W'} + 2);
Packit fcad23
	$depthincrease++;
Packit fcad23
    } else {
Packit fcad23
	print $fh "=" x $depth . " $node " . "=" x $depth . "\n";
Packit fcad23
	$dataheader = "*";
Packit fcad23
    }
Packit fcad23
Packit fcad23
    if (exists($features{$node}{'providedby'})) {
Packit fcad23
	print $fh "$dataheader provided in file: " .
Packit fcad23
	    join(", ", wiki_link_files(@{$features{$node}{'providedby'}})) ."\n";
Packit fcad23
    }
Packit fcad23
    if (exists($features{$node}{'requiredby'})) {
Packit fcad23
	print $fh "$dataheader required in file: " .
Packit fcad23
	    join(", ", wiki_link_files(@{$features{$node}{'requiredby'}})) ."\n";
Packit fcad23
    }
Packit fcad23
    if (exists($features{$node}{'wantedby'})) {
Packit fcad23
	print $fh "$dataheader wanted in file: " .
Packit fcad23
	    join(", ", wiki_link_files(@{$features{$node}{'wantedby'}})) . "\n";
Packit fcad23
    }
Packit fcad23
    if (exists($features{$node}{'children'})) {
Packit fcad23
	if ($depth >= $opts{'W'}) {
Packit fcad23
	    print $fh "$dataheader Children:\n";
Packit fcad23
	}
Packit fcad23
	foreach my $child (sort keys(%{$features{$node}{'children'}})) {
Packit fcad23
	    print_wiki_node($fh, $child, $depth + $depthincrease);
Packit fcad23
	}
Packit fcad23
    }
Packit fcad23
}
Packit fcad23
Packit fcad23
sub wiki_link_files {
Packit fcad23
    my @files = @_;
Packit fcad23
    map { $_ = "[http://net-snmp.svn.sourceforge.net/viewvc/net-snmp/trunk/net-snmp/$_?view=markup $_]"; } @files;
Packit fcad23
    return @files;
Packit fcad23
}
Packit fcad23
Packit fcad23
######################################################################
Packit fcad23
# help output
Packit fcad23
#
Packit fcad23
sub usage {
Packit fcad23
    print "Usage: $0 [FLAGS] INPUTFILE OUTPUTFILE\n\n";
Packit fcad23
    print "FLAGS:\n";
Packit fcad23
    print "\t-h\thelp\n";
Packit fcad23
    print "\t-o\tOutput style: Org-Mode [default]\n";
Packit fcad23
    print "\t-w\tOutput style: wiki\n";
Packit fcad23
    print "\t-W DEPTH\tWiki header to bullet list depth (default 2)\n";
Packit fcad23
    print "\nINPUT/OUTPUT\n";
Packit fcad23
    print "\tINPUTFILE:\tlocation of the include/net-snmp/feature-details.h file\n";
Packit fcad23
    print "\tOUTPUTFILE:\tthe file to write the results to\n";
Packit fcad23
    exit;
Packit fcad23
}