]> git.mxchange.org Git - flightgear.git/blob - src/Scripting/scriptmgr.cxx
The code to find the highest hit below you didn't work quite right when
[flightgear.git] / src / Scripting / scriptmgr.cxx
1 // scriptmgr.cxx - run user scripts
2 // Written by David Megginson, started 2002.
3 //
4 // This file is in the Public Domain, and comes with no warranty.
5
6
7 #include "scriptmgr.hxx"
8
9 #include <iostream>
10
11 #include <plib/psl.h>
12
13 #include <Main/globals.hxx>
14 #include <Main/fg_props.hxx>
15
16 SG_USING_STD(cout);
17
18
19 \f
20 ////////////////////////////////////////////////////////////////////////
21 // Extensions.
22 ////////////////////////////////////////////////////////////////////////
23
24 static pslValue
25 do_print (int argc, pslValue * argv, pslProgram * p)
26 {
27     for (int i = 0; i < argc; i++) {
28         switch(argv[i].getType()) {
29         case PSL_INT:
30             cout << argv[i].getInt();
31             break;
32         case PSL_FLOAT:
33             cout << argv[i].getFloat();
34             break;
35         case PSL_STRING:
36             cout << argv[i].getString();
37             break;
38         case PSL_VOID:
39             cout << "(void)";
40             break;
41         default:
42             cout << "(**bad value**)";
43             break;
44         }
45     }
46
47     pslValue result;
48     result.set();
49     return result;
50 }
51
52 static pslValue
53 do_get_property (int argc, pslValue * argv, pslProgram * p)
54 {
55     pslValue result;
56     SGPropertyNode * prop = fgGetNode(argv[0].getString());
57     if (prop != 0) {
58         switch (prop->getType()) {
59         case SGPropertyNode::BOOL:
60         case SGPropertyNode::INT:
61         case SGPropertyNode::LONG:
62             result.set(prop->getIntValue());
63             break;
64         case SGPropertyNode::FLOAT:
65         case SGPropertyNode::DOUBLE:
66             result.set(prop->getFloatValue());
67             break;
68         case SGPropertyNode::STRING:
69         case SGPropertyNode::UNSPECIFIED:
70             result.set(prop->getStringValue());
71             break;
72         default:
73             // DO SOMETHING
74             break;
75         }
76     } else {
77         result.set();
78     }
79
80     return result;
81 }
82
83 static pslValue
84 do_set_property (int argc, pslValue * argv, pslProgram * p)
85 {
86     pslValue result;
87     SGPropertyNode * prop = fgGetNode(argv[0].getString(), true);
88     switch (argv[1].getType()) {
89     case PSL_INT:
90         prop->setIntValue(argv[1].getInt());
91         break;
92     case PSL_FLOAT:
93         prop->setFloatValue(argv[1].getFloat());
94         break;
95     case PSL_STRING:
96         prop->setStringValue(argv[1].getString());
97         break;
98     case PSL_VOID:
99         prop->setUnspecifiedValue("");
100         break;
101     default:
102         // TODO: report an error.
103         break;
104     }
105
106     result.set();
107     return result;
108 }
109
110 static pslExtension
111 extensions[] = { {"print", -1, do_print},
112                  {"get_property", 1, do_get_property},
113                  {"set_property", 2, do_set_property},
114                  {0, 0, 0} };
115
116
117 \f
118 ////////////////////////////////////////////////////////////////////////
119 // Implementation of FGScriptMgr.
120 ////////////////////////////////////////////////////////////////////////
121
122 FGScriptMgr::FGScriptMgr ()
123 {
124 }
125
126 FGScriptMgr::~FGScriptMgr ()
127 {
128 }
129
130 void
131 FGScriptMgr::init ()
132 {
133     pslInit();
134 }
135
136 void
137 FGScriptMgr::update (double delta_time_sec)
138 {
139 }
140
141 bool
142 FGScriptMgr::run (const char * script) const
143 {
144                                 // FIXME: detect and report errors
145     pslProgram program(extensions);
146     if (program.compile(script, globals->get_fg_root().c_str()) > 0)
147         return false;
148     while (program.step() != PSL_PROGRAM_END)
149         ;
150     return true;
151 }
152
153 bool
154 FGScriptMgr::run_inline (const char * script) const
155 {
156     string s = "int main () {\n";
157     s += script;
158     s += "\n  return 0;\n}\n";
159     return run(s.c_str());
160 }
161
162
163 // end of scriptmgr.cxx