diff options
Diffstat (limited to 'share/functions')
-rw-r--r-- | share/functions/math.fish | 57 |
1 files changed, 38 insertions, 19 deletions
diff --git a/share/functions/math.fish b/share/functions/math.fish index c190ec63..ed638c69 100644 --- a/share/functions/math.fish +++ b/share/functions/math.fish @@ -1,23 +1,42 @@ - function math --description "Perform math calculations in bc" - if count $argv >/dev/null - switch $argv[1] - case -h --h --he --hel --help - __fish_print_help math - return 0 - end + set -l scale 0 # default is integer arithmetic + + if set -q argv[1] + switch $argv[1] + case '-s*' # user wants to specify the scale of the output + set scale (string replace -- '-s' '' $argv[1]) + if not string match -q -r '^\d+$' "$scale" + echo 'Expected an integer to follow -s' >&2 + return 2 # missing argument is an error + end + set -e argv[1] + + case -h --h --he --hel --help + __fish_print_help math + return 0 + end + end + + if not set -q argv[1] + return 2 # no arguments is an error + end + + # Stitch lines together manually. We can't rely on BC_LINE_LENGTH because some systems don't + # have a new enough version of bc. + set -l out (echo "scale=$scale; $argv" | bc | string replace -r '\\\\$' '' | string join '') + switch "$out" + case '' + # No output indicates an error occurred. + return 3 - # Stitch lines together manually - # we can't rely on BC_LINE_LENGTH because some systems don't have a bc version "new" enough - set -l out (echo $argv | bc | string replace -r '\\\\$' '' | string join '') - test -z "$out"; and return 1 - echo $out - switch $out - case 0 - return 1 - end - return 0 - end - return 2 + case 0 + # For historical reasons a zero result translates to a failure status. + echo 0 + return 1 + case '*' + # For historical reasons a non-zero result translates to a success status. + echo $out + return 0 + end end |