diff options
Diffstat (limited to 'lib/objdir.c')
-rw-r--r-- | lib/objdir.c | 36 |
1 files changed, 28 insertions, 8 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; +} |