git-svn-id: https://crawl-ref.svn.sourceforge.net/svnroot/crawl-ref/trunk@3105 c06c8d41-db1a-0410-9941-cceddc491573
FSFNA2NYC556SLWIBMOGS3H2YQ6ERX4KK7WFRJXBZV5FZC55RJSQC
#!/usr/bin/perl
#
# featname.pl
#
# Checks that the DNGN feature names in luadgn.cc match up with the enum
# constants in enum.h.
#
use strict;
use warnings;
my $FEATFILE = "enum.h";
my $FNAMEFILE = "luadgn.cc";
my ($features, $fnummap) = read_features($FEATFILE);
my @fnames = read_feature_names($FNAMEFILE);
verify_names($features, $fnummap, \@fnames);
sub read_feature_names {
my $file = shift;
my $text = do { local(@ARGV, $/) = $file; <> };
my ($array) = $text =~
/dngn_feature_names.*?=.*?{([^}]+)}/xs;
my @names = $array =~ /"([^"]*)"/gs;
return @names;
}
sub verify_names {
my ($farr, $fmap, $fnames) = @_;
for (my $i = 0; $i < @$fnames; ++$i) {
my $name = $$fnames[$i];
next unless $name;
my $feat = "DNGN_\U$name";
$$fmap{$feat} = -1 unless exists $$fmap{$feat};
if ($$fmap{$feat} != $i) {
die "$name is at $i, was expecting $$fmap{$feat} as in enum.\n";
}
}
print "Feature names in $FNAMEFILE and $FEATFILE match ok.\n";
}
sub read_features {
my $file = shift;
my @lines = do { local (@ARGV) = $file; <> };
my @features = ([]) x 500;
my $in_enum;
my %fnummap;
my $currval = 0;
for my $line (@lines) {
if (!$in_enum) {
$in_enum = 1 if $line =~ /enum\s+dungeon_feature_type/;
}
else {
last if $line =~ /^\s*};/;
s/^\s+//, s{//.*}{}, s/\s+$// for $line;
next unless $line =~ /\S/;
my ($key, $val) = $line =~ /(DNGN\w+)(?:\s*=\s*(\w+))?/;
next unless $key;
if (defined $val) {
if ($val =~ /^DNGN/) {
$val = $fnummap{$val};
}
}
else {
$val = $currval;
}
$currval = $val + 1;
$fnummap{$key} = $val;
push @{$features[$val]}, $key;
}
}
return (\@features, \%fnummap);
}