--- /dev/null
+#!/usr/bin/perl
+
+use warnings;
+use strict;
+
+use Getopt::Long;
+
+Getopt::Long::Configure ("bundling");
+
+my $with_variants;
+my $file_names_only;
+my $dir;
+my $no_implied;
+my $variants_str;
+
+sub usage() {
+ print STDERR "$0 [-v#] [<options>] <spelling categories> <size>\n";
+ exit 1;
+}
+
+GetOptions ("dir|d=s", \$dir,
+ "with-variants|v=i", => \$with_variants,
+ "variants=s", \$variants_str,
+ "file-names-only|f", \$file_names_only,
+ "no-implied", \$no_implied) or usage();
+$dir = "final" unless defined $dir;
+
+my %spelling_map = qw(en-us american en-gb british? en-gb-ise british
+ en-gb-ize british_z en-gb-oed british_z en-ca canadian);
+$spelling_map{$_} = $_
+ foreach (qw(english special american british canadian
+ variant_0 variant_1 variant_2
+ british_variant_0 british_variant_1
+ canadian_variant_0 canadian_variant_1));
+
+die "Cannot specify both --with-variants and --variants" if $with_variants && $variants_str;
+$variants_str = "non" unless defined $variants_str || defined $with_variants;
+$variants_str = join(',', 'non', 0..$with_variants) if defined $with_variants;
+my %use_variant_level;
+foreach (split ',', $variants_str) {
+ die "Invalid variant num: $_" unless /^(non|[012])$/;
+ $use_variant_level{$_} = 1;
+}
+
+$no_implied = 1 unless $use_variant_level{non};
+
+usage unless @ARGV >= 2;
+
+my $SIZE = pop @ARGV;
+die "Invalid size: $SIZE\n" unless $SIZE =~ /^\d\d$/;
+
+my @SPS = map {my $sp = $_;
+ $sp =~ tr/_/-/;
+ $sp = $spelling_map{lc $sp};
+ die "Must specify en_GB-ise or en_GB-ize\n"
+ if $sp eq 'british?' && $use_variant_level{non};
+ $sp = 'british' if $sp eq 'british?';
+ die "Unknown spelling category: $_\n" unless defined $sp;
+ $sp;} @ARGV;
+my %SPS;
+$SPS{$_} = 1 foreach (@SPS);
+
+$SPS{english} = 1 unless $no_implied;
+$SPS{special} = 1 unless $no_implied;
+
+$SPS{variant_0} = 1 if $SPS{american} && $use_variant_level{0};
+$SPS{variant_1} = 1 if $SPS{american} && $use_variant_level{1};
+$SPS{british_variant_0} = 1 if ($SPS{british} || $SPS{british_z}) && $use_variant_level{0};
+$SPS{british_variant_1} = 1 if ($SPS{british} || $SPS{british_z}) && $use_variant_level{1};
+$SPS{canadian_variant_0} = 1 if $SPS{canadian} && $use_variant_level{0};
+$SPS{canadian_variant_1} = 1 if $SPS{canadian} && $use_variant_level{1};
+$SPS{variant_2} = 1 if $use_variant_level{2};
+
+unless ($use_variant_level{non}) {
+ delete $SPS{$_} foreach (@SPS);
+}
+
+opendir D, $dir or die "Unable to open dir $dir\n";
+
+my @files = readdir(D);
+
+my @words;
+
+foreach (sort @files) {
+ my ($sp, $type, $size) = /^(\w+)-([^.]+)\.(\d\d)/ or next;
+ next unless $SPS{$sp};
+ next unless $size <= $SIZE;
+ if ($file_names_only) {
+ print "$_\n";
+ } else {
+ open F, "$dir/$_" or die "Unable to open $dir/$_ for reading";
+ while (<F>) {
+ chop;
+ push @words, $_;
+ }
+ }
+}
+
+my $prev = '';
+foreach (sort @words) {
+ next if $_ eq $prev;
+ print "$_\n";
+ $prev = $_;
+}
+
+
+
+
+
+