Exemplo n.º 1
0
bool qd_iterator_next_segment(qd_iterator_t *iter, uint32_t *hash)
{
    qd_hash_segment_t *hash_segment = DEQ_TAIL(iter->hash_segments);
    if (!hash_segment)
        return false;

    *hash = hash_segment->hash;
    qd_iterator_trim_view(iter, hash_segment->segment_length);

    DEQ_REMOVE_TAIL(iter->hash_segments);

    free_qd_hash_segment_t(hash_segment);

    return true;
}
Exemplo n.º 2
0
static char *test_trim(void *context)
{
    qd_iterator_t *iter = qd_iterator_string("testing.trim", ITER_VIEW_ALL);

    qd_iterator_trim_view(iter, 7);
    if (!qd_iterator_equal(iter, (unsigned char*) "testing"))
        return "Trim on ITER_VIEW_ALL failed (1)";

    qd_iterator_reset_view(iter, ITER_VIEW_ALL);
    if (!qd_iterator_equal(iter, (unsigned char*) "testing.trim"))
        return "Trim on ITER_VIEW_ALL failed (2)";

    qd_iterator_advance(iter, 4);
    qd_iterator_trim_view(iter, 5);
    if (!qd_iterator_equal(iter, (unsigned char*) "ing.t"))
        return "Trim on ITER_VIEW_ALL failed (3)";

    qd_iterator_reset_view(iter, ITER_VIEW_ADDRESS_HASH);
    qd_iterator_trim_view(iter, 9);
    if (!qd_iterator_equal(iter, (unsigned char*) "M0testing"))
        return "Trim on ITER_VIEW_ADDRESS_HASH failed";

    qd_iterator_reset(iter);
    qd_iterator_annotate_space(iter, "my_space.", 9);
    qd_iterator_trim_view(iter, 18);
    if (!qd_iterator_equal(iter, (unsigned char*) "M0my_space.testing"))
        return "Trim on ITER_VIEW_ADDRESS_HASH (with space 1) failed";

    qd_iterator_reset(iter);
    qd_iterator_trim_view(iter, 10);
    if (!qd_iterator_equal(iter, (unsigned char*) "M0my_space"))
        return "Trim on ITER_VIEW_ADDRESS_HASH (in space 1) failed";

    qd_iterator_reset(iter);
    qd_iterator_trim_view(iter, 2);
    if (!qd_iterator_equal(iter, (unsigned char*) "M0"))
        return "Trim on ITER_VIEW_ADDRESS_HASH (in annotation 1) failed";

    qd_iterator_reset(iter);
    qd_iterator_trim_view(iter, 1);
    if (!qd_iterator_equal(iter, (unsigned char*) "M"))
        return "Trim on ITER_VIEW_ADDRESS_HASH (in annotation 2) failed";

    qd_iterator_free(iter);
    return 0;
}
Exemplo n.º 3
0
static qd_parsed_field_t *qd_parse_internal(qd_iterator_t *iter, qd_parsed_field_t *p)
{
    qd_parsed_field_t *field = new_qd_parsed_field_t();
    if (!field)
        return 0;

    DEQ_ITEM_INIT(field);
    DEQ_INIT(field->children);
    field->parent   = p;
    field->raw_iter = 0;
    field->typed_iter = qd_iterator_dup(iter);

    uint32_t size            = 0;
    uint32_t count           = 0;
    uint32_t length_of_count = 0;
    uint32_t length_of_size  = 0;

    field->parse_error = get_type_info(iter, &field->tag, &size, &count, &length_of_size, &length_of_count);

    if (!field->parse_error) {
        qd_iterator_trim_view(field->typed_iter, size + length_of_size + 1); // + 1 accounts for the tag length

        field->raw_iter = qd_iterator_sub(iter, size - length_of_count);

        qd_iterator_advance(iter, size - length_of_count);

        for (uint32_t idx = 0; idx < count; idx++) {
            qd_parsed_field_t *child = qd_parse_internal(field->raw_iter, field);
            DEQ_INSERT_TAIL(field->children, child);
            if (!qd_parse_ok(child)) {
                field->parse_error = child->parse_error;
                break;
            }
        }
    }

    return field;
}