This commit is contained in:
sonoro1234
2025-11-04 11:09:08 +01:00
parent 393cae9274
commit 1407cd296d
8 changed files with 1124 additions and 1199 deletions

View File

@@ -40,6 +40,7 @@ typedef unsigned __int64 ImU64;
#endif
#endif
PLACE_STRUCTS_C
#ifdef CIMGUI_DEFINE_ENUMS_AND_STRUCTS
#include "imgui_structs.h"

View File

@@ -1,5 +1,5 @@
local M = {}
local insert = table.insert
local function ToStr(t,dometatables)
local function basicToStr (o)
if type(o) == "number" or type(o)=="boolean" then
@@ -936,7 +936,7 @@ local function itemsCount(items)
print(v,its and #its or 0)
end
end
--adding self argument for struct functions
local function AdjustArguments(FP)
for fun,defs in pairs(FP.defsT) do
--struct function but no constructors or static functions or manuals
@@ -1083,6 +1083,7 @@ local function DefsByStruct(FP)
end
return structs
end
M.DefsByStruct = DefsByStruct
local function get_nonPOD(FP)
local defbystruct = DefsByStruct(FP)
--M.prtable(defbystruct)
@@ -1102,8 +1103,139 @@ local function get_nonPOD(FP)
FP.structs_and_enums_table.nonPOD = nonPOD
return nonPOD
end
M.get_nonPOD = get_nonPOD
local function gen_structs_c(FP)
local structs = FP.structs_and_enums_table.structs
local tabs = {}
local tabs_c = {}
--for k,v in pairs(FP.nP_used) do
M.table_do_sorted(FP.nP_used, function(k,v)
insert(tabs,"typedef struct "..k.."_c "..k.."_c;")
insert(tabs_c,"typedef struct "..k.."_c "..k..";")
insert(tabs,"struct "..k.."_c {")
local struct = structs[k]
for i,field in ipairs(struct) do
insert(tabs," "..field.type.." "..field.name..";")
end
insert(tabs,"};")
end)
if #tabs_c > 0 then
insert(tabs_c,1,"#ifdef CIMGUI_DEFINE_ENUMS_AND_STRUCTS")
insert(tabs_c,"#endif")
end
--print(table.concat(tabs_c,"\n"))
--print(table.concat(tabs,"\n"))
return table.concat(tabs_c,"\n").."\n"..table.concat(tabs,"\n")
end
local function gen_field_conversion(tab, struct, FP, prefix)
prefix = prefix or ""
local structs = FP.structs_and_enums_table.structs
for i,field in ipairs(struct) do
if FP.nP_used[field.type] then
gen_field_conversion(tab, structs[field.type],FP, prefix..field.name..".")
else
insert(tab," dest."..prefix..field.name.." = src."..prefix..field.name..";")
end
end
end
local function genConversions(FP)
local structs = FP.structs_and_enums_table.structs
local convers = {}
--for k,v in pairs(FP.nP_used) do
M.table_do_sorted(FP.nP_used, function(k,v)
insert(convers,"static inline "..k.." ConvertToCPP_"..k.."(const "..k.."_c& src)")
insert(convers,"{")
insert(convers," "..k.." dest;")
local struct = structs[k]
gen_field_conversion(convers,struct,FP)
insert(convers," return dest;")
insert(convers,"}")
insert(convers,"static inline "..k.."_c ConvertFromCPP_"..k.."(const "..k.."& src)")
insert(convers,"{")
insert(convers," "..k.."_c dest;")
local struct = structs[k]
gen_field_conversion(convers,struct,FP)
insert(convers," return dest;")
insert(convers,"}")
end)
--print(table.concat(convers,"\n"))
return table.concat(convers,"\n")
end
local function get_nonPODused(FP)
print("get_nonPODused-----------------------------")
local nonPOD = FP.structs_and_enums_table.nonPOD
--M.prtable(nonPOD)
local typeargs = {}
local typeargs_ret = {}
for k,defs in pairs(FP.defsT) do
--print(k)
for i, w in ipairs(defs) do
if not w.templated then --and not w.location:match"internal" then
for ii,arg in ipairs(w.argsT) do
local typ = (arg.type):gsub("&","")
--typ = (typ):gsub("*","")
typ = (typ):gsub("const ","")
if nonPOD[typ] then
--print(arg.type,w.ov_cimguiname,w.location)
typeargs[arg.type] = (arg.type):gsub(typ,typ.."_c")
end
end
local typret = (w.ret or ""):gsub("&","")
--typret = (typret):gsub("*","")
typret = (typret):gsub("const ","")
--print(typret)
if nonPOD[typret] then
--print(w.ret,w.ov_cimguiname,w.location)
typeargs_ret[w.ret] = (w.ret):gsub(typret,typret.."_c")
end
end
end
end
local all_type_nP = {}
for k,v in pairs(typeargs) do
local k2 = k:gsub("const ","")
all_type_nP[k2] = true
end
for k,v in pairs(typeargs_ret) do
local k2 = k:gsub("const ","")
all_type_nP[k2] = true
end
FP.nP_used = all_type_nP
FP.nP_args = typeargs
FP.nP_ret = typeargs_ret
--genConversions(FP)
--M.prtable(typeargs,typeargs_ret,all_type_nP)
-- local typeargs2 = {}
-- for k,v in pairs(typeargs) do table.insert(typeargs2,k) end
-- table.sort(typeargs2)
-- print"------------typeargs2----------------"
-- M.prtable(typeargs2)
-- local typeargs2_ret = {}
-- for k,v in pairs(typeargs_ret) do table.insert(typeargs2_ret,k) end
-- table.sort(typeargs2_ret)
-- print"------------typeargs2_ret----------------"
-- M.prtable(typeargs2_ret)
end
local function ADDnonUDT(FP)
local nonPOD = get_nonPOD(FP)
get_nonPODused(FP)
for k,defs in pairs(FP.defsT) do
for i, def in ipairs(defs) do
--ret
--local typret = (def.ret):gsub("const ","")
if FP.nP_ret[def.ret] then
def.conv = (def.ret):gsub("const ","")
def.ret = FP.nP_ret[def.ret]
def.nonUDT = 1
end
end
end
end
local function ADDnonUDT_OLD(FP)
local nonPOD = get_nonPOD(FP)
get_nonPODused(FP)
--print"nonPOD"
--M.prtable(nonPOD)
local defsT = FP.defsT
@@ -1125,6 +1257,7 @@ local function ADDnonUDT(FP)
if (not isUDT) and FP.cimgui_inherited and FP.cimgui_inherited.nonPOD[defT.ret] then
isUDT = true
end
--given in generator.lua , could be skipped
for _,udt_ret in ipairs(FP.UDTs) do
if udt_ret == defT.ret then isUDT=true; break end
end
@@ -1288,7 +1421,9 @@ function M.Parser()
par.manuals = {}
par.skipped = {}
par.UDTs = {}
par.genConversors = genConversions
par.gen_structs_c = gen_structs_c
function par:insert(line,loca)
--table.insert(cdefs,{line,loca})
--table.insert(cdefs,{line:gsub("^%s*(.-)%s*$", "%1"),loca})
@@ -1343,8 +1478,9 @@ function M.Parser()
function par:do_parse()
self:parseItems()
self:gen_structs_and_enums_table()
self:gen_structs_and_enums()
self:compute_overloads()
self:gen_structs_and_enums()
--self:compute_overloads()
--self:compute_templated()
ADDdestructors(self)
end
@@ -1714,6 +1850,30 @@ function M.Parser()
function par:header_text_insert(tab,txt,it)
table.insert(tab, txt)
end
local function function_parse(self,it)
local stname = ""
local namespace
if it.parent then
if it.parent.re_name == "struct_re" or it.parent.re_name == "typedef_st_re" or it.parent.re_name == "class_re" then
stname = it.parent.name
elseif it.parent.re_name == "namespace_re" then
namespace = get_parents_nameC(it) --it.parent.name
end
end
if it.item:match"^%s*template%s+<" then
local ttype,fun = it.item:match"^%s*template%s+<%s*typename%s+([^>]+)%s*>%s*(.+)$"
if self.ftemplate_list and self.ftemplate_list[ttype] then
for iT,vT in ipairs(self.ftemplate_list[ttype]) do
local funT = fun:gsub("([< %(])"..ttype,"%1"..vT)
--funT = funT:gsub("sizeof%("..ttype.."%)","sizeof("..vT..")")
--local funT = fun:gsub(ttype,vT)
self:parseFunction(stname,{item=funT},namespace,it.locat)
end
end
else
self:parseFunction(stname,it,namespace,it.locat)
end
end
function par:gen_structs_and_enums()
print"--------------gen_structs_and_enums"
--M.prtable(self.typenames)
@@ -1851,28 +2011,7 @@ function M.Parser()
elseif it.re_name == "namespace_re" or it.re_name == "union_re" or it.re_name == "functype_re" then
--nop
elseif it.re_name == "functionD_re" or it.re_name == "function_re" then
local stname = ""
local namespace
if it.parent then
if it.parent.re_name == "struct_re" or it.parent.re_name == "typedef_st_re" or it.parent.re_name == "class_re" then
stname = it.parent.name
elseif it.parent.re_name == "namespace_re" then
namespace = get_parents_nameC(it) --it.parent.name
end
end
if it.item:match"^%s*template%s+<" then
local ttype,fun = it.item:match"^%s*template%s+<%s*typename%s+([^>]+)%s*>%s*(.+)$"
if self.ftemplate_list and self.ftemplate_list[ttype] then
for iT,vT in ipairs(self.ftemplate_list[ttype]) do
local funT = fun:gsub("([< %(])"..ttype,"%1"..vT)
--funT = funT:gsub("sizeof%("..ttype.."%)","sizeof("..vT..")")
--local funT = fun:gsub(ttype,vT)
self:parseFunction(stname,{item=funT},namespace,it.locat)
end
end
else
self:parseFunction(stname,it,namespace,it.locat)
end
--function_parse(self,it)
else
if it.re_name~="operator_re" then
print("not processed gen",it.re_name,it.item:sub(1,20))
@@ -1893,6 +2032,7 @@ function M.Parser()
check_arg_detection(self.defsT,self.typedefs_dict)
local outtabprest, outtabst = table.concat(outtabpre,""),table.concat(outtab,"")
self.structs_and_enums = {outtabprest, outtabst or ""}
return outtabprest, outtabst
end
-----------
@@ -2086,7 +2226,9 @@ function M.Parser()
end
elseif it.re_name == "namespace_re" or it.re_name == "union_re" or it.re_name == "functype_re" then
--nop
elseif it.re_name ~= "functionD_re" and it.re_name ~= "function_re" and it.re_name ~= "operator_re" then
elseif it.re_name ~= "functionD_re" or it.re_name ~= "function_re" then
function_parse(self,it)
elseif it.re_name ~= "operator_re" then
print("not processed gen table",it.re_name)
end
end
@@ -2683,7 +2825,8 @@ local function ImGui_f_implementation(def)
table.insert(outtab, "#endif\n")
elseif def.nonUDT then
if def.nonUDT == 1 then
table.insert(outtab," *pOut = "..namespace..def.funcname..def.call_args..";\n")
--table.insert(outtab," *pOut = "..namespace..def.funcname..def.call_args..";\n")
insert(outtab," return ConverFromCPP_ImVec2("..namespace..def.funcname..def.call_args..");\n")
end
table.insert(outtab,"}\n")
else --standard ImGui
@@ -2717,7 +2860,9 @@ local function struct_f_implementation(def)
end
elseif def.nonUDT then
if def.nonUDT == 1 then
table.insert(outtab," *pOut = self->"..def.funcname..def.call_args..";\n")
--table.insert(outtab," *pOut = self->"..def.funcname..def.call_args..";\n")
--local typret = (def.ret):gsub("const ","")
insert(outtab," return ConverFromCPP_"..def.conv.."(self->"..def.funcname..def.call_args..");\n")
end
else --standard struct
table.insert(outtab," return "..ptret.."self->"..def.funcname..def.call_args..";\n")
@@ -2839,17 +2984,18 @@ local function func_header_generate_funcs(FP)
elseif def.destructor then
table.insert(outtab,"CIMGUI_API void "..def.ov_cimguiname..def.args..";"..addcoment.."\n")
else --not constructor
--local ret = FP.nP_ret[def.ret] or def.ret
local ret = def.ret
if def.stname == "" or def.is_static_function then --ImGui namespace or top level
table.insert(outtab,"CIMGUI_API "..def.ret.." ".. def.ov_cimguiname ..(empty and "(void)" or def.args)..";"..addcoment.."\n")
table.insert(outtab,"CIMGUI_API "..ret.." ".. def.ov_cimguiname ..(empty and "(void)" or def.args)..";"..addcoment.."\n")
if def.isvararg then
-- For variadic functions we add a function implementation with zero argumets, for compatibility with languages such as C#.
table.insert(outtab, "#ifdef CIMGUI_VARGS0\n")
table.insert(outtab, "CIMGUI_API".." "..def.ret.." "..def.ov_cimguiname.."0"..paramListWithoutDots(def.args)..";\n")
table.insert(outtab, "CIMGUI_API".." "..ret.." "..def.ov_cimguiname.."0"..paramListWithoutDots(def.args)..";\n")
table.insert(outtab, "#endif\n")
end
else
table.insert(outtab,"CIMGUI_API "..def.ret.." "..def.ov_cimguiname..def.args..";"..addcoment.."\n")
table.insert(outtab,"CIMGUI_API "..ret.." "..def.ov_cimguiname..def.args..";"..addcoment.."\n")
end
end
end

View File

@@ -124,10 +124,14 @@ local function func_header_impl_generate(FP)
local outtab = {}
for _,t in ipairs(FP.funcdefs) do
if t.cimguiname then
local cimf = FP.defsT[t.cimguiname]
local def = cimf[t.signature]
-- for _,t in ipairs(FP.funcdefs) do
-- if t.cimguiname then
-- local cimf = FP.defsT[t.cimguiname]
-- local def = cimf[t.signature]
--for k,defs in pairs(FP.defsT) do
cpp2ffi.table_do_sorted(FP.defsT, function(i,defs)
if true then
for i, def in ipairs(defs) do
local addcoment = def.comment or ""
local empty = def.args:match("^%(%)") --no args
if def.constructor then
@@ -147,10 +151,11 @@ local function func_header_impl_generate(FP)
error("class function in implementations")
end
end
end
else --not cimguiname
table.insert(outtab,t.comment:gsub("%%","%%%%").."\n")-- %% substitution for gsub
end
end
end)
local cfuncsstr = table.concat(outtab)
cfuncsstr = cfuncsstr:gsub("\n+","\n") --several empty lines to one empty line
return cfuncsstr
@@ -271,7 +276,10 @@ local function cimgui_generation(parser)
--]]
--------------------------------------------------
local hstrfile = read_data"./cimgui_template.h"
hstrfile = hstrfile:gsub([[PLACE_STRUCTS_C]],parser:gen_structs_c())
local outpre,outpost = parser.structs_and_enums[1],parser.structs_and_enums[2]
cpp2ffi.prtable(parser.templates)
cpp2ffi.prtable(parser.typenames)
@@ -310,7 +318,10 @@ local function cimgui_generation(parser)
local cimplem = func_implementation(parser)
cimplem = colapse_defines(cimplem, "IMGUI_ENABLE_FREETYPE")
local hstrfile = read_data"./cimgui_template.cpp"
local conversors = parser:genConversors()
cimplem = conversors .. cimplem
hstrfile = hstrfile:gsub([[#include "auto_funcs%.cpp"]],cimplem)
local ftdef = "" --FREETYPE_GENERATION and "#define IMGUI_ENABLE_FREETYPE\n" or ""
save_data("./output/cimgui.cpp",cimgui_header, ftdef, hstrfile)

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff