Blame awklib/eg/lib/strtonum.awk

Packit Service f629e6
# mystrtonum --- convert string to number
Packit Service f629e6
Packit Service f629e6
#
Packit Service f629e6
# Arnold Robbins, arnold@skeeve.com, Public Domain
Packit Service f629e6
# February, 2004
Packit Service f629e6
# Revised June, 2014
Packit Service f629e6
Packit Service f629e6
function mystrtonum(str,        ret, n, i, k, c)
Packit Service f629e6
{
Packit Service f629e6
    if (str ~ /^0[0-7]*$/) {
Packit Service f629e6
        # octal
Packit Service f629e6
        n = length(str)
Packit Service f629e6
        ret = 0
Packit Service f629e6
        for (i = 1; i <= n; i++) {
Packit Service f629e6
            c = substr(str, i, 1)
Packit Service f629e6
            # index() returns 0 if c not in string,
Packit Service f629e6
            # includes c == "0"
Packit Service f629e6
            k = index("1234567", c)
Packit Service f629e6
Packit Service f629e6
            ret = ret * 8 + k
Packit Service f629e6
        }
Packit Service f629e6
    } else if (str ~ /^0[xX][[:xdigit:]]+$/) {
Packit Service f629e6
        # hexadecimal
Packit Service f629e6
        str = substr(str, 3)    # lop off leading 0x
Packit Service f629e6
        n = length(str)
Packit Service f629e6
        ret = 0
Packit Service f629e6
        for (i = 1; i <= n; i++) {
Packit Service f629e6
            c = substr(str, i, 1)
Packit Service f629e6
            c = tolower(c)
Packit Service f629e6
            # index() returns 0 if c not in string,
Packit Service f629e6
            # includes c == "0"
Packit Service f629e6
            k = index("123456789abcdef", c)
Packit Service f629e6
Packit Service f629e6
            ret = ret * 16 + k
Packit Service f629e6
        }
Packit Service f629e6
    } else if (str ~ \
Packit Service f629e6
  /^[-+]?([0-9]+([.][0-9]*([Ee][0-9]+)?)?|([.][0-9]+([Ee][-+]?[0-9]+)?))$/) {
Packit Service f629e6
        # decimal number, possibly floating point
Packit Service f629e6
        ret = str + 0
Packit Service f629e6
    } else
Packit Service f629e6
        ret = "NOT-A-NUMBER"
Packit Service f629e6
Packit Service f629e6
    return ret
Packit Service f629e6
}
Packit Service f629e6
Packit Service f629e6
# BEGIN {     # gawk test harness
Packit Service f629e6
#     a[1] = "25"
Packit Service f629e6
#     a[2] = ".31"
Packit Service f629e6
#     a[3] = "0123"
Packit Service f629e6
#     a[4] = "0xdeadBEEF"
Packit Service f629e6
#     a[5] = "123.45"
Packit Service f629e6
#     a[6] = "1.e3"
Packit Service f629e6
#     a[7] = "1.32"
Packit Service f629e6
#     a[8] = "1.32E2"
Packit Service f629e6
#
Packit Service f629e6
#     for (i = 1; i in a; i++)
Packit Service f629e6
#         print a[i], strtonum(a[i]), mystrtonum(a[i])
Packit Service f629e6
# }