04f1dc4837
1.6. The macro is HAVE_PLIB_PSL.
159 lines
3.4 KiB
C++
159 lines
3.4 KiB
C++
// scriptmgr.cxx - run user scripts
|
||
// Written by David Megginson, started 2002.
|
||
//
|
||
// This file is in the Public Domain, and comes with no warranty.
|
||
|
||
|
||
#include "scriptmgr.hxx"
|
||
|
||
#include <iostream>
|
||
|
||
#include <plib/psl.h>
|
||
|
||
#include <Main/globals.hxx>
|
||
#include <Main/fg_props.hxx>
|
||
|
||
SG_USING_STD(cout);
|
||
|
||
|
||
|
||
////////////////////////////////////////////////////////////////////////
|
||
// Extensions.
|
||
////////////////////////////////////////////////////////////////////////
|
||
|
||
static pslValue
|
||
do_print (int argc, pslValue * argv, pslProgram * p)
|
||
{
|
||
for (int i = 0; i < argc; i++) {
|
||
switch(argv[i].getType()) {
|
||
case PSL_INT:
|
||
cout << argv[i].getInt();
|
||
break;
|
||
case PSL_FLOAT:
|
||
cout << argv[i].getFloat();
|
||
break;
|
||
case PSL_STRING:
|
||
cout << argv[i].getString();
|
||
break;
|
||
case PSL_VOID:
|
||
cout << "(void)";
|
||
break;
|
||
default:
|
||
cout << "(**bad value**)";
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
|
||
static pslValue
|
||
do_get_property (int argc, pslValue * argv, pslProgram * p)
|
||
{
|
||
pslValue result;
|
||
SGPropertyNode * prop = fgGetNode(argv[0].getString());
|
||
if (prop != 0) {
|
||
switch (prop->getType()) {
|
||
case SGPropertyNode::BOOL:
|
||
case SGPropertyNode::INT:
|
||
case SGPropertyNode::LONG:
|
||
result.set(prop->getIntValue());
|
||
break;
|
||
case SGPropertyNode::FLOAT:
|
||
case SGPropertyNode::DOUBLE:
|
||
result.set(prop->getFloatValue());
|
||
break;
|
||
case SGPropertyNode::STRING:
|
||
case SGPropertyNode::UNSPECIFIED:
|
||
result.set(prop->getStringValue());
|
||
break;
|
||
default:
|
||
// DO SOMETHING
|
||
break;
|
||
}
|
||
} else {
|
||
result.set();
|
||
}
|
||
|
||
return result;
|
||
}
|
||
|
||
static pslValue
|
||
do_set_property (int argc, pslValue * argv, pslProgram * p)
|
||
{
|
||
pslValue result;
|
||
SGPropertyNode * prop = fgGetNode(argv[0].getString(), true);
|
||
switch (argv[1].getType()) {
|
||
case PSL_INT:
|
||
prop->setIntValue(argv[1].getInt());
|
||
break;
|
||
case PSL_FLOAT:
|
||
prop->setFloatValue(argv[1].getFloat());
|
||
break;
|
||
case PSL_STRING:
|
||
prop->setStringValue(argv[1].getString());
|
||
break;
|
||
case PSL_VOID:
|
||
prop->setUnspecifiedValue("");
|
||
break;
|
||
default:
|
||
// TODO: report an error.
|
||
break;
|
||
}
|
||
|
||
result.set();
|
||
return result;
|
||
}
|
||
|
||
static pslExtension
|
||
extensions[] = { {"print", -1, do_print},
|
||
{"get_property", 1, do_get_property},
|
||
{"set_property", 2, do_set_property},
|
||
{0, 0, 0} };
|
||
|
||
|
||
|
||
////////////////////////////////////////////////////////////////////////
|
||
// Implementation of FGScriptMgr.
|
||
////////////////////////////////////////////////////////////////////////
|
||
|
||
FGScriptMgr::FGScriptMgr ()
|
||
{
|
||
}
|
||
|
||
FGScriptMgr::~FGScriptMgr ()
|
||
{
|
||
}
|
||
|
||
void
|
||
FGScriptMgr::init ()
|
||
{
|
||
pslInit();
|
||
}
|
||
|
||
void
|
||
FGScriptMgr::update (double delta_time_sec)
|
||
{
|
||
}
|
||
|
||
bool
|
||
FGScriptMgr::run (const char * script) const
|
||
{
|
||
// FIXME: detect and report errors
|
||
pslProgram program(extensions);
|
||
if (program.compile(script, globals->get_fg_root().c_str()) > 0)
|
||
return false;
|
||
while (program.step() != PSL_PROGRAM_END)
|
||
;
|
||
return true;
|
||
}
|
||
|
||
bool
|
||
FGScriptMgr::run_inline (const char * script) const
|
||
{
|
||
string s = "int main () {\n";
|
||
s += script;
|
||
s += "\n return 0;\n}\n";
|
||
return run(s.c_str());
|
||
}
|
||
|
||
|
||
// end of scriptmgr.cxx
|