From f4e1cc413520712d69f9f8cd8145d5a82db7deda Mon Sep 17 00:00:00 2001 From: Victor Bombi Date: Fri, 28 Aug 2020 17:09:37 +0200 Subject: [PATCH] generator: move C writting functions inside cpp2ffi --- generator/cpp2ffi.lua | 148 ++++++++++++++++++++++++++++++++++++++++ generator/generator.lua | 148 +--------------------------------------- 2 files changed, 150 insertions(+), 146 deletions(-) diff --git a/generator/cpp2ffi.lua b/generator/cpp2ffi.lua index 6701ed2..98649bb 100644 --- a/generator/cpp2ffi.lua +++ b/generator/cpp2ffi.lua @@ -1577,7 +1577,155 @@ local function location(file,locpathT,defines,COMPILER) return location_it end 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 local line = [[struct ImDrawListSharedData diff --git a/generator/generator.lua b/generator/generator.lua index dfcea69..3db2292 100644 --- a/generator/generator.lua +++ b/generator/generator.lua @@ -115,151 +115,10 @@ local function func_header_impl_generate(FP) cfuncsstr = cfuncsstr:gsub("\n+","\n") --several empty lines to one empty line return cfuncsstr end -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 +local func_header_generate = cpp2ffi.func_header_generate +local func_implementation = cpp2ffi.func_implementation - 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 local function get_defines(t) 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 end - - - ----------custom ImVector templates local function generate_templates(code,codeimpool,templates) table.insert(code,"\n"..[[typedef struct ImVector{int Size;int Capacity;void* Data;} ImVector;]].."\n")