1 // scriptmgr.cxx - run user scripts
2 // Written by David Megginson, started 2002.
4 // This file is in the Public Domain, and comes with no warranty.
7 #include "scriptmgr.hxx"
13 #include <Main/globals.hxx>
14 #include <Main/fg_props.hxx>
20 ////////////////////////////////////////////////////////////////////////
22 ////////////////////////////////////////////////////////////////////////
25 do_print (int argc, pslValue * argv, pslProgram * p)
27 for (int i = 0; i < argc; i++) {
28 switch(argv[i].getType()) {
30 cout << argv[i].getInt();
33 cout << argv[i].getFloat();
36 cout << argv[i].getString();
42 cout << "(**bad value**)";
49 do_get_property (int argc, pslValue * argv, pslProgram * p)
52 SGPropertyNode * prop = fgGetNode(argv[0].getString());
54 switch (prop->getType()) {
55 case SGPropertyNode::BOOL:
56 case SGPropertyNode::INT:
57 case SGPropertyNode::LONG:
58 result.set(prop->getIntValue());
60 case SGPropertyNode::FLOAT:
61 case SGPropertyNode::DOUBLE:
62 result.set(prop->getFloatValue());
64 case SGPropertyNode::STRING:
65 case SGPropertyNode::UNSPECIFIED:
66 result.set(prop->getStringValue());
80 do_set_property (int argc, pslValue * argv, pslProgram * p)
83 SGPropertyNode * prop = fgGetNode(argv[0].getString(), true);
84 switch (argv[1].getType()) {
86 prop->setIntValue(argv[1].getInt());
89 prop->setFloatValue(argv[1].getFloat());
92 prop->setStringValue(argv[1].getString());
95 prop->setUnspecifiedValue("");
98 // TODO: report an error.
107 extensions[] = { {"print", -1, do_print},
108 {"get_property", 1, do_get_property},
109 {"set_property", 2, do_set_property},
114 ////////////////////////////////////////////////////////////////////////
115 // Implementation of FGScriptMgr.
116 ////////////////////////////////////////////////////////////////////////
118 FGScriptMgr::FGScriptMgr ()
122 FGScriptMgr::~FGScriptMgr ()
133 FGScriptMgr::update (double delta_time_sec)
138 FGScriptMgr::run (const char * script) const
140 // FIXME: detect and report errors
141 pslProgram program(extensions);
142 if (program.compile(script, globals->get_fg_root().c_str()) > 0)
144 while (program.step() != PSL_PROGRAM_END)
150 FGScriptMgr::run_inline (const char * script) const
152 string s = "int main () {\n";
154 s += "\n return 0;\n}\n";
155 return run(s.c_str());
159 // end of scriptmgr.cxx