diff options
-rw-r--r-- | src/formula.h | 21 | ||||
-rw-r--r-- | src/stack.h | 6 | ||||
-rw-r--r-- | src/tests/formula.cpp | 27 |
3 files changed, 47 insertions, 7 deletions
diff --git a/src/formula.h b/src/formula.h index d1e77e3..20ffa5b 100644 --- a/src/formula.h +++ b/src/formula.h | |||
@@ -60,6 +60,14 @@ namespace Bu | |||
60 | 60 | ||
61 | prec run( const Bu::FString &sFormulaSrc ) | 61 | prec run( const Bu::FString &sFormulaSrc ) |
62 | { | 62 | { |
63 | /* | ||
64 | if( !sOper.isEmpty() ) | ||
65 | printf("sOper.isEmpty() == false!\n"); | ||
66 | if( !sValue.isEmpty() ) | ||
67 | printf("sValue.isEmpty() == false!\n"); | ||
68 | if( !sFunc.isEmpty() ) | ||
69 | printf("sFunc.isEmpty() == false!\n"); | ||
70 | */ | ||
63 | const char *sFormula = sFormulaSrc.getStr(); | 71 | const char *sFormula = sFormulaSrc.getStr(); |
64 | for(;;) | 72 | for(;;) |
65 | { | 73 | { |
@@ -91,8 +99,11 @@ namespace Bu | |||
91 | if( tOpr == symEOS ) | 99 | if( tOpr == symEOS ) |
92 | { | 100 | { |
93 | reduce(); | 101 | reduce(); |
94 | return sValue.top(); | 102 | prec ret = sValue.top(); |
95 | break; | 103 | sValue.clear(); |
104 | sFunc.clear(); | ||
105 | sOper.clear(); | ||
106 | return ret; | ||
96 | } | 107 | } |
97 | if( !sOper.isEmpty() && getPrec( sOper.top() ) > getPrec( tOpr ) ) | 108 | if( !sOper.isEmpty() && getPrec( sOper.top() ) > getPrec( tOpr ) ) |
98 | { | 109 | { |
@@ -108,7 +119,11 @@ namespace Bu | |||
108 | goto oppart; | 119 | goto oppart; |
109 | } | 120 | } |
110 | } | 121 | } |
111 | return sValue.top(); | 122 | prec ret = sValue.top(); |
123 | sValue.clear(); | ||
124 | sFunc.clear(); | ||
125 | sOper.clear(); | ||
126 | return ret; | ||
112 | } | 127 | } |
113 | 128 | ||
114 | varHash hVars; | 129 | varHash hVars; |
diff --git a/src/stack.h b/src/stack.h index 99ce6e8..bbc12f4 100644 --- a/src/stack.h +++ b/src/stack.h | |||
@@ -64,6 +64,12 @@ namespace Bu | |||
64 | return ret; | 64 | return ret; |
65 | } | 65 | } |
66 | 66 | ||
67 | void clear() | ||
68 | { | ||
69 | while( !isEmpty() ) | ||
70 | pop(); | ||
71 | } | ||
72 | |||
67 | bool isEmpty() | 73 | bool isEmpty() |
68 | { | 74 | { |
69 | return pTop == NULL; | 75 | return pTop == NULL; |
diff --git a/src/tests/formula.cpp b/src/tests/formula.cpp index b3b0d5c..40b10a5 100644 --- a/src/tests/formula.cpp +++ b/src/tests/formula.cpp | |||
@@ -18,7 +18,7 @@ int main( int argc, char *argv[] ) | |||
18 | Bu::Formula<uint32_t> uForm; | 18 | Bu::Formula<uint32_t> uForm; |
19 | Bu::Formula<double> dForm; | 19 | Bu::Formula<double> dForm; |
20 | 20 | ||
21 | class CeilFunc : public Bu::Formula<double>::Func | 21 | class DblCeilFunc : public Bu::Formula<double>::Func |
22 | { | 22 | { |
23 | public: | 23 | public: |
24 | virtual double operator()( double x ) | 24 | virtual double operator()( double x ) |
@@ -27,10 +27,29 @@ int main( int argc, char *argv[] ) | |||
27 | } | 27 | } |
28 | }; | 28 | }; |
29 | 29 | ||
30 | dForm.hFunc.insert( "ceil", new CeilFunc() ); | 30 | dForm.hFunc.insert( "ceil", new DblCeilFunc() ); |
31 | |||
32 | class IntCeilFunc : public Bu::Formula<uint32_t>::Func | ||
33 | { | ||
34 | public: | ||
35 | virtual uint32_t operator()( uint32_t x ) | ||
36 | { | ||
37 | return x; | ||
38 | } | ||
39 | }; | ||
31 | 40 | ||
32 | // printf("u: %s = %u\n", argv[1], uForm.run( argv[1] ) ); | 41 | uForm.hFunc.insert( "ceil", new IntCeilFunc() ); |
33 | printf("d: %s = %f\n", argv[1], dForm.run( argv[1] ) ); | 42 | |
43 | uForm.hVars.insert("x", 10 ); | ||
44 | dForm.hVars.insert("x", 10.00 ); | ||
45 | uForm.hVars.insert("y", 10 ); | ||
46 | dForm.hVars.insert("y", 10.00 ); | ||
47 | |||
48 | for( int j = 1; j < argc; j++ ) | ||
49 | { | ||
50 | printf("u: %s = %u\n", argv[j], uForm.run( argv[j] ) ); | ||
51 | printf("d: %s = %f\n", argv[j], dForm.run( argv[j] ) ); | ||
52 | } | ||
34 | 53 | ||
35 | return 0; | 54 | return 0; |
36 | } | 55 | } |