1#!/usr/bin/perl
2
3my %include = ();
4my %included = ();
5
6for my $text (<*.txt>) {
7    open I, '<', $text || die "cannot read: $text";
8    while (<I>) {
9	if (/^include::/) {
10	    chomp;
11	    s/^include::\s*//;
12	    s/\[\]//;
13	    $include{$text}{$_} = 1;
14	    $included{$_} = 1;
15	}
16    }
17    close I;
18}
19
20# Do we care about chained includes???
21my $changed = 1;
22while ($changed) {
23    $changed = 0;
24    while (my ($text, $included) = each %include) {
25	for my $i (keys %$included) {
26	    # $text has include::$i; if $i includes $j
27	    # $text indirectly includes $j.
28	    if (exists $include{$i}) {
29		for my $j (keys %{$include{$i}}) {
30		    if (!exists $include{$text}{$j}) {
31			$include{$text}{$j} = 1;
32			$included{$j} = 1;
33			$changed = 1;
34		    }
35		}
36	    }
37	}
38    }
39}
40
41while (my ($text, $included) = each %include) {
42    if (! exists $included{$text} &&
43	(my $base = $text) =~ s/\.txt$//) {
44	print "$base.html $base.xml : ", join(" ", keys %$included), "\n";
45    }
46}
47