File: math.shlib

package info (click to toggle)
zfs-linux 2.3.4~git20250812.3b64a96-1
  • links: PTS, VCS
  • area: contrib
  • in suites: experimental
  • size: 70,688 kB
  • sloc: ansic: 393,668; sh: 68,068; asm: 47,734; python: 8,160; makefile: 5,125; perl: 859; sed: 41
file content (144 lines) | stat: -rw-r--r-- 3,477 bytes parent folder | download | duplicates (4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
# SPDX-License-Identifier: CDDL-1.0
#
# This file and its contents are supplied under the terms of the
# Common Development and Distribution License ("CDDL"), version 1.0.
# You may only use this file in accordance with the terms of version
# 1.0 of the CDDL.
#
# A full copy of the text of the CDDL should have accompanied this
# source.  A copy of the CDDL is also available via the Internet at
# http://www.illumos.org/license/CDDL.
#

#
# Copyright (c) 2012, 2016 by Delphix. All rights reserved.
#

#
# Return 0 if the percentage difference between $a and $b is $percent or
# greater. Return 1 if the percentage is lower or if we would divide by
# zero. For use like this:
#
# Do $action if the calculated percentage is greater or equal to that passed in:
#	within_percent A B P && $action
# Do $action if the calculated percentage is less than that passed in:
#	within_percent A B P || $action
#
function within_percent
{
	typeset a=$1
	typeset b=$1
	typeset percent=$3

	# Set $a or $b to $2 such that a >= b
	[ 1 -eq $(echo "$2 > $a" | bc) ] && a=$2 || b=$2

	# Prevent division by 0
	[[ $a =~ [1-9] ]] || return 1

	typeset p=$(echo "scale=2; $b * 100 / $a" | bc)
	log_note "Comparing $a and $b given $percent% (calculated: $p%)"
	[ 1 -eq $(echo "scale=2; $p >= $percent" | bc) ]
}

#
# Return 0 if value is within +/-tolerance of target.
# Return 1 if value exceeds our tolerance.
# For use like this:
#
# Do $action if value is within the tolerance from target passed in:
#	within_tolerance VAL TAR TOL && $action
# Do $action if value surpasses the tolerance from target passed in:
#	within_tolerance VAL TAR TOL || $action
#
function within_tolerance #value #target #tolerance
{
	typeset val=$1
	typeset target=$2
	typeset tol=$3

	typeset diff=$((abs(val - target)))
	log_note "Checking if $val is within +/-$tol of $target (diff: $diff)"
	((diff <= tol))
}

#
# Return 0 if the human readable string of the form <value>[suffix] can
# be converted to bytes.  Allow suffixes are shown in the table below.
#
function to_bytes
{
	typeset size=$1
	typeset value=$(echo "$size" | grep -o '[0-9]\+')

	case $size in
		*PB|*pb|*P|*p)	factor='1024^5'	;;
		*TB|*tb|*T|*t)	factor='1024^4'	;;
		*GB|*gb|*G|*g)	factor='1024^3'	;;
		*MB|*mb|*M|*m)	factor='1024^2'	;;
		*KB|*kb|*K|*k)	factor='1024^1'	;;
		*B|*b)		factor='1024^0'	;;
		*[!0-9.]*)	return 1 ;;
		*)		factor='1024^0'	;;
	esac

	echo "$value * ($factor)" | bc

	return 0
}

#
# Verify $a is equal to $b, otherwise raise an error specifying
# the $type of values being compared
#
function verify_eq # <a> <b> <type>
{
	typeset a=$1
	typeset b=$2
	typeset type=$3

	if [[ $a -ne $b ]]; then
		log_fail "Compared $type should be equal: $a != $b"
	fi
}

#
# Verify $a is not equal to $b, otherwise raise an error specifying
# the $type of values being compared
#
function verify_ne # <a> <b> <type>
{
	typeset a=$1
	typeset b=$2
	typeset type=$3

	if [[ $a -eq $b ]]; then
		log_fail "Compared $type should be not equal: $a == $b"
	fi
}

# A simple function to get a random number between two bounds (inclusive)
#
# Note since we're using $RANDOM, $min+32767 is the largest number we
# can accept as the upper bound.
#
# $1 lower bound
# $2 upper bound
# [$3 how many]
function random_int_between
{
	typeset -i min=$1
	typeset -i max=$2
	typeset -i count
	typeset -i i

	if [[ -z "$3" ]]; then
		count=1
	else
		count=$3
	fi

	for (( i = 0; i < $count; i++ )); do
		echo $(( (RANDOM % (max - min + 1)) + min ))
	done
}