#include #include #include #include #include #include #include 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; }