2 #include <lunaix/fs/twimap.h>
3 #include <lunaix/mm/valloc.h>
4 #include <lunaix/spike.h>
6 #include <klibc/strfmt.h>
7 #include <klibc/string.h>
9 #include <asm/pagetable.h>
11 #define TWIMAP_BUFFER_SIZE PAGE_SIZE
14 __twimap_default_reset(struct twimap* map)
20 __twimap_default_gonext(struct twimap* map)
26 __twimap_file_read(struct v_inode* inode, void* buf, size_t len, size_t fpos)
28 struct twimap* map = (struct twimap*)(inode->data);
29 return twimap_read(map, buf, len, fpos);
33 __twimap_file_read_page(struct v_inode* inode, void* buf, size_t fpos)
35 return __twimap_file_read(inode, buf, PAGE_SIZE, fpos);
39 twimap_read(struct twimap* map, void* buffer, size_t len, size_t fpos)
41 map->buffer = valloc(TWIMAP_BUFFER_SIZE);
46 // FIXME what if TWIMAP_BUFFER_SIZE is not big enough?
48 size_t pos = map->size_acc;
54 if (!map->go_next(map)) {
68 size_t acc_size = MIN(len, map->size_acc - (pos - fpos)), rdlen = acc_size;
69 memcpy(buffer, map->buffer + (pos - fpos), acc_size);
71 while (acc_size < len) {
74 rdlen = MIN(len - acc_size, map->size_acc);
75 memcpy(buffer + acc_size, map->buffer, rdlen);
78 if (!map->go_next(map)) {
83 if (acc_size <= len - 1) {
85 *(char*)(buffer + acc_size + 1) = 0;
93 twimap_printf(struct twimap* mapping, const char* fmt, ...)
98 char* buf = mapping->buffer + mapping->size_acc;
100 mapping->size_acc += ksnprintfv(buf, fmt, TWIMAP_BUFFER_SIZE, args) - 1;
106 twimap_memcpy(struct twimap* mapping, const void* src, const size_t len)
108 mapping->size_acc = MIN(TWIMAP_BUFFER_SIZE, len);
109 memcpy(mapping->buffer, src, mapping->size_acc);
111 return mapping->size_acc;
115 twimap_memappend(struct twimap* mapping, const void* src, const size_t len)
117 size_t cpy_len = MIN(TWIMAP_BUFFER_SIZE - mapping->size_acc, len);
118 memcpy(mapping->buffer + mapping->size_acc, src, cpy_len);
119 mapping->size_acc += cpy_len;
125 twimap_create(void* data)
127 struct twimap* map = vzalloc(sizeof(struct twimap));
128 map->reset = __twimap_default_reset;
129 map->go_next = __twimap_default_gonext;
135 struct v_file_ops twimap_file_ops = { .close = default_file_close,
136 .read = __twimap_file_read,
137 .read_page = __twimap_file_read_page,
138 .readdir = default_file_readdir,
139 .seek = default_file_seek,
140 .write = default_file_write };