mirror of
https://github.com/RIOT-OS/RIOT.git
synced 2024-12-29 04:50:03 +01:00
ng_netif: more formats for ng_netif_addr_from_str
This commit is contained in:
parent
7d3d8dee21
commit
98aec32f6b
@ -15,47 +15,76 @@
|
||||
|
||||
#include "net/ng_netif.h"
|
||||
|
||||
static int _dehex(char c)
|
||||
static inline int _dehex(char c, int default_)
|
||||
{
|
||||
return ('0' <= c && c <= '9') ? c - '0'
|
||||
: ('A' <= c && c <= 'F') ? c - 'A' + 10
|
||||
: ('a' <= c && c <= 'f') ? c - 'a' + 10
|
||||
: -1;
|
||||
if ('0' <= c && c <= '9') {
|
||||
return c - '0';
|
||||
}
|
||||
else if ('A' <= c && c <= 'F') {
|
||||
return c - 'A' + 10;
|
||||
}
|
||||
else if ('a' <= c && c <= 'f') {
|
||||
return c - 'a' + 10;
|
||||
}
|
||||
else {
|
||||
return default_;
|
||||
}
|
||||
}
|
||||
|
||||
size_t ng_netif_addr_from_str(uint8_t *out, size_t out_len, const char *str)
|
||||
{
|
||||
size_t len = 0;
|
||||
while (1) {
|
||||
++len;
|
||||
if (len > out_len) {
|
||||
return 0;
|
||||
}
|
||||
/* Walk over str from the end. */
|
||||
/* Take two chars a time as one hex value (%hhx). */
|
||||
/* Leading zeros can be omitted. */
|
||||
/* Every non-hexadimal character is a delimiter. */
|
||||
/* Leading, tailing and adjacent delimiters are forbidden. */
|
||||
|
||||
int a = _dehex(*str++);
|
||||
if (a < 0) {
|
||||
return 0;
|
||||
}
|
||||
const char *end_str = str;
|
||||
uint8_t *out_end = out;
|
||||
size_t count = 0;
|
||||
int assert_cell = 1;
|
||||
|
||||
int b = _dehex(*str++);
|
||||
if (b < 0) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
*out++ = (a << 4) | b;
|
||||
|
||||
if (*str == ':') {
|
||||
++str;
|
||||
}
|
||||
else if (*str == '\0') {
|
||||
break;
|
||||
}
|
||||
else {
|
||||
return 0;
|
||||
}
|
||||
if (!str || !*str) {
|
||||
return 0;
|
||||
}
|
||||
while (end_str[1]) {
|
||||
++end_str;
|
||||
}
|
||||
|
||||
return len;
|
||||
while (end_str >= str) {
|
||||
int a = 0, b = _dehex(*end_str--, -1);
|
||||
if (b < 0) {
|
||||
if (assert_cell) {
|
||||
return 0;
|
||||
}
|
||||
else {
|
||||
assert_cell = 1;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
assert_cell = 0;
|
||||
|
||||
if (end_str >= str) {
|
||||
a = _dehex(*end_str--, 0);
|
||||
}
|
||||
|
||||
if (++count > out_len) {
|
||||
return 0;
|
||||
}
|
||||
*out_end++ = (a << 4) | b;
|
||||
}
|
||||
if (assert_cell) {
|
||||
return 0;
|
||||
}
|
||||
/* out is reversed */
|
||||
|
||||
while (out < --out_end) {
|
||||
uint8_t tmp = *out_end;
|
||||
*out_end = *out;
|
||||
*out++ = tmp;
|
||||
}
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
/** @} */
|
||||
|
@ -4,7 +4,7 @@ include ../Makefile.tests_common
|
||||
BOARD_INSUFFICIENT_RAM := airfy-beacon chronos msb-430 msb-430h pca10000 \
|
||||
pca10005 redbee-econotag spark-core stm32f0discovery \
|
||||
telosb wsn430-v1_3b wsn430-v1_4 z1 nucleo-f334 \
|
||||
yunjia-nrf51822 samr21-xpro
|
||||
yunjia-nrf51822 samr21-xpro arduino-mega2560
|
||||
|
||||
USEMODULE += embunit
|
||||
|
||||
|
@ -184,12 +184,15 @@ static void test_ng_netif_addr_from_str__out_too_short(void)
|
||||
TEST_ASSERT_EQUAL_INT(0, ng_netif_addr_from_str(out, sizeof(out), str));
|
||||
}
|
||||
|
||||
static void test_ng_netif_addr_from_str__ill_formated1(void)
|
||||
static void test_ng_netif_addr_from_str__omitted_delimitter(void)
|
||||
{
|
||||
static const char str[] = "576:cd";
|
||||
uint8_t out[sizeof(str)];
|
||||
static const char str[] = "4567:cd";
|
||||
uint8_t out[3];
|
||||
|
||||
TEST_ASSERT_EQUAL_INT(0, ng_netif_addr_from_str(out, sizeof(out), str));
|
||||
TEST_ASSERT_EQUAL_INT(3, ng_netif_addr_from_str(out, sizeof(out), str));
|
||||
TEST_ASSERT_EQUAL_INT(0x45, out[0]);
|
||||
TEST_ASSERT_EQUAL_INT(0x67, out[1]);
|
||||
TEST_ASSERT_EQUAL_INT(0xcd, out[2]);
|
||||
}
|
||||
|
||||
static void test_ng_netif_addr_from_str__ill_formated2(void)
|
||||
@ -200,33 +203,55 @@ static void test_ng_netif_addr_from_str__ill_formated2(void)
|
||||
TEST_ASSERT_EQUAL_INT(0, ng_netif_addr_from_str(out, sizeof(out), str));
|
||||
}
|
||||
|
||||
static void test_ng_netif_addr_from_str__ill_formated3(void)
|
||||
static void test_ng_netif_addr_from_str__dash_delimitter(void)
|
||||
{
|
||||
static const char str[] = "05-cd";
|
||||
uint8_t out[sizeof(str)];
|
||||
uint8_t out[2];
|
||||
|
||||
TEST_ASSERT_EQUAL_INT(0, ng_netif_addr_from_str(out, sizeof(out), str));
|
||||
TEST_ASSERT_EQUAL_INT(2, ng_netif_addr_from_str(out, sizeof(out), str));
|
||||
TEST_ASSERT_EQUAL_INT(0x05, out[0]);
|
||||
TEST_ASSERT_EQUAL_INT(0xcd, out[1]);
|
||||
}
|
||||
|
||||
static void test_ng_netif_addr_from_str__ill_formated4(void)
|
||||
static void test_ng_netif_addr_from_str__zero_omitted_back(void)
|
||||
{
|
||||
static const char str[] = "05:c";
|
||||
uint8_t out[sizeof(str)];
|
||||
uint8_t out[2];
|
||||
|
||||
TEST_ASSERT_EQUAL_INT(0, ng_netif_addr_from_str(out, sizeof(out), str));
|
||||
TEST_ASSERT_EQUAL_INT(2, ng_netif_addr_from_str(out, sizeof(out), str));
|
||||
TEST_ASSERT_EQUAL_INT(0x05, out[0]);
|
||||
TEST_ASSERT_EQUAL_INT(0x0c, out[1]);
|
||||
}
|
||||
|
||||
static void test_ng_netif_addr_from_str__ill_formated5(void)
|
||||
static void test_ng_netif_addr_from_str__zero_omitted_front(void)
|
||||
{
|
||||
static const char str[] = "5:cd";
|
||||
uint8_t out[2];
|
||||
|
||||
TEST_ASSERT_EQUAL_INT(2, ng_netif_addr_from_str(out, sizeof(out), str));
|
||||
TEST_ASSERT_EQUAL_INT(0x05, out[0]);
|
||||
TEST_ASSERT_EQUAL_INT(0xcd, out[1]);
|
||||
}
|
||||
|
||||
static void test_ng_netif_addr_from_str__ill_trailing_delimitter(void)
|
||||
{
|
||||
static const char str[] = "05:cd:";
|
||||
uint8_t out[sizeof(str)];
|
||||
|
||||
TEST_ASSERT_EQUAL_INT(0, ng_netif_addr_from_str(out, sizeof(out), str));
|
||||
}
|
||||
|
||||
static void test_ng_netif_addr_from_str__ill_formated6(void)
|
||||
static void test_ng_netif_addr_from_str__ill_leading_delimitter(void)
|
||||
{
|
||||
static const char str[] = "05:cd:";
|
||||
static const char str[] = ":05:cd";
|
||||
uint8_t out[sizeof(str)];
|
||||
|
||||
TEST_ASSERT_EQUAL_INT(0, ng_netif_addr_from_str(out, sizeof(out), str));
|
||||
}
|
||||
|
||||
static void test_ng_netif_addr_from_str__ill_extra_delimitter(void)
|
||||
{
|
||||
static const char str[] = "05::cd";
|
||||
uint8_t out[sizeof(str)];
|
||||
|
||||
TEST_ASSERT_EQUAL_INT(0, ng_netif_addr_from_str(out, sizeof(out), str));
|
||||
@ -258,12 +283,14 @@ Test *tests_netif_tests(void)
|
||||
new_TestFixture(test_ng_netif_addr_to_str__out_too_short),
|
||||
new_TestFixture(test_ng_netif_addr_to_str__success),
|
||||
new_TestFixture(test_ng_netif_addr_from_str__out_too_short),
|
||||
new_TestFixture(test_ng_netif_addr_from_str__ill_formated1),
|
||||
new_TestFixture(test_ng_netif_addr_from_str__omitted_delimitter),
|
||||
new_TestFixture(test_ng_netif_addr_from_str__ill_formated2),
|
||||
new_TestFixture(test_ng_netif_addr_from_str__ill_formated3),
|
||||
new_TestFixture(test_ng_netif_addr_from_str__ill_formated4),
|
||||
new_TestFixture(test_ng_netif_addr_from_str__ill_formated5),
|
||||
new_TestFixture(test_ng_netif_addr_from_str__ill_formated6),
|
||||
new_TestFixture(test_ng_netif_addr_from_str__dash_delimitter),
|
||||
new_TestFixture(test_ng_netif_addr_from_str__zero_omitted_back),
|
||||
new_TestFixture(test_ng_netif_addr_from_str__zero_omitted_front),
|
||||
new_TestFixture(test_ng_netif_addr_from_str__ill_trailing_delimitter),
|
||||
new_TestFixture(test_ng_netif_addr_from_str__ill_leading_delimitter),
|
||||
new_TestFixture(test_ng_netif_addr_from_str__ill_extra_delimitter),
|
||||
new_TestFixture(test_ng_netif_addr_from_str__success),
|
||||
};
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user