pub mod engine;
pub mod math;
pub use engine::cvt;
pub use engine::error::{CalcError, calc_error_str};
pub use engine::opcodes::{CoreOp, Opcode};
pub use engine::random::seed_random_from_time;
pub use engine::{CALC_NARGS, CalcResult, CompiledExpr, ExprKind, NumericInputs};
pub use engine::StringInputs;
pub use engine::opcodes::StringOp;
pub use engine::string::ScalcResult;
pub use engine::value::{SCALC_STRING_MAX, SCALC_STRING_SIZE, ScalcString, StackValue};
pub use engine::ArrayInputs;
pub use engine::array_value::{ArrayCell, ArrayStackValue};
pub use engine::opcodes::ArrayOp;
pub fn compile(expr: &str) -> CalcResult<CompiledExpr> {
if expr.is_empty() {
return Err(CalcError::NullArg);
}
let tokens = engine::token::tokenize(expr, ExprKind::Numeric)?;
engine::postfix::compile(&tokens, ExprKind::Numeric)
}
pub fn eval(expr: &CompiledExpr, inputs: &mut NumericInputs) -> CalcResult<f64> {
engine::numeric::eval(expr, inputs)
}
pub fn calc(expr: &str, inputs: &mut NumericInputs) -> CalcResult<f64> {
let compiled = compile(expr)?;
eval(&compiled, inputs)
}
pub fn scalc_compile(expr: &str) -> CalcResult<CompiledExpr> {
if expr.is_empty() {
return Ok(CompiledExpr::empty(ExprKind::String));
}
let tokens = engine::token::tokenize(expr, ExprKind::String)?;
engine::postfix::compile(&tokens, ExprKind::String)
}
pub fn scalc_eval(expr: &CompiledExpr, inputs: &mut StringInputs) -> CalcResult<StackValue> {
engine::string::eval(expr, inputs)
}
pub fn scalc(expr: &str, inputs: &mut StringInputs) -> CalcResult<StackValue> {
let compiled = scalc_compile(expr)?;
scalc_eval(&compiled, inputs)
}
pub fn scalc_perform(
expr: &CompiledExpr,
inputs: &mut StringInputs,
precision: i16,
) -> CalcResult<ScalcResult> {
let top = scalc_eval(expr, inputs)?;
Ok(engine::string::epilogue(expr, &top, precision))
}
pub fn acalc_compile(expr: &str) -> CalcResult<CompiledExpr> {
if expr.is_empty() {
return Ok(CompiledExpr::empty(ExprKind::Array));
}
let tokens = engine::token::tokenize(expr, ExprKind::Array)?;
engine::postfix::compile(&tokens, ExprKind::Array)
}
pub fn acalc_eval(expr: &CompiledExpr, inputs: &mut ArrayInputs) -> CalcResult<ArrayStackValue> {
engine::array::eval(expr, inputs)
}
pub fn acalc(expr: &str, inputs: &mut ArrayInputs) -> CalcResult<ArrayStackValue> {
let compiled = acalc_compile(expr)?;
acalc_eval(&compiled, inputs)
}