take care of return in vararg functions

This commit is contained in:
sonoro1234
2018-08-19 10:31:07 +02:00
parent 031bfe5dcc
commit 960c4daa70
4 changed files with 162 additions and 136 deletions

View File

@@ -826,15 +826,17 @@ CIMGUI_API bool igTreeNodeStrStr(const char* str_id,const char* fmt,...)
{ {
va_list args; va_list args;
va_start(args, fmt); va_start(args, fmt);
ImGui::TreeNodeV(str_id,fmt,args); bool ret = ImGui::TreeNodeV(str_id,fmt,args);
va_end(args); va_end(args);
return ret;
} }
CIMGUI_API bool igTreeNodePtr(const void* ptr_id,const char* fmt,...) CIMGUI_API bool igTreeNodePtr(const void* ptr_id,const char* fmt,...)
{ {
va_list args; va_list args;
va_start(args, fmt); va_start(args, fmt);
ImGui::TreeNodeV(ptr_id,fmt,args); bool ret = ImGui::TreeNodeV(ptr_id,fmt,args);
va_end(args); va_end(args);
return ret;
} }
CIMGUI_API bool igTreeNodeVStr(const char* str_id,const char* fmt,va_list args) CIMGUI_API bool igTreeNodeVStr(const char* str_id,const char* fmt,va_list args)
{ {
@@ -852,15 +854,17 @@ CIMGUI_API bool igTreeNodeExStrStr(const char* str_id,ImGuiTreeNodeFlags flags,c
{ {
va_list args; va_list args;
va_start(args, fmt); va_start(args, fmt);
ImGui::TreeNodeExV(str_id,flags,fmt,args); bool ret = ImGui::TreeNodeExV(str_id,flags,fmt,args);
va_end(args); va_end(args);
return ret;
} }
CIMGUI_API bool igTreeNodeExPtr(const void* ptr_id,ImGuiTreeNodeFlags flags,const char* fmt,...) CIMGUI_API bool igTreeNodeExPtr(const void* ptr_id,ImGuiTreeNodeFlags flags,const char* fmt,...)
{ {
va_list args; va_list args;
va_start(args, fmt); va_start(args, fmt);
ImGui::TreeNodeExV(ptr_id,flags,fmt,args); bool ret = ImGui::TreeNodeExV(ptr_id,flags,fmt,args);
va_end(args); va_end(args);
return ret;
} }
CIMGUI_API bool igTreeNodeExVStr(const char* str_id,ImGuiTreeNodeFlags flags,const char* fmt,va_list args) CIMGUI_API bool igTreeNodeExVStr(const char* str_id,ImGuiTreeNodeFlags flags,const char* fmt,va_list args)
{ {

View File

@@ -826,15 +826,17 @@ CIMGUI_API bool igTreeNodeStrStr(const char* str_id,const char* fmt,...)
{ {
va_list args; va_list args;
va_start(args, fmt); va_start(args, fmt);
ImGui::TreeNodeV(str_id,fmt,args); bool ret = ImGui::TreeNodeV(str_id,fmt,args);
va_end(args); va_end(args);
return ret;
} }
CIMGUI_API bool igTreeNodePtr(const void* ptr_id,const char* fmt,...) CIMGUI_API bool igTreeNodePtr(const void* ptr_id,const char* fmt,...)
{ {
va_list args; va_list args;
va_start(args, fmt); va_start(args, fmt);
ImGui::TreeNodeV(ptr_id,fmt,args); bool ret = ImGui::TreeNodeV(ptr_id,fmt,args);
va_end(args); va_end(args);
return ret;
} }
CIMGUI_API bool igTreeNodeVStr(const char* str_id,const char* fmt,va_list args) CIMGUI_API bool igTreeNodeVStr(const char* str_id,const char* fmt,va_list args)
{ {
@@ -852,15 +854,17 @@ CIMGUI_API bool igTreeNodeExStrStr(const char* str_id,ImGuiTreeNodeFlags flags,c
{ {
va_list args; va_list args;
va_start(args, fmt); va_start(args, fmt);
ImGui::TreeNodeExV(str_id,flags,fmt,args); bool ret = ImGui::TreeNodeExV(str_id,flags,fmt,args);
va_end(args); va_end(args);
return ret;
} }
CIMGUI_API bool igTreeNodeExPtr(const void* ptr_id,ImGuiTreeNodeFlags flags,const char* fmt,...) CIMGUI_API bool igTreeNodeExPtr(const void* ptr_id,ImGuiTreeNodeFlags flags,const char* fmt,...)
{ {
va_list args; va_list args;
va_start(args, fmt); va_start(args, fmt);
ImGui::TreeNodeExV(ptr_id,flags,fmt,args); bool ret = ImGui::TreeNodeExV(ptr_id,flags,fmt,args);
va_end(args); va_end(args);
return ret;
} }
CIMGUI_API bool igTreeNodeExVStr(const char* str_id,ImGuiTreeNodeFlags flags,const char* fmt,va_list args) CIMGUI_API bool igTreeNodeExVStr(const char* str_id,ImGuiTreeNodeFlags flags,const char* fmt,va_list args)
{ {

View File

@@ -826,15 +826,17 @@ CIMGUI_API bool igTreeNodeStrStr(const char* str_id,const char* fmt,...)
{ {
va_list args; va_list args;
va_start(args, fmt); va_start(args, fmt);
ImGui::TreeNodeV(str_id,fmt,args); bool ret = ImGui::TreeNodeV(str_id,fmt,args);
va_end(args); va_end(args);
return ret;
} }
CIMGUI_API bool igTreeNodePtr(const void* ptr_id,const char* fmt,...) CIMGUI_API bool igTreeNodePtr(const void* ptr_id,const char* fmt,...)
{ {
va_list args; va_list args;
va_start(args, fmt); va_start(args, fmt);
ImGui::TreeNodeV(ptr_id,fmt,args); bool ret = ImGui::TreeNodeV(ptr_id,fmt,args);
va_end(args); va_end(args);
return ret;
} }
CIMGUI_API bool igTreeNodeVStr(const char* str_id,const char* fmt,va_list args) CIMGUI_API bool igTreeNodeVStr(const char* str_id,const char* fmt,va_list args)
{ {
@@ -852,15 +854,17 @@ CIMGUI_API bool igTreeNodeExStrStr(const char* str_id,ImGuiTreeNodeFlags flags,c
{ {
va_list args; va_list args;
va_start(args, fmt); va_start(args, fmt);
ImGui::TreeNodeExV(str_id,flags,fmt,args); bool ret = ImGui::TreeNodeExV(str_id,flags,fmt,args);
va_end(args); va_end(args);
return ret;
} }
CIMGUI_API bool igTreeNodeExPtr(const void* ptr_id,ImGuiTreeNodeFlags flags,const char* fmt,...) CIMGUI_API bool igTreeNodeExPtr(const void* ptr_id,ImGuiTreeNodeFlags flags,const char* fmt,...)
{ {
va_list args; va_list args;
va_start(args, fmt); va_start(args, fmt);
ImGui::TreeNodeExV(ptr_id,flags,fmt,args); bool ret = ImGui::TreeNodeExV(ptr_id,flags,fmt,args);
va_end(args); va_end(args);
return ret;
} }
CIMGUI_API bool igTreeNodeExVStr(const char* str_id,ImGuiTreeNodeFlags flags,const char* fmt,va_list args) CIMGUI_API bool igTreeNodeExVStr(const char* str_id,ImGuiTreeNodeFlags flags,const char* fmt,va_list args)
{ {

View File

@@ -174,28 +174,28 @@ local function serializeTable(name, value, saved)
end end
--merge tables --merge tables
function mergeT(t1,t2) function mergeT(t1,t2)
for k,v in pairs(t2) do for k,v in pairs(t2) do
t1[k] = v t1[k] = v
end end
return t1 return t1
end end
function strsplit(str, pat) function strsplit(str, pat)
local t = {} local t = {}
local fpat = "(.-)" .. pat local fpat = "(.-)" .. pat
local last_end = 1 local last_end = 1
local s, e, cap = str:find(fpat, 1) local s, e, cap = str:find(fpat, 1)
while s do while s do
table.insert(t,cap) table.insert(t,cap)
last_end = e+1 last_end = e+1
s, e, cap = str:find(fpat, last_end) s, e, cap = str:find(fpat, last_end)
end end
if last_end <= #str then if last_end <= #str then
cap = str:sub(last_end) cap = str:sub(last_end)
table.insert(t, cap) table.insert(t, cap)
elseif str:sub(-1)==pat then elseif str:sub(-1)==pat then
table.insert(t, "") table.insert(t, "")
end end
return t return t
end end
local function save_data(filename,...) local function save_data(filename,...)
local file = io.open(filename,"w") local file = io.open(filename,"w")
@@ -449,13 +449,13 @@ local function func_parser()
local argscsinpars = args:gsub("(=[^,%(%)]*)(%b())","%1") local argscsinpars = args:gsub("(=[^,%(%)]*)(%b())","%1")
argscsinpars = argscsinpars:gsub("(=[^,%(%)]*)([,%)])","%2") argscsinpars = argscsinpars:gsub("(=[^,%(%)]*)([,%)])","%2")
-- if argscsinpars:match("&") then -- if argscsinpars:match("&") then
-- for arg in argscsinpars:gmatch("[%(,]*([^,%(%)]+)[%),]") do -- for arg in argscsinpars:gmatch("[%(,]*([^,%(%)]+)[%),]") do
-- if arg:match("&") and not arg:match("const") then -- if arg:match("&") and not arg:match("const") then
-- print(funcname,argscsinpars) -- print(funcname,argscsinpars)
-- end -- end
-- end -- end
-- end -- end
--argscsinpars = argscsinpars:gsub("&","") --argscsinpars = argscsinpars:gsub("&","")
local template = argscsinpars:match("ImVector<([%w_]+)>") local template = argscsinpars:match("ImVector<([%w_]+)>")
@@ -465,50 +465,50 @@ local function func_parser()
argscsinpars = argscsinpars:gsub("<([%w_]+)>","_%1") --ImVector argscsinpars = argscsinpars:gsub("<([%w_]+)>","_%1") --ImVector
local argsArr = {} local argsArr = {}
local functype_re = "^%s*[%w%s%*]+%(%*[%w_]+%)%([^%(%)]*%)" local functype_re = "^%s*[%w%s%*]+%(%*[%w_]+%)%([^%(%)]*%)"
local functype_reex = "^(%s*[%w%s%*]+)%(%*([%w_]+)%)(%([^%(%)]*%))" local functype_reex = "^(%s*[%w%s%*]+)%(%*([%w_]+)%)(%([^%(%)]*%))"
local functype_arg_rest = "^(%s*[%w%s%*]+%(%*[%w_]+%)%([^%(%)]*%)),*(.*)" local functype_arg_rest = "^(%s*[%w%s%*]+%(%*[%w_]+%)%([^%(%)]*%)),*(.*)"
local rest = argscsinpars:sub(2,-2) --strip () local rest = argscsinpars:sub(2,-2) --strip ()
while true do while true do
--local tt = strsplit(rest,",") --local tt = strsplit(rest,",")
--for ii,arg in ipairs(tt) do --for ii,arg in ipairs(tt) do
--for arg in argscsinpars:gmatch("[%(,]*([^,%(%)]+)[%),]") do --for arg in argscsinpars:gmatch("[%(,]*([^,%(%)]+)[%),]") do
local type,name,retf,sigf local type,name,retf,sigf
local arg,restt = rest:match(functype_arg_rest) local arg,restt = rest:match(functype_arg_rest)
if arg then if arg then
local t1,namef,t2 = arg:match(functype_reex) local t1,namef,t2 = arg:match(functype_reex)
type=t1.."(*)"..t2;name=namef type=t1.."(*)"..t2;name=namef
retf = t1 retf = t1
sigf = t2 sigf = t2
rest = restt rest = restt
else else
arg,restt = rest:match(",*([^,%(%)]+),*(.*)") arg,restt = rest:match(",*([^,%(%)]+),*(.*)")
if not arg then break end if not arg then break end
rest = restt rest = restt
if arg:match("&") and arg:match("const") then if arg:match("&") and arg:match("const") then
arg = arg:gsub("&","") arg = arg:gsub("&","")
end end
if arg:match("%.%.%.") then if arg:match("%.%.%.") then
type="...";name="..." type="...";name="..."
else else
type,name = arg:match("(.+)%s([^%s]+)") type,name = arg:match("(.+)%s([^%s]+)")
end end
--if not type or not name then print(funcname,type,name,argscsinpars,arg) end --if not type or not name then print(funcname,type,name,argscsinpars,arg) end
--float name[2] to float[2] name --float name[2] to float[2] name
local siz = name:match("(%[%d*%])") local siz = name:match("(%[%d*%])")
if siz then if siz then
type = type..siz type = type..siz
name = name:gsub("(%[%d*%])","") name = name:gsub("(%[%d*%])","")
end end
end end
table.insert(argsArr,{type=type,name=name,ret=retf,signature=sigf}) table.insert(argsArr,{type=type,name=name,ret=retf,signature=sigf})
if arg:match("&") and not arg:match("const") then if arg:match("&") and not arg:match("const") then
print(funcname,argscsinpars) print(funcname,argscsinpars)
end end
end end
argscsinpars = argscsinpars:gsub("&","") argscsinpars = argscsinpars:gsub("&","")
local signature = argscsinpars:gsub("([%w%s%*_]+)%s[%w_]+%s*([,%)])","%1%2") local signature = argscsinpars:gsub("([%w%s%*_]+)%s[%w_]+%s*([,%)])","%1%2")
signature = signature:gsub("%s*([,%)])","%1") --space before , and ) signature = signature:gsub("%s*([,%)])","%1") --space before , and )
@@ -550,7 +550,7 @@ local function func_parser()
defT.isvararg = signature:match("%.%.%.%)$") defT.isvararg = signature:match("%.%.%.%)$")
defT.location = locat defT.location = locat
defT.comment = comment defT.comment = comment
defT.argsT = argsArr defT.argsT = argsArr
if ret then if ret then
defT.ret = clean_spaces(ret:gsub("&","*")) defT.ret = clean_spaces(ret:gsub("&","*"))
defT.retref = ret:match("&") defT.retref = ret:match("&")
@@ -711,50 +711,50 @@ local function gen_structs_and_enums_table(cdefs)
end end
until true until true
end end
--calcule size of name[16+1] [xxx_COUNT] --calcule size of name[16+1] [xxx_COUNT]
local allenums = {} local allenums = {}
--first calc_value in enums --first calc_value in enums
for enumname,enum in pairs(outtab.enums) do for enumname,enum in pairs(outtab.enums) do
for i,t in ipairs(enum) do for i,t in ipairs(enum) do
local val = tonumber(t.value) local val = tonumber(t.value)
if val then if val then
t.calc_value = val t.calc_value = val
elseif t.value:match"<<" then elseif t.value:match"<<" then
local v1,v2 = t.value:match("(%d+)%s*<<%s*(%d+)") local v1,v2 = t.value:match("(%d+)%s*<<%s*(%d+)")
t.calc_value = bit.lshift(v1,v2) t.calc_value = bit.lshift(v1,v2)
elseif t.value:match"|" then --or several enums elseif t.value:match"|" then --or several enums
local ens = t.value local ens = t.value
ens = strsplit(ens,"|") ens = strsplit(ens,"|")
for i,v in ipairs(ens) do ens[i] = allenums[clean_spaces(v)] end for i,v in ipairs(ens) do ens[i] = allenums[clean_spaces(v)] end
t.calc_value = bit.bor(unpack(ens)) t.calc_value = bit.bor(unpack(ens))
elseif allenums[t.value] then elseif allenums[t.value] then
t.calc_value = allenums[t.value] t.calc_value = allenums[t.value]
else else
print("Error unknown value in enums",t.value) print("Error unknown value in enums",t.value)
end end
assert(t.calc_value) assert(t.calc_value)
allenums[t.name] = t.calc_value allenums[t.name] = t.calc_value
end end
end end
--then calcsize in struct members --then calcsize in struct members
for stname,struct in pairs(outtab.structs) do for stname,struct in pairs(outtab.structs) do
for i,t in ipairs(struct) do for i,t in ipairs(struct) do
local val = t.name:match"%[([^%[%]]+)%]" local val = t.name:match"%[([^%[%]]+)%]"
if val then if val then
if tonumber(val) then if tonumber(val) then
t.size = tonumber(val) t.size = tonumber(val)
elseif allenums[val] then elseif allenums[val] then
t.size = allenums[val] t.size = allenums[val]
elseif val:match"%+" then elseif val:match"%+" then
local s1,s2 = val:match("(%d+)%s*%+%s*(%d+)") local s1,s2 = val:match("(%d+)%s*%+%s*(%d+)")
t.size = s1+s2 t.size = s1+s2
else else
print("Error size is",val) print("Error size is",val)
end end
assert(t.size) assert(t.size)
end end
end end
end end
return outtab, typedefs_dict return outtab, typedefs_dict
end end
@@ -770,7 +770,7 @@ local function gen_structs_and_enums(cdefs)
local structnames = {} local structnames = {}
local innerstructs = {} local innerstructs = {}
local typedefs_table = {} local typedefs_table = {}
local typedefs_dict = {} local typedefs_dict = {}
local outtab = {} local outtab = {}
-- Output the file -- Output the file
@@ -831,7 +831,7 @@ typedef struct ImVector ImVector;]])
local struct_closed_name = line:match(struct_closed_re) local struct_closed_name = line:match(struct_closed_re)
if struct_closed_name then if struct_closed_name then
table.insert(typedefs_table,"typedef struct "..struct_closed_name.." "..struct_closed_name..";\n") table.insert(typedefs_table,"typedef struct "..struct_closed_name.." "..struct_closed_name..";\n")
typedefs_dict[struct_closed_name] = "struct "..struct_closed_name typedefs_dict[struct_closed_name] = "struct "..struct_closed_name
end end
end end
@@ -847,14 +847,14 @@ typedef struct ImVector ImVector;]])
local structname = structnames[#structnames] local structname = structnames[#structnames]
--st[#st + 1] = string.format("typedef struct %s %s;\n",structname,structname) --st[#st + 1] = string.format("typedef struct %s %s;\n",structname,structname)
table.insert(typedefs_table,string.format("typedef struct %s %s;\n",structname,structname)) table.insert(typedefs_table,string.format("typedef struct %s %s;\n",structname,structname))
typedefs_dict[structname] = "struct "..structname typedefs_dict[structname] = "struct "..structname
structnames[#structnames] = nil structnames[#structnames] = nil
end end
elseif line:match(struct_closing_re) and not line:match(struct_op_close_re) then elseif line:match(struct_closing_re) and not line:match(struct_op_close_re) then
local structname = structnames[#structnames] local structname = structnames[#structnames]
--table.insert(outtab,"typedef struct "..structname.." "..structname..";\n") --table.insert(outtab,"typedef struct "..structname.." "..structname..";\n")
table.insert(typedefs_table,"typedef struct "..structname.." "..structname..";\n") table.insert(typedefs_table,"typedef struct "..structname.." "..structname..";\n")
typedefs_dict[structname] = "struct "..structname typedefs_dict[structname] = "struct "..structname
structnames[#structnames] = nil structnames[#structnames] = nil
end end
end end
@@ -971,8 +971,15 @@ local function func_implementation(FP)
table.insert(outtab,"{\n") table.insert(outtab,"{\n")
table.insert(outtab," va_list args;\n") table.insert(outtab," va_list args;\n")
table.insert(outtab," va_start(args, fmt);\n") table.insert(outtab," va_start(args, fmt);\n")
table.insert(outtab," ImGui::"..def.funcname.."V"..call_args..";\n") if def.ret~="void" then
table.insert(outtab," "..def.ret.." ret = ImGui::"..def.funcname.."V"..call_args..";\n")
else
table.insert(outtab," ImGui::"..def.funcname.."V"..call_args..";\n")
end
table.insert(outtab," va_end(args);\n") table.insert(outtab," va_end(args);\n")
if def.ret~="void" then
table.insert(outtab," return ret;\n")
end
--cppfile:write(" return ImGui::",def.funcname,def.call_args,";\n") --cppfile:write(" return ImGui::",def.funcname,def.call_args,";\n")
table.insert(outtab,"}\n") table.insert(outtab,"}\n")
else else
@@ -992,8 +999,15 @@ local function func_implementation(FP)
table.insert(outtab,"{\n") table.insert(outtab,"{\n")
table.insert(outtab," va_list args;\n") table.insert(outtab," va_list args;\n")
table.insert(outtab," va_start(args, fmt);\n") table.insert(outtab," va_start(args, fmt);\n")
table.insert(outtab," self->"..def.funcname.."V"..call_args..";\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") table.insert(outtab," va_end(args);\n")
if def.ret~="void" then
table.insert(outtab," return ret;\n")
end
--cppfile:write(" return self->",def.funcname,def.call_args,";\n") --cppfile:write(" return self->",def.funcname,def.call_args,";\n")
table.insert(outtab,"}\n") table.insert(outtab,"}\n")
else else
@@ -1035,7 +1049,7 @@ local function cimgui_generation(postfix,STP,FP)
hstrfile = hstrfile:gsub([[#include "auto_funcs%.cpp"]],cimplem) hstrfile = hstrfile:gsub([[#include "auto_funcs%.cpp"]],cimplem)
hstrfile = hstrfile:gsub([[#include "cimgui%.h"]],[[#include "cimgui]]..postfix..[[.h"]]) hstrfile = hstrfile:gsub([[#include "cimgui%.h"]],[[#include "cimgui]]..postfix..[[.h"]])
save_data("./generated/cimgui"..postfix..".cpp",hstrfile) save_data("./generated/cimgui"..postfix..".cpp",hstrfile)
return typedefs_dict return typedefs_dict
end end
-------------------------------------------------------- --------------------------------------------------------
-----------------------------do it---------------------- -----------------------------do it----------------------