- /* If we have a previous, check if we overlap */
- if (s->prev != OOO_SEGMENT_INVALID_INDEX)
- {
- prev = pool_elt_at_index (f->ooo_segments, s->prev);
-
- /* New segment merges prev and current. Remove previous and
- * update position of current. */
- if (offset_leq (offset, ooo_segment_end_offset (f, prev)))
- {
- s->start = prev->start;
- s->length = s_eof - ooo_segment_offset (f, prev);
- ooo_segment_del (f, s->prev);
- }
- else
- {
- s->start = offset;
- s->length = s_eof - ooo_segment_offset (f, s);
- }
- }
- else
- {
- s->start = offset;
- s->length = s_eof - ooo_segment_offset (f, s);
- }
-
- /* The new segment's tail may cover multiple smaller ones */
- if (offset_lt (s_eof, end_offset))
- {
- /* Remove segments completely covered */
- it = (s->next != OOO_SEGMENT_INVALID_INDEX) ?
- pool_elt_at_index (f->ooo_segments, s->next) : 0;
- while (it && offset_lt (ooo_segment_end_offset (f, it), end_offset))
- {
- next = (it->next != OOO_SEGMENT_INVALID_INDEX) ?
- pool_elt_at_index (f->ooo_segments, it->next) : 0;
- ooo_segment_del (f, it - f->ooo_segments);
- it = next;
- }
-
- /* Update length. Segment's start might have changed. */
- s->length = end_offset - ooo_segment_offset (f, s);
-
- /* If partial overlap with last, merge */
- if (it && offset_lt (ooo_segment_offset (f, it), end_offset))
- {
- s->length +=
- it->length - (ooo_segment_offset (f, it) - end_offset);
- ooo_segment_del (f, it - f->ooo_segments);
- }
- }