flightgear/scripts/atis/list-airports.pl

156 lines
3.2 KiB
Perl
Raw Normal View History

2022-10-20 20:29:11 +08:00
#! /usr/bin/perl -w
sub usage {
print <<EoF;
Read the apt.dat (or apt.dat.gz) file.
Remap airport names to remove ugly abbreviations.
Print airport names, one per line.
Remapping is done by reference to the atis_remap.hxx file.
Typical usage:
FG_ROOT=whatever FG_SRC=whatever ATIS_ONLY=yes ./list-airports.pl | ./words_per_line.sh > airports.vlist
EoF
}
use strict;
use Symbol;
my $noparen = 1;
my $verbose = 0;
my $apt_name = '';
my $lat;
my $lon;
my $atis;
my $country = '';
my $elev;
my $tower;
my $bldgs;
my $apt_id;
my $shapefile;
my $namer = 'NAME';
my $skipping = 0;
my $tot_apts = 0;
my %states = ();
my %short_country = ();
my $fgroot = $ENV{'FG_ROOT'} || '.';
my $atis_only = $ENV{'ATIS_ONLY'} || 0;
my $mapfn = "$ENV{'FG_SRC'}/src/ATCDCL/atis_remap.hxx";
sub process_apt {
if ($atis_only && ! $atis) {
return;
}
my $str .= $apt_name;
$str =~ s' *$''; ## remove trailing spaces
if ($noparen) {
$str =~ s/[(][^)]*[)]?//g;
}
print "$str\n";
$tot_apts++;
}
my %remap = ();
sub get_remap {
# Note: in this context, GKI probably stands for Gereja Kristen Indonesia
# I guess the church builds lots of airports.
my $mapch = Symbol::gensym;
if (!open($mapch, '<', $mapfn)) {
print STDERR "Could not open abbreviation file '$mapfn'\n";
print STDERR "Maybe you need to set FG_ROOT\n";
exit(1);
}
while (my $line = <$mapch>) {
chomp $line;
if ($line =~ s/[ \t]*REMAP[(]//) {
$line =~ s/[)][ \t]*$//;
my @stuff = split(',', $line, 2);
my $from = $stuff[0];
my $to = $stuff[1];
$to =~ s/^[ \t]*//;
if ($to eq 'NIL') {
$to = '';
}
$remap{$from} = $to;
}
}
}
main: {
if (@ARGV) {
usage;
exit;
}
get_remap;
my $delim = '-';
my $fgroot = $ENV{'FG_ROOT'} || 0;
my $incmd = "zcat $fgroot/Airports/apt.dat.gz";
my $inch = Symbol::gensym;
open ($inch, '-|', $incmd)
|| die "Couldn't open pipe from '$incmd'\n";
my $junk = <$inch>;
$junk = <$inch>;
liner: while (my $line = <$inch>) {
chomp $line;
my @stuff = split(' ', $line);
my $type = shift @stuff || 0;
### print "..$type ... $line ...\n";
if ($type == 1) {
## Here if new airport.
##
## First, print results of previous work, i.e. airport
## stanzas already seen ... since the apt.dat file
## doesn't have a clear way of signaling the end of a stanza.
if ($apt_name) {
process_apt();
}
$apt_name = '';
$atis = '';
$lat = 0;
$lon = 0;
$country = '';
$elev = shift @stuff;
$tower = shift @stuff;
$bldgs = shift @stuff;
$apt_id = shift @stuff;
my $name = join $delim, @stuff;
for my $from (keys %remap) {
my $to = $remap{$from};
$name =~ s/\b$from\b/$to/gi;
}
## option for plain words, not hyphenated phrases
if (1) {
$name =~ s/$delim/ /g;
}
$apt_name = "$name";
}
if ($type == 10) {
$lat = $stuff[0];
$lon = $stuff[1];
}
if ($type == 50) {
$atis = join(' ', @stuff);
}
}
process_apt(); ## flush out the very last one
print STDERR "Total airports: $tot_apts\n";
}