mirror of
https://github.com/cimgui/cimgui.git
synced 2025-08-11 12:18:30 +01:00
generator: move C writting functions inside cpp2ffi
This commit is contained in:
@@ -1577,7 +1577,155 @@ local function location(file,locpathT,defines,COMPILER)
|
|||||||
return location_it
|
return location_it
|
||||||
end
|
end
|
||||||
M.location = location
|
M.location = location
|
||||||
|
---------------------- C writing functions
|
||||||
|
local function ImGui_f_implementation(outtab,def)
|
||||||
|
local ptret = def.retref and "&" or ""
|
||||||
|
table.insert(outtab,"CIMGUI_API".." "..def.ret.." "..def.ov_cimguiname..def.args.."\n")
|
||||||
|
table.insert(outtab,"{\n")
|
||||||
|
local namespace = def.namespace and def.namespace.."::" or ""
|
||||||
|
if def.isvararg then
|
||||||
|
local call_args = def.call_args:gsub("%.%.%.","args")
|
||||||
|
table.insert(outtab," va_list args;\n")
|
||||||
|
table.insert(outtab," va_start(args, fmt);\n")
|
||||||
|
if def.ret~="void" then
|
||||||
|
table.insert(outtab," "..def.ret.." ret = "..namespace..def.funcname.."V"..call_args..";\n")
|
||||||
|
else
|
||||||
|
table.insert(outtab," "..namespace..def.funcname.."V"..call_args..";\n")
|
||||||
|
end
|
||||||
|
table.insert(outtab," va_end(args);\n")
|
||||||
|
if def.ret~="void" then
|
||||||
|
table.insert(outtab," return ret;\n")
|
||||||
|
end
|
||||||
|
elseif def.nonUDT then
|
||||||
|
if def.nonUDT == 1 then
|
||||||
|
table.insert(outtab," *pOut = "..namespace..def.funcname..def.call_args..";\n")
|
||||||
|
end
|
||||||
|
else --standard ImGui
|
||||||
|
table.insert(outtab," return "..ptret..namespace..def.funcname..def.call_args..";\n")
|
||||||
|
end
|
||||||
|
table.insert(outtab,"}\n")
|
||||||
|
end
|
||||||
|
local function struct_f_implementation(outtab,def)
|
||||||
|
local empty = def.args:match("^%(%)") --no args
|
||||||
|
local ptret = def.retref and "&" or ""
|
||||||
|
|
||||||
|
local imgui_stname = def.stname
|
||||||
|
|
||||||
|
table.insert(outtab,"CIMGUI_API".." "..def.ret.." "..def.ov_cimguiname..def.args.."\n")
|
||||||
|
table.insert(outtab,"{\n")
|
||||||
|
if def.isvararg then
|
||||||
|
local call_args = def.call_args:gsub("%.%.%.","args")
|
||||||
|
table.insert(outtab," va_list args;\n")
|
||||||
|
table.insert(outtab," va_start(args, fmt);\n")
|
||||||
|
if def.ret~="void" then
|
||||||
|
table.insert(outtab," "..def.ret.." ret = self->"..def.funcname.."V"..call_args..";\n")
|
||||||
|
else
|
||||||
|
table.insert(outtab," self->"..def.funcname.."V"..call_args..";\n")
|
||||||
|
end
|
||||||
|
table.insert(outtab," va_end(args);\n")
|
||||||
|
if def.ret~="void" then
|
||||||
|
table.insert(outtab," return ret;\n")
|
||||||
|
end
|
||||||
|
elseif def.nonUDT then
|
||||||
|
if def.nonUDT == 1 then
|
||||||
|
table.insert(outtab," *pOut = self->"..def.funcname..def.call_args..";\n")
|
||||||
|
end
|
||||||
|
else --standard struct
|
||||||
|
table.insert(outtab," return "..ptret.."self->"..def.funcname..def.call_args..";\n")
|
||||||
|
end
|
||||||
|
table.insert(outtab,"}\n")
|
||||||
|
end
|
||||||
|
local function func_implementation(FP)
|
||||||
|
|
||||||
|
local outtab = {}
|
||||||
|
for _,t in ipairs(FP.funcdefs) do
|
||||||
|
repeat -- continue simulation
|
||||||
|
if not t.cimguiname then break end
|
||||||
|
local cimf = FP.defsT[t.cimguiname]
|
||||||
|
local def = cimf[t.signature]
|
||||||
|
assert(def)
|
||||||
|
local manual = FP.get_manuals(def)
|
||||||
|
if not manual and not def.templated then
|
||||||
|
if def.constructor then
|
||||||
|
assert(def.stname ~= "","constructor without struct")
|
||||||
|
local empty = def.args:match("^%(%)") --no args
|
||||||
|
table.insert(outtab,"CIMGUI_API "..def.stname.."* "..def.ov_cimguiname..(empty and "(void)" or def.args).."\n")
|
||||||
|
table.insert(outtab,"{\n")
|
||||||
|
table.insert(outtab," return IM_NEW("..def.stname..")"..def.call_args..";\n")
|
||||||
|
table.insert(outtab,"}\n")
|
||||||
|
elseif def.destructor then
|
||||||
|
local args = "("..def.stname.."* self)"
|
||||||
|
local fname = def.stname.."_destroy"
|
||||||
|
table.insert(outtab,"CIMGUI_API void "..fname..args.."\n")
|
||||||
|
table.insert(outtab,"{\n")
|
||||||
|
table.insert(outtab," IM_DELETE(self);\n")
|
||||||
|
table.insert(outtab,"}\n")
|
||||||
|
elseif def.stname == "" then
|
||||||
|
ImGui_f_implementation(outtab,def)
|
||||||
|
else -- stname
|
||||||
|
struct_f_implementation(outtab,def)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
until true
|
||||||
|
end
|
||||||
|
return table.concat(outtab)
|
||||||
|
end
|
||||||
|
|
||||||
|
M.func_implementation = func_implementation
|
||||||
|
|
||||||
|
local function func_header_generate(FP)
|
||||||
|
|
||||||
|
local outtab = {}
|
||||||
|
table.insert(outtab,"#ifndef CIMGUI_DEFINE_ENUMS_AND_STRUCTS\n")
|
||||||
|
for k,v in pairs(FP.embeded_structs) do
|
||||||
|
table.insert(outtab,"typedef "..v.." "..k..";\n")
|
||||||
|
end
|
||||||
|
|
||||||
|
for ttype,v in pairs(FP.templates) do
|
||||||
|
for ttypein,_ in pairs(v) do
|
||||||
|
local te = ttypein:gsub("%s","_")
|
||||||
|
te = te:gsub("%*","Ptr")
|
||||||
|
table.insert(outtab,"typedef "..ttype.."<"..ttypein.."> "..ttype.."_"..te..";\n")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
table.insert(outtab,"#endif //CIMGUI_DEFINE_ENUMS_AND_STRUCTS\n")
|
||||||
|
for _,t in ipairs(FP.funcdefs) do
|
||||||
|
|
||||||
|
if t.cimguiname then
|
||||||
|
local cimf = FP.defsT[t.cimguiname]
|
||||||
|
local def = cimf[t.signature]
|
||||||
|
assert(def,t.signature..t.cimguiname)
|
||||||
|
local manual = FP.get_manuals(def)
|
||||||
|
if not manual and not def.templated then
|
||||||
|
|
||||||
|
local addcoment = def.comment or ""
|
||||||
|
local empty = def.args:match("^%(%)") --no args
|
||||||
|
if def.constructor then
|
||||||
|
assert(def.stname ~= "","constructor without struct")
|
||||||
|
table.insert(outtab,"CIMGUI_API "..def.stname.."* "..def.ov_cimguiname ..(empty and "(void)" or def.args)..";"..addcoment.."\n")
|
||||||
|
elseif def.destructor then
|
||||||
|
table.insert(outtab,"CIMGUI_API void "..def.ov_cimguiname..def.args..";"..addcoment.."\n")
|
||||||
|
else --not constructor
|
||||||
|
|
||||||
|
if def.stname == "" then --ImGui namespace or top level
|
||||||
|
table.insert(outtab,"CIMGUI_API "..def.ret.." ".. def.ov_cimguiname ..(empty and "(void)" or def.args)..";"..addcoment.."\n")
|
||||||
|
else
|
||||||
|
table.insert(outtab,"CIMGUI_API "..def.ret.." "..def.ov_cimguiname..def.args..";"..addcoment.."\n")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
else --not cimguiname
|
||||||
|
table.insert(outtab,t.comment:gsub("%%","%%%%").."\n")-- %% substitution for gsub
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local cfuncsstr = table.concat(outtab)
|
||||||
|
cfuncsstr = cfuncsstr:gsub("\n+","\n") --several empty lines to one empty line
|
||||||
|
return cfuncsstr
|
||||||
|
end
|
||||||
|
|
||||||
|
M.func_header_generate = func_header_generate
|
||||||
--[=[
|
--[=[
|
||||||
-- tests
|
-- tests
|
||||||
local line = [[struct ImDrawListSharedData
|
local line = [[struct ImDrawListSharedData
|
||||||
|
@@ -115,151 +115,10 @@ local function func_header_impl_generate(FP)
|
|||||||
cfuncsstr = cfuncsstr:gsub("\n+","\n") --several empty lines to one empty line
|
cfuncsstr = cfuncsstr:gsub("\n+","\n") --several empty lines to one empty line
|
||||||
return cfuncsstr
|
return cfuncsstr
|
||||||
end
|
end
|
||||||
local function func_header_generate(FP)
|
|
||||||
|
|
||||||
local outtab = {}
|
local func_header_generate = cpp2ffi.func_header_generate
|
||||||
table.insert(outtab,"#ifndef CIMGUI_DEFINE_ENUMS_AND_STRUCTS\n")
|
local func_implementation = cpp2ffi.func_implementation
|
||||||
for k,v in pairs(FP.embeded_structs) do
|
|
||||||
table.insert(outtab,"typedef "..v.." "..k..";\n")
|
|
||||||
end
|
|
||||||
|
|
||||||
for ttype,v in pairs(FP.templates) do
|
|
||||||
for ttypein,_ in pairs(v) do
|
|
||||||
local te = ttypein:gsub("%s","_")
|
|
||||||
te = te:gsub("%*","Ptr")
|
|
||||||
table.insert(outtab,"typedef "..ttype.."<"..ttypein.."> "..ttype.."_"..te..";\n")
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
table.insert(outtab,"#endif //CIMGUI_DEFINE_ENUMS_AND_STRUCTS\n")
|
|
||||||
for _,t in ipairs(FP.funcdefs) do
|
|
||||||
|
|
||||||
if t.cimguiname then
|
|
||||||
local cimf = FP.defsT[t.cimguiname]
|
|
||||||
local def = cimf[t.signature]
|
|
||||||
assert(def,t.signature..t.cimguiname)
|
|
||||||
local manual = FP.get_manuals(def)
|
|
||||||
if not manual and not def.templated then
|
|
||||||
|
|
||||||
local addcoment = def.comment or ""
|
|
||||||
local empty = def.args:match("^%(%)") --no args
|
|
||||||
if def.constructor then
|
|
||||||
assert(def.stname ~= "","constructor without struct")
|
|
||||||
table.insert(outtab,"CIMGUI_API "..def.stname.."* "..def.ov_cimguiname ..(empty and "(void)" or def.args)..";"..addcoment.."\n")
|
|
||||||
elseif def.destructor then
|
|
||||||
table.insert(outtab,"CIMGUI_API void "..def.ov_cimguiname..def.args..";"..addcoment.."\n")
|
|
||||||
else --not constructor
|
|
||||||
|
|
||||||
if def.stname == "" then --ImGui namespace or top level
|
|
||||||
table.insert(outtab,"CIMGUI_API "..def.ret.." ".. def.ov_cimguiname ..(empty and "(void)" or def.args)..";"..addcoment.."\n")
|
|
||||||
else
|
|
||||||
table.insert(outtab,"CIMGUI_API "..def.ret.." "..def.ov_cimguiname..def.args..";"..addcoment.."\n")
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
else --not cimguiname
|
|
||||||
table.insert(outtab,t.comment:gsub("%%","%%%%").."\n")-- %% substitution for gsub
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
local cfuncsstr = table.concat(outtab)
|
|
||||||
cfuncsstr = cfuncsstr:gsub("\n+","\n") --several empty lines to one empty line
|
|
||||||
return cfuncsstr
|
|
||||||
end
|
|
||||||
|
|
||||||
|
|
||||||
local function ImGui_f_implementation(outtab,def)
|
|
||||||
local ptret = def.retref and "&" or ""
|
|
||||||
table.insert(outtab,"CIMGUI_API".." "..def.ret.." "..def.ov_cimguiname..def.args.."\n")
|
|
||||||
table.insert(outtab,"{\n")
|
|
||||||
local namespace = def.namespace and def.namespace.."::" or ""
|
|
||||||
if def.isvararg then
|
|
||||||
local call_args = def.call_args:gsub("%.%.%.","args")
|
|
||||||
table.insert(outtab," va_list args;\n")
|
|
||||||
table.insert(outtab," va_start(args, fmt);\n")
|
|
||||||
if def.ret~="void" then
|
|
||||||
table.insert(outtab," "..def.ret.." ret = "..namespace..def.funcname.."V"..call_args..";\n")
|
|
||||||
else
|
|
||||||
table.insert(outtab," "..namespace..def.funcname.."V"..call_args..";\n")
|
|
||||||
end
|
|
||||||
table.insert(outtab," va_end(args);\n")
|
|
||||||
if def.ret~="void" then
|
|
||||||
table.insert(outtab," return ret;\n")
|
|
||||||
end
|
|
||||||
elseif def.nonUDT then
|
|
||||||
if def.nonUDT == 1 then
|
|
||||||
table.insert(outtab," *pOut = "..namespace..def.funcname..def.call_args..";\n")
|
|
||||||
end
|
|
||||||
else --standard ImGui
|
|
||||||
table.insert(outtab," return "..ptret..namespace..def.funcname..def.call_args..";\n")
|
|
||||||
end
|
|
||||||
table.insert(outtab,"}\n")
|
|
||||||
end
|
|
||||||
local function struct_f_implementation(outtab,def)
|
|
||||||
local empty = def.args:match("^%(%)") --no args
|
|
||||||
local ptret = def.retref and "&" or ""
|
|
||||||
|
|
||||||
local imgui_stname = def.stname
|
|
||||||
|
|
||||||
table.insert(outtab,"CIMGUI_API".." "..def.ret.." "..def.ov_cimguiname..def.args.."\n")
|
|
||||||
table.insert(outtab,"{\n")
|
|
||||||
if def.isvararg then
|
|
||||||
local call_args = def.call_args:gsub("%.%.%.","args")
|
|
||||||
table.insert(outtab," va_list args;\n")
|
|
||||||
table.insert(outtab," va_start(args, fmt);\n")
|
|
||||||
if def.ret~="void" then
|
|
||||||
table.insert(outtab," "..def.ret.." ret = self->"..def.funcname.."V"..call_args..";\n")
|
|
||||||
else
|
|
||||||
table.insert(outtab," self->"..def.funcname.."V"..call_args..";\n")
|
|
||||||
end
|
|
||||||
table.insert(outtab," va_end(args);\n")
|
|
||||||
if def.ret~="void" then
|
|
||||||
table.insert(outtab," return ret;\n")
|
|
||||||
end
|
|
||||||
elseif def.nonUDT then
|
|
||||||
if def.nonUDT == 1 then
|
|
||||||
table.insert(outtab," *pOut = self->"..def.funcname..def.call_args..";\n")
|
|
||||||
end
|
|
||||||
else --standard struct
|
|
||||||
table.insert(outtab," return "..ptret.."self->"..def.funcname..def.call_args..";\n")
|
|
||||||
end
|
|
||||||
table.insert(outtab,"}\n")
|
|
||||||
end
|
|
||||||
local function func_implementation(FP)
|
|
||||||
|
|
||||||
local outtab = {}
|
|
||||||
for _,t in ipairs(FP.funcdefs) do
|
|
||||||
repeat -- continue simulation
|
|
||||||
if not t.cimguiname then break end
|
|
||||||
local cimf = FP.defsT[t.cimguiname]
|
|
||||||
local def = cimf[t.signature]
|
|
||||||
assert(def)
|
|
||||||
local manual = FP.get_manuals(def)
|
|
||||||
if not manual and not def.templated then
|
|
||||||
if def.constructor then
|
|
||||||
assert(def.stname ~= "","constructor without struct")
|
|
||||||
local empty = def.args:match("^%(%)") --no args
|
|
||||||
table.insert(outtab,"CIMGUI_API "..def.stname.."* "..def.ov_cimguiname..(empty and "(void)" or def.args).."\n")
|
|
||||||
table.insert(outtab,"{\n")
|
|
||||||
table.insert(outtab," return IM_NEW("..def.stname..")"..def.call_args..";\n")
|
|
||||||
table.insert(outtab,"}\n")
|
|
||||||
elseif def.destructor then
|
|
||||||
local args = "("..def.stname.."* self)"
|
|
||||||
local fname = def.stname.."_destroy"
|
|
||||||
table.insert(outtab,"CIMGUI_API void "..fname..args.."\n")
|
|
||||||
table.insert(outtab,"{\n")
|
|
||||||
table.insert(outtab," IM_DELETE(self);\n")
|
|
||||||
table.insert(outtab,"}\n")
|
|
||||||
elseif def.stname == "" then
|
|
||||||
ImGui_f_implementation(outtab,def)
|
|
||||||
else -- stname
|
|
||||||
struct_f_implementation(outtab,def)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
until true
|
|
||||||
end
|
|
||||||
return table.concat(outtab)
|
|
||||||
end
|
|
||||||
-------------------functions for getting and setting defines
|
-------------------functions for getting and setting defines
|
||||||
local function get_defines(t)
|
local function get_defines(t)
|
||||||
if COMPILER == "cl" then print"can't get defines with cl compiler"; return {} end
|
if COMPILER == "cl" then print"can't get defines with cl compiler"; return {} end
|
||||||
@@ -317,9 +176,6 @@ local function DefsByStruct(FP)
|
|||||||
FP.defsBystruct = structs
|
FP.defsBystruct = structs
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
----------custom ImVector templates
|
----------custom ImVector templates
|
||||||
local function generate_templates(code,codeimpool,templates)
|
local function generate_templates(code,codeimpool,templates)
|
||||||
table.insert(code,"\n"..[[typedef struct ImVector{int Size;int Capacity;void* Data;} ImVector;]].."\n")
|
table.insert(code,"\n"..[[typedef struct ImVector{int Size;int Capacity;void* Data;} ImVector;]].."\n")
|
||||||
|
Reference in New Issue
Block a user