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"
|
#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'
|
if ('0' <= c && c <= '9') {
|
||||||
: ('A' <= c && c <= 'F') ? c - 'A' + 10
|
return c - '0';
|
||||||
: ('a' <= c && c <= 'f') ? c - 'a' + 10
|
}
|
||||||
: -1;
|
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 ng_netif_addr_from_str(uint8_t *out, size_t out_len, const char *str)
|
||||||
{
|
{
|
||||||
size_t len = 0;
|
/* Walk over str from the end. */
|
||||||
while (1) {
|
/* Take two chars a time as one hex value (%hhx). */
|
||||||
++len;
|
/* Leading zeros can be omitted. */
|
||||||
if (len > out_len) {
|
/* Every non-hexadimal character is a delimiter. */
|
||||||
return 0;
|
/* Leading, tailing and adjacent delimiters are forbidden. */
|
||||||
}
|
|
||||||
|
|
||||||
int a = _dehex(*str++);
|
const char *end_str = str;
|
||||||
if (a < 0) {
|
uint8_t *out_end = out;
|
||||||
return 0;
|
size_t count = 0;
|
||||||
}
|
int assert_cell = 1;
|
||||||
|
|
||||||
int b = _dehex(*str++);
|
if (!str || !*str) {
|
||||||
if (b < 0) {
|
return 0;
|
||||||
return 0;
|
}
|
||||||
}
|
while (end_str[1]) {
|
||||||
|
++end_str;
|
||||||
*out++ = (a << 4) | b;
|
|
||||||
|
|
||||||
if (*str == ':') {
|
|
||||||
++str;
|
|
||||||
}
|
|
||||||
else if (*str == '\0') {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
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 \
|
BOARD_INSUFFICIENT_RAM := airfy-beacon chronos msb-430 msb-430h pca10000 \
|
||||||
pca10005 redbee-econotag spark-core stm32f0discovery \
|
pca10005 redbee-econotag spark-core stm32f0discovery \
|
||||||
telosb wsn430-v1_3b wsn430-v1_4 z1 nucleo-f334 \
|
telosb wsn430-v1_3b wsn430-v1_4 z1 nucleo-f334 \
|
||||||
yunjia-nrf51822 samr21-xpro
|
yunjia-nrf51822 samr21-xpro arduino-mega2560
|
||||||
|
|
||||||
USEMODULE += embunit
|
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));
|
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";
|
static const char str[] = "4567:cd";
|
||||||
uint8_t out[sizeof(str)];
|
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)
|
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));
|
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";
|
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";
|
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";
|
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)];
|
uint8_t out[sizeof(str)];
|
||||||
|
|
||||||
TEST_ASSERT_EQUAL_INT(0, ng_netif_addr_from_str(out, sizeof(out), 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)];
|
uint8_t out[sizeof(str)];
|
||||||
|
|
||||||
TEST_ASSERT_EQUAL_INT(0, ng_netif_addr_from_str(out, sizeof(out), 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__out_too_short),
|
||||||
new_TestFixture(test_ng_netif_addr_to_str__success),
|
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__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_formated2),
|
||||||
new_TestFixture(test_ng_netif_addr_from_str__ill_formated3),
|
new_TestFixture(test_ng_netif_addr_from_str__dash_delimitter),
|
||||||
new_TestFixture(test_ng_netif_addr_from_str__ill_formated4),
|
new_TestFixture(test_ng_netif_addr_from_str__zero_omitted_back),
|
||||||
new_TestFixture(test_ng_netif_addr_from_str__ill_formated5),
|
new_TestFixture(test_ng_netif_addr_from_str__zero_omitted_front),
|
||||||
new_TestFixture(test_ng_netif_addr_from_str__ill_formated6),
|
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),
|
new_TestFixture(test_ng_netif_addr_from_str__success),
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user