diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/objdir.c | 36 | ||||
-rw-r--r-- | lib/print.c | 2 | ||||
-rw-r--r-- | lib/printpath.c | 9 |
3 files changed, 38 insertions, 9 deletions
diff --git a/lib/objdir.c b/lib/objdir.c index 665da4c..e264e5d 100644 --- a/lib/objdir.c +++ b/lib/objdir.c @@ -1,15 +1,35 @@ #include "object.h" +#include <stddef.h> -objdir_entry_t* -objdir_seek(objdir_t *dir, uintmax_t index) +static objdir_entry_t* +s_objdir_seek_rec(objdir_t *lastdir, objdir_t *dir, uint8_t *path, size_t pathw) { - uint8_t tli = index & 0xFF; - if(tli == 0) return &dir->self; + uint8_t tli = *path; + if(tli == 0 || pathw == 0) { + if(lastdir == NULL) return &dir->self; + return &lastdir->entries[path[-1]]; + } objdir_entry_t *entry = &dir->entries[tli]; - if(entry->type == KO_OBJECT_DIRECTORY) { - if(tli == index) return entry; - return objdir_seek((objdir_t*)entry->data, index >> 8); - } + if(entry->type == KO_OBJECT_DIRECTORY) + return s_objdir_seek_rec(dir, (objdir_t*)entry->data, ++path, pathw - 1); return entry; } + +objdir_entry_t* +objdir_seek(objdir_t *dir, uint8_t *path, size_t pathw) +{ + return s_objdir_seek_rec(NULL, dir, path, pathw); +} + +unsigned long +objdir_pathw(objdir_t *dir, uint8_t *path) +{ + size_t w = 0; + for(; path[w]; w++) { + uint8_t ei = path[w]; + if(dir->entries[ei].type != KO_OBJECT_DIRECTORY) return w + 1; + dir = (objdir_t*)(dir->entries[ei].data); + } + return w + 1; +} diff --git a/lib/print.c b/lib/print.c index 45c7671..a53ab4f 100644 --- a/lib/print.c +++ b/lib/print.c @@ -44,7 +44,7 @@ int kvprintf(const char *fmt, va_list ap) kvsnprintf(buffer, size, fmt, ap_dup); #ifdef ENABLE_UART - uart_write(&_initDirectory, _initData.log_object, buffer, size - 1); + uart_write(&_initDirectory, &_initData.log_object, buffer, size - 1); #endif return size; } diff --git a/lib/printpath.c b/lib/printpath.c new file mode 100644 index 0000000..5235572 --- /dev/null +++ b/lib/printpath.c @@ -0,0 +1,9 @@ +#include "print.h" +#include "object.h" + +void +kprint_objpath(path_byte_t *path, int len) +{ + kprintf("%x", *path); + for(int i = 1; i < len; i++) kprintf(":%x", path[i]); +} |