#include <string.h> // strcmp()
#include <algorithm>
-#include STL_STRING
+#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 "viewmgr.hxx"
-SG_USING_STD(string);
-SG_USING_STD(sort);
-SG_USING_NAMESPACE(std);
+using std::string;
+using std::sort;
+using std::cout;
+using std::cerr;
+using std::endl;
+#ifndef VERSION
+#define VERSION "CVS "__DATE__
+#endif
#define NEW_DEFAULT_MODEL_HZ 120
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
}
/**
fgSetDouble("/position/altitude-ft", -9999.0);
// Orientation
- fgSetDouble("/orientation/heading-deg", 270);
- fgSetDouble("/orientation/roll-deg", 0);
+ fgSetDouble("/orientation/heading-deg", 9999.0);
+ fgSetDouble("/orientation/roll-deg", 0.0);
fgSetDouble("/orientation/pitch-deg", 0.424);
// Velocities
fgSetDouble("/sim/presets/latitude-deg", 9999.0);
fgSetDouble("/sim/presets/altitude-ft", -9999.0);
- fgSetDouble("/sim/presets/heading-deg", 270);
- fgSetDouble("/sim/presets/roll-deg", 0);
+ fgSetDouble("/sim/presets/heading-deg", 9999.0);
+ fgSetDouble("/sim/presets/roll-deg", 0.0);
fgSetDouble("/sim/presets/pitch-deg", 0.424);
fgSetString("/sim/presets/speed-set", "knots");
if ( fov < FG_FOV_MIN ) { fov = FG_FOV_MIN; }
if ( fov > FG_FOV_MAX ) { fov = FG_FOV_MAX; }
- fgSetDouble("/sim/current-view/field-of-view", fov);
+ fgSetDouble("/sim/view[0]/config/default-field-of-view-deg", fov);
// printf("parse_fov(): result = %.4f\n", fov);
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 );
return FG_OPTIONS_OK;
}
+static int
+fgOptParking( const char *arg )
+{
+ cerr << "Processing argument " << arg << endl;
+ fgSetString("/sim/presets/parking", arg );
+ fgSetBool ("/sim/presets/parking-requested", true );
+ 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;
/*
enum OptionType { OPTION_BOOL, OPTION_STRING, OPTION_DOUBLE, OPTION_INT, OPTION_CHANNEL, OPTION_FUNC };
struct OptionDesc {
- char *option;
+ const char *option;
bool has_param;
enum OptionType type;
- char *property;
+ const char *property;
bool b_param;
- char *s_param;
+ const char *s_param;
int (*func)( const char * );
} fgOptionArray[] = {
{"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 },
{"flight-plan", true, OPTION_FUNC, "", false, "", fgOptFlightPlan },
{"config", true, OPTION_FUNC, "", false, "", fgOptConfig },
{"aircraft", true, OPTION_STRING, "/sim/aircraft", false, "", 0 },
+ {"vehicle", true, OPTION_STRING, "/sim/aircraft", false, "", 0 },
{"failure", true, OPTION_FUNC, "", false, "", fgOptFailure },
{"com1", true, OPTION_DOUBLE, "/instrumentation/comm[0]/frequencies/selected-mhz", false, "", 0 },
{"com2", true, OPTION_DOUBLE, "/instrumentation/comm[1]/frequencies/selected-mhz", false, "", 0 },
{"min-status", true, OPTION_STRING, "/sim/aircraft-min-status", false, "all", 0 },
{"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}
};
}
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;
}
}
} 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() ) {
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" );
}
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" );
}
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" );
fgShowAircraft(path, true);
exit(0);
}
+
+ else if (result == FG_OPTIONS_EXIT)
+ exit(0);
}
} else {
in_options = false;
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;