| 1 | 
 # strtonum --- convert string to number | 
 
 
 
 
 
 | 2 | 
  | 
 
 
 
 
 
 | 3 | 
 # | 
 
 
 
 
 
 | 4 | 
 # Arnold Robbins, arnold@skeeve.com, Public Domain | 
 
 
 
 
 
 | 5 | 
 # February, 2004 | 
 
 
 
 
 
 | 6 | 
  | 
 
 
 
 
 
 | 7 | 
 function mystrtonum(str,        ret, chars, n, i, k, c) | 
 
 
 
 
 
 | 8 | 
 { | 
 
 
 
 
 
 | 9 | 
     if (str ~ /^0[0-7]*$/) { | 
 
 
 
 
 
 | 10 | 
         # octal | 
 
 
 
 
 
 | 11 | 
         n = length(str) | 
 
 
 
 
 
 | 12 | 
         ret = 0 | 
 
 
 
 
 
 | 13 | 
         for (i = 1; i <= n; i++) { | 
 
 
 
 
 
 | 14 | 
             c = substr(str, i, 1) | 
 
 
 
 
 
 | 15 | 
             if ((k = index("01234567", c)) > 0) | 
 
 
 
 
 
 | 16 | 
                 k-- # adjust for 1-basing in awk | 
 
 
 
 
 
 | 17 | 
  | 
 
 
 
 
 
 | 18 | 
             ret = ret * 8 + k | 
 
 
 
 
 
 | 19 | 
         } | 
 
 
 
 
 
 | 20 | 
     } else if (str ~ /^0[xX][0-9a-fA-f]+/) { | 
 
 
 
 
 
 | 21 | 
         # hexadecimal | 
 
 
 
 
 
 | 22 | 
         str = substr(str, 3)    # lop off leading 0x | 
 
 
 
 
 
 | 23 | 
         n = length(str) | 
 
 
 
 
 
 | 24 | 
         ret = 0 | 
 
 
 
 
 
 | 25 | 
         for (i = 1; i <= n; i++) { | 
 
 
 
 
 
 | 26 | 
             c = substr(str, i, 1) | 
 
 
 
 
 
 | 27 | 
             c = tolower(c) | 
 
 
 
 
 
 | 28 | 
             if ((k = index("0123456789", c)) > 0) | 
 
 
 
 
 
 | 29 | 
                 k-- # adjust for 1-basing in awk | 
 
 
 
 
 
 | 30 | 
             else if ((k = index("abcdef", c)) > 0) | 
 
 
 
 
 
 | 31 | 
                 k += 9 | 
 
 
 
 
 
 | 32 | 
  | 
 
 
 
 
 
 | 33 | 
             ret = ret * 16 + k | 
 
 
 
 
 
 | 34 | 
         } | 
 
 
 
 
 
 | 35 | 
     } else if (str ~ /^[-+]?([0-9]+([.][0-9]*([Ee][0-9]+)?)?|([.][0-9]+([Ee][-+]?[0-9]+)?))$/) { | 
 
 
 
 
 
 | 36 | 
         # decimal number, possibly floating point | 
 
 
 
 
 
 | 37 | 
         ret = str + 0 | 
 
 
 
 
 
 | 38 | 
     } else | 
 
 
 
 
 
 | 39 | 
         ret = "NOT-A-NUMBER" | 
 
 
 
 
 
 | 40 | 
  | 
 
 
 
 
 
 | 41 | 
     return ret | 
 
 
 
 
 
 | 42 | 
 } | 
 
 
 
 
 
 | 43 | 
  | 
 
 
 
 
 
 | 44 | 
 # BEGIN {     # gawk test harness | 
 
 
 
 
 
 | 45 | 
 #     a[1] = "25" | 
 
 
 
 
 
 | 46 | 
 #     a[2] = ".31" | 
 
 
 
 
 
 | 47 | 
 #     a[3] = "0123" | 
 
 
 
 
 
 | 48 | 
 #     a[4] = "0xdeadBEEF" | 
 
 
 
 
 
 | 49 | 
 #     a[5] = "123.45" | 
 
 
 
 
 
 | 50 | 
 #     a[6] = "1.e3" | 
 
 
 
 
 
 | 51 | 
 #     a[7] = "1.32" | 
 
 
 
 
 
 | 52 | 
 #     a[7] = "1.32E2" | 
 
 
 
 
 
 | 53 | 
 #  | 
 
 
 
 
 
 | 54 | 
 #     for (i = 1; i in a; i++) | 
 
 
 
 
 
 | 55 | 
 #         print a[i], strtonum(a[i]), mystrtonum(a[i]) | 
 
 
 
 
 
 | 56 | 
 # } |