60 lines
1.1 KiB
C
60 lines
1.1 KiB
C
#include <kernel/iovec.h>
|
|
#include <kernel/libc/string.h>
|
|
#include <kernel/util.h>
|
|
|
|
void iovec_iterator_begin(
|
|
struct iovec_iterator *it,
|
|
const struct iovec *vecs,
|
|
size_t nr_vecs)
|
|
{
|
|
memset(it, 0x0, sizeof *it);
|
|
it->it_vecs = vecs;
|
|
it->it_nr_vecs = nr_vecs;
|
|
|
|
while (it->it_vec_ptr < nr_vecs) {
|
|
if (vecs[it->it_vec_ptr].io_len > 0) {
|
|
break;
|
|
}
|
|
|
|
it->it_vec_ptr++;
|
|
}
|
|
|
|
if (it->it_vec_ptr >= nr_vecs) {
|
|
return;
|
|
}
|
|
|
|
it->it_base = vecs[it->it_vec_ptr].io_base;
|
|
it->it_len = vecs[it->it_vec_ptr].io_len;
|
|
}
|
|
|
|
void iovec_iterator_seek(struct iovec_iterator *it, size_t nr_bytes)
|
|
{
|
|
while (nr_bytes > 0) {
|
|
size_t to_seek = MIN(nr_bytes, it->it_len);
|
|
|
|
if (to_seek < it->it_len) {
|
|
it->it_len -= to_seek;
|
|
it->it_base += to_seek;
|
|
break;
|
|
}
|
|
|
|
nr_bytes -= to_seek;
|
|
|
|
it->it_vec_ptr++;
|
|
while (it->it_vec_ptr < it->it_nr_vecs) {
|
|
if (it->it_vecs[it->it_vec_ptr].io_len > 0) {
|
|
break;
|
|
}
|
|
|
|
it->it_vec_ptr++;
|
|
}
|
|
|
|
if (it->it_vec_ptr >= it->it_nr_vecs) {
|
|
return;
|
|
}
|
|
|
|
it->it_base = it->it_vecs[it->it_vec_ptr].io_base;
|
|
it->it_len = it->it_vecs[it->it_vec_ptr].io_len;
|
|
}
|
|
}
|