in src/parse.c [355:440]
uint64_t qd_parse_as_ulong(qd_parsed_field_t *parsed_field)
{
uint64_t result = 0;
uint32_t tmp32 = 0;
uint8_t octet = 0;
qd_buffer_field_t field = parsed_field->amqp.value;
switch (parsed_field->amqp.tag) {
case QD_AMQP_ULONG:
case QD_AMQP_TIMESTAMP:
qd_buffer_field_uint32(&field, &tmp32);
result = ((uint64_t) tmp32) << 32;
qd_buffer_field_uint32(&field, &tmp32);
result |= ((uint64_t) tmp32);
break;
case QD_AMQP_UINT:
qd_buffer_field_uint32(&field, &tmp32);
result = tmp32;
break;
case QD_AMQP_USHORT:
qd_buffer_field_octet(&field, &octet);
result = ((uint64_t) octet) << 8;
// Fall Through...
case QD_AMQP_BOOLEAN:
case QD_AMQP_UBYTE:
case QD_AMQP_SMALLUINT:
case QD_AMQP_SMALLULONG:
qd_buffer_field_octet(&field, &octet);
result |= (uint64_t) octet;
break;
case QD_AMQP_TRUE:
result = 1;
break;
case QD_AMQP_FALSE:
case QD_AMQP_UINT0:
case QD_AMQP_ULONG0:
// already zeroed
break;
case QD_AMQP_STR8_UTF8:
case QD_AMQP_STR32_UTF8:
case QD_AMQP_SYM8:
case QD_AMQP_SYM32:
{
// conversion from string to 64 bit unsigned integer:
char *value = qd_buffer_field_strdup(&field);
if (sscanf(value, "%"SCNu64, &result) != 1)
parsed_field->parse_error = "Cannot convert string to unsigned long";
free(value);
}
break;
case QD_AMQP_BYTE:
case QD_AMQP_SHORT:
case QD_AMQP_INT:
case QD_AMQP_SMALLINT:
case QD_AMQP_LONG:
case QD_AMQP_SMALLLONG:
{
// if a signed integer is positive, accept it
int64_t ltmp = qd_parse_as_long(parsed_field);
if (qd_parse_ok(parsed_field)) {
if (ltmp >= 0) {
result = (uint64_t)ltmp;
} else {
parsed_field->parse_error = "Unable to parse negative integer as unsigned";
}
}
}
break;
default:
parsed_field->parse_error = "Unable to parse as an unsigned integer";
// catch any missing types during development
assert(false);
}
return result;
}