1 #include <lunaix/fs/twifs.h>
2 #include <lunaix/mm/valloc.h>
4 #include <klibc/stdio.h>
5 #include <klibc/string.h>
7 #define TWIMAP_BUFFER_SIZE 1024
10 __twimap_default_reset(struct twimap* map)
16 __twimap_default_gonext(struct twimap* map)
22 __twimap_read(struct v_inode* inode, void* buffer, size_t len, size_t fpos)
24 struct twimap* map = twinode_getdata(inode, struct twimap*);
25 map->buffer = valloc(TWIMAP_BUFFER_SIZE);
28 // FIXME what if TWIMAP_BUFFER_SIZE is not big enough?
35 } while (pos < fpos && map->go_next(map));
46 size_t acc_size = MIN(len, map->size_acc - (pos - fpos)), rdlen = acc_size;
47 memcpy(buffer, map->buffer + (pos - fpos), acc_size);
49 while (acc_size < len && map->go_next(map)) {
52 rdlen = MIN(len - acc_size, map->size_acc);
53 memcpy(buffer + acc_size, map->buffer, rdlen);
62 twifs_mapping(struct twifs_node* parent, void* data, const char* fmt, ...)
67 struct twimap* map = vzalloc(sizeof(struct twimap));
68 struct twifs_node* node = twifs_file_node_vargs(parent, fmt, args);
69 node->ops.read = __twimap_read;
72 map->reset = __twimap_default_reset;
73 map->go_next = __twimap_default_gonext;
80 twimap_printf(struct twimap* mapping, const char* fmt, ...)
85 char* buf = mapping->buffer + mapping->size_acc;
88 __ksprintf_internal(buf, fmt, TWIMAP_BUFFER_SIZE, args);
94 twimap_memcpy(struct twimap* mapping, const void* src, const size_t len)
96 mapping->size_acc = MIN(TWIMAP_BUFFER_SIZE, len);
97 memcpy(mapping->buffer, src, mapping->size_acc);
99 return mapping->size_acc;
103 twimap_memappend(struct twimap* mapping, const void* src, const size_t len)
105 size_t cpy_len = MIN(TWIMAP_BUFFER_SIZE - mapping->size_acc, len);
106 memcpy(mapping->buffer + mapping->size_acc, src, cpy_len);
107 mapping->size_acc += cpy_len;