#include <Main/fg_props.hxx>
#include "NasalSys.hxx"
+#include "NasalDisplay.hxx"
// Read and return file contents in a single buffer. Note use of
// stat() to get the file size. This is a win32 function, believe it
return naNil();
}
+// setlistener(func, property) extension function. Falls through to
+// FGNasalSys::setListener(). See there for docs.
+static naRef f_setlistener(naContext c, naRef me, int argc, naRef* args)
+{
+ FGNasalSys* nasal = (FGNasalSys*)globals->get_subsystem("nasal");
+ nasal->setListener(argc, args);
+ return naNil();
+}
+
// Returns a ghost handle to the argument to the currently executing
// command
static naRef f_cmdarg(naContext c, naRef me, int argc, naRef* args)
return naNum(sg_random());
}
+static naRef f_srand(naContext c, naRef me, int argc, naRef* args)
+{
+ sg_srandom_time();
+ return naNum(0);
+}
+
+// Wrapper function for screenPrint
+static naRef f_screenPrint(naContext c, naRef me, int argc, naRef* args)
+{
+ if(argc != 1 || !naIsString(args[0]))
+ naRuntimeError(c, "bad arguments to screenPrint()");
+ naRef lmsg = args[0];
+ FGNasalSys* nasal = (FGNasalSys*)globals->get_subsystem("nasal");
+ nasal->screenPrint(naStr_data(lmsg));
+ return naNil();
+}
+
+// Return an array listing of all files in a directory
+static naRef f_directory(naContext c, naRef me, int argc, naRef* args)
+{
+ if(argc != 1 || !naIsString(args[0]))
+ naRuntimeError(c, "bad arguments to directory()");
+ naRef ldir = args[0];
+ ulDir* dir = ulOpenDir(naStr_data(args[0]));
+ if(!dir) return naNil();
+ naRef result = naNewVector(c);
+ ulDirEnt* dent;
+ while((dent = ulReadDir(dir)))
+ naVec_append(result, naStr_fromdata(naNewString(c), dent->d_name,
+ strlen(dent->d_name)));
+ ulCloseDir(dir);
+ return result;
+}
+
// Table of extension functions. Terminate with zeros.
static struct { char* name; naCFunction func; } funcs[] = {
{ "getprop", f_getprop },
{ "print", f_print },
{ "_fgcommand", f_fgcommand },
{ "settimer", f_settimer },
+ { "_setlistener", f_setlistener },
{ "_cmdarg", f_cmdarg },
{ "_interpolate", f_interpolate },
{ "rand", f_rand },
+ { "srand", f_srand },
+ { "screenPrint", f_screenPrint },
+ { "directory", f_directory },
{ 0, 0 }
};
nasal->handleTimer(this);
delete this;
}
+
+// setlistener(property, func) extension function. The first argument
+// is either a ghost (SGPropertyNode_ptr*) or a string (global property
+// path), the second is a Nasal function.
+void FGNasalSys::setListener(int argc, naRef* args)
+{
+ SGPropertyNode* node;
+ naRef prop = argc > 0 ? args[0] : naNil();
+ if(naIsString(prop)) node = fgGetNode(naStr_data(prop), true);
+ else if(naIsGhost(prop)) node = *(SGPropertyNode_ptr*)naGhost_ptr(prop);
+ else return;
+
+ naRef handler = argc > 1 ? args[1] : naNil();
+ if(!(naIsCode(handler) || naIsCCode(handler) || naIsFunc(handler)))
+ return;
+
+ node->addChangeListener(new FGNasalListener(handler, this, gcSave(handler)));
+}
+
+// functions providing access to the NasalDisplay - used to display text directly on the screen
+void FGNasalSys::screenPrint(const char* src)
+{
+ globals->get_Nasal_display()->RegisterSingleMessage(src, 0);
+}