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 | ||
