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));