summaryrefslogtreecommitdiff
path: root/iup/srclua5/generator.lua
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/generator.lua
Initial import. Contains the im, cd and iup librairies, and a "working" Makefile for them under linux.
Diffstat (limited to 'iup/srclua5/generator.lua')
-rwxr-xr-xiup/srclua5/generator.lua222
1 files changed, 222 insertions, 0 deletions
diff --git a/iup/srclua5/generator.lua b/iup/srclua5/generator.lua
new file mode 100755
index 0000000..24fd325
--- /dev/null
+++ b/iup/srclua5/generator.lua
@@ -0,0 +1,222 @@
+
+function dofile(f)
+ pcall(loadfile(f))
+end
+
+-- compatibility functions (with iuplua.lua)
+function iupSetClass(ctrl, name)
+ element = ctrl
+end
+
+-- dummy functions
+iupluaNewClass = function() end
+iupSetMethod = iupluaNewClass
+iupRegisterWidget = iupluaNewClass
+
+c_types = {
+ n = "int",
+ s = "char *",
+ i = "Ihandle *",
+ c = "unsigned char ",
+ d = "double",
+ f = "float",
+ v = "Ihandle **",
+}
+
+-- Adjust the callbacks table
+function adjustcallbacktable(c)
+ d = {}
+ for i,j in pairs(c) do
+ if type(j) == "string" then
+ d[i] = { j, "IUP_".. string.upper(i)}
+ elseif type(j) == "table" then
+ d[i] = j
+ else
+ print("ERROR IN CALLBACK TABLE FORMAT")
+ end
+ end
+ return d
+end
+
+
+function header(o,i)
+ io.write [[
+/******************************************************************************
+ * Automatically generated file (iuplua5). Please don t change anything. *
+ *****************************************************************************/
+
+#include <stdlib.h>
+
+#include <lua.h>
+#include <lauxlib.h>
+
+#include "iup.h"
+#include "iuplua.h"
+]]
+ if i then io.write('#include "',i,'"\n') end
+ io.write('#include "il.h"\n\n\n')
+end
+
+function firstupper(name)
+ return string.upper(string.sub(name,1,1)) .. string.sub(name,2,-1)
+end
+
+function write_creation(o, t)
+ local aux = {n = 1}
+ local u = firstupper(o)
+ local v = t.creation
+ local c = t.callback
+ if t.funcname then
+ u = t.funcname
+ end
+ io.write ("static int ",u,"(lua_State *L)\n")
+ io.write ("{\n")
+ if t.rettype == nil then io.write(" Ihandle *ih = Iup",u,"(")
+ elseif t.rettype == "n" then io.write(" int n = (Iup",u,"(")
+ elseif t.rettype == "s" then io.write(" char *s = (Iup",u,"(")
+ end
+ local max = string.len(v)
+ string.gsub(v, "(.)", function(p)
+ if p == "n" then io.write("luaL_checkint(L, ",aux.n,")")
+ elseif p == "d" then io.write("luaL_number(L, ",aux.n,")")
+ elseif p == "s" then io.write("(char *) luaL_checkstring(L, ",aux.n,")")
+ elseif p == "S" then io.write("(char *) luaL_optstring(L, ",aux.n,', NULL)')
+ elseif p == "i" then io.write("iuplua_checkihandle(L, ",aux.n,")")
+ elseif p == "I" then io.write("iuplua_checkihandleornil(L, ",aux.n,")")
+ elseif p == "-" then io.write("NULL")
+ elseif p == "a" then io.write("iuplua_checkstring_array(L, ",aux.n,")")
+ elseif p == "t" then io.write("iuplua_checkint_array(L, ",aux.n,")")
+ elseif p == "v" then io.write("iuplua_checkihandle_array(L, ",aux.n,")")
+ else io.write("FORMAT '", p, "' NOT SUPPORTED\n")
+ end
+ if aux.n < max then io.write(", ") end
+ aux.n = aux.n + 1
+ end)
+ io.write(");\n")
+
+ io.write(" iuplua_plugstate(L, ih);\n")
+ io.write(" iuplua_pushihandle_raw(L, ih);\n")
+ io.write(" return 1;\n")
+ io.write("}\n\n")
+end
+
+function write_callbacks(o, c)
+ local aux = { }
+ for i,v in pairs(c) do
+ local s = v[1]
+ local max = string.len(s)
+ aux.n = 0
+ io.write("static ")
+ if v.ret then
+ if v.ret == "s" then
+ io.write("char * ")
+ end
+ else
+ io.write("int ")
+ end
+ io.write(o, "_", i, "(Ihandle *self")
+ if max > 0 then io.write(", ") end
+ string.gsub(s, "(.)", function(p)
+ io.write(c_types[p], " p", aux.n)
+ aux.n = aux.n + 1
+ if aux.n < max then io.write(", ") end
+ end)
+ io.write(")\n{\n")
+ io.write(' lua_State *L = iuplua_call_start(self, "', i, '");')
+ aux.n = 0
+ string.gsub(s, "(.)", function(p)
+ if p == "n" or p == "f" or p == "d" or p == "c" then
+ io.write("\n lua_pushnumber(L, p"..aux.n..");")
+ elseif p == "s" then
+ io.write("\n lua_pushstring(L, p"..aux.n..");")
+ elseif p == "i" then
+ io.write("\n iuplua_pushihandle(L, p"..aux.n..");")
+ else
+ io.write("\n ERROR !! ")
+ end
+ aux.n = aux.n + 1
+ end)
+ if v.ret and v.ret == "s" then
+ io.write("\n return iuplua_call_rs(L, " .. max .. ");")
+ else
+ io.write("\n return iuplua_call(L, " .. max .. ");")
+ end
+ io.write("\n}\n\n")
+ end
+end
+
+function write_initialization(o,t)
+ local aux= {n=1}
+ local c = t.callback
+ local u = firstupper(o)
+ if t.extrafuncs then
+ io.write('void iuplua_', o,'funcs_open(lua_State *L);\n\n')
+ end
+ if t.openfuncname then
+ io.write("void ", t.openfuncname, "(lua_State * L)\n")
+ else
+ io.write("int iup", o,"lua_open(lua_State * L)\n")
+ end
+ io.write("{\n")
+ io.write(" iuplua_register(L, ")
+ if t.funcname then
+ u = t.funcname
+ end
+ io.write(u, ', "', u,'");\n\n')
+
+ for i,v in pairs(c) do
+ local type = "NULL"
+ if i == "action" or
+ i == "action_cb" or
+ i == "edit_cb" or
+ i == "mousemove_cb" then
+ type = '"'..string.lower(o)..'"'
+ end
+ io.write(' iuplua_register_cb(L, "',string.upper(i),'", (lua_CFunction)',o,'_',i,', ',type,');\n')
+ first = 0
+ end
+ io.write('\n')
+
+ if t.extrafuncs then
+ io.write(' iuplua_', o,'funcs_open(L);\n\n')
+ end
+ io.write('#ifdef IUPLUA_USELOH\n')
+ io.write('#ifdef TEC_BIGENDIAN\n')
+ io.write('#ifdef TEC_64\n')
+ io.write('#include "loh/', o,'_be64.loh"\n')
+ io.write('#else\n')
+ io.write('#include "loh/', o,'_be32.loh"\n')
+ io.write('#endif\n')
+ io.write('#else\n')
+ io.write('#ifdef TEC_64\n')
+ io.write('#ifdef WIN64\n')
+ io.write('#include "loh/', o,'_le64w.loh"\n')
+ io.write('#else\n')
+ io.write('#include "loh/', o,'_le64.loh"\n')
+ io.write('#endif\n')
+ io.write('#else\n')
+ io.write('#include "loh/', o,'.loh"\n')
+ io.write('#endif\n')
+ io.write('#endif\n')
+ io.write('#else\n')
+ io.write(' iuplua_dofile(L, "', o,'.lua");\n')
+ io.write('#endif\n\n')
+ io.write(' return 0;\n')
+ io.write("}\n\n")
+end
+
+dofile(arg[1])
+element.callback = adjustcallbacktable(element.callback)
+
+io.output("il_"..element.nick..".c")
+header(element.nick, element.include)
+write_callbacks(element.nick, element.callback)
+if element.createfunc == nil then
+ write_creation(element.nick, element)
+else
+ io.write(element.createfunc)
+end
+write_initialization(element.nick, element)
+if element.extracode then
+ io.write(element.extracode)
+end