75 lines
1.9 KiB
C
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;
|
|
} |