From d5d305193ce527f1cc3022c406de35d9a85d4ccb Mon Sep 17 00:00:00 2001 From: hrxi Date: Sun, 1 Sep 2019 18:18:25 +0200 Subject: Fix some warnings Instances of `RegexError` are just asserted as `assert_not_reached` as they cannot really fail except for allocation failure if the given regex is valid. --- xmpp-vala/src/util.vala | 50 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 xmpp-vala/src/util.vala (limited to 'xmpp-vala/src/util.vala') diff --git a/xmpp-vala/src/util.vala b/xmpp-vala/src/util.vala new file mode 100644 index 00000000..34a05b7a --- /dev/null +++ b/xmpp-vala/src/util.vala @@ -0,0 +1,50 @@ +namespace Xmpp.Util { + +// Parse a number from a hexadecimal representation. +// +// Skips any whitespace at the start of the string, parses as many valid +// characters as hexadecimal digits as possible (possibly zero) and returns +// them as an integer value. +// +// ``` +// // 0x0 +// print("0x%lx\n", from_hex("")); +// +// // 0x123abc +// print("0x%lx\n", from_hex("123abc")); +// +// // 0x0 +// print("0x%lx\n", from_hex("0x123abc")); +// +// // 0xa +// print("0x%lx\n", from_hex("A quick brown fox jumps over the lazy dog.")); +// +// // 0xfeed +// print("0x%lx\n", from_hex(" FEED ME ")); +// ``` + +public long from_hex(string numeral) { + long result = 0; + bool skipping_whitespace = true; + foreach (uint8 byte in numeral.data) { + char c = (char)byte; + if (skipping_whitespace && c.isspace()) { + continue; + } + skipping_whitespace = false; + int digit; + if ('0' <= c && c <= '9') { + digit = c - '0'; + } else if ('A' <= c && c <= 'F') { + digit = c - 'A' + 10; + } else if ('a' <= c && c <= 'f') { + digit = c - 'a' + 10; + } else { + break; + } + result = (result << 4) | digit; + } + return result; +} + +} -- cgit v1.2.3-54-g00ecf