Compare commits

..

5 Commits

2 changed files with 65 additions and 14 deletions

View File

@ -1,24 +1,60 @@
#include <lua.hpp> #include <lua.hpp>
#include <libqalculate/qalculate.h> #include <libqalculate/qalculate.h>
#include <vector>
#include <string> #include <string>
const char* qalculate(const char* input, bool exact_mode) { 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, bool structuring_mode) {
// Create and prepare calculator
Calculator* c = new Calculator(); Calculator* c = new Calculator();
c->loadExchangeRates(); c->loadExchangeRates();
c->loadGlobalDefinitions(); c->loadGlobalDefinitions();
c->loadLocalDefinitions(); c->loadLocalDefinitions();
// Create input and output string buffers
std::string Input = input; std::string Input = input;
std::string Output; std::string Output;
if (exact_mode) { // Check evaluation options
default_user_evaluation_options.approximation = APPROXIMATION_EXACT; user_evaluation_options.structuring = (structuring_mode ?
} else { STRUCTURING_FACTORIZE :
default_user_evaluation_options.approximation = APPROXIMATION_APPROXIMATE; 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();
} }
Output = c->calculateAndPrint(Input,2000,default_user_evaluation_options);
delete c; delete c;
char * output = new char [Output.length()+1]; // Copy result to the output structure
Output.copy(output,Output.length()); output.result = new char [Output.length()+1];
output[Output.length()] = "\0"[0]; Output.copy(output.result,Output.length());
output.result[Output.length()] = "\0"[0];
return output; return output;
} }
@ -26,9 +62,16 @@ extern "C"
int l_qalc(lua_State* L) { int l_qalc(lua_State* L) {
const char * input = luaL_checkstring(L, 1); const char * input = luaL_checkstring(L, 1);
bool exact_mode = lua_toboolean(L, 2); bool exact_mode = lua_toboolean(L, 2);
const char * output = qalculate(input, exact_mode); bool interval_mode = lua_toboolean(L, 3);
lua_pushstring(L, output); bool struct_mode = lua_toboolean(L, 4);
return 1; 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" extern "C"

View File

@ -1,3 +1,11 @@
qalculate = require("libqalculator") qalculate = require("libqalculator")
print(qalculate.qalc("sin(3 rad)")) local result,messages = qalculate.qalc("sin(3 rad)",true,false,true)
print(qalculate.qalc("sin(3 rad)",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))
local result,messages = qalculate.qalc("sin(3 rad)",true)
print(result,table.concat(messages))