summaryrefslogtreecommitdiffstats
path: root/lib/objdir.c
diff options
context:
space:
mode:
authorJon Santmyer <jon@jonsantmyer.com>2025-08-10 15:40:19 -0400
committerJon Santmyer <jon@jonsantmyer.com>2025-08-10 15:40:19 -0400
commitc4f8ef91f18d854a4ede7a94e95b2eab898d6963 (patch)
treec2772c4f380a684b6fa347f03b13f9476bf9500c /lib/objdir.c
parentb905869a35f062a4e5072f10bec3a2ba3db0e365 (diff)
downloadjove-kernel-c4f8ef91f18d854a4ede7a94e95b2eab898d6963.tar.gz
jove-kernel-c4f8ef91f18d854a4ede7a94e95b2eab898d6963.tar.bz2
jove-kernel-c4f8ef91f18d854a4ede7a94e95b2eab898d6963.zip
working usermode objdir iteration
Diffstat (limited to 'lib/objdir.c')
-rw-r--r--lib/objdir.c36
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;
+}