]> git.mxchange.org Git - flightgear.git/blobdiff - src/Airports/simple.cxx
Set the format default to float instead of int.
[flightgear.git] / src / Airports / simple.cxx
index 04a528f956cf27454f0b25d3cd8370bf3c01b0b2..cfbb61ac24092b841883d75331581a575aa9d343 100644 (file)
@@ -27,6 +27,8 @@
 #  include <config.h>
 #endif
 
+#include <math.h>
+
 #include <simgear/compiler.h>
 
 #include <simgear/debug/logstream.hxx>
@@ -48,43 +50,78 @@ operator >> ( istream& in, FGAirport& a )
     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;
+    getline( in,a.name );
+
+    // Remove the space before the name
+    if ( a.name.substr(0,1) == " " ) {
+        a.name = a.name.erase(0,1);
+    }
 
-    a.has_metar = true;         // assume true
+    a.has_metar = false;
+
+#if 0
+    // As a quick seed for the has_metar value, only airports with
+    // four-letter codes can have metar stations
+    a.has_metar = (isalpha(a.id[0]) && isalpha(a.id[1]) && isalpha(a.id[2])
+        && isalpha(a.id[3]) && !a.id[4]);
+#endif
 
     return in;
 }
 
 
-FGAirportList::FGAirportList( const string& file ) {
-    SG_LOG( SG_GENERAL, SG_DEBUG, "Reading simple airport list: " << file );
+FGAirportList::FGAirportList( const string &airport_file,
+                              const string &metar_file ) {
+    SG_LOG( SG_GENERAL, SG_INFO, "Reading simple airport list: "
+            << airport_file );
 
     // open the specified file for reading
-    sg_gzifstream in( file );
-    if ( !in.is_open() ) {
-        SG_LOG( SG_GENERAL, SG_ALERT, "Cannot open file: " << file );
+    sg_gzifstream apt_in( airport_file );
+    if ( !apt_in.is_open() ) {
+        SG_LOG( SG_GENERAL, SG_ALERT, "Cannot open file: " << airport_file );
        exit(-1);
     }
 
     // skip header line
-    in >> skipeol;
+    apt_in >> skipeol;
 
     FGAirport a;
-    int size = 0;
-    while ( in ) {
-        in >> a;
+    while ( apt_in ) {
+        apt_in >> a;
         airports_by_id[a.id] = a;
         airports_array.push_back( &airports_by_id[a.id] );
-        size++;
+    }
+
+
+    SG_LOG( SG_GENERAL, SG_INFO, "Reading simple metar station list: "
+            << metar_file );
+
+    // open the specified file for reading
+    sg_gzifstream metar_in( metar_file );
+    if ( !metar_in.is_open() ) {
+        SG_LOG( SG_GENERAL, SG_ALERT, "Cannot open file: " << metar_file );
+    }
+
+    string ident;
+    while ( metar_in ) {
+        metar_in >> ident;
+        if ( ident == "#" || ident == "//" ) {
+            metar_in >> skipeol;
+        } else {
+            airport_map_iterator apt = airports_by_id.find( ident );
+            if ( apt == airports_by_id.end() ) {
+                SG_LOG( SG_GENERAL, SG_DEBUG, "no apt = " << ident );
+            } else {
+                SG_LOG( SG_GENERAL, SG_DEBUG, "metar = " << ident );
+                airports_by_id[ident].has_metar = true;
+            }
+        }
     }
 }
 
 
 // search for the specified id
 FGAirport FGAirportList::search( const string& id) {
-    
     return airports_by_id[id];
 }
 
@@ -121,9 +158,9 @@ FGAirportList::size () const
     return airports_array.size();
 }
 
-const FGAirport FGAirportList::getAirport( int index ) const
+const FGAirport *FGAirportList::getAirport( int index ) const
 {
-    return *airports_array[index];
+    return airports_array[index];
 }