From f1fdb2375ae039b2ef060634f3bcd2309b6957bc Mon Sep 17 00:00:00 2001 From: Yessiest Date: Fri, 20 May 2022 22:13:31 +0400 Subject: [PATCH 1/4] Ubuntu LTS versions fix --- qalculator.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/qalculator.cpp b/qalculator.cpp index 77c875d..276d125 100644 --- a/qalculator.cpp +++ b/qalculator.cpp @@ -2,6 +2,8 @@ #include #include +EvaluationOptions user_evaluation_options = default_evaluation_options; + const char* qalculate(const char* input, bool exact_mode) { Calculator* c = new Calculator(); c->loadExchangeRates(); @@ -10,11 +12,11 @@ const char* qalculate(const char* input, bool exact_mode) { std::string Input = input; std::string Output; if (exact_mode) { - default_user_evaluation_options.approximation = APPROXIMATION_EXACT; + user_evaluation_options.approximation = APPROXIMATION_EXACT; } else { - default_user_evaluation_options.approximation = APPROXIMATION_APPROXIMATE; + user_evaluation_options.approximation = APPROXIMATION_APPROXIMATE; } - Output = c->calculateAndPrint(Input,2000,default_user_evaluation_options); + Output = c->calculateAndPrint(Input,2000,user_evaluation_options); delete c; char * output = new char [Output.length()+1]; Output.copy(output,Output.length()); From 23fcea17c2eb380b6a6b1ba848d5bc7ebdc38b05 Mon Sep 17 00:00:00 2001 From: Yessiest Date: Fri, 20 May 2022 22:17:07 +0400 Subject: [PATCH 2/4] Changed default version in readme --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 2c03822..43bdadc 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ Calling this library a "binding" would probably be a mistake seeing that it simp That being said, it's more than enough for my particular use case. # Building -To make everything to compile with as few steps as possible you will need `make`, `g++`, `libqalculate` and `lua5.2` (which is the default target). +To make everything to compile with as few steps as possible you will need `make`, `g++`, `libqalculate` and `lua5.1` (which is the default target). Once you have all of the above, simply type `make` and it will produce the needed `libqalcaulator.so` library. If you wish to compile against a different version, simply change the variable `LUA_VERSION` in the makefile to the one you need. From 26aef364d168a848dbc3c0d33957ee8cb4d08a7c Mon Sep 17 00:00:00 2001 From: Yessiest Date: Wed, 25 May 2022 00:40:55 +0400 Subject: [PATCH 3/4] Added message handling for qalc function --- qalculator.cpp | 54 +++++++++++++++++++++++++++++++++++++++----------- test.lua | 8 ++++++-- 2 files changed, 48 insertions(+), 14 deletions(-) diff --git a/qalculator.cpp b/qalculator.cpp index 276d125..7951b8d 100644 --- a/qalculator.cpp +++ b/qalculator.cpp @@ -1,26 +1,50 @@ #include #include +#include #include EvaluationOptions user_evaluation_options = default_evaluation_options; -const char* qalculate(const char* input, bool exact_mode) { +struct Output_struct { + char * result; + std::vector messages; +}; + +Output_struct qalculate(const char* input, bool exact_mode, bool interval_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; - if (exact_mode) { - user_evaluation_options.approximation = APPROXIMATION_EXACT; - } else { - user_evaluation_options.approximation = APPROXIMATION_APPROXIMATE; - } + // Check evaluation options + user_evaluation_options.interval_calculation = (interval_mode ? + INTERVAL_CALCULATION_NONE : + INTERVAL_CALCULATION_VARIANCE_FORMULA); + user_evaluation_options.approximation = (exact_mode ? + APPROXIMATION_EXACT : + APPROXIMATION_APPROXIMATE); + // 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); + // 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; - char * output = new char [Output.length()+1]; - Output.copy(output,Output.length()); - output[Output.length()] = "\0"[0]; + // 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; } @@ -28,9 +52,15 @@ extern "C" int l_qalc(lua_State* L) { const char * input = luaL_checkstring(L, 1); bool exact_mode = lua_toboolean(L, 2); - const char * output = qalculate(input, exact_mode); - lua_pushstring(L, output); - return 1; + bool interval_mode = lua_toboolean(L, 3); + Output_struct output = qalculate(input, exact_mode, !interval_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" diff --git a/test.lua b/test.lua index a5bd1a4..e8e7d89 100644 --- a/test.lua +++ b/test.lua @@ -1,3 +1,7 @@ qalculate = require("libqalculator") -print(qalculate.qalc("sin(3 rad)")) -print(qalculate.qalc("sin(3 rad)",true)) +local result,messages = qalculate.qalc("sin(3 rad)") +print(result,table.concat(messages)) +local result,messages = qalculate.qalc("fibonacci()") +print(result,table.concat(messages)) +local result,messages = qalculate.qalc("sin(3 rad)",true) +print(result,table.concat(messages)) From 79cd4c0a7fe8e00cd87bea6053bc8abbfe52bc8e Mon Sep 17 00:00:00 2001 From: Yessiest Date: Fri, 27 May 2022 23:44:10 +0400 Subject: [PATCH 4/4] Added more tests, more parameters, fixed interval handling --- qalculator.cpp | 21 ++++++++++++++++----- test.lua | 6 +++++- 2 files changed, 21 insertions(+), 6 deletions(-) diff --git a/qalculator.cpp b/qalculator.cpp index 7951b8d..63ce31c 100644 --- a/qalculator.cpp +++ b/qalculator.cpp @@ -4,13 +4,14 @@ #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) { +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++) { diff --git a/test.lua b/test.lua index e8e7d89..5568a19 100644 --- a/test.lua +++ b/test.lua @@ -1,5 +1,9 @@ qalculate = require("libqalculator") -local result,messages = qalculate.qalc("sin(3 rad)") +local result,messages = qalculate.qalc("sin(3 rad)",true,false,true) +print(result,table.concat(messages)) +local result,messages = qalculate.qalc("4/3",true) +print(result,table.concat(messages)) +local result,messages = qalculate.qalc("4/3",false) print(result,table.concat(messages)) local result,messages = qalculate.qalc("fibonacci()") print(result,table.concat(messages))