|
|
@ -4,13 +4,14 @@ |
|
|
|
#include <string>
|
|
|
|
|
|
|
|
EvaluationOptions user_evaluation_options = default_evaluation_options; |
|
|
|
PrintOptions user_print_options = default_print_options; |
|
|
|
|
|
|
|
struct Output_struct { |
|
|
|
char * result; |
|
|
|
std::vector<char *> messages; |
|
|
|
}; |
|
|
|
|
|
|
|
Output_struct qalculate(const char* input, bool exact_mode, bool interval_mode) { |
|
|
|
Output_struct qalculate(const char* input, bool exact_mode, bool interval_mode, bool structuring_mode) { |
|
|
|
// Create and prepare calculator
|
|
|
|
Calculator* c = new Calculator(); |
|
|
|
c->loadExchangeRates(); |
|
|
@ -20,17 +21,26 @@ Output_struct qalculate(const char* input, bool exact_mode, bool interval_mode) |
|
|
|
std::string Input = input; |
|
|
|
std::string Output; |
|
|
|
// Check evaluation options
|
|
|
|
user_evaluation_options.structuring = (structuring_mode ? |
|
|
|
STRUCTURING_FACTORIZE : |
|
|
|
STRUCTURING_EXPAND); |
|
|
|
user_evaluation_options.interval_calculation = (interval_mode ? |
|
|
|
INTERVAL_CALCULATION_NONE : |
|
|
|
INTERVAL_CALCULATION_VARIANCE_FORMULA); |
|
|
|
INTERVAL_CALCULATION_VARIANCE_FORMULA : |
|
|
|
INTERVAL_CALCULATION_NONE); |
|
|
|
user_evaluation_options.approximation = (exact_mode ? |
|
|
|
APPROXIMATION_EXACT : |
|
|
|
APPROXIMATION_APPROXIMATE); |
|
|
|
user_print_options.number_fraction_format = (exact_mode ? |
|
|
|
FRACTION_DECIMAL_EXACT : |
|
|
|
FRACTION_DECIMAL); |
|
|
|
user_print_options.interval_display = (interval_mode ? |
|
|
|
INTERVAL_DISPLAY_INTERVAL : |
|
|
|
INTERVAL_DISPLAY_MIDPOINT); |
|
|
|
// Prepare output struct
|
|
|
|
struct Output_struct output; |
|
|
|
memset(&output,0,sizeof(Output_struct)); |
|
|
|
// Evaluate and record result in Output
|
|
|
|
Output = c->calculateAndPrint(Input,2000,user_evaluation_options); |
|
|
|
Output = c->calculateAndPrint(Input,2000,user_evaluation_options,user_print_options); |
|
|
|
// record messages
|
|
|
|
std::string current_msg; |
|
|
|
while (c->message() != NULL) { |
|
|
@ -53,7 +63,8 @@ int l_qalc(lua_State* L) { |
|
|
|
const char * input = luaL_checkstring(L, 1); |
|
|
|
bool exact_mode = lua_toboolean(L, 2); |
|
|
|
bool interval_mode = lua_toboolean(L, 3); |
|
|
|
Output_struct output = qalculate(input, exact_mode, !interval_mode); |
|
|
|
bool struct_mode = lua_toboolean(L, 4); |
|
|
|
Output_struct output = qalculate(input, exact_mode, interval_mode, struct_mode); |
|
|
|
lua_pushstring(L, output.result); |
|
|
|
lua_newtable(L); |
|
|
|
for (int i = 0; i < output.messages.size(); i++) { |
|
|
|