From e3cbc0119ee06b52c667642afdd38eb33b31f787 Mon Sep 17 00:00:00 2001 From: sonoro1234 Date: Tue, 26 Nov 2019 09:56:37 +0100 Subject: [PATCH] generator.lua: preparation of imgui_internal inclusion --- generator/generator.lua | 93 +++++++++++++++++++---------------------- 1 file changed, 42 insertions(+), 51 deletions(-) diff --git a/generator/generator.lua b/generator/generator.lua index c86a625..6b7d76a 100644 --- a/generator/generator.lua +++ b/generator/generator.lua @@ -220,6 +220,7 @@ local function func_header_generate(FP) 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","_") @@ -471,12 +472,10 @@ local function cimgui_generation(parser) local hstrfile = read_data"./cimgui_template.h" local outpre,outpost = parser:gen_structs_and_enums() - --parser.templates get completely defined here - --cpp2ffi.prtable(parser.templates) local outtab = {} generate_templates(outtab,parser.templates) - local cstructsstr = outpre..table.concat(outtab,"")..outpost + local cstructsstr = outpre..table.concat(outtab,"")..outpost..(extra or "") hstrfile = hstrfile:gsub([[#include "imgui_structs%.h"]],cstructsstr) local cfuncsstr = func_header_generate(parser) @@ -555,45 +554,54 @@ print("------------------generation with "..COMPILER.."------------------------" --local parser1 = parseImGuiHeader([[headers.h]],{[[imgui]],[[imgui_internal]],[[imstb_textedit]]}) local parser1 = parseImGuiHeader([[../imgui/imgui.h]],{[[imgui]]}) parser1:do_parse() ---table.sort(parser1.funcdefs, function(a,b) return a.cimguiname < b.cimguiname end) ---parser1:dump_alltypes() ---parser1:printItems() ---[[ -for i,v in ipairs(parser1.itemsarr) do - if v.item:match"ImRect" then - print(v.re_name) - print(v.item) - end -end ---]] ----------- add ImGuiContext from imgui_internal.h --[=[ local parser1i = parseImGuiHeader([[../imgui/imgui_internal.h]],{[[imgui_internal]],[[imstb_textedit]]}) parser1i:do_parse() -for i,v in ipairs(parser1i.itemsarr) do - if v.re_name == "vardef_re" then - table.insert(parser1.itemsarr,v) - elseif v.re_name == "enum_re" then - table.insert(parser1.itemsarr,v) - elseif v.re_name == "typedef_re" then - table.insert(parser1.itemsarr,v) - elseif v.re_name == "struct_re" or v.re_name=="enum_re" then - if v.item:match"^[%s\n\r]*struct%s*ImGuiContext" then - table.insert(parser1.itemsarr,v) - else - --print(v.item) - local newitem = v.item:match"(struct%s*%S+)" - print("reduced",newitem) - if newitem:match"ImPool" then - table.insert(parser1.itemsarr,{re_name="vardef_re",item=newitem..";"}) - else - table.insert(parser1.itemsarr,v) - end +local p1isten = parser1i:gen_structs_and_enums_table() + +local needed = {ImGuiContext = {type = "ImGuiContext", kind = "structs", order = parser1i.order["ImGuiContext"]}} +local function RecurseNeeded(Ini,IniKind) + for i,v in ipairs(p1isten[IniKind][Ini]) do + local kind = p1isten.enums[v.type] and "enums" or p1isten.structs[v.type] and "structs" + if kind then + needed[v.type] = {type = v.type, kind = kind, order = parser1i.order[v.type]} + RecurseNeeded(v.type,kind) end end end ---cpp2ffi.prtable(parser1i.itemsarr) + +RecurseNeeded("ImGuiContext","structs") + + +local ordered_needed = {} +for k,v in pairs(needed) do + table.insert(ordered_needed,v) +end +table.sort(ordered_needed, function(a,b) return a.order < b.order end) + +for i,vv in ipairs(ordered_needed) do + print(vv.order,vv.type) + local v = parser1i.itemsarr[vv.order] + + if v.item:match"^[%s\n\r]*struct%s*ImGuiContext" then + --add enum keyword where necessary + print"setting enum keyword------------------------" + local newitem = "" + for line in v.item:gmatch("([^\n]+)") do + local typen = line:match"^%s*(%S+)" + if p1isten.enums[typen] then + print("add enum",typen) + newitem = newitem.."\nenum"..line + else + newitem = newitem.."\n"..line + end + end + v.item = newitem + end + table.insert(parser1.itemsarr,v) +end --]=] ---------------------- @@ -628,24 +636,7 @@ save_data("./output/typedefs_dict.lua",serializeTableF(parser1.typedefs_dict)) -- assert(def.ov_cimguiname) -- end -- end -------------imgui_internal.h ---[=[ ---prepare parser -local parser1i = parseImGuiHeader([[../imgui/imgui_internal.h]],[[imgui_internal]]) -parser1i:do_parse() -cpp2ffi.prtable(parser1i.itemsarr) -local outtab = {} -generate_templates(outtab,parser1i.templates) - -local int_structs_and_enums_table = parser1i:gen_structs_and_enums_table() -outtab[#outtab +1] = "struct ImGuiContext\n{\n" -for i,v in ipairs(int_structs_and_enums_table.structs.ImGuiContext) do - outtab[#outtab +1] = " "..v.type.." "..v.name..";\n" -end -outtab[#outtab +1]="}\n" -print(table.concat(outtab)) ---]=] --=================================Now implementations local parser2