//
// simple.cxx -- a really simplistic class to manage airport ID,
-// lat, lon of the center of one of it's runways, and
-// elevation in feet.
+// lat, lon of the center of one of it's runways, and
+// elevation in feet.
//
// Written by Curtis Olson, started April 1998.
//
//
// $Id$
-
#ifdef HAVE_CONFIG_H
# include <config.h>
#endif
-// #include <sys/types.h> // for gdbm open flags
-// #include <sys/stat.h> // for gdbm open flags
-
-// #ifdef HAVE_GDBM
-// # include <gdbm.h>
-// #else
-// # include <simgear/gdbm/gdbm.h>
-// #endif
-
#include <simgear/compiler.h>
#include <simgear/debug/logstream.hxx>
-#include <simgear/misc/fgstream.hxx>
-
-#include <Main/options.hxx>
+#include <simgear/misc/sgstream.hxx>
#include STL_STRING
-#include STL_FUNCTIONAL
-#include STL_ALGORITHM
+#include STL_IOSTREAM
#include "simple.hxx"
-FG_USING_NAMESPACE(std);
-
-FGAirports::FGAirports( const string& file ) {
- // open the specified database readonly
- storage = new c4_Storage( file.c_str(), false );
-
- // need to do something about error handling here!
-
- vAirport = new c4_View;
- *vAirport =
- storage->GetAs("airport[ID:S,Longitude:F,Latitude:F,Elevation:F]");
-}
-
-
-// search for the specified id
-bool
-FGAirports::search( const string& id, FGAirport* a ) const
-{
- c4_StringProp pID ("ID");
- c4_FloatProp pLon ("Longitude");
- c4_FloatProp pLat ("Latitude");
- c4_FloatProp pElev ("Elevation");
-
- int idx = vAirport->Find(pID[id.c_str()]);
- cout << "idx = " << idx << endl;
-
- if ( idx == -1 ) {
- return false;
- }
-
- c4_RowRef r = vAirport->GetAt(idx);
+SG_USING_NAMESPACE(std);
+SG_USING_STD(istream);
- a->longitude = (double) pLon(r);
- a->latitude = (double) pLat(r);
- a->elevation = (double) pElev(r);
-
- return true;
-}
-
-FGAirport
-FGAirports::search( const string& id ) const
+inline istream&
+operator >> ( istream& in, FGAirport& a )
{
- FGAirport a;
- search( id, &a );
- return a;
-}
+ string junk;
+ in >> junk >> a.id >> a.latitude >> a.longitude >> a.elevation
+ >> a.code;
+ char name[256]; // should never be longer than this, right? :-)
+ in.getline( name, 256 );
+ a.name = name;
-// Destructor
-FGAirports::~FGAirports( void ) {
- // gdbm_close( dbf );
+ return in;
}
-// Constructor
-FGAirportsUtil::FGAirportsUtil() {
-}
-
+FGAirportList::FGAirportList( const string& file ) {
+ SG_LOG( SG_GENERAL, SG_DEBUG, "Reading simple airport list: " << file );
-// load the data
-int FGAirportsUtil::load( const string& file ) {
- FGAirport a;
-
- airports.erase( airports.begin(), airports.end() );
-
- fg_gzifstream in( file );
+ // open the specified file for reading
+ sg_gzifstream in( file );
if ( !in.is_open() ) {
- FG_LOG( FG_GENERAL, FG_ALERT, "Cannot open file: " << file );
+ SG_LOG( SG_GENERAL, SG_ALERT, "Cannot open file: " << file );
exit(-1);
}
- /*
- // We can use the STL copy algorithm because the input
- // file doesn't contain and comments or blank lines.
- copy( istream_iterator<FGAirport,ptrdiff_t>(in.stream()),
- istream_iterator<FGAirport,ptrdiff_t>(),
- inserter( airports, airports.begin() ) );
- */
-
- // read in each line of the file
-
-#ifdef __MWERKS__
-
- in >> skipcomment;
- char c = 0;
- while ( in.get(c) && c != '\0' ) {
- in.putback(c);
- in >> a;
- airports.insert(a);
- in >> skipcomment;
- }
-
-#else
-
- in >> skipcomment;
- while ( ! in.eof() ) {
- in >> a;
- airports.insert(a);
- in >> skipcomment;
- }
-
-#endif
-
- return 1;
-}
-
-
-// save the data in gdbm format
-bool FGAirportsUtil::dump_mk4( const string& file ) {
-
- // open database for writing
- c4_Storage storage( file.c_str(), true );
-
- // need to do something about error handling here!
-
- // define the properties
- c4_StringProp pID ("ID");
- c4_FloatProp pLon ("Longitude");
- c4_FloatProp pLat ("Latitude");
- c4_FloatProp pElev ("Elevation");
-
- // Start with an empty view of the proper structure.
- c4_View vAirport =
- storage.GetAs("airport[ID:S,Longitude:F,Latitude:F,Elevation:F]");
-
- c4_Row row;
+ // skip header line
+ in >> skipeol;
- iterator current = airports.begin();
- const_iterator end = airports.end();
- while ( current != end ) {
- // add each airport record
- pID (row) = current->id.c_str();
- pLon (row) = current->longitude;
- pLat (row) = current->latitude;
- pElev (row) = current->elevation;
- vAirport.Add(row);
-
- ++current;
+ FGAirport a;
+ while ( in ) {
+ in >> a;
+ airports[a.id] = a;
}
-
- // commit our changes
- storage.Commit();
-
- return true;
}
// search for the specified id
-bool
-FGAirportsUtil::search( const string& id, FGAirport* a ) const
-{
- const_iterator it = airports.find( FGAirport(id) );
- if ( it != airports.end() )
- {
- *a = *it;
- return true;
- }
- else
- {
- return false;
- }
-}
-
-
-FGAirport
-FGAirportsUtil::search( const string& id ) const
-{
- FGAirport a;
- this->search( id, &a );
- return a;
+FGAirport FGAirportList::search( const string& id) {
+ return airports[id];
}
// Destructor
-FGAirportsUtil::~FGAirportsUtil( void ) {
+FGAirportList::~FGAirportList( void ) {
}
-
-