diff --git a/kalk/src/kalk_num.rs b/kalk/src/kalk_num.rs index 320332d..5bddcc1 100644 --- a/kalk/src/kalk_num.rs +++ b/kalk/src/kalk_num.rs @@ -56,6 +56,10 @@ impl KalkNum { } } + pub fn to_string_big(&self) -> String { + self.value.to_string() + } + pub fn is_too_big(&self) -> bool { self.value.is_infinite() } diff --git a/kalk_cli/src/main.rs b/kalk_cli/src/main.rs index 0721602..2b3dc6e 100644 --- a/kalk_cli/src/main.rs +++ b/kalk_cli/src/main.rs @@ -6,12 +6,15 @@ use std::env; use std::fs::File; use std::io::Read; +static DEFAULT_PRECISION: u32 = 53; + fn main() { let mut parser_context = parser::Context::new().set_angle_unit(&get_angle_unit()); // Command line argument input, execute it and exit. let mut args = env::args().skip(1); let mut expr_input: Option = None; + let mut precision = DEFAULT_PRECISION; loop { // Get the next argument if possible, otherwise break the loop. let arg = if let Some(arg) = args.next() { @@ -28,8 +31,9 @@ fn main() { [kalk help] kalk [OPTIONS] [INPUT] --h, --help : show this --i : load a file with predefined functions/variables +-h, --help : show this +-i : load a file with predefined functions/variables +--precision : specify number precision [Environment variables] ANGLE_UNIT=(deg/rad) : Sets the default unit used for trigonometric functions. @@ -47,9 +51,16 @@ ANGLE_UNIT=(deg/rad) : Sets the default unit used for trigonometric functions. // Parse the input file content, resulting in the symbol table being filled out. // Output is not needed here. - parser::eval(&mut parser_context, &file_content, 53) + parser::eval(&mut parser_context, &file_content, precision) .expect("Failed to parse input file."); } + "--precision" => { + precision = args + .next() + .expect("Expected precision input.") + .parse::() + .expect("Precision value could not be parsed."); + } _ => { // Main argument. This is expected to be a maths expression. // After the loop is finished, this will be parsed and outputted. @@ -60,10 +71,10 @@ ANGLE_UNIT=(deg/rad) : Sets the default unit used for trigonometric functions. if let Some(input) = expr_input { // Direct output - output::eval(&mut parser_context, &input); + output::eval(&mut parser_context, &input, precision); } else { // REPL - repl::start(&mut parser_context); + repl::start(&mut parser_context, precision); } } diff --git a/kalk_cli/src/output.rs b/kalk_cli/src/output.rs index 52dda88..6a01999 100644 --- a/kalk_cli/src/output.rs +++ b/kalk_cli/src/output.rs @@ -1,14 +1,17 @@ +use crate::DEFAULT_PRECISION; use ansi_term::Colour::Red; use kalk::parser::{self, CalcError, CalcError::*}; -pub fn eval(parser: &mut parser::Context, input: &str) { - match parser::eval(parser, input, 53) { +pub fn eval(parser: &mut parser::Context, input: &str, precision: u32) { + match parser::eval(parser, input, precision) { Ok(Some(result)) => { let sci_notation = result.to_scientific_notation(); let result_str = if sci_notation.exponent > 8 || sci_notation.exponent < -6 { sci_notation.to_string() - } else { + } else if precision == DEFAULT_PRECISION { result.to_string() + } else { + result.to_string_big() }; println!("{} {}", result_str, result.get_unit()); diff --git a/kalk_cli/src/repl.rs b/kalk_cli/src/repl.rs index 23fb94a..83b7240 100644 --- a/kalk_cli/src/repl.rs +++ b/kalk_cli/src/repl.rs @@ -18,7 +18,7 @@ use std::borrow::Cow::Owned; use std::collections::HashMap; use std::process; -pub fn start(mut parser: &mut parser::Context) { +pub fn start(mut parser: &mut parser::Context, precision: u32) { let mut editor = Editor::::new(); editor.set_helper(Some(RLHelper { highlighter: LineHighlighter {}, @@ -36,7 +36,7 @@ pub fn start(mut parser: &mut parser::Context) { match readline { Ok(input) => { editor.add_history_entry(input.as_str()); - eval_repl(&mut parser, &input); + eval_repl(&mut parser, &input, precision); } Err(ReadlineError::Interrupted) => break, _ => break, @@ -44,12 +44,12 @@ pub fn start(mut parser: &mut parser::Context) { } } -fn eval_repl(parser: &mut parser::Context, input: &str) { +fn eval_repl(parser: &mut parser::Context, input: &str, precision: u32) { match input { "" => eprint!(""), "clear" => print!("\x1B[2J"), "exit" => process::exit(0), - _ => output::eval(parser, input), + _ => output::eval(parser, input, precision), } }