mirror of
https://github.com/cimgui/cimgui.git
synced 2025-08-14 05:38:29 +01:00
generate structs_and_enums.lua file to help in bindings.
This commit is contained in:
@@ -4,6 +4,7 @@
|
|||||||
|
|
||||||
This is a thin c-api wrapper programmatically generated for the excellent C++ intermediate gui [imgui](https://github.com/ocornut/imgui).
|
This is a thin c-api wrapper programmatically generated for the excellent C++ intermediate gui [imgui](https://github.com/ocornut/imgui).
|
||||||
All functions are programmatically wrapped except contructors, destructors and ImVector.(Unless someone find a use case for them)
|
All functions are programmatically wrapped except contructors, destructors and ImVector.(Unless someone find a use case for them)
|
||||||
|
Generated files are: cimgui.cpp, cimgui.h for C compilation. Also for helping in bindings creation, definitions.lua with function definitions information and structs_and_enums.lua.
|
||||||
This library is intended as a intermediate layer to be able to use imgui from other languages that can interface with C (like D - see [D-binding](https://github.com/Extrawurst/DerelictImgui))
|
This library is intended as a intermediate layer to be able to use imgui from other languages that can interface with C (like D - see [D-binding](https://github.com/Extrawurst/DerelictImgui))
|
||||||
|
|
||||||
Notes:
|
Notes:
|
||||||
|
@@ -1,4 +1,6 @@
|
|||||||
:: this is used to rebuild cimgui.h and cimgui.cpp and must be executed in this directory
|
:: this is used to rebuild cimgui.h and cimgui.cpp and must be executed in this directory
|
||||||
|
:: also provides definitions.lua for function definitions
|
||||||
|
:: and structs_and_enums.lua with struct and enum information-definitions
|
||||||
|
|
||||||
:: set your PATH if necessary for gcc and lua 5.1 or luajit with:
|
:: set your PATH if necessary for gcc and lua 5.1 or luajit with:
|
||||||
set PATH=%PATH%;C:\mingw32\bin;C:\luaGL;
|
set PATH=%PATH%;C:\mingw32\bin;C:\luaGL;
|
||||||
@@ -10,7 +12,7 @@ set PATH=%PATH%;C:\mingw32\bin;C:\luaGL;
|
|||||||
:: gcc -E -P no #pragma location information
|
:: gcc -E -P no #pragma location information
|
||||||
|
|
||||||
::generate preprocessed file
|
::generate preprocessed file
|
||||||
gcc -E -C -DIMGUI_DISABLE_OBSOLETE_FUNCTIONS -DIMGUI_APIX="" ../../imgui/imgui.h ../../imgui/examples/imgui_impl_glfw.h ../../imgui/examples/imgui_impl_opengl3.h > 1.txt
|
gcc -E -C -DIMGUI_DISABLE_OBSOLETE_FUNCTIONS -DIMGUI_API="" ../../imgui/imgui.h ../../imgui/examples/imgui_impl_glfw.h ../../imgui/examples/imgui_impl_opengl3.h > 1.txt
|
||||||
|
|
||||||
::process preprocessed file
|
::process preprocessed file
|
||||||
type 1.txt | luajit.exe ./generator.lua true imgui imgui_impl_glfw imgui_impl_opengl3 > out.txt
|
type 1.txt | luajit.exe ./generator.lua true imgui imgui_impl_glfw imgui_impl_opengl3 > out.txt
|
||||||
|
@@ -108,7 +108,7 @@ local function location(file,locpathT)
|
|||||||
end
|
end
|
||||||
return location_it
|
return location_it
|
||||||
end
|
end
|
||||||
|
------serializeTable("anyname",table) gives a string that recreates the table with dofile(generated_string)
|
||||||
local function serializeTable(name, value, saved)
|
local function serializeTable(name, value, saved)
|
||||||
|
|
||||||
local function basicSerialize (o)
|
local function basicSerialize (o)
|
||||||
@@ -485,6 +485,101 @@ local function func_parser()
|
|||||||
return FP
|
return FP
|
||||||
end
|
end
|
||||||
|
|
||||||
|
local function gen_structs_and_enums_table(cdefs)
|
||||||
|
local function_closing_re = "}"
|
||||||
|
local namespace_re = "namespace"
|
||||||
|
local in_namespace = false
|
||||||
|
local struct_re = "^%s*struct%s+([^%s;]+)$"
|
||||||
|
local in_struct = false
|
||||||
|
local struct_closed_re = "^%s*struct%s+([^%s]+);$"
|
||||||
|
local struct_closing_re = "};"
|
||||||
|
local struct_op_close_re = "%b{}"
|
||||||
|
local structnames = {}
|
||||||
|
local enumnames = {}
|
||||||
|
local enums_re = "^%s*enum%s+([^%s;]+)"
|
||||||
|
local outtab = {structs={},enums={}}
|
||||||
|
|
||||||
|
for i,line in ipairs(cdefs) do
|
||||||
|
repeat -- simulating continue with break
|
||||||
|
-- separate comments from code
|
||||||
|
local linecom = line
|
||||||
|
local line, comment = split_comment(line)
|
||||||
|
line = clean_spaces(line)
|
||||||
|
|
||||||
|
if line:match(namespace_re) then
|
||||||
|
in_namespace = true
|
||||||
|
end
|
||||||
|
|
||||||
|
local structbegin = line:match(struct_re)
|
||||||
|
if structbegin then
|
||||||
|
structnames[#structnames + 1] = structbegin
|
||||||
|
outtab.structs[structbegin] = outtab.structs[structbegin] or {}
|
||||||
|
break
|
||||||
|
end
|
||||||
|
|
||||||
|
local enumname = line:match(enums_re)
|
||||||
|
if enumname then
|
||||||
|
enumnames[#enumnames + 1] = enumname
|
||||||
|
outtab.enums[enumname] = outtab.enums[enumname] or {}
|
||||||
|
break
|
||||||
|
end
|
||||||
|
|
||||||
|
if in_namespace then
|
||||||
|
if line:match(function_closing_re) then
|
||||||
|
in_namespace = false
|
||||||
|
end
|
||||||
|
break -- dont write anything inside
|
||||||
|
end
|
||||||
|
|
||||||
|
if (#enumnames > 0) then
|
||||||
|
assert(#structnames==0,"enum in struct")
|
||||||
|
if line:match(struct_closing_re) and not line:match(struct_op_close_re) then
|
||||||
|
enumnames[#enumnames] = nil
|
||||||
|
break
|
||||||
|
end
|
||||||
|
if line=="" or line:match("^{") then
|
||||||
|
break
|
||||||
|
else
|
||||||
|
local name,value = line:match("%s*([%w_]+)%s*=%s*([^,]+)")
|
||||||
|
if value then
|
||||||
|
table.insert(outtab.enums[enumnames[#enumnames]],{name=name,value=value})
|
||||||
|
else
|
||||||
|
local name = line:match("%s*([^,]+)")
|
||||||
|
local value = #outtab.enums[enumnames[#enumnames]]
|
||||||
|
table.insert(outtab.enums[enumnames[#enumnames]],{name=name,value=value})
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
if (#structnames > 0) then
|
||||||
|
if line:match(struct_closing_re) and not line:match(struct_op_close_re) then
|
||||||
|
structnames[#structnames] = nil
|
||||||
|
break
|
||||||
|
end
|
||||||
|
if line=="" or line:match("^{") then
|
||||||
|
break
|
||||||
|
elseif structnames[#structnames] ~="ImVector" then --avoid ImVector
|
||||||
|
--local functype_re = "^%s*[%w%s%*]+(%(%*)[%w_]+(%)%([^%(%)]*%))"
|
||||||
|
local functype_re = "^%s*[%w%s%*]+%(%*[%w_]+%)%([^%(%)]*%)"
|
||||||
|
local functype_reex = "^(%s*[%w%s%*]+%(%*)([%w_]+)(%)%([^%(%)]*%))"
|
||||||
|
if line:match(functype_re) then
|
||||||
|
local t1,name,t2 = line:match(functype_reex)
|
||||||
|
table.insert(outtab.structs[structnames[#structnames]],{type=t1..t2,name=name})
|
||||||
|
break
|
||||||
|
end
|
||||||
|
--split type name1,name2; in several lines
|
||||||
|
local typen,rest = line:match("([^,]+)%s(%S+[,;])")
|
||||||
|
for name in rest:gmatch("([^%s,;]+)%s?[,;]") do
|
||||||
|
table.insert(outtab.structs[structnames[#structnames]],{type=typen,name=name})
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
until true
|
||||||
|
end
|
||||||
|
return outtab
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
local function gen_structs_and_enums(cdefs)
|
local function gen_structs_and_enums(cdefs)
|
||||||
local function_closing_re = "}"
|
local function_closing_re = "}"
|
||||||
local namespace_re = "namespace"
|
local namespace_re = "namespace"
|
||||||
@@ -727,7 +822,7 @@ FP:compute_overloads()
|
|||||||
|
|
||||||
local cstructs = gen_structs_and_enums(STP.lines)
|
local cstructs = gen_structs_and_enums(STP.lines)
|
||||||
local cfuncs = func_header_generate(FP)
|
local cfuncs = func_header_generate(FP)
|
||||||
|
local cstructs_table = gen_structs_and_enums_table(STP.lines)
|
||||||
|
|
||||||
--merge it in cimgui_template.h to cimgui.h
|
--merge it in cimgui_template.h to cimgui.h
|
||||||
local hfile = io.open("./cimgui_template.h","r")
|
local hfile = io.open("./cimgui_template.h","r")
|
||||||
@@ -760,9 +855,15 @@ local ser = serializeTable("defs",FP.defsT)
|
|||||||
hfile:write(ser.."\nreturn defs")
|
hfile:write(ser.."\nreturn defs")
|
||||||
hfile:close()
|
hfile:close()
|
||||||
|
|
||||||
|
----------save struct and enums lua table in structs_and_enums.lua for using in bindings
|
||||||
|
local hfile = io.open("./structs_and_enums.lua","w")
|
||||||
|
local ser = serializeTable("defs",cstructs_table)
|
||||||
|
hfile:write(ser.."\nreturn defs")
|
||||||
|
hfile:close()
|
||||||
|
|
||||||
|
|
||||||
---dump infos-----------------------------------------------------------------------
|
|
||||||
|
---dump some infos-----------------------------------------------------------------------
|
||||||
------------------------------------------------------------------------------------
|
------------------------------------------------------------------------------------
|
||||||
print"//-------alltypes--------------------------------------------------------------------"
|
print"//-------alltypes--------------------------------------------------------------------"
|
||||||
FP:dump_alltypes()
|
FP:dump_alltypes()
|
||||||
|
Reference in New Issue
Block a user