#!/usr/bin/ruby require 'getoptlong' def replace_all(line, subst) subst.each do |sub,rep| line = line.gsub('{' + sub + '}', rep) end return line end def split_parts(text) parts = [] text = text.gsub(/[A-Z]+[a-z]*/) do |s| parts << s.downcase end return parts end def gen_underscore_lcase(parts) ret = "" parts.each do |part| ret += part.downcase + '_' end return ret[0..-2] end def gen_from_template(template, nameparts, parentparts, subst, out, ext) begin tc = IO.readlines(template) rescue StandardError => boom print "Template file not found #{template}!\n" return end if out then f = File.open(out + ext, 'w') else f = $stdout end tc.each do |line| f.write(replace_all(line, subst)) end if f != $stdout then f.close end end opts = GetoptLong.new( ["--body", "-b", GetoptLong::NO_ARGUMENT], ["--header", "-h", GetoptLong::NO_ARGUMENT], ["--parent", "-p", GetoptLong::REQUIRED_ARGUMENT], ["--body-template", "-c", GetoptLong::REQUIRED_ARGUMENT], ["--header-template", "-t", GetoptLong::REQUIRED_ARGUMENT], ["--out", "-o", GetoptLong::REQUIRED_ARGUMENT] ) options = {} opts.each do |arg,value| options[arg] = value end parent = (options["--parent"] or "GObject") body_template = (options["--body-template"] or "template.c") header_template = (options["--header-template"] or "template.h") out = (options["--out"] or nil) subst = {} name = ARGV[0] if (name == nil) then print "Class name (camel case, including namespace): " name = gets.chomp end nameparts = split_parts(name) subst['namespace'] = nameparts[0].downcase subst['NAMESPACE'] = nameparts[0].upcase subst['Namespace'] = nameparts[0].capitalize subst['template_'] = gen_underscore_lcase(nameparts[1..-1]) subst['template-'] = subst['template_'].gsub('_', '-') subst['TEMPLATE'] = subst['template_'].upcase subst['Template'] = name[nameparts[0].length..-1] parentparts = split_parts(parent) subst['parent_namespace'] = parentparts[0].downcase subst['PARENT_NAMESPACE'] = parentparts[0].upcase subst['Parent_Namespace'] = parentparts[0].capitalize subst['parent_'] = gen_underscore_lcase(parentparts[1..-1]) subst['parent-'] = subst['parent_'].gsub('_', '-') subst['PARENT'] = subst['parent_'].upcase subst['Parent'] = parent[parentparts[0].length..-1] if !options["--body"] and !options["--header"] then gen_from_template(body_template, nameparts, parentparts, subst, out, ".c") gen_from_template(header_template, nameparts, parentparts, subst, out, '.h') else if options['--body'] then gen_from_template(body_template, nameparts, parentparts, subst, out, '.c') end if options['--header'] then gen_from_template(header_template, nameparts, parentparts, subst, out, '.h') end end print "Done ...\n"