summaryrefslogtreecommitdiff
path: root/iup/srclua5/il_getparam.c
diff options
context:
space:
mode:
authorPixel <pixel@nobis-crew.org>2009-11-04 11:56:41 -0800
committerPixel <pixel@nobis-crew.org>2009-11-04 11:59:33 -0800
commitd577d991b97ae2b5ee1af23641bcffc3f83af5b2 (patch)
tree590639d50205d1bcfaff2a7d2dc6ebf3f373c7ed /iup/srclua5/il_getparam.c
Initial import. Contains the im, cd and iup librairies, and a "working" Makefile for them under linux.
Diffstat (limited to 'iup/srclua5/il_getparam.c')
-rwxr-xr-xiup/srclua5/il_getparam.c177
1 files changed, 177 insertions, 0 deletions
diff --git a/iup/srclua5/il_getparam.c b/iup/srclua5/il_getparam.c
new file mode 100755
index 0000000..c7f4936
--- /dev/null
+++ b/iup/srclua5/il_getparam.c
@@ -0,0 +1,177 @@
+/** \file
+ * \brief IupGetParam bindig to Lua 5.
+ *
+ * See Copyright Notice in "iup.h"
+ */
+
+#include <stdlib.h>
+#include <string.h>
+
+#include <lua.h>
+#include <lauxlib.h>
+
+#include "iup.h"
+
+#include "iuplua.h"
+#include "il.h"
+#include "il_controls.h"
+
+
+/* Used only by the Lua binding */
+int iupGetParamCount(const char *format, int *param_extra);
+char iupGetParamType(const char* format, int *line_size);
+
+
+typedef struct _getparam_data
+{
+ lua_State *L;
+ int has_func;
+ int func_ref;
+}getparam_data;
+
+static int param_action(Ihandle* dialog, int param_index, void* user_data)
+{
+ int ret = 1;
+ getparam_data* gp = (getparam_data*)user_data;
+ if (gp->has_func)
+ {
+ lua_State *L = gp->L;
+ lua_getref(L, gp->func_ref);
+ iuplua_pushihandle(L, dialog);
+ lua_pushnumber(L, param_index);
+ if (iuplua_call_raw(L, 2, 1) != 0) /* 2 args, 1 return */
+ {
+ ret = (int)lua_tonumber(L,-1);
+ lua_pop(L, 1);
+ }
+ }
+ return ret;
+}
+
+static int GetParam(lua_State *L)
+{
+ getparam_data gp;
+ const char* title = luaL_checkstring(L, 1);
+ void* user_data = (void*)&gp;
+ const char* format = luaL_checkstring(L, 3);
+ int param_count, param_extra, i, size, ret,
+ line_size = 0, lua_param_start = 4;
+ const char* f = format;
+ const char* s;
+ void* param_data[50];
+ char param_type[50];
+
+ gp.L = L;
+ gp.has_func = 0;
+ gp.func_ref = 0;
+
+ memset(param_data, 0, sizeof(void*)*50);
+ memset(param_type, 0, sizeof(char)*50);
+
+ param_count = iupGetParamCount(format, &param_extra);
+
+ for (i = 0; i < param_count; i++)
+ {
+ char t = iupGetParamType(f, &line_size);
+
+ if (t == 't') /* if separator */
+ {
+ f += line_size;
+ i--; /* compensate next increment */
+ continue;
+ }
+
+ switch(t)
+ {
+ case 'b':
+ case 'i':
+ case 'l':
+ param_data[i] = malloc(sizeof(int));
+ *(int*)(param_data[i]) = (int)luaL_checknumber(L, lua_param_start); lua_param_start++;
+ break;
+ case 'a':
+ case 'r':
+ param_data[i] = malloc(sizeof(float));
+ *(float*)(param_data[i]) = (float)luaL_checknumber(L, lua_param_start); lua_param_start++;
+ break;
+ case 's':
+ case 'm':
+ s = luaL_checkstring(L, lua_param_start); lua_param_start++;
+ size = strlen(s);
+ if (size < 512)
+ param_data[i] = malloc(512);
+ else
+ param_data[i] = malloc(2*size);
+ memcpy(param_data[i], s, size+1);
+ break;
+ }
+
+ param_type[i] = t;
+ f += line_size;
+ }
+
+ if (lua_isfunction(L, 2))
+ {
+ lua_pushvalue(L, 2);
+ gp.func_ref = lua_ref(L, 1);
+ gp.has_func = 1;
+ }
+
+ ret = IupGetParamv(title, param_action, user_data, format, param_count, param_extra, param_data);
+
+ lua_pushboolean(L, ret);
+
+ if (ret)
+ {
+ for (i = 0; i < param_count; i++)
+ {
+ switch(param_type[i])
+ {
+ case 'b':
+ case 'i':
+ case 'l':
+ lua_pushnumber(L, *(int*)(param_data[i]));
+ break;
+ case 'a':
+ case 'r':
+ lua_pushnumber(L, *(float*)(param_data[i]));
+ break;
+ case 's':
+ case 'm':
+ lua_pushstring(L, (char*)(param_data[i]));
+ break;
+ }
+ }
+ }
+
+ for (i = 0; i < param_count; i++)
+ {
+ free(param_data[i]);
+ }
+
+ if (gp.has_func)
+ lua_unref(L, gp.func_ref);
+
+ if (ret)
+ return param_count+1;
+ else
+ return 1;
+}
+
+static int GetParamParam(lua_State *L)
+{
+ Ihandle *dialog = iuplua_checkihandle(L, 1);
+ int param_index = (int)luaL_checknumber(L, 2);
+ Ihandle* param;
+ char param_str[50];
+ sprintf(param_str, "PARAM%d", param_index);
+ param = (Ihandle*)IupGetAttribute(dialog, param_str);
+ iuplua_pushihandle(L, param);
+ return 1;
+}
+
+void iupgetparamlua_open(lua_State * L)
+{
+ iuplua_register(L, GetParam, "GetParam");
+ iuplua_register(L, GetParamParam, "GetParamParam");
+}