From 45aada6ecb0f4f6a42299a1bf7764603d6561595 Mon Sep 17 00:00:00 2001 From: Victor Bombi Date: Mon, 14 Dec 2020 17:57:47 +0100 Subject: [PATCH] preparation for 1.80 with imgui_tables.cpp addition and 8bytes enum values --- CMakeLists.txt | 8 ++++++++ generator/cpp2ffi.lua | 43 +++++++++++++++++++++++++++++++++++------ generator/generator.lua | 2 +- test/main.c | 5 +++-- 4 files changed, 49 insertions(+), 9 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 9565e3e..6268c16 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -2,6 +2,13 @@ cmake_minimum_required(VERSION 3.1) project(cimgui) +if (EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/imgui/imgui_tables.cpp) + set(TABLES_SOURCE "imgui/imgui_tables.cpp") +else() + set(TABLES_SOURCE "") +endif() + + #general settings file(GLOB IMGUI_SOURCES cimgui.cpp @@ -9,6 +16,7 @@ file(GLOB IMGUI_SOURCES imgui/imgui_draw.cpp imgui/imgui_demo.cpp imgui/imgui_widgets.cpp + ${TABLES_SOURCE} ) set(IMGUI_STATIC "no" CACHE STRING "Build as a static library") diff --git a/generator/cpp2ffi.lua b/generator/cpp2ffi.lua index 8c5b05a..138fdce 100644 --- a/generator/cpp2ffi.lua +++ b/generator/cpp2ffi.lua @@ -182,6 +182,9 @@ local function parse_enum_value(value, allenums,dontpost) local val2 = clean(several[i+1]) if allenums[val1] then val1 = allenums[val1] end if allenums[val2] then val2 = allenums[val2] end + --for getting numbers from "1ULL" + if type(val1)=="string" then val1 = loadstring("return "..val1)() end + if type(val2)=="string" then val2 = loadstring("return "..val2)() end if v=="~" then assert(several[i]==" " or several[i]=="") several[i] = bit.bnot(val2) @@ -214,12 +217,14 @@ local function parse_enum_value(value, allenums,dontpost) end if #seps>0 or type(several[1])~="number" and not dontpost then --M.prtable("enline",enline) - print("parse_enum_value WARNING",value) + print("parse_enum_value WARNING",value,several[1]) --M.prtable(several,seps) --M.prtable("allenums",allenums) end assert(#seps==0) - assert(type(several[1])=="number") + assert(type(several[1])=="number" or type(several[1])=="cdata") + --converst 1ULL to "1ULL" + if type(several[1])=="cdata" then several[1] = tostring(several[1]) end return several[1] end end @@ -967,6 +972,7 @@ function M.Parser() end function par:do_parse() self:parseItems() + self:gen_structs_and_enums_table() self:gen_structs_and_enums() self:compute_overloads() --self:compute_templated() @@ -1195,10 +1201,28 @@ function M.Parser() end end elseif it.re_name == "enum_re" then - local enumname, enumbody = it.item:match"^%s*enum%s+([^%s;{}]+)[%s\n\r]*(%b{})" + --local enumname, enumbody = it.item:match"^%s*enum%s+([^%s;{}]+)[%s\n\r]*(%b{})" + local enumname = it.item:match"^%s*enum%s+([^%s;{}]+)" if enumname then - enumbody = clean_comments(enumbody) - table.insert(outtab,"\ntypedef enum ".. enumbody..enumname..";") + --if it's an enum with int type changed + if self.structs_and_enums_table.enumtypes[enumname] then + local enumtype = self.structs_and_enums_table.enumtypes[enumname] + local enumbody = "" + local extraenums = "" + for i,v in ipairs(self.structs_and_enums_table.enums[enumname]) do + if type(v.calc_value)=="string" then + extraenums = extraenums .."\nstatic const "..enumtype.." "..v.name.." = "..v.calc_value..";" + else + enumbody = enumbody .. "\n" ..v.name .."="..v.value.."," + end + end + enumbody = "{"..enumbody.."\n}" + table.insert(outtab,"\ntypedef enum ".. enumbody..enumname..";"..extraenums) + else + local enumbody = it.item:match"(%b{})" + enumbody = clean_comments(enumbody) + table.insert(outtab,"\ntypedef enum ".. enumbody..enumname..";") + end if it.parent then if it.parent.re_name == "namespace_re" then local namespace = it.parent.item:match("namespace%s+(%S+)") @@ -1208,6 +1232,7 @@ function M.Parser() else --unamed enum just repeat declaration local cl_item = clean_comments(it.item) table.insert(outtab,cl_item) + print("unnamed enum",cl_item) end elseif it.re_name == "struct_re" or it.re_name == "typedef_st_re" then local cleanst,structname,strtab,comstab,predec = self:clean_structR1(it) @@ -1319,6 +1344,11 @@ function M.Parser() enumname = "unnamed"..unnamed_enum_counter print("unamed enum",enumname,it.parent and ("parent:"..it.parent.name) or "no parent") end + local enumtype = it.item:match"^%s*enum%s+[^%s;{}:]+%s*:%s*([^{%s]+)" + if enumtype then + print("enumtype",enumtype) + outtab.enumtypes[enumname] = enumtype + end outtab.enums[enumname] = {} table.insert(enumsordered,enumname) local inner = strip_end(it.item:match("%b{}"):sub(2,-2)) @@ -1366,7 +1396,7 @@ function M.Parser() end par.enums_for_table = enums_for_table function par:gen_structs_and_enums_table() - local outtab = {enums={},structs={},locations={}} + local outtab = {enums={},structs={},locations={},enumtypes={}} self.typedefs_table = {} local enumsordered = {} unnamed_enum_counter = 0 @@ -1435,6 +1465,7 @@ function M.Parser() end end end + self.structs_and_enums_table = outtab return outtab end par.alltypes = {} diff --git a/generator/generator.lua b/generator/generator.lua index 2796776..21cd1a6 100644 --- a/generator/generator.lua +++ b/generator/generator.lua @@ -396,7 +396,7 @@ cimgui_generation(parser1) ----------save struct and enums lua table in structs_and_enums.lua for using in bindings -local structs_and_enums_table = parser1:gen_structs_and_enums_table() +local structs_and_enums_table = parser1.structs_and_enums_table save_data("./output/structs_and_enums.lua",serializeTableF(structs_and_enums_table)) save_data("./output/typedefs_dict.lua",serializeTableF(parser1.typedefs_dict)) diff --git a/test/main.c b/test/main.c index 4aa30df..dca3440 100644 --- a/test/main.c +++ b/test/main.c @@ -27,13 +27,14 @@ int main(void) static float f = 0.0f; igText("Hello World!"); - igSliderFloat("float", &f, 0.0f, 1.0f, "%.3f", 1.0f); + igSliderFloat("float", &f, 0.0f, 1.0f, "%.3f", 0); igText("Application average %.3f ms/frame (%.1f FPS)", 1000.0f / io->Framerate, io->Framerate); igShowDemoWindow(NULL); igRender(); } - + printf("%llu\n",ImGuiWindowFlags_NoTitleBar); + printf("size: %d\n",sizeof(ImGuiWindowFlags_NoTitleBar)); printf("DestroyContext()\n"); igDestroyContext(NULL);