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