X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FScripting%2FNasalSys.cxx;h=75c49fbcf5d05d7b262b1de836e01ba9d21569d9;hb=4b59c152eafb5aa52c4562838090f037c07b65e9;hp=6e8c4ef05ccd8c36ab23a9535e5542a8afbf4735;hpb=b3c7cb7c151858ef79f9371a29be49915e5d3803;p=flightgear.git diff --git a/src/Scripting/NasalSys.cxx b/src/Scripting/NasalSys.cxx index 6e8c4ef05..75c49fbcf 100644 --- a/src/Scripting/NasalSys.cxx +++ b/src/Scripting/NasalSys.cxx @@ -23,6 +23,7 @@ #include #include #include +#include #include #include #include @@ -36,6 +37,7 @@ #include "NasalSGPath.hxx" #include "NasalSys.hxx" #include "NasalSys_private.hxx" +#include "NasalAircraft.hxx" #include "NasalModelData.hxx" #include "NasalPositioned.hxx" #include "NasalCanvas.hxx" @@ -144,11 +146,14 @@ public: void invoke() { + if( _singleShot ) + // Callback may restart the timer, so update status before callback is + // called (Prevent warnings of deleting not existing tasks from the + // event manager). + _isRunning = false; + naRef *args = NULL; _sys->callMethod(_func, _self, 0, args, naNil() /* locals */); - if (_singleShot) { - _isRunning = false; - } } void setSingleShot(bool aSingleShot) @@ -486,7 +491,7 @@ static naRef f_makeTimer(naContext c, naRef me, int argc, naRef* args) } TimerObj* timerObj = new TimerObj(nasalSys, func, self, args[0].num); - return NasalTimerObj::create(c, timerObj); + return nasal::to_nasal(c, timerObj); } // setlistener(func, property, bool) extension function. Falls through to @@ -696,6 +701,35 @@ static naRef f_parsexml(naContext c, naRef me, int argc, naRef* args) return naStr_fromdata(naNewString(c), const_cast(file), strlen(file)); } +/** + * Parse very simple and small subset of markdown + * + * parse_markdown(src) + */ +static naRef f_parse_markdown(naContext c, naRef me, int argc, naRef* args) +{ + nasal::CallContext ctx(c, me, argc, args); + return ctx.to_nasal( + simgear::SimpleMarkdown::parse(ctx.requireArg(0)) + ); +} + +/** + * Create md5 hash from given string + * + * md5(str) + */ +static naRef f_md5(naContext c, naRef me, int argc, naRef* args) +{ + if( argc != 1 || !naIsString(args[0]) ) + naRuntimeError(c, "md5(): wrong type or number of arguments"); + + return nasal::to_nasal( + c, + simgear::strutils::md5(naStr_data(args[0]), naStr_len(args[0])) + ); +} + // Return UNIX epoch time in seconds. static naRef f_systime(naContext c, naRef me, int argc, naRef* args) { @@ -734,6 +768,8 @@ static struct { const char* name; naCFunction func; } funcs[] = { { "resolvepath", f_resolveDataPath }, { "finddata", f_findDataDir }, { "parsexml", f_parsexml }, + { "parse_markdown", f_parse_markdown }, + { "md5", f_md5 }, { "systime", f_systime }, { 0, 0 } }; @@ -786,6 +822,7 @@ void FGNasalSys::init() initNasalPositioned(_globals, _context); initNasalPositioned_cppbind(_globals, _context); + initNasalAircraft(_globals, _context); NasalClipboard::init(this); initNasalCanvas(_globals, _context); initNasalCondition(_globals, _context); @@ -909,6 +946,9 @@ void FGNasalSys::update(double) _unloadList.pop()->unload(); } + // Destroy all queued ghosts + nasal::ghostProcessDestroyList(); + // The global context is a legacy thing. We use dynamically // created contexts for naCall() now, so that we can call them // recursively. But there are still spots that want to use it for