X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FScripting%2FNasalSys.cxx;h=72c964c04cabdab83b954341fb104620c1990e13;hb=e9f4106bc16b4dc55cdff4fae5f22ad31d30651a;hp=dc8b0d4342b94c99c25d3eea60f157348b6b4bca;hpb=988a6771aaf6657ed02e24d32a286e943386857b;p=flightgear.git diff --git a/src/Scripting/NasalSys.cxx b/src/Scripting/NasalSys.cxx index dc8b0d434..72c964c04 100644 --- a/src/Scripting/NasalSys.cxx +++ b/src/Scripting/NasalSys.cxx @@ -14,12 +14,11 @@ #include #include -#include - #include #include #include #include +#include #include #include #include @@ -33,6 +32,7 @@ #include
#include #include +#include #include "NasalSys.hxx" @@ -212,6 +212,7 @@ static naRef f_setprop(naContext c, naRef me, int argc, naRef* args) buf[BUFLEN] = 0; char* p = buf; int buflen = BUFLEN; + if(argc < 2) naRuntimeError(c, "setprop() expects at least 2 arguments"); for(int i=0; id_name, - strlen(dent->d_name))); - ulCloseDir(dir); + + simgear::PathList paths = d.children(simgear::Dir::TYPE_FILE | simgear::Dir::TYPE_DIR); + for (unsigned int i=0; iresolve_maybe_aircraft_path(naStr_data(args[0])); + const char* pdata = p.c_str(); + return naStr_fromdata(naNewString(c), const_cast(pdata), strlen(pdata)); +} + // Parse XML file. // parsexml( [, [, [, [, ]]]]); // @@ -599,6 +615,28 @@ static naRef f_airportinfo(naContext c, naRef me, int argc, naRef* args) HASHSET("ils_frequency_mhz", 17, naNum(rwy->ILS()->get_freq() / 100.0)); } + std::vector sids(rwy->getSIDs()); + naRef sidVec = naNewVector(c); + + for (unsigned int s=0; s < sids.size(); ++s) { + naRef procId = naStr_fromdata(naNewString(c), + const_cast(sids[s]->ident().c_str()), + sids[s]->ident().length()); + naVec_append(sidVec, procId); + } + HASHSET("sids", 4, sidVec); + + std::vector stars(rwy->getSTARs()); + naRef starVec = naNewVector(c); + + for (unsigned int s=0; s < stars.size(); ++s) { + naRef procId = naStr_fromdata(naNewString(c), + const_cast(stars[s]->ident().c_str()), + stars[s]->ident().length()); + naVec_append(starVec, procId); + } + HASHSET("stars", 5, starVec); + #undef HASHSET naHash_set(rwys, rwyid, rwydata); } @@ -635,6 +673,7 @@ static struct { const char* name; naCFunction func; } funcs[] = { { "srand", f_srand }, { "abort", f_abort }, { "directory", f_directory }, + { "resolvepath", f_resolveDataPath }, { "parsexml", f_parsexml }, { "systime", f_systime }, { "carttogeod", f_carttogeod }, @@ -684,18 +723,14 @@ void FGNasalSys::init() hashset(_globals, "__gcsave", _gcHash); // Now load the various source files in the Nasal directory - SGPath p(globals->get_fg_root()); - p.append("Nasal"); - ulDirEnt* dent; - ulDir* dir = ulOpenDir(p.c_str()); - while(dir && (dent = ulReadDir(dir)) != 0) { - SGPath fullpath(p); - fullpath.append(dent->d_name); - SGPath file(dent->d_name); - if(file.extension() != "nas") continue; - loadModule(fullpath, file.base().c_str()); + simgear::Dir nasalDir(SGPath(globals->get_fg_root(), "Nasal")); + simgear::PathList scripts = nasalDir.children(simgear::Dir::TYPE_FILE, ".nas"); + + for (unsigned int i=0; igetChild("file", j)) != NULL) { file_specified = true; const char* file = fn->getStringValue(); - SGPath p(globals->get_fg_root()); - p.append(file); + SGPath p = globals->resolve_maybe_aircraft_path(file); loadModule(p, module); j++; } @@ -759,7 +793,7 @@ void FGNasalSys::loadPropertyScripts() const char* src = n->getStringValue("script"); if(!n->hasChild("script")) src = 0; // Hrm... if(src) - createModule(module, n->getPath(), src, strlen(src)); + createModule(module, n->getPath().c_str(), src, strlen(src)); if(!file_specified && !src) SG_LOG(SG_NASAL, SG_ALERT, "Nasal error: " << @@ -856,7 +890,7 @@ bool FGNasalSys::handleCommand(const SGPropertyNode* arg) { const char* nasal = arg->getStringValue("script"); const char* moduleName = arg->getStringValue("module"); - naRef code = parse(arg->getPath(true), nasal, strlen(nasal)); + naRef code = parse(arg->getPath(true).c_str(), nasal, strlen(nasal)); if(naIsNil(code)) return false; // Commands can be run "in" a module. Make sure that module