svn commit: r256335 - head/usr.sbin/bsdconfig/share

Devin Teske dteske at FreeBSD.org
Fri Oct 11 20:12:30 UTC 2013


Author: dteske
Date: Fri Oct 11 20:12:30 2013
New Revision: 256335
URL: http://svnweb.freebsd.org/changeset/base/256335

Log:
  Add new f_expand_number() (shadowing expand_number(3)).
  
  Approved by:	re (glebius)

Modified:
  head/usr.sbin/bsdconfig/share/strings.subr

Modified: head/usr.sbin/bsdconfig/share/strings.subr
==============================================================================
--- head/usr.sbin/bsdconfig/share/strings.subr	Fri Oct 11 20:11:24 2013	(r256334)
+++ head/usr.sbin/bsdconfig/share/strings.subr	Fri Oct 11 20:12:30 2013	(r256335)
@@ -324,6 +324,112 @@ f_shell_unescape()
 	f_replaceall "$__string" "'\\''" "'" "$__var_to_set"
 }
 
+# f_expand_number $string [$var_to_set]
+#
+# Unformat $string into a number, optionally to be stored in $var_to_set. This
+# function follows the SI power of two convention.
+#
+# The prefixes are:
+#
+# 	Prefix	Description	Multiplier
+# 	k	kilo		1024
+# 	M	mega		1048576
+# 	G	giga		1073741824
+# 	T	tera		1099511627776
+# 	P	peta		1125899906842624
+# 	E	exa		1152921504606846976
+#
+# NOTE: Prefixes are case-insensitive.
+#
+# Upon successful completion, the value 0 is returned (or stored to
+# $var_to_set); otherwise -1. Reasons for a -1 return include:
+#
+# 	Given $string contains no digits.
+# 	An unrecognized prefix was given.
+# 	Result too large to calculate.
+#
+f_expand_number()
+{
+	local __string="$1" __var_to_set="$2"
+	local __cp __num
+
+	# Remove any leading non-digits
+	while :; do
+		__cp="$__string"
+		__string="${__cp#[!0-9]}"
+		[ "$__string" = "$__cp" ] && break
+	done
+
+	# Return `-1' if string didn't contain any digits
+	if [ ! "$__string" ]; then
+		if [ "$__var_to_set" ]; then
+			setvar "$__var_to_set" -1
+		else
+			echo -1
+		fi
+		return $FAILURE
+	fi
+
+	# Store the numbers
+	__num="${__string%%[!0-9]*}"
+
+	# Shortcut
+	if [ $__num -eq 0 ]; then
+		if [ "$__var_to_set" ]; then
+			setvar "$__var_to_set" 0
+		else
+			echo 0
+		fi
+		return $SUCCESS
+	fi
+
+	# Remove all the leading numbers from the string to get at the prefix
+	while :; do
+		__cp="$__string"
+		__string="${__cp#[0-9]}"
+		[ "$__string" = "$__cp" ] && break
+	done
+
+	# Test for invalid prefix
+	case "$__string" in
+	""|[KkMmGgTtPpEe]*) : known prefix ;;
+	*)
+		# Unknown prefix
+		if [ "$__var_to_set" ]; then
+			setvar "$__var_to_set" -1
+		else
+			echo -1
+		fi
+		return $FAILURE
+	esac
+
+	# Multiply the number out
+	case "$__string" in
+	[Kk]) __num=$(( $__num * 1024 )) ;;
+	[Mm]) __num=$(( $__num * 1048576 )) ;;
+	[Gg]) __num=$(( $__num * 1073741824 )) ;;
+	[Tt]) __num=$(( $__num * 1099511627776 )) ;;
+	[Pp]) __num=$(( $__num * 1125899906842624 )) ;;
+	[Ee]) __num=$(( $__num * 1152921504606846976 )) ;;
+	esac
+	if [ $__num -le 0 ]; then
+		# Arithmetic overflow
+		if [ "$__var_to_set" ]; then
+			setvar "$__var_to_set" -1
+		else
+			echo -1
+		fi
+		return $FAILURE
+	fi
+
+	# Return the number
+	if [ "$__var_to_set" ]; then
+		setvar "$__var_to_set" $__num
+	else
+		echo $__num
+	fi
+}
+
 ############################################################ MAIN
 
 f_dprintf "%s: Successfully loaded." strings.subr


More information about the svn-src-head mailing list