Commit a961f2cd authored by Yedidya Feldblum's avatar Yedidya Feldblum Committed by Facebook Github Bot

Let MacAddress use a helper hex-table

Summary:
[Folly] Let `MacAddress` use a helper hex-table.

The table is in the `folly::detail` namespace so it is non-public to users of folly, but the rules may not be quite as strict in at least some cases within folly.

Also the helper `unhex` function that this replaces is not `clang-format`-clean, so this lets us sidestep that.

Reviewed By: Orvid

Differential Revision: D5524229

fbshipit-source-id: 21d6938e20cd675e65499a5b64d2af934f980222
parent 83b9f93f
...@@ -20,6 +20,7 @@ ...@@ -20,6 +20,7 @@
#include <folly/Exception.h> #include <folly/Exception.h>
#include <folly/IPAddressV6.h> #include <folly/IPAddressV6.h>
#include <folly/String.h>
using std::invalid_argument; using std::invalid_argument;
using std::string; using std::string;
...@@ -71,12 +72,6 @@ string MacAddress::toString() const { ...@@ -71,12 +72,6 @@ string MacAddress::toString() const {
void MacAddress::parse(StringPiece str) { void MacAddress::parse(StringPiece str) {
// Helper function to convert a single hex char into an integer // Helper function to convert a single hex char into an integer
auto unhex = [](char c) -> int {
return c >= '0' && c <= '9' ? c - '0' :
c >= 'A' && c <= 'F' ? c - 'A' + 10 :
c >= 'a' && c <= 'f' ? c - 'a' + 10 :
-1;
};
auto isSeparatorChar = [](char c) { auto isSeparatorChar = [](char c) {
return c == ':' || c == '-'; return c == ':' || c == '-';
}; };
...@@ -99,21 +94,21 @@ void MacAddress::parse(StringPiece str) { ...@@ -99,21 +94,21 @@ void MacAddress::parse(StringPiece str) {
} }
// Parse the upper nibble // Parse the upper nibble
int upper = unhex(*p); uint8_t upper = detail::hexTable[static_cast<uint8_t>(*p)];
if (upper < 0) { if (upper & 0x10) {
throw invalid_argument(to<string>("invalid MAC address \"", str, throw invalid_argument(to<string>("invalid MAC address \"", str,
"\": contains non-hex digit")); "\": contains non-hex digit"));
} }
++p; ++p;
// Parse the lower nibble // Parse the lower nibble
int lower; uint8_t lower;
if (p == str.end()) { if (p == str.end()) {
lower = upper; lower = upper;
upper = 0; upper = 0;
} else { } else {
lower = unhex(*p); lower = detail::hexTable[static_cast<uint8_t>(*p)];
if (lower < 0) { if (lower & 0x10) {
// Also accept ':', '-', or '\0', to handle the case where one // Also accept ':', '-', or '\0', to handle the case where one
// of the bytes was represented by just a single digit. // of the bytes was represented by just a single digit.
if (isSeparatorChar(*p)) { if (isSeparatorChar(*p)) {
...@@ -128,7 +123,7 @@ void MacAddress::parse(StringPiece str) { ...@@ -128,7 +123,7 @@ void MacAddress::parse(StringPiece str) {
} }
// Update parsed with the newly parsed byte // Update parsed with the newly parsed byte
parsed[byteIndex] = uint8_t((upper << 4) | lower); parsed[byteIndex] = (upper << 4) | lower;
} }
if (p != str.end()) { if (p != str.end()) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment