#include #include #include #include EvaluationOptions user_evaluation_options = default_evaluation_options; PrintOptions user_print_options = default_print_options; struct Output_struct { char * result; std::vector messages; }; 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(); c->loadGlobalDefinitions(); c->loadLocalDefinitions(); // Create input and output string buffers 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_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,user_print_options); // record messages std::string current_msg; while (c->message() != NULL) { current_msg = c->message()->message(); output.messages.push_back(new char[current_msg.size()+1]); current_msg.copy(output.messages.back(),current_msg.size()); output.messages.back()[current_msg.size()] = "\0"[0]; c->nextMessage(); } delete c; // Copy result to the output structure output.result = new char [Output.length()+1]; Output.copy(output.result,Output.length()); output.result[Output.length()] = "\0"[0]; return output; } extern "C" 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); 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++) { lua_pushstring(L, output.messages[i]); lua_rawseti(L, -2, i+1); } return 2; } extern "C" int luaopen_libqalculator(lua_State* L) { static const struct luaL_Reg library [] = { {"qalc", l_qalc}, {NULL, NULL} }; luaL_register(L, "qalc", library); return 1; }