summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog3
-rw-r--r--node.c17
-rw-r--r--test/ChangeLog5
-rw-r--r--test/Makefile.am5
-rw-r--r--test/Makefile.in10
-rw-r--r--test/Maketests5
-rw-r--r--test/hex2.awk1
-rw-r--r--test/hex2.in2
-rw-r--r--test/hex2.ok2
9 files changed, 46 insertions, 4 deletions
diff --git a/ChangeLog b/ChangeLog
index 9c9d87bd..7c42d77a 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -3,6 +3,9 @@
* nonposix.h (getpgrp): Wrap declaration in ifdef so it doesn't
mess things up on POSIX systems (like Solaris). Thanks to
Nelson Beebe for the report.
+ * node.c (is_hex): New function to check for 0x preceded by
+ optional sign.
+ (r_force_number): Use it. Thanks to Mike Brennan for the report.
2016-05-30 Arnold D. Robbins <arnold@skeeve.com>
diff --git a/node.c b/node.c
index a7c19db1..23199c5b 100644
--- a/node.c
+++ b/node.c
@@ -38,6 +38,20 @@ NODE *(*str2number)(NODE *) = r_force_number;
NODE *(*format_val)(const char *, int, NODE *) = r_format_val;
int (*cmp_numbers)(const NODE *, const NODE *) = cmp_awknums;
+/* is_hex --- return true if a string looks like a hex value */
+
+static bool
+is_hex(const char *str)
+{
+ if (*str == '-' || *str == '+')
+ str++;
+
+ if (str[0] == '0' && (str[1] == 'x' || str[1] == 'X'))
+ return true;
+
+ return false;
+}
+
/* force_number --- force a value to be numeric */
NODE *
@@ -96,8 +110,7 @@ r_force_number(NODE *n)
|| (! do_posix /* not POSIXLY paranoid and */
&& (is_alpha((unsigned char) *cp) /* letter, or */
/* CANNOT do non-decimal and saw 0x */
- || (! do_non_decimal_data && cp[0] == '0'
- && (cp[1] == 'x' || cp[1] == 'X'))))) {
+ || (! do_non_decimal_data && is_hex(cp))))) {
return n;
}
diff --git a/test/ChangeLog b/test/ChangeLog
index 2e1090ce..02f083d6 100644
--- a/test/ChangeLog
+++ b/test/ChangeLog
@@ -1,3 +1,8 @@
+2016-06-01 Arnold D. Robbins <arnold@skeeve.com>
+
+ * Makefile.am (hex2): New test.
+ * hex2.awk, hex2.in, hex2.ok: New files.
+
2016-05-30 Arnold D. Robbins <arnold@skeeve.com>
* Makefile.am (fsnul1): New test.
diff --git a/test/Makefile.am b/test/Makefile.am
index 92e8f6e7..7cd37fdd 100644
--- a/test/Makefile.am
+++ b/test/Makefile.am
@@ -420,6 +420,9 @@ EXTRA_DIST = \
hello.awk \
hex.awk \
hex.ok \
+ hex2.awk \
+ hex2.in \
+ hex2.ok \
hsprint.awk \
hsprint.ok \
icasefs.awk \
@@ -1064,7 +1067,7 @@ BASIC_TESTS = \
getline getline2 getline3 getline4 getline5 getlnbuf getnr2tb getnr2tm \
gsubasgn gsubtest gsubtst2 gsubtst3 gsubtst4 gsubtst5 gsubtst6 \
gsubtst7 gsubtst8 \
- hex hsprint \
+ hex hex2 hsprint \
inpref inputred intest intprec iobug1 \
leaddig leadnl litoct longsub longwrds \
manglprm math membug1 messages minusstr mmap8k mtchi18n \
diff --git a/test/Makefile.in b/test/Makefile.in
index 34656eca..23f50afc 100644
--- a/test/Makefile.in
+++ b/test/Makefile.in
@@ -677,6 +677,9 @@ EXTRA_DIST = \
hello.awk \
hex.awk \
hex.ok \
+ hex2.awk \
+ hex2.in \
+ hex2.ok \
hsprint.awk \
hsprint.ok \
icasefs.awk \
@@ -1320,7 +1323,7 @@ BASIC_TESTS = \
getline getline2 getline3 getline4 getline5 getlnbuf getnr2tb getnr2tm \
gsubasgn gsubtest gsubtst2 gsubtst3 gsubtst4 gsubtst5 gsubtst6 \
gsubtst7 gsubtst8 \
- hex hsprint \
+ hex hex2 hsprint \
inpref inputred intest intprec iobug1 \
leaddig leadnl litoct longsub longwrds \
manglprm math membug1 messages minusstr mmap8k mtchi18n \
@@ -3011,6 +3014,11 @@ hex:
@AWKPATH="$(srcdir)" $(AWK) -f $@.awk >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+hex2:
+ @echo $@
+ @AWKPATH="$(srcdir)" $(AWK) -f $@.awk < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+ @-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
hsprint:
@echo $@
@AWKPATH="$(srcdir)" $(AWK) -f $@.awk >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
diff --git a/test/Maketests b/test/Maketests
index e5bde1d2..c7b125c7 100644
--- a/test/Maketests
+++ b/test/Maketests
@@ -415,6 +415,11 @@ hex:
@AWKPATH="$(srcdir)" $(AWK) -f $@.awk >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+hex2:
+ @echo $@
+ @AWKPATH="$(srcdir)" $(AWK) -f $@.awk < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+ @-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
hsprint:
@echo $@
@AWKPATH="$(srcdir)" $(AWK) -f $@.awk >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
diff --git a/test/hex2.awk b/test/hex2.awk
new file mode 100644
index 00000000..49c6203d
--- /dev/null
+++ b/test/hex2.awk
@@ -0,0 +1 @@
+{ print $1 + 7}
diff --git a/test/hex2.in b/test/hex2.in
new file mode 100644
index 00000000..60f06f0f
--- /dev/null
+++ b/test/hex2.in
@@ -0,0 +1,2 @@
+0x4
+-0x4
diff --git a/test/hex2.ok b/test/hex2.ok
new file mode 100644
index 00000000..49019db8
--- /dev/null
+++ b/test/hex2.ok
@@ -0,0 +1,2 @@
+7
+7