summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorZuhaitz Méndez Fernández de Aránguiz <zuhaitz@debian>2026-01-15 12:11:02 +0000
committerZuhaitz Méndez Fernández de Aránguiz <zuhaitz@debian>2026-01-15 12:11:02 +0000
commit7411d71fbde5d652f04cc8851ed93bd15513968b (patch)
tree2fe1e8fa9a604dc558a0528d8f465bef8b597aab /src
parent1925cf6f1a8c134cbfae728023ac325f03e4c14f (diff)
Some docs for plugins, among other things.
Diffstat (limited to 'src')
-rw-r--r--src/codegen/codegen_decl.c3
-rw-r--r--src/main.c17
-rw-r--r--src/parser/parser_stmt.c16
-rw-r--r--src/parser/parser_utils.c35
-rw-r--r--src/plugins/plugin_manager.c11
-rw-r--r--src/plugins/plugin_manager.h5
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, ", ");
diff --git a/src/main.c b/src/main.c
index 49691ea..2c33a6b 100644
--- a/src/main.c
+++ b/src/main.c
@@ -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(&regex_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);