54 #define in_range(c, lo, up) ((u8_t)c >= lo && (u8_t)c <= up)
55 #define isprint(c) in_range(c, 0x20, 0x7f)
56 #define isdigit(c) in_range(c, '0', '9')
57 #define isxdigit(c) (isdigit(c) || in_range(c, 'a', 'f') || in_range(c, 'A', 'F'))
58 #define islower(c) in_range(c, 'a', 'z')
59 #define isspace(c) (c == ' ' || c == '\f' || c == '\n' || c == '\r' || c == '\t' || c == '\v')
60 #define xchar(i) ((i) < 10 ? '0' + (i) : 'A' + (i) - 10)
73 ip6addr_aton(
const char *cp, ip6_addr_t *addr)
75 u32_t addr_index, zero_blocks, current_block_index, current_block_value;
81 for (s = cp; *s != 0; s++) {
84 }
else if (!isxdigit(*s)) {
91 current_block_index = 0;
92 current_block_value = 0;
93 for (s = cp; *s != 0; s++) {
96 if (current_block_index & 0x1) {
97 addr->addr[addr_index++] |= current_block_value;
100 addr->addr[addr_index] = current_block_value << 16;
103 current_block_index++;
104 current_block_value = 0;
105 if (current_block_index > 7) {
116 while (zero_blocks > 0) {
118 if (current_block_index & 0x1) {
122 addr->addr[addr_index] = 0;
125 current_block_index++;
126 if (current_block_index > 7) {
132 }
else if (isxdigit(*s)) {
134 current_block_value = (current_block_value << 4) +
135 (isdigit(*s) ? (
u32_t)(*s -
'0') :
136 (
u32_t)(10 + (islower(*s) ? *s -
'a' : *s -
'A')));
144 if (current_block_index & 0x1) {
145 addr->addr[addr_index++] |= current_block_value;
148 addr->addr[addr_index] = current_block_value << 16;
154 for (addr_index = 0; addr_index < 4; addr_index++) {
155 addr->addr[addr_index] =
lwip_htonl(addr->addr[addr_index]);
159 if (current_block_index != 7) {
175 ip6addr_ntoa(
const ip6_addr_t *addr)
178 return ip6addr_ntoa_r(addr, str, 40);
191 ip6addr_ntoa_r(
const ip6_addr_t *addr,
char *
buf,
int buflen)
193 u32_t current_block_index, current_block_value, next_block_value;
195 u8_t zero_flag, empty_block_flag;
198 empty_block_flag = 0;
200 for (current_block_index = 0; current_block_index < 8; current_block_index++) {
202 current_block_value =
lwip_htonl(addr->addr[current_block_index >> 1]);
203 if ((current_block_index & 0x1) == 0) {
204 current_block_value = current_block_value >> 16;
206 current_block_value &= 0xffff;
209 if (current_block_value == 0) {
210 if (current_block_index == 7 && empty_block_flag == 1) {
218 if (empty_block_flag == 0) {
221 next_block_value =
lwip_htonl(addr->addr[(current_block_index + 1) >> 1]);
222 if ((current_block_index & 0x1) == 0x01) {
223 next_block_value = next_block_value >> 16;
225 next_block_value &= 0xffff;
226 if (next_block_value == 0) {
227 empty_block_flag = 1;
234 }
else if (empty_block_flag == 1) {
238 }
else if (empty_block_flag == 1) {
240 empty_block_flag = 2;
243 if (current_block_index > 0) {
250 if ((current_block_value & 0xf000) == 0) {
253 buf[i++] = xchar(((current_block_value & 0xf000) >> 12));
260 if (((current_block_value & 0xf00) == 0) && (zero_flag)) {
263 buf[i++] = xchar(((current_block_value & 0xf00) >> 8));
270 if (((current_block_value & 0xf0) == 0) && (zero_flag)) {
274 buf[i++] = xchar(((current_block_value & 0xf0) >> 4));
281 buf[i++] = xchar((current_block_value & 0xf));