Some calculations from sysctl(8) regarding kstat numbers produce
negative calculations (since values can change between query of
one value and another, it is not guaranteed that all values are
going to be positive). The f_float() and f_perc() functions which
provide floating point arithmetic native to sh(1) were using the
getopts built-in to parse arguments which made it impossible to
accept negative values. Both f_float() and f_perc() have been
updated to support negative numbers, fixing the PR.
To test the f_float() function, I had inserted the following few
lines after its declaration:
f_float "$@"
retval=$?
echo "foo=[$foo]"
exit $retval
Wherein I tested many arguments:
-1 2 # -0.50
1 -2 # -0.50
-n4 -1 2 # -0.5000
-n4 1 -2 # -0.5000
-n 4 -1 2 # -0.5000
-n 4 1 -2 # -0.5000
-10 2 # -5.00
10 -2 # -5.00
-n4 -10 2 # -5.0000
-n4 10 -2 # -5.0000
-n 4 -10 2 # -5.0000
-n 4 10 -2 # -5.0000
-1 / 2 # -0.50
1 / -2 # -0.50
-n4 -1 / 2 # -0.5000
-n4 1 / -2 # -0.5000
-n 4 -1 / 2 # -0.5000
-n 4 1 / -2 # -0.5000
-10 / 2 # -5.00
10 / -2 # -5.00
-n4 -10 / 2 # -5.0000
-n4 10 / -2 # -5.0000
-n 4 -10 / 2 # -5.0000
-n 4 10 / -2 # -5.0000
-1 -2 # 0.50
-n4 -1 -2 # 0.5000
-n 4 -1 -2 # 0.5000
-10 -2 # 5.00
-n4 -10 -2 # 5.0000
-n 4 -10 -2 # 5.0000
-1 / -2 # 0.50
-n4 -1 / -2 # 0.5000
-n 4 -1 / -2 # 0.5000
-10 / -2 # 5.00
-n4 -10 / -2 # 5.0000
-n 4 -10 / -2 # 5.0000
-1 2 foo # foo=[-0.50]
1 -2 foo # foo=[-0.50]
-n4 -1 2 foo # foo=[-0.5000]
-n4 1 -2 foo # foo=[-0.5000]
-n 4 -1 2 foo # foo=[-0.5000]
-n 4 1 -2 foo # foo=[-0.5000]
-10 2 foo # foo=[-5.00]
10 -2 foo # foo=[-5.00]
-n4 -10 2 foo # foo=[-5.0000]
-n4 10 -2 foo # foo=[-5.0000]
-n 4 -10 2 foo # foo=[-5.0000]
-n 4 10 -2 foo # foo=[-5.0000]
-1 / 2 foo # foo=[-0.50]
1 / -2 foo # foo=[-0.50]
-n4 -1 / 2 foo # foo=[-0.5000]
-n4 1 / -2 foo # foo=[-0.5000]
-n 4 -1 / 2 foo # foo=[-0.5000]
-n 4 1 / -2 foo # foo=[-0.5000]
-10 / 2 foo # foo=[-5.00]
10 / -2 foo # foo=[-5.00]
-n4 -10 / 2 foo # foo=[-5.0000]
-n4 10 / -2 foo # foo=[-5.0000]
-n 4 -10 / 2 foo # foo=[-5.0000]
-n 4 10 / -2 foo # foo=[-5.0000]
-1 -2 foo # foo=[0.50]
-n4 -1 -2 foo # foo=[0.5000]
-n 4 -1 -2 foo # foo=[0.5000]
-10 -2 foo # foo=[5.00]
-n4 -10 -2 foo # foo=[5.0000]
-n 4 -10 -2 foo # foo=[5.0000]
-1 / -2 foo # foo=[0.50]
-n4 -1 / -2 foo # foo=[0.5000]
-n 4 -1 / -2 foo # foo=[0.5000]
-10 / -2 foo # foo=[5.00]
-n4 -10 / -2 foo # foo=[5.0000]
-n 4 -10 / -2 foo # foo=[5.0000]
To test the f_perc() function, I inserted the following after it:
f_perc "$@"
retval=$?
echo "foo=[$foo]"
Wherein I performed similar testing to the above.