| 898 | -------------------------------------------------------------------------*/ |
| 899 | |
| 900 | void |
| 901 | RangeTransform::transform_to_range() |
| 902 | { |
| 903 | IOBufferReader *reader = m_write_vio.get_reader(); |
| 904 | int64_t toskip, tosend, avail; |
| 905 | const int64_t *end, *start; |
| 906 | int64_t prev_end = 0; |
| 907 | int64_t *done_byte; |
| 908 | |
| 909 | if (m_current_range >= m_num_range_fields) { |
| 910 | return; |
| 911 | } |
| 912 | |
| 913 | end = &m_ranges[m_current_range]._end; |
| 914 | done_byte = &m_ranges[m_current_range]._done_byte; |
| 915 | start = &m_ranges[m_current_range]._start; |
| 916 | avail = reader->read_avail(); |
| 917 | |
| 918 | while (true) { |
| 919 | if (*done_byte < (*start - 1)) { |
| 920 | toskip = *start - *done_byte - 1; |
| 921 | |
| 922 | if (toskip > avail) { |
| 923 | toskip = avail; |
| 924 | } |
| 925 | |
| 926 | if (toskip > 0) { |
| 927 | reader->consume(toskip); |
| 928 | *done_byte += toskip; |
| 929 | avail = reader->read_avail(); |
| 930 | } |
| 931 | } |
| 932 | |
| 933 | if (avail > 0) { |
| 934 | tosend = *end - *done_byte; |
| 935 | |
| 936 | if (tosend > avail) { |
| 937 | tosend = avail; |
| 938 | } |
| 939 | |
| 940 | m_output_buf->write(reader, tosend); |
| 941 | reader->consume(tosend); |
| 942 | |
| 943 | m_done += tosend; |
| 944 | *done_byte += tosend; |
| 945 | } |
| 946 | |
| 947 | if (*done_byte == *end) { |
| 948 | prev_end = *end; |
| 949 | } |
| 950 | |
| 951 | // move to next Range if done one |
| 952 | // ignore bad Range: _done_byte -1, _end -1 |
| 953 | while (*done_byte == *end) { |
| 954 | m_current_range++; |
| 955 | |
| 956 | if (m_current_range == m_num_range_fields) { |
| 957 | if (m_num_range_fields > 1) { |
nothing calls this directly
no test coverage detected