From 0bd7b99fbf813415b9a0217eaa2a4e8f6f74e1ea Mon Sep 17 00:00:00 2001 From: Zuhaitz Méndez Fernández de Aránguiz Date: Sun, 25 Jan 2026 13:44:24 +0000 Subject: Fix for #111 --- src/parser/parser_decl.c | 30 ++++++++++++++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) (limited to 'src/parser/parser_decl.c') diff --git a/src/parser/parser_decl.c b/src/parser/parser_decl.c index bd56350..5d5af1e 100644 --- a/src/parser/parser_decl.c +++ b/src/parser/parser_decl.c @@ -207,17 +207,43 @@ char *patch_self_args(const char *args, const char *struct_name) { return NULL; } - char *new_args = xmalloc(strlen(args) + strlen(struct_name) + 10); + + // Sanitize struct name for C usage (Vec -> Vec_T) + char *safe_name = xmalloc(strlen(struct_name) + 1); + int j = 0; + for (int i = 0; struct_name[i]; i++) + { + if (struct_name[i] == '<') + { + safe_name[j++] = '_'; + } + else if (struct_name[i] == '>') + { + // skip + } + else if (struct_name[i] == ' ') + { + // skip + } + else + { + safe_name[j++] = struct_name[i]; + } + } + safe_name[j] = 0; + + char *new_args = xmalloc(strlen(args) + strlen(safe_name) + 10); // Check if it starts with "void* self" if (strncmp(args, "void* self", 10) == 0) { - sprintf(new_args, "%s* self%s", struct_name, args + 10); + sprintf(new_args, "%s* self%s", safe_name, args + 10); } else { strcpy(new_args, args); } + free(safe_name); return new_args; } // Helper for Value-Returning Defer -- cgit v1.2.3