#!/usr/bin/env ruby $VERBOSE = 2 INDENT = ' ' * 4 puts <[\w\s]+\w)\s+(?\w*)\((?[^)]+)\)(?[^;]*);(?.*)$/) do |m| next unless m[:name].match(/^(Begin|Push|Open|Tree|Column)/) next unless m[:name].match(/^TreeNode|PushID|Begin$/) argnames = m[:args].split(/,\s*/).map do |arg| arg = arg.split(/\s*=\s*/, 2).first arg.split(/[ \*]/).last end # Check for obsolete if m[:name] == 'Begin' && (argnames == %w{name p_open size_on_first_use bg_alpha_override flags} || argnames == %w{items_count items_height}) next end $stderr.puts m.inspect if $-d fail "Return value #{m[:type]} is not bool or void" unless %w{bool void}.include?(m[:type]) if !current_class || current_class.name != m[:name] if current_class current_class.close puts end current_class = WrapperClass.new(m) end attrs = m[:attrs].gsub(/IM_FMT(ARGS|LIST)\(\d+\)/) do |a| a.sub(/\d+/) { |index| (index.to_i + 1).to_s } end print "#{INDENT}#{current_class.class_name}(#{m[:args]})#{attrs} { " use_varargs = false if argnames.last == '...' argnames[-1] = 'ap' use_varargs = true print "va_list ap; va_start(ap, fmt); " end print "#{current_class.state_var} = " if current_class.state_var print "ImGui::#{m[:name]}" print 'V' if use_varargs print "(#{argnames.join(', ')}); " print 'va_end(ap); ' if use_varargs puts '}' end end current_class.close if current_class