diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/codegen/codegen_decl.c | 3 | ||||
| -rw-r--r-- | src/main.c | 17 | ||||
| -rw-r--r-- | src/parser/parser_stmt.c | 16 | ||||
| -rw-r--r-- | src/parser/parser_utils.c | 35 | ||||
| -rw-r--r-- | src/plugins/plugin_manager.c | 11 | ||||
| -rw-r--r-- | src/plugins/plugin_manager.h | 5 |
6 files changed, 60 insertions, 27 deletions
diff --git a/src/codegen/codegen_decl.c b/src/codegen/codegen_decl.c index 2dff0dd..026824e 100644 --- a/src/codegen/codegen_decl.c +++ b/src/codegen/codegen_decl.c @@ -738,7 +738,8 @@ void emit_impl_vtables(ParserContext *ctx, FILE *out) while (m) { const char *orig = parse_original_method_name(m->func.name); - fprintf(out, ".%s = (__typeof__(((%s_VTable*)0)->%s))%s_%s_%s", orig, trait, orig, strct, trait, orig); + fprintf(out, ".%s = (__typeof__(((%s_VTable*)0)->%s))%s_%s_%s", orig, trait, orig, + strct, trait, orig); if (m->next) { fprintf(out, ", "); @@ -125,7 +125,7 @@ int main(int argc, char **argv) { g_config.emit_c = 1; } - else if (strcmp(arg, "--version") == 0|| strcmp(arg, "-V") == 0) + else if (strcmp(arg, "--version") == 0 || strcmp(arg, "-V") == 0) { print_version(); return 0; @@ -228,21 +228,6 @@ int main(int argc, char **argv) // Scan for build directives (e.g. //> link: -lm) scan_build_directives(&ctx, src); - // Register built-in plugins - extern ZPlugin brainfuck_plugin; - extern ZPlugin befunge_plugin; - extern ZPlugin lisp_plugin; - extern ZPlugin forth_plugin; - extern ZPlugin regex_plugin; - extern ZPlugin sql_plugin; - - zptr_register_plugin(&brainfuck_plugin); - zptr_register_plugin(&befunge_plugin); - zptr_register_plugin(&lisp_plugin); - zptr_register_plugin(&forth_plugin); - zptr_register_plugin(®ex_plugin); - zptr_register_plugin(&sql_plugin); - Lexer l; lexer_init(&l, src); diff --git a/src/parser/parser_stmt.c b/src/parser/parser_stmt.c index 227b5aa..24dfa10 100644 --- a/src/parser/parser_stmt.c +++ b/src/parser/parser_stmt.c @@ -3551,6 +3551,22 @@ ASTNode *parse_import(ParserContext *ctx, Lexer *l) strncpy(plugin_name, plugin_tok.start + 1, name_len); plugin_name[name_len] = '\0'; + if (plugin_name[0] == '.' && + (plugin_name[1] == '/' || (plugin_name[1] == '.' && plugin_name[2] == '/'))) + { + char *current_dir = xstrdup(g_current_filename); + char *last_slash = strrchr(current_dir, '/'); + if (last_slash) + { + *last_slash = 0; + char resolved_path[1024]; + snprintf(resolved_path, sizeof(resolved_path), "%s/%s", current_dir, plugin_name); + free(plugin_name); + plugin_name = xstrdup(resolved_path); + } + free(current_dir); + } + // Check for optional "as alias" char *alias = NULL; Token as_tok = lexer_peek(l); diff --git a/src/parser/parser_utils.c b/src/parser/parser_utils.c index 490ea42..2e2fb5b 100644 --- a/src/parser/parser_utils.c +++ b/src/parser/parser_utils.c @@ -1,5 +1,6 @@ #include "../codegen/codegen.h" +#include "../plugins/plugin_manager.h" #include "parser.h" #include <ctype.h> #include <stdio.h> @@ -2581,8 +2582,40 @@ char *find_similar_symbol(ParserContext *ctx, const char *name) void register_plugin(ParserContext *ctx, const char *name, const char *alias) { + // Try to find existing (built-in) or already loaded plugin + ZPlugin *plugin = zptr_find_plugin(name); + + // If not found, try to load it dynamically + if (!plugin) + { + plugin = zptr_load_plugin(name); + + if (!plugin) + { + char path[1024]; + snprintf(path, sizeof(path), "%s.so", name); + plugin = zptr_load_plugin(path); + } + + if (!plugin && !strchr(name, '/')) + { + char path[1024]; + snprintf(path, sizeof(path), "./%s.so", name); + plugin = zptr_load_plugin(path); + } + } + + if (!plugin) + { + fprintf(stderr, + COLOR_RED "Error:" COLOR_RESET " Could not load plugin '%s'\n" + " Tried built-ins and dynamic loading (.so)\n", + name); + exit(1); + } + ImportedPlugin *p = xmalloc(sizeof(ImportedPlugin)); - p->name = xstrdup(name); + p->name = xstrdup(plugin->name); // Use the plugin's internal name p->alias = alias ? xstrdup(alias) : NULL; p->next = ctx->imported_plugins; ctx->imported_plugins = p; diff --git a/src/plugins/plugin_manager.c b/src/plugins/plugin_manager.c index 12c85cd..afca55e 100644 --- a/src/plugins/plugin_manager.c +++ b/src/plugins/plugin_manager.c @@ -39,13 +39,12 @@ void zptr_register_plugin(ZPlugin *plugin) head = node; } -int zptr_load_plugin(const char *path) +ZPlugin *zptr_load_plugin(const char *path) { void *handle = dlopen(path, RTLD_LAZY); if (!handle) { - fprintf(stderr, "Failed to load plugin '%s': %s\n", path, dlerror()); - return 0; + return NULL; } ZPluginInitFn init_fn = (ZPluginInitFn)dlsym(handle, "z_plugin_init"); @@ -53,7 +52,7 @@ int zptr_load_plugin(const char *path) { fprintf(stderr, "Plugin '%s' missing 'z_plugin_init' symbol\n", path); dlclose(handle); - return 0; + return NULL; } ZPlugin *plugin = init_fn(); @@ -61,7 +60,7 @@ int zptr_load_plugin(const char *path) { fprintf(stderr, "Plugin '%s' init returned NULL\n", path); dlclose(handle); - return 0; + return NULL; } // Register @@ -71,7 +70,7 @@ int zptr_load_plugin(const char *path) node->next = head; head = node; - return 1; + return plugin; } ZPlugin *zptr_find_plugin(const char *name) diff --git a/src/plugins/plugin_manager.h b/src/plugins/plugin_manager.h index a1e8ca6..9b35c2d 100644 --- a/src/plugins/plugin_manager.h +++ b/src/plugins/plugin_manager.h @@ -10,9 +10,8 @@ void zptr_plugin_mgr_init(void); void zptr_register_plugin(ZPlugin *plugin); // Load a plugin from a shared object file (.so). -// Returns 1 on success, 0 on failure. -// Yeah, for now, I'm sorry Windows guys. -int zptr_load_plugin(const char *path); +// Returns ZPlugin pointer on success, NULL on failure. +ZPlugin *zptr_load_plugin(const char *path); // Find a registered plugin by name. ZPlugin *zptr_find_plugin(const char *name); |
