diff --git a/lua/loadlib.c b/lua/loadlib.c index 6f9fa37..cb28045 100644 --- a/lua/loadlib.c +++ b/lua/loadlib.c @@ -653,9 +653,119 @@ static void findloader (lua_State *L, const char *name) { } } +// [RZC 12/03/2026] ================================== +// Soport per a rutes relatives i absolutes +// +static void resolve_module_name(lua_State *L, char *out, size_t outsz) { + const char *req = luaL_checkstring(L, 1); + + // 1. RUTA ABSOLUTA: empieza por ':' + if (req[0] == ':') { + strncpy(out, req + 1, outsz - 1); + out[outsz - 1] = '\0'; + return; + } + + // 2. Obtener módulo llamador + lua_Debug ar; + if (!lua_getstack(L, 1, &ar)) { + // No hay llamador → usar nombre tal cual + strncpy(out, req, outsz - 1); + out[outsz - 1] = '\0'; + return; + } + + lua_getinfo(L, "S", &ar); + + // ar.source contiene algo como "@ia.test" o "@main" + const char *src = ar.source; + if (!src) { + // No viene de archivo → usar nombre tal cual + strncpy(out, req, outsz - 1); + out[outsz - 1] = '\0'; + return; + } + + // Quitar '@' + //src++; + + // 3. Extraer directorio del módulo llamador + // Ej: "ia.tools.other" → "ia.tools" + char caller[256]; + strncpy(caller, src, sizeof(caller) - 1); + caller[sizeof(caller) - 1] = '\0'; + + char *lastdot = strrchr(caller, '.'); + if (lastdot) + *lastdot = '\0'; // dejar solo el directorio + else + caller[0] = '\0'; // está en la raíz + + // 4. RUTA RELATIVA HACIA ARRIBA: empieza por ".." + if (req[0] == '.' && req[1] == '.') { + // Contar cuántos '.' consecutivos hay + int up = 0; + while (req[up] == '.') + up++; + + // up = número de puntos → niveles a subir + // Ej: "..test" → up=2 → subir 1 nivel + // "...main" → up=3 → subir 2 niveles + + int levels = up - 1; + + // Copiar caller a buffer temporal + char temp[256]; + strncpy(temp, caller, sizeof(temp) - 1); + temp[sizeof(temp) - 1] = '\0'; + + // Subir niveles + for (int i = 0; i < levels; i++) { + char *p = strrchr(temp, '.'); + if (p) + *p = '\0'; + else { + temp[0] = '\0'; + break; + } + } + + // Concatenar lo que queda después de los puntos + const char *rest = req + up; + + if (temp[0] == '\0') { + // Hemos llegado a la raíz + strncpy(out, rest, outsz - 1); + } else { + snprintf(out, outsz, "%s.%s", temp, rest); + } + + out[outsz - 1] = '\0'; + return; + } + + // 5. RUTA RELATIVA NORMAL (no empieza por ':' ni por '..') + if (caller[0] == '\0') { + // Estamos en la raíz + strncpy(out, req, outsz - 1); + } else { + snprintf(out, outsz, "%s.%s", caller, req); + } + + out[outsz - 1] = '\0'; +} +// =================================================== static int ll_require (lua_State *L) { - const char *name = luaL_checkstring(L, 1); + // [RZC 12/03/2026] ================================== + // Soport per a rutes relatives i absolutes + // + //const char *name = luaL_checkstring(L, 1); + char resolved[256]; + resolve_module_name(L, resolved, sizeof(resolved)); + const char *name = resolved; + // =================================================== + lua_settop(L, 1); /* LOADED table will be at index 2 */ lua_getfield(L, LUA_REGISTRYINDEX, LUA_LOADED_TABLE); lua_getfield(L, 2, name); /* LOADED[name] */ diff --git a/version.h b/version.h index 24a390b..851dd0e 100644 --- a/version.h +++ b/version.h @@ -1,3 +1,3 @@ #pragma once -#define MINI_VERSION "1.4" +#define MINI_VERSION "1.4.1"