mirror of
https://github.com/edubart/otclient.git
synced 2025-10-15 03:54:54 +02:00
add lua binding generator tools, changes in pch header
This commit is contained in:
94
tools/lua-binding-generator/generate_lua_bindings.lua
Executable file
94
tools/lua-binding-generator/generate_lua_bindings.lua
Executable file
@@ -0,0 +1,94 @@
|
||||
#!/usr/bin/lua
|
||||
|
||||
if not (#arg >= 1 and #arg <= 4) then
|
||||
print('usage: ' .. arg[0] .. ' <cpp class header> [class name] [cpp class instance] [lua class instance]')
|
||||
return false
|
||||
end
|
||||
|
||||
cppclassheader = arg[1]
|
||||
cppclassname = arg[2]
|
||||
cppclassinstance = arg[3]
|
||||
luaclassname = arg[3] or luaclassname
|
||||
|
||||
if not io.open(cppclassheader, 'r') then
|
||||
print('could not open ' .. cppclassheader)
|
||||
return false
|
||||
end
|
||||
|
||||
function string.matchcount(str, pattern)
|
||||
local count = 0
|
||||
for w in str:gmatch(pattern) do count = count + 1 end
|
||||
return count
|
||||
end
|
||||
|
||||
function string.splitlines(str)
|
||||
local t = {}
|
||||
local function helper(line) table.insert(t, line) return "" end
|
||||
helper((str:gsub("(.-)\r?\n", helper)))
|
||||
return t
|
||||
end
|
||||
|
||||
classfound = false
|
||||
publicmethods = false
|
||||
for line in io.lines(cppclassheader) do
|
||||
foundclassname = line:match('^class ([%w_]+)')
|
||||
if foundclassname then
|
||||
if not cppclassname then
|
||||
guessedclassname = cppclassheader:match('([%w_]+).h'):lower()
|
||||
if foundclassname:lower() == guessedclassname then
|
||||
cppclassname = foundclassname
|
||||
end
|
||||
end
|
||||
if foundclassname == cppclassname then
|
||||
classfound = true
|
||||
publicmethods = false
|
||||
|
||||
if cppclassinstance then
|
||||
print('g_lua.registerStaticClass("' .. luaclassname .. '");')
|
||||
else
|
||||
baseclassname = line:match(': public ([%w_]+)')
|
||||
bindline = 'g_lua.registerClass<' .. cppclassname
|
||||
|
||||
if baseclassname and baseclassname ~= 'LuaObject' then
|
||||
bindline = bindline .. ', ' .. baseclassname
|
||||
end
|
||||
|
||||
bindline = bindline .. '>();'
|
||||
print(bindline)
|
||||
|
||||
bindline = 'g_lua.bindClassStaticFunction<' .. cppclassname .. '>("create", &' .. cppclassname .. '::create);'
|
||||
print(bindline)
|
||||
end
|
||||
elseif classfound then
|
||||
return true
|
||||
end
|
||||
end
|
||||
if classfound then
|
||||
if line:match('public:') then
|
||||
publicmethods = true
|
||||
elseif line:match('private:') or line:match('protected:') then
|
||||
publicmethods = false
|
||||
elseif publicmethods then
|
||||
for funcname,args in line:gmatch(' *[%w :_]* ([%w_]+)%(([^%(]*%)) *[;{].*$') do
|
||||
if funcname ~= cppclassname then
|
||||
numargs = args:matchcount('[^,)]+[,)]')
|
||||
|
||||
if cppclassinstance then
|
||||
bindline = 'g_lua.bindClassStaticFunction("' .. luaclassname .. '", "' .. funcname .. '", ' ..
|
||||
'std::bind(&' .. cppclassname .. "::" .. funcname .. ', &' .. cppclassinstance
|
||||
for i=1,numargs do
|
||||
bindline = bindline .. ', _' .. i
|
||||
end
|
||||
bindline = bindline .. '));'
|
||||
else
|
||||
bindline = 'g_lua.bindClassMemberFunction<' .. cppclassname .. '>("' .. funcname .. '", &' ..
|
||||
cppclassname .. '::' .. funcname .. ');'
|
||||
end
|
||||
print(bindline)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
return true
|
Reference in New Issue
Block a user