Esempio n. 1
0
void qd_field_iterator_advance(qd_field_iterator_t *iter, uint32_t length)
{
    while (length > 0 && !qd_field_iterator_end(iter)) {
        if (iter->state == STATE_IN_ADDRESS) {
            field_iterator_move_cursor(iter, length);
            break;
        } else {
            qd_field_iterator_octet(iter);
            length--;
        }
    }
}
Esempio n. 2
0
unsigned char qd_iterator_octet(qd_iterator_t *iter)
{
    if (!iter)
        return 0;

    if (iter->state == STATE_AT_PREFIX) {
        iter->state = iter->prefix == 'M' ? STATE_AT_PHASE : (iter->space ? STATE_IN_SPACE : STATE_IN_BODY);
        iter->space_cursor = 0;
        iter->annotation_remaining--;
        return iter->prefix;
    }

    if (iter->state == STATE_AT_PHASE) {
        iter->state = iter->space ? STATE_IN_SPACE : STATE_IN_BODY;
        iter->space_cursor = 0;
        iter->annotation_remaining--;
        return iter->phase;
    }

    if (iter->state == STATE_IN_SPACE) {
        if (iter->space_cursor == iter->space_length - 1) {
            iter->state = STATE_IN_BODY;
            assert(iter->annotation_remaining == 1);
        }
        iter->annotation_remaining--;
        return iter->space[iter->space_cursor++];
    }

    if (iter->view_pointer.remaining == 0)
        return (unsigned char) 0;

    unsigned char result = *(iter->view_pointer.cursor);

    field_iterator_move_cursor(iter, 1);
    if (iter->view_pointer.remaining && iter->mode == MODE_TO_SLASH && *(iter->view_pointer.cursor) == '/')
        iter->view_pointer.remaining = 0;

    return result;
}
Esempio n. 3
0
unsigned char qd_field_iterator_octet(qd_field_iterator_t *iter)
{
    if (iter->state == STATE_AT_PREFIX) {
        iter->state =  iter->prefix == 'M' ? STATE_AT_PHASE : STATE_IN_ADDRESS;
        return iter->prefix;
    }

    if (iter->state == STATE_AT_PHASE) {
        iter->state = STATE_IN_ADDRESS;
        return iter->phase;
    }

    if (iter->pointer.length == 0)
        return (unsigned char) 0;

    unsigned char result = *(iter->pointer.cursor);

    field_iterator_move_cursor(iter, 1);
    if (iter->pointer.length && iter->mode == MODE_TO_SLASH && *(iter->pointer.cursor) == '/')
        iter->pointer.length = 0;

    return result;
}