From 59e6a69d888c2febf3efa9c5cfacaa8fe4ab2bb7 Mon Sep 17 00:00:00 2001 From: Victor Bombi Date: Thu, 24 Sep 2020 12:32:36 +0200 Subject: [PATCH] generator.lua: add function to repair default values --- generator/cpp2ffi.lua | 1 + generator/generator.lua | 83 +++++++++++++++++++++++++++++++++++++---- 2 files changed, 77 insertions(+), 7 deletions(-) diff --git a/generator/cpp2ffi.lua b/generator/cpp2ffi.lua index f97d30a..ae16b2e 100644 --- a/generator/cpp2ffi.lua +++ b/generator/cpp2ffi.lua @@ -113,6 +113,7 @@ local function strsplit(str, pat) end return t,t2 end +M.strsplit = strsplit local function split_comment(line) local comment = line:match("(%s*//.*)") --or "" line = line:gsub("%s*//.*","") diff --git a/generator/generator.lua b/generator/generator.lua index 9881ce1..a719d11 100644 --- a/generator/generator.lua +++ b/generator/generator.lua @@ -178,6 +178,77 @@ local function DefsByStruct(FP) FP.defsBystruct = structs end +-- function for repairing funcdefs default values +local function repair_defaults(defsT,str_and_enu) + local enumsvalues = {} + for k,enu in pairs(str_and_enu.enums) do + for i,v in ipairs(enu) do + assert(v.calc_value) + enumsvalues[v.name] = v.calc_value + end + end + local function deleteOuterPars(def) + local w = def:match("^%b()$") + if w then + w = w:gsub("^%((.+)%)$","%1") + return w + else + return def + end + end + local function CleanImU32(def) + def = def:gsub("%(ImU32%)","") + --quitar () de numeros + def = def:gsub("%((%d+)%)","%1") + def = deleteOuterPars(def) + local bb=cpp2ffi.strsplit(def,"|") + for i=1,#bb do + local val = deleteOuterPars(bb[i]) + if val:match"<<" then + local v1,v2 = val:match("(%d+)%s*<<%s*(%d+)") + val = v1*2^v2 + bb[i] = val + end + assert(type(bb[i])=="number") + end + local res = 0 + for i=1,#bb do res = res + bb[i] end + return res + end + for k,defT in pairs(defsT) do + for i,def in ipairs(defT) do + for k,v in pairs(def.defaults) do + --do only if not a c string + local is_cstring = v:sub(1,1)=='"' and v:sub(-1,-1) =='"' + if not is_cstring then + if v:match"::" then --could be nested enum + local enumname = v:gsub("[%w:]-::([%w]+)","%1") + local ok,val = pcall(cpp2ffi.parse_enum_value,enumname,enumsvalues) + if ok then + def.defaults[k] = val + else + print("deleting default ",v) + def.defaults[k] = nil + end + elseif enumsvalues[v] then + def.defaults[k] = enumsvalues[v] + else + local ok,val = pcall(cpp2ffi.parse_enum_value,v,enumsvalues,true) + if ok then + def.defaults[k] = val + else + def.defaults[k] = def.defaults[k]:gsub("%(%(void%s*%*%)0%)","NULL") + if def.defaults[k]:match"%(ImU32%)" then + def.defaults[k] = CleanImU32(def.defaults[k]) + end + end + end + end + end + end + end +end + ----------custom ImVector templates local table_do_sorted = cpp2ffi.table_do_sorted local function generate_templates(code,codeimpool,templates) @@ -364,19 +435,17 @@ parser1:do_parse() save_data("./output/overloads.txt",parser1.overloadstxt) cimgui_generation(parser1) -----------save fundefs in definitions.lua for using in bindings ---DefsByStruct(pFP) -set_defines(parser1.defsT) -save_data("./output/definitions.lua",serializeTableF(parser1.defsT)) - ----------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() - ------------------------ save_data("./output/structs_and_enums.lua",serializeTableF(structs_and_enums_table)) save_data("./output/typedefs_dict.lua",serializeTableF(parser1.typedefs_dict)) +----------save fundefs in definitions.lua for using in bindings +--DefsByStruct(pFP) +set_defines(parser1.defsT) +repair_defaults(parser1.defsT, structs_and_enums_table) +save_data("./output/definitions.lua",serializeTableF(parser1.defsT)) --check every function has ov_cimguiname -- for k,v in pairs(parser1.defsT) do