|
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 |
}
|