Files
net/exec/library.c
2026-01-06 15:51:03 -08:00

75 lines
1.9 KiB
C

#include <stddef.h>
#include <stdint.h>
#include <exec/mem.h>
#include <exec/list.h>
#include <exec/hal.h>
#include <exec/elf.h>
#include <exec/library.h>
struct List librarians;
struct List libraries;
struct Library *MakeLibrary(uintptr_t *vectors, void *structure, uintptr_t init, uint32_t dataSize) {
return NULL;
}
static struct Library *ExistingLibrarianFind(const char *name) {
return (struct Library *)FindNode(&libraries, name);
}
static struct Library *RomLibrarianFind(const char *name) {
void *rom = HalFindROM(name);
if (rom == NULL) {
return NULL;
}
struct Library *lib = ElfLoad(rom);
return lib;
}
static struct Librarian existing_librarian = {
.node.priority = 127,
.find_library = &ExistingLibrarianFind
};
static struct Librarian rom_librarian = {
.node.priority = -30,
.find_library = &RomLibrarianFind
};
void LibrariesInit(void) {
NewList(&librarians, LP_BLOCK);
NewList(&libraries, LP_BLOCK);
AddLibrarian(&existing_librarian);
AddLibrarian(&rom_librarian);
}
void AddLibrary(struct Library *library) {
Enqueue(&libraries, &library->node);
}
void AddLibrarian(struct Librarian *librarian) {
Enqueue(&librarians, &librarian->node);
}
void NewLibrarian(struct Librarian *librarian, struct Library *(*f)(const char *name), int8_t pri) {
librarian->find_library = f;
librarian->node.priority = pri;
}
struct Librarian *CreateLibrarian(struct Library *(*f)(const char *name), int8_t pri) {
struct Librarian *librarian = AllocMem(sizeof(struct Librarian));
if (librarian) {
NewLibrarian(librarian, f, pri);
return librarian;
}
return NULL;
}
struct Library *OpenLibrary(const char *name) {
struct Library *lib;
for (struct Node *n = libraries.head; n != &libraries.tail; n = n->next) {
lib = ((struct Librarian *)n)->find_library(name);
if (lib) return lib;
}
return NULL;
}