]> git.mxchange.org Git - flightgear.git/blob - src/Scripting/scriptmgr.cxx
Moved random ground cover object management code (userdata.[ch]xx) over
[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
48 static pslValue
49 do_get_property (int argc, pslValue * argv, pslProgram * p)
50 {
51     pslValue result;
52     SGPropertyNode * prop = fgGetNode(argv[0].getString());
53     if (prop != 0) {
54         switch (prop->getType()) {
55         case SGPropertyNode::BOOL:
56         case SGPropertyNode::INT:
57         case SGPropertyNode::LONG:
58             result.set(prop->getIntValue());
59             break;
60         case SGPropertyNode::FLOAT:
61         case SGPropertyNode::DOUBLE:
62             result.set(prop->getFloatValue());
63             break;
64         case SGPropertyNode::STRING:
65         case SGPropertyNode::UNSPECIFIED:
66             result.set(prop->getStringValue());
67             break;
68         default:
69             // DO SOMETHING
70             break;
71         }
72     } else {
73         result.set();
74     }
75
76     return result;
77 }
78
79 static pslValue
80 do_set_property (int argc, pslValue * argv, pslProgram * p)
81 {
82     pslValue result;
83     SGPropertyNode * prop = fgGetNode(argv[0].getString(), true);
84     switch (argv[1].getType()) {
85     case PSL_INT:
86         prop->setIntValue(argv[1].getInt());
87         break;
88     case PSL_FLOAT:
89         prop->setFloatValue(argv[1].getFloat());
90         break;
91     case PSL_STRING:
92         prop->setStringValue(argv[1].getString());
93         break;
94     case PSL_VOID:
95         prop->setUnspecifiedValue("");
96         break;
97     default:
98         // TODO: report an error.
99         break;
100     }
101
102     result.set();
103     return result;
104 }
105
106 static pslExtension
107 extensions[] = { {"print", -1, do_print},
108                  {"get_property", 1, do_get_property},
109                  {"set_property", 2, do_set_property},
110                  {0, 0, 0} };
111
112
113 \f
114 ////////////////////////////////////////////////////////////////////////
115 // Implementation of FGScriptMgr.
116 ////////////////////////////////////////////////////////////////////////
117
118 FGScriptMgr::FGScriptMgr ()
119 {
120 }
121
122 FGScriptMgr::~FGScriptMgr ()
123 {
124 }
125
126 void
127 FGScriptMgr::init ()
128 {
129     pslInit();
130 }
131
132 void
133 FGScriptMgr::update (double delta_time_sec)
134 {
135 }
136
137 bool
138 FGScriptMgr::run (const char * script) const
139 {
140                                 // FIXME: detect and report errors
141     pslProgram program(extensions);
142     if (program.compile(script, globals->get_fg_root().c_str()) > 0)
143         return false;
144     while (program.step() != PSL_PROGRAM_END)
145         ;
146     return true;
147 }
148
149 bool
150 FGScriptMgr::run_inline (const char * script) const
151 {
152     string s = "int main () {\n";
153     s += script;
154     s += "\n  return 0;\n}\n";
155     return run(s.c_str());
156 }
157
158
159 // end of scriptmgr.cxx