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