1
0
Fork 0
flightgear/src/Scripting/scriptmgr.cxx
2003-01-17 12:41:47 +00:00

159 lines
3.4 KiB
C++
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// 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