From 825c9b727ca72180da9e6b582e575044ab541470 Mon Sep 17 00:00:00 2001 From: TheSomeMan Date: Thu, 4 May 2023 16:04:24 +0700 Subject: [PATCH] Add API mac_addr_from_str --- include/mac_addr.h | 10 ++++++ src/mac_addr.c | 44 +++++++++++++++++++++++++++ tests/test_mac_addr/test_mac_addr.cpp | 17 +++++++++++ 3 files changed, 71 insertions(+) diff --git a/include/mac_addr.h b/include/mac_addr.h index ffd9dec..c7430ed 100644 --- a/include/mac_addr.h +++ b/include/mac_addr.h @@ -9,6 +9,7 @@ #define RUUVI_MAC_ADDR_H #include +#include #ifdef __cplusplus extern "C" { @@ -42,6 +43,15 @@ mac_address_bin_init(mac_address_bin_t* p_mac, const uint8_t mac[MAC_ADDRESS_NUM mac_address_str_t mac_address_to_str(const mac_address_bin_t* p_mac); +/** + * @brief Convert a string in format "AA:BB:CC:DD:EE:FF" to binary format + * @param[IN] p_mac_addr_str - input string with MAC address + * @param[OUT] p_mac_addr_bin - pointer to output @def mac_address_bin_t where the converted value will be saved + * @return true if input string contains valid MAC address + */ +bool +mac_addr_from_str(const char* const p_mac_addr_str, mac_address_bin_t* p_mac_addr_bin); + #ifdef __cplusplus } #endif diff --git a/src/mac_addr.c b/src/mac_addr.c index 9aa0a69..4b11b0b 100644 --- a/src/mac_addr.c +++ b/src/mac_addr.c @@ -7,6 +7,8 @@ #include "mac_addr.h" #include +#include +#include #include "str_buf.h" void @@ -37,3 +39,45 @@ mac_address_to_str(const mac_address_bin_t* p_mac) } return mac_str; } + +bool +mac_addr_from_str(const char* const p_mac_addr_str, mac_address_bin_t* p_mac_addr_bin) +{ + if ((NULL == p_mac_addr_str) || (NULL == p_mac_addr_bin)) + { + return false; + } + + mac_address_str_t mac_addr_str; + if (strlen(p_mac_addr_str) >= sizeof(mac_addr_str)) + { + return false; + } + strcpy(mac_addr_str.str_buf, p_mac_addr_str); + + const char* const p_delim = ":"; + char* p_save_ptr = NULL; + char* p_token = strtok_r(mac_addr_str.str_buf, p_delim, &p_save_ptr); + + if (NULL == p_token) + { + return false; + } + + for (size_t i = 0; i < MAC_ADDRESS_NUM_BYTES && p_token != NULL; ++i) + { + if (strlen(p_token) != 2 || !isxdigit(p_token[0]) || !isxdigit(p_token[1])) + { + return false; + } + p_mac_addr_bin->mac[i] = (uint8_t)strtol(p_token, NULL, 16); + p_token = strtok_r(NULL, p_delim, &p_save_ptr); + } + + if (p_token != NULL) + { + return false; + } + + return true; +} diff --git a/tests/test_mac_addr/test_mac_addr.cpp b/tests/test_mac_addr/test_mac_addr.cpp index 1aa392a..db1f64e 100644 --- a/tests/test_mac_addr/test_mac_addr.cpp +++ b/tests/test_mac_addr/test_mac_addr.cpp @@ -74,3 +74,20 @@ TEST_F(TestMacAddr, test_mac_address_to_str) // NOLINT const mac_address_str_t mac_str = mac_address_to_str(&mac_bin); ASSERT_EQ(string("11:22:33:AA:BB:CC"), string(mac_str.str_buf)); } + +TEST_F(TestMacAddr, test_mac_addr_from_str) // NOLINT +{ + mac_address_bin_t mac_addr_bin = { 0 }; + ASSERT_TRUE(mac_addr_from_str("11:22:33:AA:BB:CC", &mac_addr_bin)); + ASSERT_EQ(0x11U, mac_addr_bin.mac[0]); + ASSERT_EQ(0x22U, mac_addr_bin.mac[1]); + ASSERT_EQ(0x33U, mac_addr_bin.mac[2]); + ASSERT_EQ(0xAAU, mac_addr_bin.mac[3]); + ASSERT_EQ(0xBBU, mac_addr_bin.mac[4]); + ASSERT_EQ(0xCCU, mac_addr_bin.mac[5]); + + ASSERT_FALSE(mac_addr_from_str("11:22:33:AA:BB:CC", nullptr)); + ASSERT_FALSE(mac_addr_from_str(nullptr, &mac_addr_bin)); + ASSERT_FALSE(mac_addr_from_str("11:22:33:AA:BB:C", &mac_addr_bin)); + ASSERT_FALSE(mac_addr_from_str("", &mac_addr_bin)); +}