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
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to