diff options
Diffstat (limited to '')
-rw-r--r-- | src/options.cpp | 15 | ||||
-rw-r--r-- | src/options.h | 4 | ||||
-rw-r--r-- | src/parser.cpp | 9 | ||||
-rw-r--r-- | src/scriptengine.cpp | 75 | ||||
-rw-r--r-- | src/scriptengine.h | 26 |
5 files changed, 110 insertions, 19 deletions
diff --git a/src/options.cpp b/src/options.cpp index 672858a..3ed2336 100644 --- a/src/options.cpp +++ b/src/options.cpp | |||
@@ -201,8 +201,9 @@ int Options::execute( Bu::StringArray aArgs ) | |||
201 | Parser parser( lex ); | 201 | Parser parser( lex ); |
202 | Expression *pExp = parser.parse(); | 202 | Expression *pExp = parser.parse(); |
203 | ScriptEngine se; | 203 | ScriptEngine se; |
204 | Number n = se.exec( pExp ); | 204 | se.sigError = Bu::slot( this, &Options::printError ); |
205 | Bu::println( n.toString() ); | 205 | se.sigNumResult = Bu::slot( this, &Options::printNumber ); |
206 | se.exec( pExp ); | ||
206 | exit( 0 ); | 207 | exit( 0 ); |
207 | return aArgs.getSize(); | 208 | return aArgs.getSize(); |
208 | } | 209 | } |
@@ -328,3 +329,13 @@ int Options::grind( Bu::StringArray aArgs ) | |||
328 | return 0; | 329 | return 0; |
329 | } | 330 | } |
330 | 331 | ||
332 | void Options::printError( const Bu::String &sMsg ) | ||
333 | { | ||
334 | Bu::println("ERROR: %1").arg( sMsg ); | ||
335 | } | ||
336 | |||
337 | void Options::printNumber( const class Number &rNum ) | ||
338 | { | ||
339 | Bu::println("%1").arg( rNum ); | ||
340 | } | ||
341 | |||
diff --git a/src/options.h b/src/options.h index a7453ab..dc28190 100644 --- a/src/options.h +++ b/src/options.h | |||
@@ -24,6 +24,10 @@ private: | |||
24 | 24 | ||
25 | int iScale; | 25 | int iScale; |
26 | int iRadix; | 26 | int iRadix; |
27 | |||
28 | private: | ||
29 | void printError( const Bu::String &sMsg ); | ||
30 | void printNumber( const class Number &rNum ); | ||
27 | }; | 31 | }; |
28 | 32 | ||
29 | #endif | 33 | #endif |
diff --git a/src/parser.cpp b/src/parser.cpp index e9388c8..982c342 100644 --- a/src/parser.cpp +++ b/src/parser.cpp | |||
@@ -199,6 +199,15 @@ void Parser::statement() | |||
199 | if( lex[0].eType == Token::tCommand ) | 199 | if( lex[0].eType == Token::tCommand ) |
200 | { | 200 | { |
201 | lex.setMode( Lexer::modeCommand ); | 201 | lex.setMode( Lexer::modeCommand ); |
202 | output( lex[0] ); | ||
203 | for(;;) | ||
204 | { | ||
205 | lex.nextToken(); | ||
206 | if( lex[0].eType == Token::tEndOfLine || | ||
207 | lex[0].eType == Token::tEndOfInput ) | ||
208 | break; | ||
209 | output( lex[0] ); | ||
210 | } | ||
202 | lex.setMode( Lexer::modeNormal ); | 211 | lex.setMode( Lexer::modeNormal ); |
203 | } | 212 | } |
204 | else | 213 | else |
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 | ||
diff --git a/src/scriptengine.h b/src/scriptengine.h index 74924d6..b25c651 100644 --- a/src/scriptengine.h +++ b/src/scriptengine.h | |||
@@ -2,11 +2,12 @@ | |||
2 | #define SCRIPT_ENGINE_H | 2 | #define SCRIPT_ENGINE_H |
3 | 3 | ||
4 | #include "number.h" | 4 | #include "number.h" |
5 | #include "expression.h" | ||
5 | 6 | ||
6 | #include <bu/hash.h> | 7 | #include <bu/hash.h> |
7 | #include <bu/list.h> | 8 | #include <bu/list.h> |
8 | #include <bu/string.h> | 9 | #include <bu/string.h> |
9 | 10 | #include <bu/signals.h> | |
10 | 11 | ||
11 | namespace Bu | 12 | namespace Bu |
12 | { | 13 | { |
@@ -16,18 +17,31 @@ class Expression; | |||
16 | 17 | ||
17 | class ScriptEngine | 18 | class ScriptEngine |
18 | { | 19 | { |
20 | private: | ||
21 | typedef Bu::Hash<Bu::String, Number> VarHash; | ||
22 | typedef Bu::List<Number> NumStack; | ||
23 | |||
19 | public: | 24 | public: |
20 | ScriptEngine(); | 25 | ScriptEngine(); |
21 | virtual ~ScriptEngine(); | 26 | virtual ~ScriptEngine(); |
22 | 27 | ||
23 | Number exec( const Bu::String &sExpr ); | 28 | void exec( const Bu::String &sExpr ); |
24 | Number exec( Bu::Stream &sInput ); | 29 | void exec( Bu::Stream &sInput ); |
25 | Number exec( Expression *pExpr ); | 30 | void exec( Expression *pExpr ); |
31 | |||
32 | bool isRunning() const { return bRunning; } | ||
33 | |||
34 | public: | ||
35 | Bu::Signal1<void, const class Number &> sigNumResult; | ||
36 | Bu::Signal1<void, const Bu::String &> sigError; | ||
37 | Bu::Signal1<void, const Bu::String &> sigMessage; | ||
38 | |||
39 | private: | ||
40 | void command( Expression::iterator &i ); | ||
26 | 41 | ||
27 | private: | 42 | private: |
28 | typedef Bu::Hash<Bu::String, Number> VarHash; | ||
29 | typedef Bu::List<Number> NumStack; | ||
30 | VarHash hVarState; | 43 | VarHash hVarState; |
44 | bool bRunning; | ||
31 | }; | 45 | }; |
32 | 46 | ||
33 | #endif | 47 | #endif |