diff options
author | Jean Boussier <[email protected]> | 2025-02-20 10:25:03 +0100 |
---|---|---|
committer | Hiroshi SHIBATA <[email protected]> | 2025-02-21 11:31:36 +0900 |
commit | bf6c106d5467b51efb88fe6252093a59dbeeddee (patch) | |
tree | 048360ca872a85850d158e857a911ee5841b8caf | |
parent | 0f8a6e1f592d19330695cc4c632f8fe2e08f2dd1 (diff) |
[ruby/strscan] `scan_integer(base: 16)` ignore x suffix if not
followed by hexadecimal
(https://github.com/ruby/strscan/pull/141)
Fix: https://github.com/ruby/strscan/issues/140
`0x<EOF>`, `0xZZZ` should be parsed as `0` instead of not matching at
all.
https://github.com/ruby/strscan/commit/c4e4795ed2
-rw-r--r-- | ext/strscan/strscan.c | 2 | ||||
-rw-r--r-- | test/strscan/test_stringscanner.rb | 23 |
2 files changed, 15 insertions, 10 deletions
diff --git a/ext/strscan/strscan.c b/ext/strscan/strscan.c index 012d3a4c42..e5a0ad66a3 100644 --- a/ext/strscan/strscan.c +++ b/ext/strscan/strscan.c @@ -1379,7 +1379,7 @@ strscan_scan_base16_integer(VALUE self) len++; } - if ((remaining_len >= (len + 2)) && ptr[len] == '0' && ptr[len + 1] == 'x') { + if ((remaining_len >= (len + 3)) && ptr[len] == '0' && ptr[len + 1] == 'x' && rb_isxdigit(ptr[len + 2])) { len += 2; } diff --git a/test/strscan/test_stringscanner.rb b/test/strscan/test_stringscanner.rb index eb35dfa119..2f68331da5 100644 --- a/test/strscan/test_stringscanner.rb +++ b/test/strscan/test_stringscanner.rb @@ -1052,19 +1052,24 @@ module StringScannerTests assert_predicate(s, :matched?) s = create_string_scanner('0x') - assert_nil(s.scan_integer(base: 16)) - assert_equal(0, s.pos) - refute_predicate(s, :matched?) + assert_equal(0, s.scan_integer(base: 16)) + assert_equal(1, s.pos) + assert_predicate(s, :matched?) + + s = create_string_scanner('0xyz') + assert_equal(0, s.scan_integer(base: 16)) + assert_equal(1, s.pos) + assert_predicate(s, :matched?) s = create_string_scanner('-0x') - assert_nil(s.scan_integer(base: 16)) - assert_equal(0, s.pos) - refute_predicate(s, :matched?) + assert_equal(0, s.scan_integer(base: 16)) + assert_equal(2, s.pos) + assert_predicate(s, :matched?) s = create_string_scanner('+0x') - assert_nil(s.scan_integer(base: 16)) - assert_equal(0, s.pos) - refute_predicate(s, :matched?) + assert_equal(0, s.scan_integer(base: 16)) + assert_equal(2, s.pos) + assert_predicate(s, :matched?) s = create_string_scanner('-123abc') assert_equal(-0x123abc, s.scan_integer(base: 16)) |