diff options
author | Pixel <pixel@nobis-crew.org> | 2009-11-04 11:56:41 -0800 |
---|---|---|
committer | Pixel <pixel@nobis-crew.org> | 2009-11-04 11:59:33 -0800 |
commit | d577d991b97ae2b5ee1af23641bcffc3f83af5b2 (patch) | |
tree | 590639d50205d1bcfaff2a7d2dc6ebf3f373c7ed /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-x | iup/srclua5/generator.lua | 222 |
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 |