From 5d69b71cf905051b8a2b81685f4d6104e1b13e2b Mon Sep 17 00:00:00 2001 From: Yves Rizoud Date: Wed, 15 Aug 2012 17:15:49 +0000 Subject: [PATCH] Issue 501: Lua function run() now converts Unix 'parent directory' to AROS format. To be tested/reviewed on the actual platform! Function also converts antislashes to slashes on all platforms. git-svn-id: svn://pulkomandy.tk/GrafX2/trunk@1991 416bcca6-2ee7-4201-b75f-2eb2f807beb1 --- src/factory.c | 62 ++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 52 insertions(+), 10 deletions(-) diff --git a/src/factory.c b/src/factory.c index 53606bf5..c972ab33 100644 --- a/src/factory.c +++ b/src/factory.c @@ -1391,8 +1391,8 @@ int L_Run(lua_State* L) // these are only needed before running script // (which may call L_Run() again recursively) // so it's safe to make them static to spare a few hundred bytes. - static char directory[MAX_PATH_CHARACTERS]; - static char filename[MAX_PATH_CHARACTERS]; + static char full_path[MAX_PATH_CHARACTERS]; + static char path_element[MAX_PATH_CHARACTERS]; static int nested_calls = 0; int nb_args=lua_gettop(L); @@ -1409,21 +1409,63 @@ int L_Run(lua_State* L) // store the current directory (on the stack) getcwd(saved_directory,MAX_PATH_CHARACTERS); - Extract_path(directory, script_arg); - if (directory[0]!='\0') + #if defined (__AROS__) + // Convert path written on Linux/Windows norms to AROS norms : + // Each element like ../ and ..\ is replaced by / + // Each path separator \ is replaced by / { - if (!Directory_exists(directory)) - return luaL_error(L, "run: directory of script doesn't exist"); - chdir(directory); + const char *src = script_arg; + char *dst = full_path; + char c; + do + { + while (src[0]=='.' && src[1]=='.' && (src[2]=='/' || src[2]=='\\')) + { + *dst='/'; + dst++; + src+=3; + } + // copy until / or \ or NUL included + do + { + c=*src; + *dst=c=='\\' ? '/' : c; // Replace \ by / anyway + src++; + dst++; + } while (c != '\0' && c != '/' && c != '\\'); + } while (c!='\0'); } - Extract_filename(filename, script_arg); - if (luaL_loadfile(L,filename) != 0) + #else + { + // Convert any number of '\' in the path to '/' + // It is not useful on Windows, but does no harm (both path separators work) + // On Linux/Unix, this ensures that scripts written and tested on Windows + // work similarly. + char *pos; + strcpy(full_path, script_arg); + pos=strchr(full_path, '\\'); + while (pos!=NULL) + { + *pos='/'; + pos=strchr(full_path, '\\'); + } + } + #endif + Extract_path(path_element, full_path); + if (path_element[0]!='\0') + { + if (!Directory_exists(path_element)) + return luaL_error(L, "run: directory of script doesn't exist"); + chdir(path_element); + } + Extract_filename(path_element, full_path); + if (luaL_loadfile(L,path_element) != 0) { nb_args= lua_gettop(L); if (nb_args>0 && (message = lua_tostring(L, nb_args))!=NULL) return luaL_error(L, message); else - return luaL_error(L, "run: Unknown error loading script %s", filename); + return luaL_error(L, "run: Unknown error loading script %s", path_element); } else if (lua_pcall(L, 0, 0, 0) != 0) {