]> git.mxchange.org Git - flightgear.git/blobdiff - src/Main/options.cxx
header cleanups
[flightgear.git] / src / Main / options.cxx
index 9eb8956c732a31585262bf7833bf4ec2c27dbd21..6286578af3d6fa355e57e2cbb0020ade8e7d8729 100644 (file)
 #include <string.h>            // strcmp()
 #include <algorithm>
 
-#include STL_STRING
+#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 "viewmgr.hxx"
 
 
-SG_USING_STD(string);
-SG_USING_STD(sort);
-SG_USING_NAMESPACE(std);
+using std::string;
+using std::sort;
 
+#ifndef VERSION
+#define VERSION "CVS "__DATE__
+#endif
 
 #define NEW_DEFAULT_MODEL_HZ 120
 
@@ -72,31 +75,21 @@ enum
     FG_OPTIONS_OK = 0,
     FG_OPTIONS_HELP = 1,
     FG_OPTIONS_ERROR = 2,
-    FG_OPTIONS_VERBOSE_HELP = 3,
-    FG_OPTIONS_SHOW_AIRCRAFT = 4
+    FG_OPTIONS_EXIT = 3,
+    FG_OPTIONS_VERBOSE_HELP = 4,
+    FG_OPTIONS_SHOW_AIRCRAFT = 5
 };
 
 static double
 atof( const string& str )
 {
-
-#ifdef __MWERKS__
-    // -dw- if ::atof is called, then we get an infinite loop
-    return std::atof( str.c_str() );
-#else
     return ::atof( str.c_str() );
-#endif
 }
 
 static int
 atoi( const string& str )
 {
-#ifdef __MWERKS__
-    // -dw- if ::atoi is called, then we get an infinite loop
-    return std::atoi( str.c_str() );
-#else
     return ::atoi( str.c_str() );
-#endif
 }
 
 /**
@@ -567,12 +560,8 @@ parse_flightplan(const string& arg)
 
     while ( true ) {
         string line;
-
-#if defined( macintosh )
-        getline( in, line, '\r' );
-#else
         getline( in, line, '\n' );
-#endif
+
         // catch extraneous (DOS) line ending character
         if ( line[line.length() - 1] < 32 )
             line = line.substr( 0, line.length()-1 );
@@ -1198,6 +1187,14 @@ fgOptParking( const char *arg )
     return FG_OPTIONS_OK;
 }
 
+static int
+fgOptVersion( const char *arg )
+{
+    cerr << VERSION << endl;
+    cerr << "FG_ROOT=" << globals->get_fg_root() << endl;
+    cerr << "FG_HOME=" << fgGetString("/sim/fg-home") << endl;
+    return FG_OPTIONS_EXIT;
+}
 
 static map<string,size_t> fgOptionMap;
 
@@ -1275,15 +1272,14 @@ struct OptionDesc {
     {"disable-sound",                false, OPTION_BOOL,   "/sim/sound/pause", true, "", 0 },
     {"enable-sound",                 false, OPTION_BOOL,   "/sim/sound/pause", false, "", 0 },
     {"airport",                      true,  OPTION_STRING, "/sim/presets/airport-id", false, "", 0 },
-    {"airport-id",                   true,  OPTION_STRING, "/sim/presets/airport-id", false, "", 0 },
     {"runway",                       true,  OPTION_FUNC,   "", false, "", fgOptRunway },
     {"vor",                          true,  OPTION_FUNC,   "", false, "", fgOptVOR },
     {"ndb",                          true,  OPTION_FUNC,   "", false, "", fgOptNDB },
     {"carrier",                      true,  OPTION_FUNC,   "", false, "", fgOptCarrier },
     {"parkpos",                      true,  OPTION_FUNC,   "", false, "", fgOptParkpos },
     {"fix",                          true,  OPTION_FUNC,   "", false, "", fgOptFIX },
-    {"offset-distance",              true,  OPTION_DOUBLE, "/sim/presets/offset-distance", false, "", 0 },
-    {"offset-azimuth",               true,  OPTION_DOUBLE, "/sim/presets/offset-azimuth", false, "", 0 },
+    {"offset-distance",              true,  OPTION_DOUBLE, "/sim/presets/offset-distance-nm", false, "", 0 },
+    {"offset-azimuth",               true,  OPTION_DOUBLE, "/sim/presets/offset-azimuth-deg", false, "", 0 },
     {"lon",                          true,  OPTION_FUNC,   "", false, "", fgOptLon },
     {"lat",                          true,  OPTION_FUNC,   "", false, "", fgOptLat },
     {"altitude",                     true,  OPTION_FUNC,   "", false, "", fgOptAltitude },
@@ -1406,6 +1402,7 @@ struct OptionDesc {
     {"livery",                       true,  OPTION_FUNC,   "", false, "", fgOptLivery },
     {"ai-scenario",                  true,  OPTION_FUNC,   "", false, "", fgOptScenario },
     {"parking-id",                   true,  OPTION_FUNC,   "", false, "", fgOptParking  },
+    {"version",                      false, OPTION_FUNC,   "", false, "", fgOptVersion },
     {0}
 };
 
@@ -1431,22 +1428,29 @@ set_property(const string& arg)
     }
     SGPropertyNode *n = fgGetNode(name.c_str(), true);
 
+    bool writable = n->getAttribute(SGPropertyNode::WRITE);
+    if (!writable)
+        n->setAttribute(SGPropertyNode::WRITE, true);
+
+    bool ret = false;
     if (type.empty())
-        return n->setUnspecifiedValue(value.c_str());
+        ret = n->setUnspecifiedValue(value.c_str());
     else if (type == "s" || type == "string")
-        return n->setStringValue(value.c_str());
+        ret = n->setStringValue(value.c_str());
     else if (type == "d" || type == "double")
-        return n->setDoubleValue(strtod(value.c_str(), 0));
+        ret = n->setDoubleValue(strtod(value.c_str(), 0));
     else if (type == "f" || type == "float")
-        return n->setFloatValue(atof(value.c_str()));
+        ret = n->setFloatValue(atof(value.c_str()));
     else if (type == "l" || type == "long")
-        return n->setLongValue(strtol(value.c_str(), 0, 0));
+        ret =  n->setLongValue(strtol(value.c_str(), 0, 0));
     else if (type == "i" || type == "int")
-        return n->setIntValue(atoi(value.c_str()));
+        ret =  n->setIntValue(atoi(value.c_str()));
     else if (type == "b" || type == "bool")
-        return n->setBoolValue(value == "true" || atoi(value.c_str()) != 0);
+        ret =  n->setBoolValue(value == "true" || atoi(value.c_str()) != 0);
 
-    return false;
+    if (!writable)
+        n->setAttribute(SGPropertyNode::WRITE, false);
+    return ret;
 }
 
 
@@ -1480,11 +1484,12 @@ parse_option (const string& arg)
         }
     } else if ( arg.find( "--" ) == 0 ) {
         size_t pos = arg.find( '=' );
-        string arg_name;
+        string arg_name, arg_value;
         if ( pos == string::npos ) {
             arg_name = arg.substr( 2 );
         } else {
             arg_name = arg.substr( 2, pos - 2 );
+            arg_value = arg.substr( pos + 1);
         }
         map<string,size_t>::iterator it = fgOptionMap.find( arg_name );
         if ( it != fgOptionMap.end() ) {
@@ -1494,9 +1499,9 @@ parse_option (const string& arg)
                     fgSetBool( pt->property, pt->b_param );
                     break;
                 case OPTION_STRING:
-                    if ( pt->has_param && pos != string::npos && pos + 1 < arg.size() ) {
-                        fgSetString( pt->property, arg.substr( pos + 1 ).c_str() );
-                    } else if ( !pt->has_param && pos == string::npos ) {
+                    if ( pt->has_param && !arg_value.empty() ) {
+                        fgSetString( pt->property, arg_value.c_str() );
+                    } else if ( !pt->has_param && arg_value.empty() ) {
                         fgSetString( pt->property, pt->s_param );
                     } else if ( pt->has_param ) {
                         SG_LOG( SG_GENERAL, SG_ALERT, "Option '" << arg << "' needs a parameter" );
@@ -1507,25 +1512,25 @@ parse_option (const string& arg)
                     }
                     break;
                 case OPTION_DOUBLE:
-                    if ( pos != string::npos && pos + 1 < arg.size() ) {
-                        fgSetDouble( pt->property, atof( arg.substr( pos + 1 ) ) );
+                    if ( !arg_value.empty() ) {
+                        fgSetDouble( pt->property, atof( arg_value ) );
                     } else {
                         SG_LOG( SG_GENERAL, SG_ALERT, "Option '" << arg << "' needs a parameter" );
                         return FG_OPTIONS_ERROR;
                     }
                     break;
                 case OPTION_INT:
-                    if ( pos != string::npos && pos + 1 < arg.size() ) {
-                        fgSetInt( pt->property, atoi( arg.substr( pos + 1 ) ) );
+                    if ( !arg_value.empty() ) {
+                        fgSetInt( pt->property, atoi( arg_value ) );
                     } else {
                         SG_LOG( SG_GENERAL, SG_ALERT, "Option '" << arg << "' needs a parameter" );
                         return FG_OPTIONS_ERROR;
                     }
                     break;
                 case OPTION_CHANNEL:
-                    if ( pt->has_param && pos != string::npos && pos + 1 < arg.size() ) {
-                        add_channel( pt->option, arg.substr( pos + 1 ) );
-                    } else if ( !pt->has_param && pos == string::npos ) {
+                    if ( pt->has_param && !arg_value.empty() ) {
+                        add_channel( pt->option, arg_value );
+                    } else if ( !pt->has_param && arg_value.empty() ) {
                         add_channel( pt->option, pt->s_param );
                     } else if ( pt->has_param ) {
                         SG_LOG( SG_GENERAL, SG_ALERT, "Option '" << arg << "' needs a parameter" );
@@ -1536,9 +1541,9 @@ parse_option (const string& arg)
                     }
                     break;
                 case OPTION_FUNC:
-                    if ( pt->has_param && pos != string::npos && pos + 1 < arg.size() ) {
-                        return pt->func( arg.substr( pos + 1 ).c_str() );
-                    } else if ( !pt->has_param && pos == string::npos ) {
+                    if ( pt->has_param && !arg_value.empty() ) {
+                        return pt->func( arg_value.c_str() );
+                    } else if ( !pt->has_param && arg_value.empty() ) {
                         return pt->func( 0 );
                     } else if ( pt->has_param ) {
                         SG_LOG( SG_GENERAL, SG_ALERT, "Option '" << arg << "' needs a parameter" );
@@ -1593,6 +1598,9 @@ fgParseArgs (int argc, char **argv)
                fgShowAircraft(path, true);
                exit(0);
             }
+
+            else if (result == FG_OPTIONS_EXIT)
+               exit(0);
          }
        } else {
          in_options = false;
@@ -1623,20 +1631,9 @@ fgParseOptions (const string& path) {
     SG_LOG( SG_GENERAL, SG_INFO, "Processing config file: " << path );
 
     in >> skipcomment;
-#ifndef __MWERKS__
     while ( ! in.eof() ) {
-#else
-    char c = '\0';
-    while ( in.get(c) && c != '\0' ) {
-       in.putback(c);
-#endif
        string line;
-
-#if defined( macintosh )
-        getline( in, line, '\r' );
-#else
        getline( in, line, '\n' );
-#endif
 
         // catch extraneous (DOS) line ending character
         int i;