aboutsummaryrefslogtreecommitdiffhomepage
path: root/share/functions
diff options
context:
space:
mode:
Diffstat (limited to 'share/functions')
-rw-r--r--share/functions/math.fish57
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