mirror of
https://github.com/cimgui/cimgui.git
synced 2025-11-30 21:51:40 +00:00
ccc
This commit is contained in:
@@ -40,6 +40,7 @@ typedef unsigned __int64 ImU64;
|
||||
#endif
|
||||
#endif
|
||||
|
||||
PLACE_STRUCTS_C
|
||||
|
||||
#ifdef CIMGUI_DEFINE_ENUMS_AND_STRUCTS
|
||||
#include "imgui_structs.h"
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
Reference in New Issue
Block a user