int main(int argc, char **argv) { winstart(); /* get dir of executable */ winpath(dir); /* get story file */ if (!winargs(argc, argv, buf)) winbrowsefile(buf); if (!strlen(buf)) return TRUE; /* run story file */ return rungame(dir, buf); }
static void mad_setenv (lua_State *L, int no_env) { char prog_name[PATH_MAX+1] = ""; char prog_path[PATH_MAX+1] = ""; char curr_path[PATH_MAX+1] = ""; char home_path[PATH_MAX+1] = ""; char nam[PATH_MAX+4+1], buf[PATH_MAX+4+1]; char *path, *p, nul = 0, psep = ':', dsep = '/'; /* get curr_path [=getenv(unix:"PWD" or win:"CD")+cannonize] */ if (!(path = getcwd(curr_path, sizeof curr_path))) *curr_path = nul; if (!path && !(path = getenv("PATH"))) path = &nul; /* retrieve separators */ p = strchr(path, '/'); if (!p) p = strchr(path, '\\'); if (p) dsep = *p, psep = *p == '\\' ? ';' : ':'; /* get home_path */ #if LUAJIT_OS == LUAJIT_OS_WINDOWS if ((path = getenv("HOMEDRIVE"))) strcpy(home_path, path); if ((path = getenv("HOMEPATH" ))) strcat(home_path, path); winpath(home_path); #else if ((path = getenv("HOME" ))) strcpy(home_path, path); #endif /* get prog_name */ strcpy(nam, progname); #if LUAJIT_OS == LUAJIT_OS_WINDOWS winexe(winpath(prog_path)); /* canonize */ #endif p = strrchr(nam, dsep); strcpy(prog_name, p ? p+1 : nam); /* get prog_path */ if (realpath(nam, prog_path)) goto found; /* absolute path */ if (snprintf(buf, sizeof buf, "%s%c%s", curr_path, dsep, nam) > 0 && realpath(buf, prog_path)) goto found; /* relative path */ if ((path = getenv("PATH")) && *path) { /* $PATH path */ for(;;) { p = strchr(path, psep); if (p) *p = nul; if (snprintf(buf, sizeof buf, "%s%c%s", path, dsep, prog_name) > 0 && realpath(buf, prog_path)) { if (p) *p = psep; goto found; } if (p) *p = psep, path = p+1; else break; } } *prog_path = nul; found: #if LUAJIT_OS == LUAJIT_OS_WINDOWS winexe(winpath(prog_path)); /* canonize */ #endif if ((p=strrchr(prog_path, dsep))) { *p = nul; if (p[1]) strcpy(prog_name, p+1); } /* add trailing dir separator */ if (*curr_path && (p=curr_path+strlen(curr_path))[-1] != dsep) p[0] = dsep, p[1] = nul; if (*home_path && (p=home_path+strlen(home_path))[-1] != dsep) p[0] = dsep, p[1] = nul; if (*prog_path && (p=prog_path+strlen(prog_path))[-1] != dsep) p[0] = dsep, p[1] = nul; buf[0] = dsep, buf[1] = nul; const char *dir_sep = buf; /* set global table '_M' */ enum { nitem = 8 }; const char *list[2][nitem] = { { "currpath", "homepath", "progpath", "progname", "dirsep", "version", "os", "arch" }, { curr_path , home_path , prog_path , prog_name , dir_sep , MAD_VERSION, LJ_OS_NAME, MKSTR(LJ_ARCH_BITS) } }; lua_createtable(L, 0, nitem); for (int i = 0; i < nitem; i++) { assert(list[0][i]); lua_pushstring(L, list[0][i]); assert(list[1][i]); lua_pushstring(L, list[1][i]); lua_rawset(L, -3); } lua_setglobal(L, "_M"); if (no_env) return; const char *mpath = getenv("MAD_PATH"), *cpath = getenv("MAD_CPATH"); const char *lpath = getenv("LUA_PATH"), *lcpath = getenv("LUA_CPATH"); int len, mlen, clen, marg, carg; if (mpath) marg = 0, mlen = strlen(mpath); else mpath = "./?.mad;./?.lua;" // CURR_PATH /* MAD modules (user's home) */ "%s.mad/?.mad;" // HOME_PATH (1) "%s.mad/?.lua;" // HOME_PATH (1) /* MAD modules (relative) */ "%s?.mad;" // MAD_PATH (1) "%s?.lua;" // MAD_PATH (1) #if LUAJIT_OS == LUAJIT_OS_WINDOWS /* MAD modules (relative) */ "%s../mad/?.mad;" // MAD_PATH (1) "%s../mad/?.lua;" // MAD_PATH (1) /* From Lua unofficial uFAQ (relative) */ "%s../Lua/5.1/?.lua;" // MAD_PATH (1) "%s../Lua/5.1/?/init.lua;" // MAD_PATH (1) "%s../Lua/5.1/lua/?.lua;" // MAD_PATH (1) "%s../Lua/5.1/lua/?/init.lua;" // MAD_PATH (1) /* From Lua unofficial uFAQ (absolute) */ "C:/Program Files/Lua/5.1/?.lua;" "C:/Program Files/Lua/5.1/?/init.lua;" "C:/Program Files/Lua/5.1/lua/?.lua;" "C:/Program Files/Lua/5.1/lua/?/init.lua;", marg = 4+6, #else /* MAD modules (relative) */ "%s../share/mad/?.mad;" // MAD_PATH (1) "%s../share/mad/?.lua;" // MAD_PATH (1) "%s../lib/mad/?.mad;" // MAD_PATH (1) "%s../lib/mad/?.lua;" // MAD_PATH (1) /* From Lua unofficial uFAQ (relative) */ "%s../share/lua/5.1/?.lua;" // MAD_PATH (1) "%s../share/lua/5.1/?/init.lua;" // MAD_PATH (1) "%s../lib/lua/5.1/?.lua;" // MAD_PATH (1) "%s../lib/lua/5.1/?/init.lua;" // MAD_PATH (1) /* From Lua unofficial uFAQ (/opt/local absolute) */ "/opt/local/share/lua/5.1/?.lua;" "/opt/local/share/lua/5.1/?/init.lua;" "/opt/local/lib/lua/5.1/?.lua;" "/opt/local/lib/lua/5.1/?/init.lua;" /* From Lua unofficial uFAQ (/usr/local absolute) */ "/usr/local/share/lua/5.1/?.lua;" "/usr/local/share/lua/5.1/?/init.lua;" "/usr/local/lib/lua/5.1/?.lua;" "/usr/local/lib/lua/5.1/?/init.lua;", marg = 4+8, #endif mlen = strlen(mpath)-(2*marg) + 2*strlen(home_path) + (marg-2)*strlen(prog_path); if (cpath) carg = 0, clen = strlen(cpath); else cpath = #if LUAJIT_OS == LUAJIT_OS_WINDOWS "./?.dll;./?.so;" // CURR_PATH /* MAD modules (user's home) */ "%s.mad/?.dll;" // HOME_PATH (1) "%s.mad/?.so;" // HOME_PATH (1) /* MAD modules (relative) */ "%s?.dll;" // MAD_PATH (1) "%s?.so;" // MAD_PATH (1) "%s../lib/mad/?.dll;" // MAD_PATH (1) "%s../lib/mad/?.so;" // MAD_PATH (1) /* From Lua unofficial uFAQ (relative) */ "%s../lib/lua/5.1/?.dll;" // MAD_PATH (1) "%s../lib/lua/5.1/?.so;" // MAD_PATH (1) "C:/Program Files/Lua/5.1/?.dll;" "C:/Program Files/Lua/5.1/?.so;" "C:/Program Files/Lua/5.1/clibs/?.dll;" "C:/Program Files/Lua/5.1/clibs/?.so;", carg = 8, #elif LUAJIT_OS == LUAJIT_OS_OSX "./?.dylib;./?.so;" // CURR_PATH /* MAD modules (user's home) */ "%s.mad/?.dylib;" // HOME_PATH (1) "%s.mad/?.so;" // HOME_PATH (1) /* MAD modules (relative) */ "%s?.dylib;" // MAD_PATH (1) "%s?.so;" // MAD_PATH (1) "%s../lib/mad/?.dylib;" // MAD_PATH (1) "%s../lib/mad/?.so;" // MAD_PATH (1) /* From Lua unofficial uFAQ (relative) */ "%s../lib/lua/5.1/?.dylib;" // MAD_PATH (1) "%s../lib/lua/5.1/?.so;" // MAD_PATH (1) /* From Lua unofficial uFAQ (/opt/local absolute) */ "/opt/local/lib/lua/5.1/?.dylib;" "/opt/local/lib/lua/5.1/?.so;" /* From Lua unofficial uFAQ (/usr/local absolute) */ "/usr/local/lib/lua/5.1/?.dylib;" "/usr/local/lib/lua/5.1/?.so;", carg = 8, #else "./?.so;" // CURR_PATH /* MAD modules (user's home) */ "%s.mad/?.so;" // HOME_PATH (1) /* MAD modules (relative) */ "%s?.so;" // MAD_PATH (1) "%s../lib/mad/?.so;" // MAD_PATH (1) /* From Lua unofficial uFAQ (relative) */ "%s../lib/lua/5.1/?.so;" // MAD_PATH (1) /* From Lua unofficial uFAQ (/opt/local absolute) */ "/opt/local/lib/lua/5.1/?.so;" /* From Lua unofficial uFAQ (/usr/local absolute) */ "/usr/local/lib/lua/5.1/?.so;", carg = 4, #endif clen = strlen(cpath)-(2*carg) + (carg/4)*strlen(home_path) + (carg-carg/4)*strlen(prog_path); /* LUA_PATH = $MAD_PATH;$LUA_PATH */ char env[(mlen>clen?mlen:clen) + strlen(lpath ? lpath : "") + 1]; ensure(marg == 10 || marg == 12, "invalid number of path argument"); len = snprintf(env, sizeof env, mpath, /* next args discarded without %s */ home_path, home_path, prog_path, prog_path, prog_path, prog_path, prog_path, prog_path, prog_path, prog_path, prog_path, prog_path); if (lpath) strcat(env, lpath); else if (len>0) env[len-1] = nul; #if LUAJIT_OS == LUAJIT_OS_WINDOWS winpath(env); /* canonize */ #endif setenv("LUA_PATH", env, 1); /* LUA_CPATH = $MAD_CPATH;$LUA_CPATH */ ensure(carg == 4 || carg == 8, "invalid number of path argument"); if (carg == 4) len = snprintf(env, sizeof env, cpath, /* next args discarded without %s */ home_path, prog_path, prog_path, prog_path); else len = snprintf(env, sizeof env, cpath, /* next args discarded without %s */ home_path, home_path, prog_path, prog_path, prog_path, prog_path, prog_path, prog_path); if (lcpath) strcat(env, lcpath); else if (len>0) env[len-1] = nul; #if LUAJIT_OS == LUAJIT_OS_WINDOWS winpath(env); /* canonize */ #endif setenv("LUA_CPATH", env, 1); }