#ifndef NSAP_H
#define NSAP_H
nonnull_all
static really_inline int32_t parse_nsap(
parser_t *parser,
const type_info_t *type,
const rdata_info_t *field,
rdata_t *rdata,
const token_t *token)
{
const uint8_t *data = (const uint8_t *)token->data;
if (unlikely(data[0] != '0' || !(data[1] == 'X' || data[1] == 'x')))
SYNTAX_ERROR(parser, "Invalid %s in %s", NAME(field), NAME(type));
data += 2;
while (rdata->octets < rdata->limit) {
uint32_t d0 = base16_table_dec_32bit_d0[data[0]];
uint32_t d1 = base16_table_dec_32bit_d1[data[1]];
if ((d0 | d1) > 0xff) {
while (*data == '.') data++;
d0 = base16_table_dec_32bit_d0[data[0]];
if (d0 > 0xff)
break;
data += 1;
while (*data == '.') data++;
d1 = base16_table_dec_32bit_d1[data[0]];
if (d1 > 0xff)
goto bad_sequence;
data += 1;
} else {
data += 2;
}
*rdata->octets++ = (uint8_t)(d0 | d1);
}
if (rdata->octets <= rdata->limit && data == (uint8_t *)token->data + token->length)
return 0;
bad_sequence:
SYNTAX_ERROR(parser, "Invalid %s in %s", NAME(field), NAME(type));
}
#endif