elua: new API elua_state_dirs_fill + utilize

This commit is contained in:
Daniel Kolesa 2015-04-10 11:42:09 +01:00 committed by Daniel Kolesa
parent c1cfcc35b9
commit 5f6109bc47
3 changed files with 76 additions and 52 deletions

View File

@ -288,8 +288,7 @@ elua_main(lua_State *L)
hasexec = EINA_FALSE;
Eina_List *largs = NULL, *l = NULL;
Arg_Data *data = NULL;
char *coredir = NULL, *moddir = NULL, *appsdir = NULL;
char coredirbuf[PATH_MAX], moddirbuf[PATH_MAX], appsdirbuf[PATH_MAX];
const char *coredir = NULL, *moddir = NULL, *appsdir = NULL;
char modfile[PATH_MAX];
int ch;
@ -306,29 +305,31 @@ elua_main(lua_State *L)
{
switch (ch)
{
case 'h':
elua_print_help(elua_progname, stdout);
return 0;
case 'C':
coredir = optarg;
case 'h':
elua_print_help(elua_progname, stdout);
return 0;
case 'C':
coredir = optarg;
break;
case 'M':
moddir = optarg;
break;
case 'A':
appsdir = optarg;
break;
case 'e':
case 'l':
case 'I':
{
Arg_Data *v = malloc(sizeof(Arg_Data));
v->type = (ch == 'e') ? ARG_CODE : ((ch == 'l')
? ARG_LIBRARY : ARG_LIBDIR);
v->value = optarg;
largs = eina_list_append(largs, v);
break;
case 'M':
moddir = optarg;
break;
case 'A':
appsdir = optarg;
break;
case 'e':
case 'l':
case 'I':
{
Arg_Data *v = malloc(sizeof(Arg_Data));
v->type = (ch == 'e') ? ARG_CODE : ((ch == 'l')
? ARG_LIBRARY : ARG_LIBDIR);
v->value = optarg;
largs = eina_list_append(largs, v);
break;
}
}
case 'E':
noenv = EINA_TRUE;
}
}
@ -347,35 +348,19 @@ elua_main(lua_State *L)
return 0;
}
if (!coredir)
{
if (noenv || !(coredir = getenv("ELUA_CORE_DIR")) || !coredir[0])
{
coredir = coredirbuf;
snprintf(coredirbuf, sizeof(coredirbuf), "%s/core",
eina_prefix_data_get(elua_prefix));
}
}
if (!moddir)
{
if (noenv || !(moddir = getenv("ELUA_MODULES_DIR")) || !moddir[0])
{
moddir = moddirbuf;
snprintf(moddirbuf, sizeof(moddirbuf), "%s/modules",
eina_prefix_data_get(elua_prefix));
}
}
if (!appsdir)
{
if (noenv || !(appsdir = getenv("ELUA_APPS_DIR")) || !appsdir[0])
{
appsdir = appsdirbuf;
snprintf(appsdirbuf, sizeof(appsdirbuf), "%s/apps",
eina_prefix_data_get(elua_prefix));
}
}
elua_state_dirs_set(es, coredir, moddir, appsdir);
elua_state_dirs_fill(es, noenv);
coredir = elua_state_core_dir_get(es);
moddir = elua_state_mod_dir_get(es);
appsdir = elua_state_apps_dir_get(es);
if (!coredir || !moddir || !appsdir)
{
ERR("could not set one or more script directories");
m->status = 1;
return 0;
}
snprintf(modfile, sizeof(modfile), "%s/module.lua", coredir);
if (elua_report_error(es, elua_progname, elua_io_loadfile(es, modfile)))

View File

@ -72,6 +72,7 @@ EAPI void elua_state_free(Elua_State *es);
EAPI void elua_state_dirs_set(Elua_State *es, const char *core,
const char *mods, const char *apps);
EAPI void elua_state_dirs_fill(Elua_State *es, Eina_Bool ignore_env);
EAPI Eina_Stringshare *elua_state_core_dir_get(const Elua_State *es);
EAPI Eina_Stringshare *elua_state_mod_dir_get(const Elua_State *es);

View File

@ -109,6 +109,44 @@ elua_state_dirs_set(Elua_State *es, const char *core, const char *mods,
if (apps) es->appsdir = eina_stringshare_add(apps);
}
EAPI void
elua_state_dirs_fill(Elua_State *es, Eina_Bool ignore_env)
{
const char *coredir = NULL, *moddir = NULL, *appsdir = NULL;
char coredirbuf[PATH_MAX], moddirbuf[PATH_MAX], appsdirbuf[PATH_MAX];
EINA_SAFETY_ON_NULL_RETURN(es);
if (!(coredir = es->coredir))
{
if (ignore_env || !(coredir = getenv("ELUA_CORE_DIR")) || !coredir[0])
{
coredir = coredirbuf;
snprintf(coredirbuf, sizeof(coredirbuf), "%s/core",
eina_prefix_data_get(_elua_pfx));
}
if (coredir) es->coredir = eina_stringshare_add(coredir);
}
if (!(moddir = es->moddir))
{
if (ignore_env || !(moddir = getenv("ELUA_MODULES_DIR")) || !moddir[0])
{
moddir = moddirbuf;
snprintf(moddirbuf, sizeof(moddirbuf), "%s/modules",
eina_prefix_data_get(_elua_pfx));
}
if (moddir) es->moddir = eina_stringshare_add(moddir);
}
if (!(appsdir = es->appsdir))
{
if (ignore_env || !(appsdir = getenv("ELUA_APPS_DIR")) || !appsdir[0])
{
appsdir = appsdirbuf;
snprintf(appsdirbuf, sizeof(appsdirbuf), "%s/apps",
eina_prefix_data_get(_elua_pfx));
}
if (appsdir) es->appsdir = eina_stringshare_add(appsdir);
}
}
EAPI Eina_Stringshare *
elua_state_core_dir_get(const Elua_State *es)
{