Example #1
0
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);
}