]> git.mxchange.org Git - flightgear.git/blobdiff - src/Main/options.cxx
Improve timing statistics
[flightgear.git] / src / Main / options.cxx
index ceca89101118ad9d04c3ec6614bb9c705967776c..b4a3bc830f01596d1678689f0b6c07bc48456a3e 100644 (file)
@@ -28,6 +28,8 @@
 #include <simgear/compiler.h>
 #include <simgear/structure/exception.hxx>
 #include <simgear/debug/logstream.hxx>
+#include <simgear/timing/sg_time.hxx>
+#include <simgear/misc/sg_dir.hxx>
 
 #include <math.h>              // rint()
 #include <stdio.h>
 #include <iostream>
 #include <string>
 
-#include <plib/ul.h>
-
 #include <simgear/math/sg_random.h>
 #include <simgear/props/props_io.hxx>
 #include <simgear/misc/sgstream.hxx>
 #include <simgear/misc/sg_path.hxx>
 #include <simgear/scene/material/mat.hxx>
 #include <simgear/sound/soundmgr_openal.hxx>
-
-// #include <Include/general.hxx>
-// #include <Airports/simple.hxx>
-// #include <Cockpit/cockpit.hxx>
-// #include <FDM/flight.hxx>
-
+#include <simgear/misc/strutils.hxx>
 #include <Autopilot/route_mgr.hxx>
 #include <GUI/gui.h>
 
 #include "util.hxx"
 #include "viewmgr.hxx"
 #include <Main/viewer.hxx>
+#include <Environment/presets.hxx>
+
+#include <simgear/version.h>
+#include <osg/Version>
 
 using std::string;
 using std::sort;
@@ -69,8 +68,10 @@ using std::cout;
 using std::cerr;
 using std::endl;
 
-#ifndef VERSION
-#define VERSION "CVS "__DATE__
+#if defined( HAVE_VERSION_H ) && HAVE_VERSION_H
+#  include <Include/version.h>
+#else
+#  include <Include/no_version.h>
 #endif
 
 #define NEW_DEFAULT_MODEL_HZ 120
@@ -98,6 +99,8 @@ atoi( const string& str )
     return ::atoi( str.c_str() );
 }
 
+static int fgSetupProxy( const char *arg );
+
 /**
  * Set a few fail-safe default property values.
  *
@@ -119,6 +122,7 @@ fgSetDefaults ()
        // Otherwise, default to Scenery being in $FG_ROOT/Scenery
        globals->set_fg_scenery("");
     }
+
                                // Position (deliberately out of range)
     fgSetDouble("/position/longitude-deg", 9999.0);
     fgSetDouble("/position/latitude-deg", 9999.0);
@@ -185,8 +189,8 @@ fgSetDefaults ()
 
                                // Features
     fgSetBool("/sim/hud/color/antialiased", false);
-    fgSetBool("/sim/hud/enable3d", true);
-    fgSetBool("/sim/hud/visibility", false);
+    fgSetBool("/sim/hud/enable3d[1]", true);
+    fgSetBool("/sim/hud/visibility[1]", false);
     fgSetBool("/sim/panel/visibility", true);
     fgSetBool("/sim/sound/enabled", true);
     fgSetBool("/sim/sound/working", true);
@@ -204,7 +208,7 @@ fgSetDefaults ()
     fgSetBool("/sim/rendering/shading", true);
     fgSetBool("/sim/rendering/skyblend", true);
     fgSetBool("/sim/rendering/textures", true);
-       fgTie( "/sim/rendering/filtering", SGGetTextureFilter, SGSetTextureFilter, false);
+    fgTie( "/sim/rendering/filtering", SGGetTextureFilter, SGSetTextureFilter, false);
     fgSetInt("/sim/rendering/filtering", 1);
     fgSetBool("/sim/rendering/wireframe", false);
     fgSetBool("/sim/rendering/horizon-effect", false);
@@ -220,7 +224,7 @@ fgSetDefaults ()
                                // HUD options
     fgSetString("/sim/startup/units", "feet");
     fgSetString("/sim/hud/frame-stat-type", "tris");
-       
+
                                // Time options
     fgSetInt("/sim/startup/time-offset", 0);
     fgSetString("/sim/startup/time-offset-type", "system-offset");
@@ -237,6 +241,15 @@ fgSetDefaults ()
     fgSetString("/sim/multiplay/txhost", "0");
     fgSetInt("/sim/multiplay/rxport", 0);
     fgSetInt("/sim/multiplay/txport", 0);
+    
+    fgSetString("/sim/version/flightgear", FLIGHTGEAR_VERSION);
+    fgSetString("/sim/version/simgear", SG_STRINGIZE(SIMGEAR_VERSION));
+    fgSetString("/sim/version/openscenegraph", osgGetVersion());
+    fgSetString("/sim/version/revision", REVISION);
+    fgSetInt("/sim/version/build-number", HUDSON_BUILD_NUMBER);
+    fgSetString("/sim/version/build-id", HUDSON_BUILD_ID);
+    if( (envp = ::getenv( "http_proxy" )) != NULL )
+      fgSetupProxy( envp );
 }
 
 static bool
@@ -348,7 +361,7 @@ parse_time(const string& time_in) {
 
 
 // parse a date string (yyyy:mm:dd:hh:mm:ss) into a time_t (seconds)
-static long int 
+static long int
 parse_date( const string& date)
 {
     struct tm gmt;
@@ -486,7 +499,7 @@ parse_time_offset( const string& time_str) {
 }
 
 
-// Parse --fov=x.xx type option 
+// Parse --fov=x.xx type option
 static double
 parse_fov( const string& arg ) {
     double fov = atof(arg);
@@ -513,7 +526,7 @@ parse_fov( const string& arg ) {
 //        point values are ok.
 //
 // Serial example "--nmea=serial,dir,hz,device,baud" where
-// 
+//
 //  device = OS device name of serial line to be open()'ed
 //  baud = {300, 1200, 2400, ..., 230400}
 //
@@ -529,6 +542,14 @@ parse_fov( const string& arg ) {
 
 static bool
 add_channel( const string& type, const string& channel_str ) {
+    // This check is neccessary to prevent fgviewer from segfaulting when given
+    // weird options. (It doesn't run the full initailization)
+    if(!globals->get_channel_options_list())
+    {
+        SG_LOG(SG_GENERAL, SG_ALERT, "Option " << type << "=" << channel_str
+                                     << " ignored.");
+        return false;
+    }
     SG_LOG(SG_GENERAL, SG_INFO, "Channel string = " << channel_str );
     globals->get_channel_options_list()->push_back( type + "," + channel_str );
     return true;
@@ -769,7 +790,7 @@ fgOptRoc( const char *arg )
 static int
 fgOptFgRoot( const char *arg )
 {
-    globals->set_fg_root(arg);
+    // this option is dealt with by fgInitFGRoot
     return FG_OPTIONS_OK;
 }
 
@@ -780,6 +801,13 @@ fgOptFgScenery( const char *arg )
     return FG_OPTIONS_OK;
 }
 
+static int
+fgOptFgAircraft(const char* arg)
+{
+  // this option is dealt with by fgInitFGAircraft
+  return FG_OPTIONS_OK;
+}
+
 static int
 fgOptFov( const char *arg )
 {
@@ -873,12 +901,18 @@ fgOptStartDateGmt( const char *arg )
 static int
 fgSetupProxy( const char *arg )
 {
-    string options = arg;
+    string options = simgear::strutils::strip( arg );
     string host, port, auth;
     string::size_type pos;
 
+    // this is NURLP - NURLP is not an url parser
+    if( simgear::strutils::starts_with( options, "http://" ) )
+        options = options.substr( 7 );
+    if( simgear::strutils::ends_with( options, "/" ) )
+        options = options.substr( 0, options.length() - 1 );
+
     host = port = auth = "";
-    if ((pos = options.find("@")) != string::npos) 
+    if ((pos = options.find("@")) != string::npos)
         auth = options.substr(0, pos++);
     else
         pos = 0;
@@ -959,7 +993,7 @@ fgOptViewOffset( const char *arg )
     } else {
        default_view_offset = atof( woffset.c_str() ) * SGD_DEGREES_TO_RADIANS;
     }
-    /* apparently not used (CLO, 11 Jun 2002) 
+    /* apparently not used (CLO, 11 Jun 2002)
         FGViewer *pilot_view =
            (FGViewer *)globals->get_viewmgr()->get_view( 0 ); */
     // this will work without calls to the viewer...
@@ -972,16 +1006,14 @@ fgOptViewOffset( const char *arg )
 static int
 fgOptVisibilityMeters( const char *arg )
 {
-    double visibility = atof( arg );
-    fgDefaultWeatherValue("visibility-m", visibility);
+    Environment::Presets::VisibilitySingleton::instance()->preset( atof( arg ) );
     return FG_OPTIONS_OK;
 }
 
 static int
 fgOptVisibilityMiles( const char *arg )
 {
-    double visibility = atof( arg ) * 5280.0 * SG_FEET_TO_METER;
-    fgDefaultWeatherValue("visibility-m", visibility);
+    Environment::Presets::VisibilitySingleton::instance()->preset( atof( arg ) * 5280.0 * SG_FEET_TO_METER );
     return FG_OPTIONS_OK;
 }
 
@@ -992,7 +1024,7 @@ fgOptRandomWind( const char *arg )
     double max_hdg = min_hdg + (20 - sqrt(sg_random() * 400));
     double speed = sg_random() * sg_random() * 40;
     double gust = speed + (10 - sqrt(sg_random() * 100));
-    fgSetupWind(min_hdg, max_hdg, speed, gust);
+    Environment::Presets::WindSingleton::instance()->preset(min_hdg, max_hdg, speed, gust);
     return FG_OPTIONS_OK;
 }
 
@@ -1004,14 +1036,14 @@ fgOptWind( const char *arg )
        SG_LOG( SG_GENERAL, SG_ALERT, "bad wind value " << arg );
        return FG_OPTIONS_ERROR;
     }
-    fgSetupWind(min_hdg, max_hdg, speed, gust);
+    Environment::Presets::WindSingleton::instance()->preset(min_hdg, max_hdg, speed, gust);
     return FG_OPTIONS_OK;
 }
 
 static int
 fgOptTurbulence( const char *arg )
 {
-    fgDefaultWeatherValue("turbulence/magnitude-norm", atof(arg));
+    Environment::Presets::TurbulenceSingleton::instance()->preset( atof(arg) );
     return FG_OPTIONS_OK;
 }
 
@@ -1028,9 +1060,7 @@ fgOptCeiling( const char *arg )
         elevation = atof(spec.substr(0, pos).c_str());
         thickness = atof(spec.substr(pos + 1).c_str());
     }
-    fgSetDouble("/environment/clouds/layer[0]/elevation-ft", elevation);
-    fgSetDouble("/environment/clouds/layer[0]/thickness-ft", thickness);
-    fgSetString("/environment/clouds/layer[0]/coverage", "overcast");
+    Environment::Presets::CeilingSingleton::instance()->preset( elevation, thickness );
     return FG_OPTIONS_OK;
 }
 
@@ -1197,9 +1227,24 @@ fgOptParking( const char *arg )
 static int
 fgOptVersion( const char *arg )
 {
-    cerr << VERSION << endl;
+    cerr << "FlightGear version: " << FLIGHTGEAR_VERSION << endl;
+    cerr << "Revision: " << REVISION << endl;
+    cerr << "Build-Id: " << HUDSON_BUILD_ID << endl;
     cerr << "FG_ROOT=" << globals->get_fg_root() << endl;
     cerr << "FG_HOME=" << fgGetString("/sim/fg-home") << endl;
+    cerr << "FG_SCENERY=";
+
+    int didsome = 0;
+    string_list scn = globals->get_fg_scenery();
+    for (string_list::const_iterator it = scn.begin(); it != scn.end(); it++)
+    {
+        if (didsome) cerr << ":";
+        didsome++;
+        cerr << *it;
+    }
+    cerr << endl;
+    cerr << "SimGear version: " << SG_STRINGIZE(SIMGEAR_VERSION) << endl;
+    cerr << "PLIB version: " << PLIB_VERSION << endl;
     return FG_OPTIONS_EXIT;
 }
 
@@ -1217,6 +1262,26 @@ fgOptFgviewer(const char* arg)
     return FG_OPTIONS_OK;
 }
 
+static int
+fgOptCallSign(const char * arg)
+{
+    int i;
+    char callsign[11];
+    strncpy(callsign,arg,10);
+    callsign[10]=0;
+    for (i=0;callsign[i];i++)
+    {
+        char c = callsign[i];
+        if (c >= 'A' && c <= 'Z') continue;
+        if (c >= 'a' && c <= 'z') continue;
+        if (c >= '0' && c <= '9') continue;
+        if (c == '-' || c == '_') continue;
+        // convert any other illegal characters
+        callsign[i]='-';
+    }
+    fgSetString("sim/multiplay/callsign", callsign );
+    return FG_OPTIONS_OK;
+}
 
 
 static map<string,size_t> fgOptionMap;
@@ -1258,7 +1323,7 @@ struct OptionDesc {
     const char *s_param;
     int (*func)( const char * );
     } fgOptionArray[] = {
-       
+
     {"language",                     true,  OPTION_FUNC,   "", false, "", fgOptLanguage },
     {"disable-game-mode",            false, OPTION_BOOL,   "/sim/startup/game-mode", false, "", 0 },
     {"enable-game-mode",             false, OPTION_BOOL,   "/sim/startup/game-mode", true, "", 0 },
@@ -1270,27 +1335,29 @@ struct OptionDesc {
     {"enable-mouse-pointer",         false, OPTION_STRING, "/sim/startup/mouse-pointer", false, "enabled", 0 },
     {"disable-random-objects",       false, OPTION_BOOL,   "/sim/rendering/random-objects", false, "", 0 },
     {"enable-random-objects",        false, OPTION_BOOL,   "/sim/rendering/random-objects", true, "", 0 },
-    {"disable-real-weather-fetch",   false, OPTION_BOOL,   "/environment/params/real-world-weather-fetch", false, "", 0 },
-    {"enable-real-weather-fetch",    false, OPTION_BOOL,   "/environment/params/real-world-weather-fetch", true,  "", 0 },
+    {"disable-real-weather-fetch",   false, OPTION_BOOL,   "/environment/realwx/enabled", false, "", 0 },
+    {"enable-real-weather-fetch",    false, OPTION_BOOL,   "/environment/realwx/enabled", true,  "", 0 },
     {"metar",                        true,  OPTION_STRING, "/environment/metar/data", false, "", 0 },
     {"disable-ai-models",            false, OPTION_BOOL,   "/sim/ai/enabled", false, "", 0 },
     {"enable-ai-models",             false, OPTION_BOOL,   "/sim/ai/enabled", true, "", 0 },
+    {"disable-ai-traffic",           false, OPTION_BOOL,   "/sim/traffic-manager/enabled", false, "", 0 },
+    {"enable-ai-traffic",            false, OPTION_BOOL,   "/sim/traffic-manager/enabled", true,  "", 0 },
     {"disable-freeze",               false, OPTION_BOOL,   "/sim/freeze/master", false, "", 0 },
     {"enable-freeze",                false, OPTION_BOOL,   "/sim/freeze/master", true, "", 0 },
     {"disable-fuel-freeze",          false, OPTION_BOOL,   "/sim/freeze/fuel", false, "", 0 },
     {"enable-fuel-freeze",           false, OPTION_BOOL,   "/sim/freeze/fuel", true, "", 0 },
     {"disable-clock-freeze",         false, OPTION_BOOL,   "/sim/freeze/clock", false, "", 0 },
     {"enable-clock-freeze",          false, OPTION_BOOL,   "/sim/freeze/clock", true, "", 0 },
-    {"disable-hud-3d",               false, OPTION_BOOL,   "/sim/hud/enable3d", false, "", 0 },
-    {"enable-hud-3d",                false, OPTION_BOOL,   "/sim/hud/enable3d", true, "", 0 },
+    {"disable-hud-3d",               false, OPTION_BOOL,   "/sim/hud/enable3d[1]", false, "", 0 },
+    {"enable-hud-3d",                false, OPTION_BOOL,   "/sim/hud/enable3d[1]", true, "", 0 },
     {"disable-anti-alias-hud",       false, OPTION_BOOL,   "/sim/hud/color/antialiased", false, "", 0 },
     {"enable-anti-alias-hud",        false, OPTION_BOOL,   "/sim/hud/color/antialiased", true, "", 0 },
     {"control",                      true,  OPTION_STRING, "/sim/control-mode", false, "", 0 },
     {"disable-auto-coordination",    false, OPTION_BOOL,   "/sim/auto-coordination", false, "", 0 },
     {"enable-auto-coordination",     false, OPTION_BOOL,   "/sim/auto-coordination", true, "", 0 },
     {"browser-app",                  true,  OPTION_STRING, "/sim/startup/browser-app", false, "", 0 },
-    {"disable-hud",                  false, OPTION_BOOL,   "/sim/hud/visibility", false, "", 0 },
-    {"enable-hud",                   false, OPTION_BOOL,   "/sim/hud/visibility", true, "", 0 },
+    {"disable-hud",                  false, OPTION_BOOL,   "/sim/hud/visibility[1]", false, "", 0 },
+    {"enable-hud",                   false, OPTION_BOOL,   "/sim/hud/visibility[1]", true, "", 0 },
     {"disable-panel",                false, OPTION_BOOL,   "/sim/panel/visibility", false, "", 0 },
     {"enable-panel",                 false, OPTION_BOOL,   "/sim/panel/visibility", true, "", 0 },
     {"disable-sound",                false, OPTION_BOOL,   "/sim/sound/working", false, "", 0 },
@@ -1323,6 +1390,7 @@ struct OptionDesc {
     {"roc",                          true,  OPTION_FUNC,   "", false, "", fgOptRoc },
     {"fg-root",                      true,  OPTION_FUNC,   "", false, "", fgOptFgRoot },
     {"fg-scenery",                   true,  OPTION_FUNC,   "", false, "", fgOptFgScenery },
+    {"fg-aircraft",                  true,  OPTION_FUNC,   "", false, "", fgOptFgAircraft },
     {"fdm",                          true,  OPTION_STRING, "/sim/flight-model", false, "", 0 },
     {"aero",                         true,  OPTION_STRING, "/sim/aero", false, "", 0 },
     {"aircraft-dir",                 true,  OPTION_STRING, "/sim/aircraft-dir", false, "", 0 },
@@ -1359,7 +1427,7 @@ struct OptionDesc {
     {"enable-skyblend",              false, OPTION_BOOL,   "/sim/rendering/skyblend", true, "", 0 },
     {"disable-textures",             false, OPTION_BOOL,   "/sim/rendering/textures", false, "", 0 },
     {"enable-textures",              false, OPTION_BOOL,   "/sim/rendering/textures", true, "", 0 },
-    {"texture-filtering",           false, OPTION_INT,    "/sim/rendering/filtering", 1, "", 0 },
+    {"texture-filtering",            false, OPTION_INT,    "/sim/rendering/filtering", 1, "", 0 },
     {"disable-wireframe",            false, OPTION_BOOL,   "/sim/rendering/wireframe", false, "", 0 },
     {"enable-wireframe",             false, OPTION_BOOL,   "/sim/rendering/wireframe", true, "", 0 },
     {"geometry",                     true,  OPTION_FUNC,   "", false, "", fgOptGeometry },
@@ -1400,8 +1468,11 @@ struct OptionDesc {
     {"joyclient",                    true,  OPTION_CHANNEL, "", false, "", 0 },
     {"jsclient",                     true,  OPTION_CHANNEL, "", false, "", 0 },
     {"proxy",                        true,  OPTION_FUNC,    "", false, "", fgSetupProxy },
-    {"callsign",                     true, OPTION_STRING,  "sim/multiplay/callsign", false, "", 0 },
+    {"callsign",                     true,  OPTION_FUNC,    "", false, "", fgOptCallSign},
     {"multiplay",                    true,  OPTION_CHANNEL, "", false, "", 0 },
+#ifdef FG_HAVE_HLA
+    {"hla",                          true,  OPTION_CHANNEL, "", false, "", 0 },
+#endif
     {"trace-read",                   true,  OPTION_FUNC,   "", false, "", fgOptTraceRead },
     {"trace-write",                  true,  OPTION_FUNC,   "", false, "", fgOptTraceWrite },
     {"log-level",                    true,  OPTION_FUNC,   "", false, "", fgOptLogLevel },
@@ -1429,8 +1500,8 @@ struct OptionDesc {
     {"ai-scenario",                  true,  OPTION_FUNC,   "", false, "", fgOptScenario },
     {"parking-id",                   true,  OPTION_FUNC,   "", false, "", fgOptParking  },
     {"version",                      false, OPTION_FUNC,   "", false, "", fgOptVersion },
-    {"enable-fpe",                  false, OPTION_FUNC,   "", false, "", fgOptFpe},
-    {"fgviewer",                    false, OPTION_FUNC,   "", false, "", fgOptFgviewer},
+    {"enable-fpe",                   false, OPTION_FUNC,   "", false, "", fgOptFpe},
+    {"fgviewer",                     false, OPTION_FUNC,   "", false, "", fgOptFgviewer},
     {0}
 };
 
@@ -1512,6 +1583,10 @@ parse_option (const string& arg)
             SG_LOG( SG_GENERAL, SG_ALERT, "Bad property assignment: " << arg );
             return FG_OPTIONS_ERROR;
         }
+    } else if ( arg.find("-psn_") == 0) {
+    // on Mac, when launched from the GUI, we are passed the ProcessSerialNumber
+    // as an argument (and no others). Silently ignore the argument here.
+        return FG_OPTIONS_OK;
     } else if ( arg.find( "--" ) == 0 ) {
         size_t pos = arg.find( '=' );
         string arg_name, arg_value;
@@ -1558,6 +1633,7 @@ parse_option (const string& arg)
                     }
                     break;
                 case OPTION_CHANNEL:
+                    // XXX return value of add_channel should be checked?
                     if ( pt->has_param && !arg_value.empty() ) {
                         add_channel( pt->option, arg_value );
                     } else if ( !pt->has_param && arg_value.empty() ) {
@@ -1605,7 +1681,7 @@ fgParseArgs (int argc, char **argv)
     bool verbose = false;
     bool help = false;
 
-    SG_LOG(SG_GENERAL, SG_INFO, "Processing command line arguments");
+    SG_LOG(SG_GENERAL, SG_ALERT, "Processing command line arguments");
 
     for (int i = 1; i < argc; i++) {
         string arg = argv[i];
@@ -1625,14 +1701,21 @@ fgParseArgs (int argc, char **argv)
               fgOptLogLevel( "alert" );
               SGPath path( globals->get_fg_root() );
               path.append("Aircraft");
-              fgShowAircraft(path, true);
+              fgShowAircraft(path);
               exit(0);
 
             } else if (result == FG_OPTIONS_SHOW_SOUND_DEVICES) {
               SGSoundMgr smgr;
+
+              smgr.init();
+              string vendor = smgr.get_vendor();
+              string renderer = smgr.get_renderer();
+              cout << renderer << " provided by " << vendor << endl;
+              cout << endl << "No. Device" << endl;
+
               vector <const char*>devices = smgr.get_available_devices();
-              for (int i=0; i<devices.size(); i++) {
-                printf("%i. \"%s\"\n", i, devices[i]);
+              for (vector <const char*>::size_type i=0; i<devices.size(); i++) {
+                cout << i << ".  \"" << devices[i] << "\"" << endl;
               }
               devices.clear();
               exit(0);
@@ -1682,7 +1765,7 @@ fgParseOptions (const string& path) {
         line = line.substr( 0, i );
 
        if ( parse_option( line ) == FG_OPTIONS_ERROR ) {
-            cerr << endl << "Config file parse error: " << path << " '" 
+            cerr << endl << "Config file parse error: " << path << " '"
                    << line << "'" << endl;
            fgUsage();
            exit(-1);
@@ -1693,7 +1776,7 @@ fgParseOptions (const string& path) {
 
 
 // Print usage message
-void 
+void
 fgUsage (bool verbose)
 {
     SGPropertyNode *locale = globals->get_locale();
@@ -1710,7 +1793,7 @@ fgUsage (bool verbose)
         cout << "Make sure the file options.xml is located in the FlightGear base directory," << endl;
         cout << "and the location of the base directory is specified by setting $FG_ROOT or" << endl;
         cout << "by adding --fg-root=path as a program argument." << endl;
-        
+
         exit(-1);
     }
 
@@ -1754,7 +1837,7 @@ fgUsage (bool verbose)
                     tmp.append(", -");
                     tmp.append(short_name->getStringValue());
                 }
-                               
+
                 if (tmp.size() <= 25) {
                     msg+= "   --";
                     msg += tmp;
@@ -1823,135 +1906,3 @@ fgUsage (bool verbose)
     cin.get();
 #endif
 }
-
-// A simple function to return an integer depending on the position
-// of the status string within the array in order to determine the hierarchy.
-unsigned int getNumMaturity(const char * str) 
-{
-  // changes should also be reflected in $FG_ROOT/data/options.xml & 
-  // $FG_ROOT/data/Translations/string-default.xml
-  const char* levels[] = {"alpha","beta","early-production","production"}; 
-
-  for (size_t i=0; i<(sizeof(levels)/sizeof(levels[0]));i++) 
-    if (strcmp(str,levels[i])==0)
-      return i;
-
-  return 0;
-};
-
-
-static void fgSearchAircraft(const SGPath &path, string_list &aircraft,
-                             bool recursive)
-{   
-   
-   ulDirEnt* dire;
-   ulDir *dirp = ulOpenDir(path.str().c_str());
-   if (dirp == NULL) {
-      cerr << "Unable to open aircraft directory '" << path.str() << '\'' << endl;
-      exit(-1);
-   }
-
-   while ((dire = ulReadDir(dirp)) != NULL) {
-      char *ptr;
-
-      if (dire->d_isdir) {
-          if (recursive && strcmp("CVS", dire->d_name)
-              && strcmp(".", dire->d_name) && strcmp("..", dire->d_name))
-          {
-              SGPath next = path;
-              next.append(dire->d_name);
-
-              fgSearchAircraft(next, aircraft, true);
-          }
-      } else if ((ptr = strstr(dire->d_name, "-set.xml")) && (ptr[8] == '\0')) {
-
-          SGPath afile = path;
-          afile.append(dire->d_name);
-
-          *ptr = '\0';
-
-          SGPropertyNode root;
-          try {
-             readProperties(afile.str(), &root);
-          } catch (...) {
-             continue;
-          }
-
-          SGPropertyNode *desc = NULL;
-         SGPropertyNode *status = NULL;
-         
-          SGPropertyNode *node = root.getNode("sim");
-          if (node) {
-             desc = node->getNode("description");
-            // if a status tag is found, read it in
-            if (node->hasValue("status"))
-               status = node->getNode("status");
-          }
-
-          //additionally display status information where it is available
-
-          string descStr("   ");
-          descStr += dire->d_name;
-          if (desc) {
-              if (descStr.size() <= 27+3) {
-                descStr.append(29+3-descStr.size(), ' ');
-              } else {
-                descStr += '\n';
-                descStr.append( 32, ' ');
-              }
-              descStr += desc->getStringValue();
-          }
-  
-          SGPropertyNode * required_status
-                             = fgGetNode ("/sim/aircraft-min-status", true);
-         
-         // If the node holds the value "all", then there wasn't any status 
-         // level specified, so we simply go ahead and output ALL aircraft
-         if (strcmp(required_status->getStringValue(),"all")==0) {        
-                 aircraft.push_back(descStr);
-                 }
-         else
-         {
-         // If the node doesn't hold "all" as its value, then we are supposed
-         // to show only aircraft meeting specific status (development status)
-          // requirements:
-     if (node->hasValue("status"))     {
-         //Compare (minimally) required status level with actual aircraft status:
-          if ( getNumMaturity(status->getStringValue() ) >= 
-               getNumMaturity(required_status->getStringValue() ) )
-                                 aircraft.push_back(descStr); }
-                                                 
-         }
-      
-   
-   }
-   }
-
-   ulCloseDir(dirp);
-}
-
-/*
- * Search in the current directory, and in on directory deeper
- * for <aircraft>-set.xml configuration files and show the aircaft name
- * and the contents of the<description> tag in a sorted manner.
- *
- * @parampath the directory to search for configuration files
- * @param recursive defines whether the directory should be searched recursively
- */
-void fgShowAircraft(const SGPath &path, bool recursive) {
-    string_list aircraft;
-
-    fgSearchAircraft( path, aircraft, recursive );
-
-    sort(aircraft.begin(), aircraft.end());
-    SG_LOG( SG_GENERAL, SG_ALERT, "" ); // To popup the console on Windows
-    cout << "Available aircraft:" << endl;
-    for ( unsigned int i = 0; i < aircraft.size(); i++ ) {
-        cout << aircraft[i] << endl;
-    }
-#ifdef _MSC_VER
-    cout << "Hit a key to continue..." << endl;
-    cin.get();
-#endif
-}