summaryrefslogtreecommitdiff
path: root/awklib/eg/lib/strtonum.awk
diff options
context:
space:
mode:
authorArnold D. Robbins <arnold@skeeve.com>2010-07-16 14:40:49 +0300
committerArnold D. Robbins <arnold@skeeve.com>2010-07-16 14:40:49 +0300
commit85c0d5edb781c9f31b79e48452b1ca68643f41de (patch)
tree14efbc59b30cdd626a208d6391f3ed226387054e /awklib/eg/lib/strtonum.awk
parent6cc7d587a710606d3fe52222707739c7cc1b8651 (diff)
downloadgawk-85c0d5edb781c9f31b79e48452b1ca68643f41de.tar.gz
Move to gawk-3.1.4.gawk-3.1.4
Diffstat (limited to 'awklib/eg/lib/strtonum.awk')
-rw-r--r--awklib/eg/lib/strtonum.awk56
1 files changed, 56 insertions, 0 deletions
diff --git a/awklib/eg/lib/strtonum.awk b/awklib/eg/lib/strtonum.awk
new file mode 100644
index 00000000..a71341fb
--- /dev/null
+++ b/awklib/eg/lib/strtonum.awk
@@ -0,0 +1,56 @@
+# strtonum --- convert string to number
+
+#
+# Arnold Robbins, arnold@skeeve.com, Public Domain
+# February, 2004
+
+function mystrtonum(str, ret, chars, n, i, k, c)
+{
+ if (str ~ /^0[0-7]*$/) {
+ # octal
+ n = length(str)
+ ret = 0
+ for (i = 1; i <= n; i++) {
+ c = substr(str, i, 1)
+ if ((k = index("01234567", c)) > 0)
+ k-- # adjust for 1-basing in awk
+
+ ret = ret * 8 + k
+ }
+ } else if (str ~ /^0[xX][0-9a-fA-f]+/) {
+ # hexadecimal
+ str = substr(str, 3) # lop off leading 0x
+ n = length(str)
+ ret = 0
+ for (i = 1; i <= n; i++) {
+ c = substr(str, i, 1)
+ c = tolower(c)
+ if ((k = index("0123456789", c)) > 0)
+ k-- # adjust for 1-basing in awk
+ else if ((k = index("abcdef", c)) > 0)
+ k += 9
+
+ ret = ret * 16 + k
+ }
+ } else if (str ~ /^[-+]?([0-9]+([.][0-9]*([Ee][0-9]+)?)?|([.][0-9]+([Ee][-+]?[0-9]+)?))$/) {
+ # decimal number, possibly floating point
+ ret = str + 0
+ } else
+ ret = "NOT-A-NUMBER"
+
+ return ret
+}
+
+# BEGIN { # gawk test harness
+# a[1] = "25"
+# a[2] = ".31"
+# a[3] = "0123"
+# a[4] = "0xdeadBEEF"
+# a[5] = "123.45"
+# a[6] = "1.e3"
+# a[7] = "1.32"
+# a[7] = "1.32E2"
+#
+# for (i = 1; i in a; i++)
+# print a[i], strtonum(a[i]), mystrtonum(a[i])
+# }