uint64_t qd_parse_as_ulong()

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