]> git.mxchange.org Git - flightgear.git/blobdiff - src/Main/options.cxx
- Added ultra-light traffic is now a separate traffic class that can have its
[flightgear.git] / src / Main / options.cxx
index 37f2d46304e9fcda53643bad75421378cd8e2955..518b1babf265bac95b4b86d6c8b401bacffdcfb7 100644 (file)
@@ -1398,6 +1398,46 @@ struct OptionDesc {
 };
 
 
+// Set a property for the --prop: option. Syntax: --prop:[<type>:]<name>=<value>
+// <type> can be "double" etc. but also only the first letter "d".
+// Examples:  --prop:alpha=1  --prop:bool:beta=true  --prop:d:gamma=0.123
+static bool
+set_property(const string& arg)
+{
+    string::size_type pos = arg.find('=');
+    if (pos == arg.npos || pos == 0 || pos + 1 == arg.size())
+        return false;
+
+    string name = arg.substr(0, pos);
+    string value = arg.substr(pos + 1);
+    string type;
+    pos = name.find(':');
+
+    if (pos != name.npos && pos != 0 && pos + 1 != name.size()) {
+        type = name.substr(0, pos);
+        name = name.substr(pos + 1);
+    }
+    SGPropertyNode *n = fgGetNode(name.c_str(), true);
+
+    if (type.empty())
+        return n->setUnspecifiedValue(value.c_str());
+    else if (type == "s" || type == "string")
+        return n->setStringValue(value.c_str());
+    else if (type == "d" || type == "double")
+        return n->setDoubleValue(strtod(value.c_str(), 0));
+    else if (type == "f" || type == "float")
+        return n->setFloatValue(atof(value.c_str()));
+    else if (type == "l" || type == "long")
+        return n->setLongValue(strtol(value.c_str(), 0, 0));
+    else if (type == "i" || type == "int")
+        return n->setIntValue(atoi(value.c_str()));
+    else if (type == "b" || type == "bool")
+        return n->setBoolValue(value == "true" || atoi(value.c_str()) != 0);
+
+    return false;
+}
+
+
 // Parse a single option
 static int
 parse_option (const string& arg)
@@ -1422,15 +1462,9 @@ parse_option (const string& arg)
     } else if ( arg.find( "--show-aircraft") == 0) {
         return(FG_OPTIONS_SHOW_AIRCRAFT);
     } else if ( arg.find( "--prop:" ) == 0 ) {
-        string assign = arg.substr(7);
-       string::size_type pos = assign.find('=');
-       if ( pos == arg.npos || pos == 0 || pos + 1 == assign.size() ) {
-           SG_LOG( SG_GENERAL, SG_ALERT, "Bad property assignment: " << arg );
+        if (!set_property(arg.substr(7))) {
+            SG_LOG( SG_GENERAL, SG_ALERT, "Bad property assignment: " << arg );
             return FG_OPTIONS_ERROR;
-        } else {
-           string name = assign.substr(0, pos);
-           string value = assign.substr(pos + 1);
-           fgSetString(name.c_str(), value.c_str());
         }
     } else if ( arg.find( "--" ) == 0 ) {
         size_t pos = arg.find( '=' );