X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FScripting%2FNasalPositioned.cxx;h=1d2b41402a28a71b02f12e0266a2f66463f20af4;hb=accdf97785593046744cebbcdc467b4e52a86ebd;hp=9da830f31c2961c7c770b70cafa2b51a3067a7b5;hpb=7de4cb5965fbf73fb09a161978cd2702dfbcf206;p=flightgear.git diff --git a/src/Scripting/NasalPositioned.cxx b/src/Scripting/NasalPositioned.cxx index 9da830f31..1d2b41402 100644 --- a/src/Scripting/NasalPositioned.cxx +++ b/src/Scripting/NasalPositioned.cxx @@ -124,6 +124,17 @@ static naRef stringToNasal(naContext c, const std::string& s) s.length()); } +static bool convertToNum(naRef v, double& result) +{ + naRef n = naNumValue(v); + if (naIsNil(n)) { + return false; // couldn't convert + } + + result = n.num; + return true; +} + static WayptFlag wayptFlagFromString(const char* s) { if (!strcmp(s, "sid")) return WPT_DEPARTURE; @@ -1118,7 +1129,11 @@ static naRef f_airport_comms(naContext c, naRef me, int argc, naRef* args) naRef comms = naNewVector(c); // if we have an explicit type, return a simple vector of frequencies - if (argc > 0 && naIsScalar(args[0])) { + if (argc > 0 && !naIsString(args[0])) { + naRuntimeError(c, "airport.comms argument must be a frequency type name"); + } + + if (argc > 0) { std::string commName = naStr_data(args[0]); FGPositioned::Type commType = FGPositioned::typeFromName(commName); @@ -1920,6 +1935,10 @@ static naRef f_createWP(naContext c, naRef me, int argc, naRef* args) // set waypt flags - approach, departure, pseudo, etc if (argc > argOffset) { WayptFlag f = wayptFlagFromString(naStr_data(args[argOffset++])); + if (f == 0) { + naRuntimeError(c, "createWP: bad waypoint role"); + } + wpt->setFlag(f); } @@ -1947,6 +1966,9 @@ static naRef f_createWPFrom(naContext c, naRef me, int argc, naRef* args) // set waypt flags - approach, departure, pseudo, etc if (argc > 1) { WayptFlag f = wayptFlagFromString(naStr_data(args[1])); + if (f == 0) { + naRuntimeError(c, "createWPFrom: bad waypoint role"); + } wpt->setFlag(f); } @@ -2116,6 +2138,10 @@ static naRef f_flightplan_clearWPType(naContext c, naRef me, int argc, naRef* ar } WayptFlag flag = wayptFlagFromString(naStr_data(args[0])); + if (flag == 0) { + naRuntimeError(c, "clearWPType: bad waypoint role"); + } + fp->clearWayptsWithFlag(flag); return naNil(); } @@ -2171,13 +2197,14 @@ static naRef f_leg_setSpeed(naContext c, naRef me, int argc, naRef* args) if (!leg) { naRuntimeError(c, "leg.setSpeed called on non-flightplan-leg object"); } - - if (argc < 2) { - naRuntimeError(c, "bad arguments to leg.setSpeed"); - } - + + double speed = 0.0; + if ((argc < 2) || !convertToNum(args[0], speed)) + naRuntimeError(c, "bad arguments to setSpeed"); + RouteRestriction rr = routeRestrictionFromString(naStr_data(args[1])); - leg->setSpeed(rr, args[0].num); + leg->setSpeed(rr, speed); + return naNil(); } @@ -2188,12 +2215,13 @@ static naRef f_leg_setAltitude(naContext c, naRef me, int argc, naRef* args) naRuntimeError(c, "leg.setAltitude called on non-flightplan-leg object"); } - if (argc < 2) { - naRuntimeError(c, "bad arguments to leg.setAltitude"); - } - + double alt = 0.0; + if ((argc < 2) || !convertToNum(args[0], alt)) + naRuntimeError(c, "bad arguments to leg.setAltitude"); + RouteRestriction rr = routeRestrictionFromString(naStr_data(args[1])); - leg->setAltitude(rr, args[0].num); + leg->setAltitude(rr, alt); + return naNil(); } @@ -2392,10 +2420,10 @@ static struct { const char* name; naCFunction func; } funcs[] = { }; -naRef initNasalPositioned(naRef globals, naContext c, naRef gcSave) +naRef initNasalPositioned(naRef globals, naContext c) { airportPrototype = naNewHash(c); - hashset(c, gcSave, "airportProto", airportPrototype); + naSave(c, airportPrototype); hashset(c, airportPrototype, "runway", naNewFunc(c, naNewCCode(c, f_airport_runway))); hashset(c, airportPrototype, "runwaysWithoutReciprocals", naNewFunc(c, naNewCCode(c, f_airport_runwaysWithoutReciprocals))); @@ -2413,7 +2441,7 @@ naRef initNasalPositioned(naRef globals, naContext c, naRef gcSave) hashset(c, airportPrototype, "tostring", naNewFunc(c, naNewCCode(c, f_airport_toString))); flightplanPrototype = naNewHash(c); - hashset(c, gcSave, "flightplanProto", flightplanPrototype); + naSave(c, flightplanPrototype); hashset(c, flightplanPrototype, "getWP", naNewFunc(c, naNewCCode(c, f_flightplan_getWP))); hashset(c, flightplanPrototype, "currentWP", naNewFunc(c, naNewCCode(c, f_flightplan_currentWP))); @@ -2431,19 +2459,19 @@ naRef initNasalPositioned(naRef globals, naContext c, naRef gcSave) hashset(c, flightplanPrototype, "finish", naNewFunc(c, naNewCCode(c, f_flightplan_finish))); waypointPrototype = naNewHash(c); - hashset(c, gcSave, "wayptProto", waypointPrototype); + naSave(c, waypointPrototype); hashset(c, waypointPrototype, "navaid", naNewFunc(c, naNewCCode(c, f_waypoint_navaid))); hashset(c, waypointPrototype, "runway", naNewFunc(c, naNewCCode(c, f_waypoint_runway))); hashset(c, waypointPrototype, "airport", naNewFunc(c, naNewCCode(c, f_waypoint_airport))); procedurePrototype = naNewHash(c); - hashset(c, gcSave, "procedureProto", procedurePrototype); + naSave(c, procedurePrototype); hashset(c, procedurePrototype, "transition", naNewFunc(c, naNewCCode(c, f_procedure_transition))); hashset(c, procedurePrototype, "route", naNewFunc(c, naNewCCode(c, f_procedure_route))); fpLegPrototype = naNewHash(c); - hashset(c, gcSave, "fpLegProto", fpLegPrototype); + naSave(c, fpLegPrototype); hashset(c, fpLegPrototype, "setSpeed", naNewFunc(c, naNewCCode(c, f_leg_setSpeed))); hashset(c, fpLegPrototype, "setAltitude", naNewFunc(c, naNewCCode(c, f_leg_setAltitude))); hashset(c, fpLegPrototype, "path", naNewFunc(c, naNewCCode(c, f_leg_path)));