#include <klibc/strfmt.h>
#include <klibc/string.h>
-#include <sys/mm/pagetable.h>
+#include <asm/pagetable.h>
#define TWIMAP_BUFFER_SIZE PAGE_SIZE
twimap_read(struct twimap* map, void* buffer, size_t len, size_t fpos)
{
map->buffer = valloc(TWIMAP_BUFFER_SIZE);
+ map->size_acc = 0;
+
map->reset(map);
// FIXME what if TWIMAP_BUFFER_SIZE is not big enough?
- size_t pos = 0;
- do {
+ size_t pos = map->size_acc;
+ while (pos <= fpos) {
map->size_acc = 0;
map->read(map);
pos += map->size_acc;
- } while (pos <= fpos && map->go_next(map));
+
+ if (!map->go_next(map)) {
+ break;
+ }
+ }
if (pos <= fpos) {
vfree(map->buffer);
size_t acc_size = MIN(len, map->size_acc - (pos - fpos)), rdlen = acc_size;
memcpy(buffer, map->buffer + (pos - fpos), acc_size);
- while (acc_size < len && map->go_next(map)) {
+ while (acc_size < len) {
map->size_acc = 0;
map->read(map);
rdlen = MIN(len - acc_size, map->size_acc);
memcpy(buffer + acc_size, map->buffer, rdlen);
acc_size += rdlen;
+
+ if (!map->go_next(map)) {
+ break;
+ }
}
if (acc_size <= len - 1) {