X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FNavaids%2Ffixlist.cxx;h=c51534b1dd8c57095d2cc37f2090e3687238de45;hb=4a79d82ba62fa4e5be759fa0fc4b20220e8da303;hp=bb7c643df343ba8d0cc2c30f718f51ad16431175;hpb=182fd42b4017fa54d680508c092ea1b216398a00;p=flightgear.git diff --git a/src/Navaids/fixlist.cxx b/src/Navaids/fixlist.cxx index bb7c643df..c51534b1d 100644 --- a/src/Navaids/fixlist.cxx +++ b/src/Navaids/fixlist.cxx @@ -2,7 +2,7 @@ // // Written by Curtis Olson, started April 2000. // -// Copyright (C) 2000 Curtis L. Olson - curt@flightgear.org +// Copyright (C) 2000 Curtis L. Olson - http://www.flightgear.org/~curt // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License as @@ -16,21 +16,22 @@ // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software -// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. // // $Id$ +#ifdef HAVE_CONFIG_H +# include +#endif + #include -#include +#include #include #include "fixlist.hxx" -FGFixList *current_fixlist; - - // Constructor FGFixList::FGFixList( void ) { } @@ -42,64 +43,66 @@ FGFixList::~FGFixList( void ) { // load the navaids and build the map -bool FGFixList::init( FGPath path ) { - FGFix fix; - +bool FGFixList::init( SGPath path ) { fixlist.erase( fixlist.begin(), fixlist.end() ); - fg_gzifstream in( path.str() ); + sg_gzifstream in( path.str() ); if ( !in.is_open() ) { SG_LOG( SG_GENERAL, SG_ALERT, "Cannot open file: " << path.str() ); exit(-1); } - // read in each line of the file - + // toss the first two lines of the file + in >> skipeol; in >> skipeol; - in >> skipcomment; -#ifdef __MWERKS__ + // read in each remaining line of the file +#ifdef __MWERKS__ char c = 0; - while ( in.get(c) && c != '\0' && fix.get_ident() != "[End]" ) { + while ( in.get(c) && c != '\0' ) { in.putback(c); +#else + while ( ! in.eof() ) { +#endif + + FGFix fix; in >> fix; - if ( fix.get_ident() != "[End]" ) { - fixlist[fix.get_ident()] = fix; - } - in >> skipcomment; - } + if ( fix.get_lat() > 95.0 ) { + break; + } -#else + /* cout << "ident=" << fix.get_ident() + << ", lat=" << fix.get_lat() + << ", lon=" << fix.get_lon() << endl; */ - while ( ! in.eof() && fix.get_ident() != "[End]" ) { - in >> fix; - /* cout << "id = " << n.get_ident() << endl; - cout << " type = " << n.get_type() << endl; - cout << " lon = " << n.get_lon() << endl; - cout << " lat = " << n.get_lat() << endl; - cout << " elev = " << n.get_elev() << endl; - cout << " freq = " << n.get_freq() << endl; - cout << " range = " << n.get_range() << endl; */ - if ( fix.get_ident() != "[End]" ) { - fixlist[fix.get_ident()] = fix; - } + fixlist[fix.get_ident()] = fix; in >> skipcomment; } + return true; +} -#endif - return true; +// query the database for the specified fix, lon and lat are in +// degrees, elev is in meters +bool FGFixList::query( const string& ident, FGFix *fix ) { + *fix = fixlist[ident]; + if ( ! fix->get_ident().empty() ) { + return true; + } else { + return false; + } } -// query the database for the specified frequency, lon and lat are in +// query the database for the specified fix, lon and lat are in // degrees, elev is in meters -bool FGFixList::query( const string& ident, double lon, double lat, double elev, - FGFix *fix, double *heading, double *dist ) +bool FGFixList::query_and_offset( const string& ident, double lon, double lat, + double elev, FGFix *fix, double *heading, + double *dist ) { *fix = fixlist[ident]; - if ( fix->get_ident() == "" ) { + if ( fix->get_ident().empty() ) { return false; } @@ -112,3 +115,18 @@ bool FGFixList::query( const string& ident, double lon, double lat, double elev, *dist = s; return true; } + +const FGFix* FGFixList::findFirstByIdent( const string& ident, bool exact) +{ + fix_map_iterator itr; + if(exact) { + itr = fixlist.find(ident); + } else { + itr = fixlist.lower_bound(ident); + } + if(itr == fixlist.end()) { + return(NULL); + } else { + return(&(itr->second)); + } +}