diff options
Diffstat (limited to 'src/scriptengine.cpp')
-rw-r--r-- | src/scriptengine.cpp | 75 |
1 files changed, 64 insertions, 11 deletions
diff --git a/src/scriptengine.cpp b/src/scriptengine.cpp index 65b6ec2..b65db70 100644 --- a/src/scriptengine.cpp +++ b/src/scriptengine.cpp | |||
@@ -5,8 +5,12 @@ | |||
5 | 5 | ||
6 | #include <bu/staticmembuf.h> | 6 | #include <bu/staticmembuf.h> |
7 | #include <bu/exceptionbase.h> | 7 | #include <bu/exceptionbase.h> |
8 | #include <bu/sio.h> | ||
8 | 9 | ||
9 | ScriptEngine::ScriptEngine() | 10 | #include <stdlib.h> |
11 | |||
12 | ScriptEngine::ScriptEngine() : | ||
13 | bRunning( true ) | ||
10 | { | 14 | { |
11 | } | 15 | } |
12 | 16 | ||
@@ -14,23 +18,22 @@ ScriptEngine::~ScriptEngine() | |||
14 | { | 18 | { |
15 | } | 19 | } |
16 | 20 | ||
17 | Number ScriptEngine::exec( const Bu::String &sExpr ) | 21 | void ScriptEngine::exec( const Bu::String &sExpr ) |
18 | { | 22 | { |
19 | Bu::StaticMemBuf mb( sExpr.getStr(), sExpr.getSize() ); | 23 | Bu::StaticMemBuf mb( sExpr.getStr(), sExpr.getSize() ); |
20 | return exec( sExpr ); | 24 | exec( sExpr ); |
21 | } | 25 | } |
22 | 26 | ||
23 | Number ScriptEngine::exec( Bu::Stream &sInput ) | 27 | void ScriptEngine::exec( Bu::Stream &sInput ) |
24 | { | 28 | { |
25 | Lexer l( sInput ); | 29 | Lexer l( sInput ); |
26 | Parser p( l ); | 30 | Parser p( l ); |
27 | Expression *pExp = p.parse(); | 31 | Expression *pExp = p.parse(); |
28 | Number n = exec( pExp ); | 32 | exec( pExp ); |
29 | delete pExp; | 33 | delete pExp; |
30 | return n; | ||
31 | } | 34 | } |
32 | 35 | ||
33 | Number ScriptEngine::exec( Expression *pExpr ) | 36 | void ScriptEngine::exec( Expression *pExpr ) |
34 | { | 37 | { |
35 | NumStack sNums; | 38 | NumStack sNums; |
36 | 39 | ||
@@ -49,9 +52,12 @@ Number ScriptEngine::exec( Expression *pExpr ) | |||
49 | } | 52 | } |
50 | else | 53 | else |
51 | { | 54 | { |
52 | throw Bu::ExceptionBase( | 55 | if( sigError.isSet() ) |
53 | Bu::String("No such variable: $%1").arg(*(*i).sVal).end().getStr() | 56 | sigError( |
54 | ); | 57 | Bu::String("No such variable: $%1"). |
58 | arg(*(*i).sVal) | ||
59 | ); | ||
60 | return; | ||
55 | } | 61 | } |
56 | break; | 62 | break; |
57 | 63 | ||
@@ -90,9 +96,56 @@ Number ScriptEngine::exec( Expression *pExpr ) | |||
90 | case Token::tNegate: | 96 | case Token::tNegate: |
91 | sNums.push( -sNums.peekPop() ); | 97 | sNums.push( -sNums.peekPop() ); |
92 | break; | 98 | break; |
99 | |||
100 | case Token::tCommand: | ||
101 | command( i ); | ||
102 | return; | ||
93 | } | 103 | } |
94 | } | 104 | } |
95 | 105 | ||
96 | return sNums.peekPop(); | 106 | if( sigNumResult.isSet() ) |
107 | sigNumResult( sNums.peekPop() ); | ||
108 | } | ||
109 | |||
110 | void ScriptEngine::command( Expression::iterator &i ) | ||
111 | { | ||
112 | Bu::String sCmd = *(*i).sVal; | ||
113 | if( sCmd == "exit" || sCmd == "quit" ) | ||
114 | { | ||
115 | bRunning = false; | ||
116 | return; | ||
117 | } | ||
118 | else if( sCmd == "scale" ) | ||
119 | { | ||
120 | if( !(++i) ) | ||
121 | { | ||
122 | if( sigError.isSet() ) | ||
123 | sigError("You must provide a positive integer."); | ||
124 | return; | ||
125 | } | ||
126 | int32_t iScale = strtol( (*i).sVal->getStr(), 0, 10 ); | ||
127 | if( iScale < 0 ) | ||
128 | { | ||
129 | if( sigError.isSet() ) | ||
130 | sigError("You must provide a positive integer."); | ||
131 | return; | ||
132 | } | ||
133 | if( sigMessage.isSet() ) | ||
134 | sigMessage(Bu::String("Changed scale to: %1").arg( iScale )); | ||
135 | for( VarHash::iterator i = hVarState.begin(); i; i++ ) | ||
136 | (*i).setScale( iScale ); | ||
137 | } | ||
138 | else if( sCmd == "radix" ) | ||
139 | { | ||
140 | } | ||
141 | else if( sCmd == "vars" ) | ||
142 | { | ||
143 | } | ||
144 | else if( sCmd == "help" || sCmd == "?" ) | ||
145 | { | ||
146 | } | ||
147 | else | ||
148 | { | ||
149 | } | ||
97 | } | 150 | } |
98 | 151 | ||