VERSIÓ 1.4.1
- [NEW] Ara require soporta rutes relatives (he tingut que fer un parxe al codi de Lua)
This commit is contained in:
112
lua/loadlib.c
112
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] */
|
||||
|
||||
Reference in New Issue
Block a user