lua: Don't used mixed declarations
This requires a lot more cleanup
This commit is contained in:
parent
2e478f1b5a
commit
2e2b895ebe
@ -96,24 +96,31 @@ static void check_deferred(script_info *info);
|
||||
|
||||
static inline script_info *get_info(lua_State *L)
|
||||
{
|
||||
script_info *info;
|
||||
|
||||
lua_getfield(L, LUA_REGISTRYINDEX, registry_field);
|
||||
script_info *info = lua_touserdata(L, -1);
|
||||
info = lua_touserdata(L, -1);
|
||||
lua_pop(L, 1);
|
||||
|
||||
return info;
|
||||
}
|
||||
|
||||
static int api_hexchat_register(lua_State *L)
|
||||
{
|
||||
char const *name, *version, *description;
|
||||
script_info *info = get_info(L);
|
||||
if(info->name)
|
||||
return luaL_error(L, "script is already registered as '%s'", info->name);
|
||||
char const *name = luaL_checkstring(L, 1);
|
||||
char const *version = luaL_checkstring(L, 2);
|
||||
char const *description = luaL_checkstring(L, 3);
|
||||
|
||||
name = luaL_checkstring(L, 1);
|
||||
version = luaL_checkstring(L, 2);
|
||||
description = luaL_checkstring(L, 3);
|
||||
|
||||
info->name = g_strdup(name);
|
||||
info->description = g_strdup(description);
|
||||
info->version = g_strdup(version);
|
||||
info->handle = hexchat_plugingui_add(ph, info->filename, info->name, info->description, info->version, NULL);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -149,10 +156,9 @@ static int tostring(lua_State *L, int n)
|
||||
|
||||
static int api_hexchat_print(lua_State *L)
|
||||
{
|
||||
int args = lua_gettop(L);
|
||||
int i, args = lua_gettop(L);
|
||||
luaL_Buffer b;
|
||||
luaL_buffinit(L, &b);
|
||||
int i;
|
||||
for(i = 1; i <= args; i++)
|
||||
{
|
||||
if(i != 1)
|
||||
@ -180,14 +186,19 @@ static int api_hexchat_emit_print_attrs(lua_State *L)
|
||||
|
||||
static int api_hexchat_send_modes(lua_State *L)
|
||||
{
|
||||
size_t i, n;
|
||||
int modes;
|
||||
char const *mode;
|
||||
char const **targets;
|
||||
|
||||
luaL_checktype(L, 1, LUA_TTABLE);
|
||||
size_t n = lua_rawlen(L, 1);
|
||||
char const *mode = luaL_checkstring(L, 2);
|
||||
n = lua_rawlen(L, 1);
|
||||
mode = luaL_checkstring(L, 2);
|
||||
if(strlen(mode) != 2)
|
||||
return luaL_argerror(L, 2, "expected sign followed by a mode letter");
|
||||
int modes = luaL_optinteger(L, 3, 0);
|
||||
char const **targets = malloc(n * sizeof(char const *));
|
||||
size_t i;
|
||||
modes = luaL_optinteger(L, 3, 0);
|
||||
targets = malloc(n * sizeof(char const *));
|
||||
|
||||
for(i = 0; i < n; i++)
|
||||
{
|
||||
lua_rawgeti(L, 1, i + 1);
|
||||
@ -213,11 +224,15 @@ static int api_hexchat_nickcmp(lua_State *L)
|
||||
static int api_hexchat_strip(lua_State *L)
|
||||
{
|
||||
size_t len;
|
||||
char const *text;
|
||||
gboolean leave_colors, leave_attrs;
|
||||
char *result;
|
||||
|
||||
luaL_checktype(L, 1, LUA_TSTRING);
|
||||
char const *text = lua_tolstring(L, 1, &len);
|
||||
int leave_colors = lua_toboolean(L, 2);
|
||||
int leave_attrs = lua_toboolean(L, 3);
|
||||
char *result = hexchat_strip(ph, text, len, (leave_colors ? 0 : 1) | (leave_attrs ? 0 : 2));
|
||||
text = lua_tolstring(L, 1, &len);
|
||||
leave_colors = lua_toboolean(L, 2);
|
||||
leave_attrs = lua_toboolean(L, 3);
|
||||
result = hexchat_strip(ph, text, len, (leave_colors ? 0 : 1) | (leave_attrs ? 0 : 2));
|
||||
if(result)
|
||||
{
|
||||
lua_pushstring(L, result);
|
||||
@ -250,8 +265,8 @@ static int unregister_hook(hook_info *hook)
|
||||
for(i = 0; i < info->num_hooks; i++)
|
||||
if(info->hooks[i] == hook)
|
||||
{
|
||||
free_hook(hook);
|
||||
size_t j;
|
||||
free_hook(hook);
|
||||
for(j = i; j < info->num_hooks - 1; j++)
|
||||
info->hooks[j] = info->hooks[j + 1];
|
||||
ARRAY_SHRINK(info->hooks, info->num_hooks);
|
||||
@ -260,8 +275,8 @@ static int unregister_hook(hook_info *hook)
|
||||
for(i = 0; i < info->num_unload_hooks; i++)
|
||||
if(info->unload_hooks[i] == hook)
|
||||
{
|
||||
free_hook(hook);
|
||||
size_t j;
|
||||
free_hook(hook);
|
||||
for(j = i; j < info->num_unload_hooks - 1; j++)
|
||||
info->unload_hooks[j] = info->unload_hooks[j + 1];
|
||||
ARRAY_SHRINK(info->unload_hooks, info->num_unload_hooks);
|
||||
@ -272,13 +287,14 @@ static int unregister_hook(hook_info *hook)
|
||||
|
||||
static int api_command_closure(char *word[], char *word_eol[], void *udata)
|
||||
{
|
||||
int base, i, ret;
|
||||
hook_info *info = udata;
|
||||
lua_State *L = info->state;
|
||||
script_info *script = get_info(L);
|
||||
|
||||
lua_rawgeti(L, LUA_REGISTRYINDEX, script->traceback);
|
||||
int base = lua_gettop(L);
|
||||
base = lua_gettop(L);
|
||||
lua_rawgeti(L, LUA_REGISTRYINDEX, info->ref);
|
||||
int i;
|
||||
lua_newtable(L);
|
||||
for(i = 1; i < 32 && *word_eol[i]; i++)
|
||||
{
|
||||
@ -300,7 +316,7 @@ static int api_command_closure(char *word[], char *word_eol[], void *udata)
|
||||
check_deferred(script);
|
||||
return HEXCHAT_EAT_NONE;
|
||||
}
|
||||
int ret = lua_tointeger(L, -1);
|
||||
ret = lua_tointeger(L, -1);
|
||||
lua_pop(L, 2);
|
||||
check_deferred(script);
|
||||
return ret;
|
||||
@ -308,16 +324,20 @@ static int api_command_closure(char *word[], char *word_eol[], void *udata)
|
||||
|
||||
static int api_hexchat_hook_command(lua_State *L)
|
||||
{
|
||||
char const *command = luaL_optstring(L, 1, "");
|
||||
hook_info *info, **u;
|
||||
char const *command, *help;
|
||||
int ref, pri;
|
||||
|
||||
command = luaL_optstring(L, 1, "");
|
||||
lua_pushvalue(L, 2);
|
||||
int ref = luaL_ref(L, LUA_REGISTRYINDEX);
|
||||
char const *help = luaL_optstring(L, 3, NULL);
|
||||
int pri = luaL_optinteger(L, 4, HEXCHAT_PRI_NORM);
|
||||
hook_info *info = malloc(sizeof(hook_info));
|
||||
ref = luaL_ref(L, LUA_REGISTRYINDEX);
|
||||
help = luaL_optstring(L, 3, NULL);
|
||||
pri = luaL_optinteger(L, 4, HEXCHAT_PRI_NORM);
|
||||
info = malloc(sizeof(hook_info));
|
||||
info->state = L;
|
||||
info->ref = ref;
|
||||
info->hook = hexchat_hook_command(ph, command, pri, api_command_closure, help, info);
|
||||
hook_info **u = lua_newuserdata(L, sizeof(hook_info *));
|
||||
u = lua_newuserdata(L, sizeof(hook_info *));
|
||||
*u = info;
|
||||
luaL_newmetatable(L, "hook");
|
||||
lua_setmetatable(L, -2);
|
||||
@ -330,10 +350,12 @@ static int api_print_closure(char *word[], void *udata)
|
||||
hook_info *info = udata;
|
||||
lua_State *L = info->state;
|
||||
script_info *script = get_info(L);
|
||||
int i, j, base, ret;
|
||||
|
||||
lua_rawgeti(L, LUA_REGISTRYINDEX, script->traceback);
|
||||
int base = lua_gettop(L);
|
||||
base = lua_gettop(L);
|
||||
lua_rawgeti(L, LUA_REGISTRYINDEX, info->ref);
|
||||
int i, j;
|
||||
|
||||
for(j = 31; j >= 1; j--)
|
||||
if(*word[j])
|
||||
break;
|
||||
@ -352,7 +374,7 @@ static int api_print_closure(char *word[], void *udata)
|
||||
check_deferred(script);
|
||||
return HEXCHAT_EAT_NONE;
|
||||
}
|
||||
int ret = lua_tointeger(L, -1);
|
||||
ret = lua_tointeger(L, -1);
|
||||
lua_pop(L, 2);
|
||||
check_deferred(script);
|
||||
return ret;
|
||||
@ -361,14 +383,17 @@ static int api_print_closure(char *word[], void *udata)
|
||||
static int api_hexchat_hook_print(lua_State *L)
|
||||
{
|
||||
char const *event = luaL_checkstring(L, 1);
|
||||
hook_info *info, **u;
|
||||
int ref, pri;
|
||||
|
||||
lua_pushvalue(L, 2);
|
||||
int ref = luaL_ref(L, LUA_REGISTRYINDEX);
|
||||
int pri = luaL_optinteger(L, 3, HEXCHAT_PRI_NORM);
|
||||
hook_info *info = malloc(sizeof(hook_info));
|
||||
ref = luaL_ref(L, LUA_REGISTRYINDEX);
|
||||
pri = luaL_optinteger(L, 3, HEXCHAT_PRI_NORM);
|
||||
info = malloc(sizeof(hook_info));
|
||||
info->state = L;
|
||||
info->ref = ref;
|
||||
info->hook = hexchat_hook_print(ph, event, pri, api_print_closure, info);
|
||||
hook_info **u = lua_newuserdata(L, sizeof(hook_info *));
|
||||
u = lua_newuserdata(L, sizeof(hook_info *));
|
||||
*u = info;
|
||||
luaL_newmetatable(L, "hook");
|
||||
lua_setmetatable(L, -2);
|
||||
@ -388,10 +413,12 @@ static int api_print_attrs_closure(char *word[], hexchat_event_attrs *attrs, voi
|
||||
hook_info *info = udata;
|
||||
lua_State *L = info->state;
|
||||
script_info *script = get_info(L);
|
||||
int base, i, j, ret;
|
||||
hexchat_event_attrs **u;
|
||||
|
||||
lua_rawgeti(L, LUA_REGISTRYINDEX, script->traceback);
|
||||
int base = lua_gettop(L);
|
||||
base = lua_gettop(L);
|
||||
lua_rawgeti(L, LUA_REGISTRYINDEX, info->ref);
|
||||
int i, j;
|
||||
for(j = 31; j >= 1; j--)
|
||||
if(*word[j])
|
||||
break;
|
||||
@ -401,7 +428,7 @@ static int api_print_attrs_closure(char *word[], hexchat_event_attrs *attrs, voi
|
||||
lua_pushstring(L, word[i]);
|
||||
lua_rawseti(L, -2, i);
|
||||
}
|
||||
hexchat_event_attrs **u = lua_newuserdata(L, sizeof(hexchat_event_attrs *));
|
||||
u = lua_newuserdata(L, sizeof(hexchat_event_attrs *));
|
||||
*u = event_attrs_copy(attrs);
|
||||
luaL_newmetatable(L, "attrs");
|
||||
lua_setmetatable(L, -2);
|
||||
@ -414,7 +441,7 @@ static int api_print_attrs_closure(char *word[], hexchat_event_attrs *attrs, voi
|
||||
check_deferred(script);
|
||||
return HEXCHAT_EAT_NONE;
|
||||
}
|
||||
int ret = lua_tointeger(L, -1);
|
||||
ret = lua_tointeger(L, -1);
|
||||
lua_pop(L, 2);
|
||||
check_deferred(script);
|
||||
return ret;
|
||||
@ -422,15 +449,18 @@ static int api_print_attrs_closure(char *word[], hexchat_event_attrs *attrs, voi
|
||||
|
||||
static int api_hexchat_hook_print_attrs(lua_State *L)
|
||||
{
|
||||
hook_info *info, **u;
|
||||
int ref, pri;
|
||||
char const *event = luaL_checkstring(L, 1);
|
||||
|
||||
lua_pushvalue(L, 2);
|
||||
int ref = luaL_ref(L, LUA_REGISTRYINDEX);
|
||||
int pri = luaL_optinteger(L, 3, HEXCHAT_PRI_NORM);
|
||||
hook_info *info = malloc(sizeof(hook_info));
|
||||
ref = luaL_ref(L, LUA_REGISTRYINDEX);
|
||||
pri = luaL_optinteger(L, 3, HEXCHAT_PRI_NORM);
|
||||
info = malloc(sizeof(hook_info));
|
||||
info->state = L;
|
||||
info->ref = ref;
|
||||
info->hook = hexchat_hook_print_attrs(ph, event, pri, api_print_attrs_closure, info);
|
||||
hook_info **u = lua_newuserdata(L, sizeof(hook_info *));
|
||||
u = lua_newuserdata(L, sizeof(hook_info *));
|
||||
*u = info;
|
||||
luaL_newmetatable(L, "hook");
|
||||
lua_setmetatable(L, -2);
|
||||
@ -443,10 +473,11 @@ static int api_server_closure(char *word[], char *word_eol[], void *udata)
|
||||
hook_info *info = udata;
|
||||
lua_State *L = info->state;
|
||||
script_info *script = get_info(L);
|
||||
int base, i, ret;
|
||||
|
||||
lua_rawgeti(L, LUA_REGISTRYINDEX, script->traceback);
|
||||
int base = lua_gettop(L);
|
||||
base = lua_gettop(L);
|
||||
lua_rawgeti(L, LUA_REGISTRYINDEX, info->ref);
|
||||
int i;
|
||||
lua_newtable(L);
|
||||
for(i = 1; i < 32 && *word_eol[i]; i++)
|
||||
{
|
||||
@ -468,7 +499,7 @@ static int api_server_closure(char *word[], char *word_eol[], void *udata)
|
||||
check_deferred(script);
|
||||
return HEXCHAT_EAT_NONE;
|
||||
}
|
||||
int ret = lua_tointeger(L, -1);
|
||||
ret = lua_tointeger(L, -1);
|
||||
lua_pop(L, 2);
|
||||
check_deferred(script);
|
||||
return ret;
|
||||
@ -477,14 +508,17 @@ static int api_server_closure(char *word[], char *word_eol[], void *udata)
|
||||
static int api_hexchat_hook_server(lua_State *L)
|
||||
{
|
||||
char const *command = luaL_optstring(L, 1, "RAW LINE");
|
||||
hook_info *info, **u;
|
||||
int ref, pri;
|
||||
|
||||
lua_pushvalue(L, 2);
|
||||
int ref = luaL_ref(L, LUA_REGISTRYINDEX);
|
||||
int pri = luaL_optinteger(L, 3, HEXCHAT_PRI_NORM);
|
||||
hook_info *info = malloc(sizeof(hook_info));
|
||||
ref = luaL_ref(L, LUA_REGISTRYINDEX);
|
||||
pri = luaL_optinteger(L, 3, HEXCHAT_PRI_NORM);
|
||||
info = malloc(sizeof(hook_info));
|
||||
info->state = L;
|
||||
info->ref = ref;
|
||||
info->hook = hexchat_hook_server(ph, command, pri, api_server_closure, info);
|
||||
hook_info **u = lua_newuserdata(L, sizeof(hook_info *));
|
||||
u = lua_newuserdata(L, sizeof(hook_info *));
|
||||
*u = info;
|
||||
luaL_newmetatable(L, "hook");
|
||||
lua_setmetatable(L, -2);
|
||||
@ -497,10 +531,12 @@ static int api_server_attrs_closure(char *word[], char *word_eol[], hexchat_even
|
||||
hook_info *info = udata;
|
||||
lua_State *L = info->state;
|
||||
script_info *script = get_info(L);
|
||||
int base, i, ret;
|
||||
hexchat_event_attrs **u;
|
||||
|
||||
lua_rawgeti(L, LUA_REGISTRYINDEX, script->traceback);
|
||||
int base = lua_gettop(L);
|
||||
base = lua_gettop(L);
|
||||
lua_rawgeti(L, LUA_REGISTRYINDEX, info->ref);
|
||||
int i;
|
||||
lua_newtable(L);
|
||||
for(i = 1; i < 32 && *word_eol[i]; i++)
|
||||
{
|
||||
@ -513,7 +549,8 @@ static int api_server_attrs_closure(char *word[], char *word_eol[], hexchat_even
|
||||
lua_pushstring(L, word_eol[i]);
|
||||
lua_rawseti(L, -2, i);
|
||||
}
|
||||
hexchat_event_attrs **u = lua_newuserdata(L, sizeof(hexchat_event_attrs *));
|
||||
|
||||
u = lua_newuserdata(L, sizeof(hexchat_event_attrs *));
|
||||
*u = event_attrs_copy(attrs);
|
||||
luaL_newmetatable(L, "attrs");
|
||||
lua_setmetatable(L, -2);
|
||||
@ -523,10 +560,10 @@ static int api_server_attrs_closure(char *word[], char *word_eol[], hexchat_even
|
||||
char const *error = lua_tostring(L, -1);
|
||||
lua_pop(L, 2);
|
||||
hexchat_printf(ph, "Lua error in server_attrs hook: %s", error ? error : "(non-string error)");
|
||||
return HEXCHAT_EAT_NONE;
|
||||
check_deferred(script);
|
||||
return HEXCHAT_EAT_NONE;
|
||||
}
|
||||
int ret = lua_tointeger(L, -1);
|
||||
ret = lua_tointeger(L, -1);
|
||||
lua_pop(L, 2);
|
||||
check_deferred(script);
|
||||
return ret;
|
||||
@ -535,14 +572,17 @@ static int api_server_attrs_closure(char *word[], char *word_eol[], hexchat_even
|
||||
static int api_hexchat_hook_server_attrs(lua_State *L)
|
||||
{
|
||||
char const *command = luaL_optstring(L, 1, "RAW LINE");
|
||||
int ref, pri;
|
||||
hook_info *info, **u;
|
||||
|
||||
lua_pushvalue(L, 2);
|
||||
int ref = luaL_ref(L, LUA_REGISTRYINDEX);
|
||||
int pri = luaL_optinteger(L, 3, HEXCHAT_PRI_NORM);
|
||||
hook_info *info = malloc(sizeof(hook_info));
|
||||
ref = luaL_ref(L, LUA_REGISTRYINDEX);
|
||||
pri = luaL_optinteger(L, 3, HEXCHAT_PRI_NORM);
|
||||
info = malloc(sizeof(hook_info));
|
||||
info->state = L;
|
||||
info->ref = ref;
|
||||
info->hook = hexchat_hook_server_attrs(ph, command, pri, api_server_attrs_closure, info);
|
||||
hook_info **u = lua_newuserdata(L, sizeof(hook_info *));
|
||||
u = lua_newuserdata(L, sizeof(hook_info *));
|
||||
*u = info;
|
||||
luaL_newmetatable(L, "hook");
|
||||
lua_setmetatable(L, -2);
|
||||
@ -555,8 +595,10 @@ static int api_timer_closure(void *udata)
|
||||
hook_info *info = udata;
|
||||
lua_State *L = info->state;
|
||||
script_info *script = get_info(L);
|
||||
int base, ret;
|
||||
|
||||
lua_rawgeti(L, LUA_REGISTRYINDEX, script->traceback);
|
||||
int base = lua_gettop(L);
|
||||
base = lua_gettop(L);
|
||||
lua_rawgeti(L, LUA_REGISTRYINDEX, info->ref);
|
||||
script->status |= STATUS_ACTIVE;
|
||||
if(lua_pcall(L, 0, 1, base))
|
||||
@ -567,7 +609,7 @@ static int api_timer_closure(void *udata)
|
||||
check_deferred(script);
|
||||
return 0;
|
||||
}
|
||||
int ret = lua_toboolean(L, -1);
|
||||
ret = lua_toboolean(L, -1);
|
||||
lua_pop(L, 2);
|
||||
check_deferred(script);
|
||||
return ret;
|
||||
@ -575,14 +617,16 @@ static int api_timer_closure(void *udata)
|
||||
|
||||
static int api_hexchat_hook_timer(lua_State *L)
|
||||
{
|
||||
int timeout = luaL_checknumber(L, 1);
|
||||
int ref, timeout = luaL_checknumber(L, 1);
|
||||
hook_info *info, **u;
|
||||
|
||||
lua_pushvalue(L, 2);
|
||||
int ref = luaL_ref(L, LUA_REGISTRYINDEX);
|
||||
hook_info *info = malloc(sizeof(hook_info));
|
||||
ref = luaL_ref(L, LUA_REGISTRYINDEX);
|
||||
info = malloc(sizeof(hook_info));
|
||||
info->state = L;
|
||||
info->ref = ref;
|
||||
info->hook = hexchat_hook_timer(ph, timeout, api_timer_closure, info);
|
||||
hook_info **u = lua_newuserdata(L, sizeof(hook_info *));
|
||||
u = lua_newuserdata(L, sizeof(hook_info *));
|
||||
*u = info;
|
||||
luaL_newmetatable(L, "hook");
|
||||
lua_setmetatable(L, -2);
|
||||
@ -592,17 +636,21 @@ static int api_hexchat_hook_timer(lua_State *L)
|
||||
|
||||
static int api_hexchat_hook_unload(lua_State *L)
|
||||
{
|
||||
script_info *script;
|
||||
hook_info *info, **u;
|
||||
int ref;
|
||||
|
||||
lua_pushvalue(L, 1);
|
||||
int ref = luaL_ref(L, LUA_REGISTRYINDEX);
|
||||
hook_info *info = malloc(sizeof(hook_info));
|
||||
ref = luaL_ref(L, LUA_REGISTRYINDEX);
|
||||
info = malloc(sizeof(hook_info));
|
||||
info->state = L;
|
||||
info->ref = ref;
|
||||
info->hook = NULL;
|
||||
hook_info **u = lua_newuserdata(L, sizeof(hook_info *));
|
||||
u = lua_newuserdata(L, sizeof(hook_info *));
|
||||
*u = info;
|
||||
luaL_newmetatable(L, "hook");
|
||||
lua_setmetatable(L, -2);
|
||||
script_info *script = get_info(info->state);
|
||||
script = get_info(info->state);
|
||||
ARRAY_GROW(script->unload_hooks, script->num_unload_hooks);
|
||||
script->unload_hooks[script->num_unload_hooks - 1] = info;
|
||||
return 1;
|
||||
@ -664,10 +712,10 @@ static int api_hexchat_set_context(lua_State *L)
|
||||
|
||||
static int wrap_context_closure(lua_State *L)
|
||||
{
|
||||
hexchat_context *context = *(hexchat_context **)luaL_checkudata(L, 1, "context");
|
||||
hexchat_context *old, *context = *(hexchat_context **)luaL_checkudata(L, 1, "context");
|
||||
lua_pushvalue(L, lua_upvalueindex(1));
|
||||
lua_replace(L, 1);
|
||||
hexchat_context *old = hexchat_get_context(ph);
|
||||
old = hexchat_get_context(ph);
|
||||
if(!hexchat_set_context(ph, context))
|
||||
return luaL_error(L, "could not switch into context");
|
||||
lua_call(L, lua_gettop(L) - 1, LUA_MULTRET);
|
||||
@ -778,6 +826,7 @@ static int api_hexchat_prefs_meta_newindex(lua_State *L)
|
||||
static inline int list_marshal(lua_State *L, const char *key, hexchat_list *list)
|
||||
{
|
||||
char const *str = hexchat_list_str(ph, list, key);
|
||||
int number;
|
||||
if(str)
|
||||
{
|
||||
if(!strcmp(key, "context"))
|
||||
@ -791,7 +840,7 @@ static inline int list_marshal(lua_State *L, const char *key, hexchat_list *list
|
||||
lua_pushstring(L, str);
|
||||
return 1;
|
||||
}
|
||||
int number = hexchat_list_int(ph, list, key);
|
||||
number = hexchat_list_int(ph, list, key);
|
||||
if(number != -1)
|
||||
{
|
||||
lua_pushinteger(L, number);
|
||||
@ -825,17 +874,22 @@ static int api_hexchat_props_meta_newindex(lua_State *L)
|
||||
static int api_hexchat_pluginprefs_meta_index(lua_State *L)
|
||||
{
|
||||
script_info *script = get_info(L);
|
||||
const char *key;
|
||||
hexchat_plugin *h;
|
||||
char str[512];
|
||||
int r;
|
||||
|
||||
if(!script->name)
|
||||
return luaL_error(L, "cannot use hexchat.pluginprefs before registering with hexchat.register");
|
||||
char const *key = luaL_checkstring(L, 2);
|
||||
hexchat_plugin *h = script->handle;
|
||||
int r = hexchat_pluginpref_get_int(h, key);
|
||||
|
||||
key = luaL_checkstring(L, 2);
|
||||
h = script->handle;
|
||||
r = hexchat_pluginpref_get_int(h, key);
|
||||
if(r != -1)
|
||||
{
|
||||
lua_pushnumber(L, r);
|
||||
return 1;
|
||||
}
|
||||
char str[512];
|
||||
if(hexchat_pluginpref_get_str(h, key, str))
|
||||
{
|
||||
lua_pushstring(L, str);
|
||||
@ -848,10 +902,14 @@ static int api_hexchat_pluginprefs_meta_index(lua_State *L)
|
||||
static int api_hexchat_pluginprefs_meta_newindex(lua_State *L)
|
||||
{
|
||||
script_info *script = get_info(L);
|
||||
const char *key;
|
||||
hexchat_plugin *h;
|
||||
|
||||
if(!script->name)
|
||||
return luaL_error(L, "cannot use hexchat.pluginprefs before registering with hexchat.register");
|
||||
char const *key = luaL_checkstring(L, 2);
|
||||
hexchat_plugin *h = script->handle;
|
||||
|
||||
key = luaL_checkstring(L, 2);
|
||||
h = script->handle;
|
||||
switch(lua_type(L, 3))
|
||||
{
|
||||
case LUA_TSTRING:
|
||||
@ -872,22 +930,25 @@ static int api_hexchat_pluginprefs_meta_pairs_closure(lua_State *L)
|
||||
{
|
||||
char *dest = lua_touserdata(L, lua_upvalueindex(1));
|
||||
hexchat_plugin *h = get_info(L)->handle;
|
||||
|
||||
if(dest && *dest)
|
||||
{
|
||||
int r;
|
||||
char str[512];
|
||||
char *key = dest;
|
||||
|
||||
dest = strchr(dest, ',');
|
||||
if(dest)
|
||||
*(dest++) = 0;
|
||||
lua_pushlightuserdata(L, dest);
|
||||
lua_replace(L, lua_upvalueindex(1));
|
||||
lua_pushstring(L, key);
|
||||
int r = hexchat_pluginpref_get_int(h, key);
|
||||
r = hexchat_pluginpref_get_int(h, key);
|
||||
if(r != -1)
|
||||
{
|
||||
lua_pushnumber(L, r);
|
||||
return 2;
|
||||
}
|
||||
char str[512];
|
||||
if(hexchat_pluginpref_get_str(h, key, str))
|
||||
{
|
||||
lua_pushstring(L, str);
|
||||
@ -903,10 +964,14 @@ static int api_hexchat_pluginprefs_meta_pairs_closure(lua_State *L)
|
||||
static int api_hexchat_pluginprefs_meta_pairs(lua_State *L)
|
||||
{
|
||||
script_info *script = get_info(L);
|
||||
char *dest;
|
||||
hexchat_plugin *h;
|
||||
|
||||
if(!script->name)
|
||||
return luaL_error(L, "cannot use hexchat.pluginprefs before registering with hexchat.register");
|
||||
char *dest = lua_newuserdata(L, 4096);
|
||||
hexchat_plugin *h = script->handle;
|
||||
|
||||
dest = lua_newuserdata(L, 4096);
|
||||
h = script->handle;
|
||||
if(!hexchat_pluginpref_list(h, dest))
|
||||
strcpy(dest, "");
|
||||
lua_pushlightuserdata(L, dest);
|
||||
@ -1164,9 +1229,10 @@ static char const *expand_path(char const *path)
|
||||
{
|
||||
char *user = g_strdup(path + 1);
|
||||
char *slash_pos = strchr(user, '/');
|
||||
struct passwd *pw;
|
||||
if(slash_pos)
|
||||
*slash_pos = 0;
|
||||
struct passwd *pw = getpwnam(user);
|
||||
pw = getpwnam(user);
|
||||
g_free(user);
|
||||
if(pw)
|
||||
{
|
||||
@ -1224,6 +1290,9 @@ static void prepare_state(lua_State *L, script_info *info)
|
||||
|
||||
static script_info *create_script(char const *file)
|
||||
{
|
||||
int base;
|
||||
char *filename_fs;
|
||||
lua_State *L;
|
||||
script_info *info = malloc(sizeof(script_info));
|
||||
info->name = info->description = info->version = NULL;
|
||||
info->handle = NULL;
|
||||
@ -1233,7 +1302,7 @@ static script_info *create_script(char const *file)
|
||||
info->unload_hooks = NULL;
|
||||
info->num_unload_hooks = 0;
|
||||
info->filename = g_strdup(expand_path(file));
|
||||
lua_State *L = luaL_newstate();
|
||||
L = luaL_newstate();
|
||||
info->state = L;
|
||||
if(!L)
|
||||
{
|
||||
@ -1243,8 +1312,8 @@ static script_info *create_script(char const *file)
|
||||
}
|
||||
prepare_state(L, info);
|
||||
lua_rawgeti(L, LUA_REGISTRYINDEX, info->traceback);
|
||||
int base = lua_gettop(L);
|
||||
char *filename_fs = g_filename_from_utf8(info->filename, -1, NULL, NULL, NULL);
|
||||
base = lua_gettop(L);
|
||||
filename_fs = g_filename_from_utf8(info->filename, -1, NULL, NULL, NULL);
|
||||
if(!filename_fs)
|
||||
{
|
||||
hexchat_printf(ph, "Invalid filename: %s", info->filename);
|
||||
@ -1267,8 +1336,8 @@ static script_info *create_script(char const *file)
|
||||
if(lua_pcall(L, 0, 0, base))
|
||||
{
|
||||
char const *error = lua_tostring(L, -1);
|
||||
hexchat_printf(ph, "Lua error: %s", error ? error : "(non-string error)");
|
||||
size_t i;
|
||||
hexchat_printf(ph, "Lua error: %s", error ? error : "(non-string error)");
|
||||
for(i = 0; i < info->num_hooks; i++)
|
||||
free_hook(info->hooks[i]);
|
||||
for(i = 0; i < info->num_unload_hooks; i++)
|
||||
@ -1288,8 +1357,8 @@ static script_info *create_script(char const *file)
|
||||
lua_pop(L, 1);
|
||||
if(!info->name)
|
||||
{
|
||||
hexchat_printf(ph, "Lua script didn't register with hexchat.register");
|
||||
size_t i;
|
||||
hexchat_printf(ph, "Lua script didn't register with hexchat.register");
|
||||
for(i = 0; i < info->num_hooks; i++)
|
||||
free_hook(info->hooks[i]);
|
||||
for(i = 0; i < info->num_unload_hooks; i++)
|
||||
@ -1304,12 +1373,15 @@ static script_info *create_script(char const *file)
|
||||
|
||||
static void destroy_script(script_info *info)
|
||||
{
|
||||
lua_State *L;
|
||||
size_t i;
|
||||
int base;
|
||||
|
||||
for(i = 0; i < info->num_hooks; i++)
|
||||
free_hook(info->hooks[i]);
|
||||
lua_State *L = info->state;
|
||||
L = info->state;
|
||||
lua_rawgeti(L, LUA_REGISTRYINDEX, info->traceback);
|
||||
int base = lua_gettop(L);
|
||||
base = lua_gettop(L);
|
||||
for(i = 0; i < info->num_unload_hooks; i++)
|
||||
{
|
||||
hook_info *hook = info->unload_hooks[i];
|
||||
@ -1353,8 +1425,8 @@ static int unload_script(char const *filename)
|
||||
scripts[i]->status |= STATUS_DEFERRED_UNLOAD;
|
||||
else
|
||||
{
|
||||
destroy_script(scripts[i]);
|
||||
size_t j;
|
||||
destroy_script(scripts[i]);
|
||||
for(j = i; j < num_scripts - 1; j++)
|
||||
scripts[j] = scripts[j + 1];
|
||||
ARRAY_SHRINK(scripts, num_scripts);
|
||||
@ -1375,8 +1447,8 @@ static int reload_script(char const *filename)
|
||||
scripts[i]->status |= STATUS_DEFERRED_RELOAD;
|
||||
else
|
||||
{
|
||||
destroy_script(scripts[i]);
|
||||
size_t j;
|
||||
destroy_script(scripts[i]);
|
||||
for(j = i; j < num_scripts - 1; j++)
|
||||
scripts[j] = scripts[j + 1];
|
||||
ARRAY_SHRINK(scripts, num_scripts);
|
||||
@ -1405,6 +1477,7 @@ static void autoload_scripts(void)
|
||||
script_info *interp = NULL;
|
||||
static void create_interpreter(void)
|
||||
{
|
||||
lua_State *L;
|
||||
interp = malloc(sizeof(script_info));
|
||||
interp->name = "lua interpreter";
|
||||
interp->description = "";
|
||||
@ -1416,7 +1489,7 @@ static void create_interpreter(void)
|
||||
interp->unload_hooks = NULL;
|
||||
interp->num_unload_hooks = 0;
|
||||
interp->filename = "";
|
||||
lua_State *L = luaL_newstate();
|
||||
L = luaL_newstate();
|
||||
interp->state = L;
|
||||
if(!L)
|
||||
{
|
||||
@ -1431,12 +1504,15 @@ static void destroy_interpreter(void)
|
||||
{
|
||||
if(interp)
|
||||
{
|
||||
lua_State *L;
|
||||
size_t i;
|
||||
int base;
|
||||
|
||||
for(i = 0; i < interp->num_hooks; i++)
|
||||
free_hook(interp->hooks[i]);
|
||||
lua_State *L = interp->state;
|
||||
L = interp->state;
|
||||
lua_rawgeti(L, LUA_REGISTRYINDEX, interp->traceback);
|
||||
int base = lua_gettop(L);
|
||||
base = lua_gettop(L);
|
||||
for(i = 0; i < interp->num_unload_hooks; i++)
|
||||
{
|
||||
hook_info *hook = interp->unload_hooks[i];
|
||||
@ -1458,8 +1534,10 @@ static void destroy_interpreter(void)
|
||||
static void inject_string(script_info *info, char const *line)
|
||||
{
|
||||
lua_State *L = info->state;
|
||||
int base, top;
|
||||
|
||||
lua_rawgeti(L, LUA_REGISTRYINDEX, info->traceback);
|
||||
int base = lua_gettop(L);
|
||||
base = lua_gettop(L);
|
||||
if(luaL_loadbuffer(L, line, strlen(line), "@interpreter"))
|
||||
{
|
||||
hexchat_printf(ph, "Lua syntax error: %s", luaL_optstring(L, -1, ""));
|
||||
@ -1474,12 +1552,12 @@ static void inject_string(script_info *info, char const *line)
|
||||
hexchat_printf(ph, "Lua error: %s", error ? error : "(non-string error)");
|
||||
return;
|
||||
}
|
||||
int top = lua_gettop(L);
|
||||
top = lua_gettop(L);
|
||||
if(top > base)
|
||||
{
|
||||
int i;
|
||||
luaL_Buffer b;
|
||||
luaL_buffinit(L, &b);
|
||||
int i;
|
||||
for(i = base + 1; i <= top; i++)
|
||||
{
|
||||
if(i != base + 1)
|
||||
@ -1546,8 +1624,8 @@ void check_deferred(script_info *info)
|
||||
for(i = 0; i < num_scripts; i++)
|
||||
if(scripts[i] == info)
|
||||
{
|
||||
destroy_script(info);
|
||||
size_t j;
|
||||
destroy_script(info);
|
||||
for(j = i; j < num_scripts - 1; j++)
|
||||
scripts[j] = scripts[j + 1];
|
||||
ARRAY_SHRINK(scripts, num_scripts);
|
||||
@ -1566,9 +1644,9 @@ void check_deferred(script_info *info)
|
||||
for(i = 0; i < num_scripts; i++)
|
||||
if(scripts[i] == info)
|
||||
{
|
||||
size_t j;
|
||||
char *filename = g_strdup(info->filename);
|
||||
destroy_script(info);
|
||||
size_t j;
|
||||
for(j = i; j < num_scripts - 1; j++)
|
||||
scripts[j] = scripts[j + 1];
|
||||
ARRAY_SHRINK(scripts, num_scripts);
|
||||
|
Loading…
Reference in New Issue
Block a user