From: Kevin Ollivier Date: Fri, 17 Jul 2009 18:39:26 +0000 (+0000) Subject: Adding preliminary code for C bindings, thanks to Luke A. Guest. X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/1013a78945f502d451641aef576ae7111b38bdf5 Adding preliminary code for C bindings, thanks to Luke A. Guest. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@61445 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- diff --git a/docs/doxygen/scripts/c_tools.py b/docs/doxygen/scripts/c_tools.py new file mode 100644 index 0000000000..6df0d9bece --- /dev/null +++ b/docs/doxygen/scripts/c_tools.py @@ -0,0 +1,73 @@ +""" +C bindings generator +Author: Luke A. Guest +""" + +import os + +from common import * + +class CBuilder: + def __init__(self, doxyparse, outputdir): + self.doxyparser = doxyparse + self.output_dir = outputdir + + def make_bindings(self): + output_dir = os.path.abspath(os.path.join(self.output_dir, "c")) + if not os.path.exists(output_dir): + os.makedirs(output_dir) + + for aclass in self.doxyparser.classes: + # This bit doesn't work, because the aclass.name is not the same as + # those listed in common + if aclass.name in excluded_classes: + #print "Skipping %s" % aclass.name + continue + + self.make_c_header(output_dir, aclass) + + + def make_c_header(self, output_dir, aclass): + filename = os.path.join(output_dir, aclass.name[2:].lower() + ".hh") + enums_text = make_enums(aclass) + method_text = self.make_c_methods(aclass) + class_name = aclass.name[2:].capitalize() + text = """ +// Enums +%s + +%s +""" % (enums_text, method_text) + + afile = open(filename, "wb") + afile.write(text) + afile.close() + + + def make_c_methods(self, aclass): + retval = "" + + wxc_classname = 'wxC' + aclass.name[2:].capitalize() + + for amethod in aclass.constructors: + if amethod.name.startswith('m_'): + # for some reason, public members are listed as methods + continue + retval += """ +// %s +%s%s;\n\n +""" % (amethod.brief_description, wxc_classname + '* ' + wxc_classname + '_' + amethod.name, amethod.argsstring) + + for amethod in aclass.methods: + args = '(' + wxc_classname + '* obj' + if amethod.argsstring.find('()') != -1: + args += ')' + else: + args += ', ' + amethod.argsstring[1:].strip() + + retval += """ +// %s +%s %s%s;\n +""" % (amethod.detailed_description, amethod.return_type, wxc_classname + '_' + amethod.name, args) + + return retval diff --git a/docs/doxygen/scripts/make_bindings.py b/docs/doxygen/scripts/make_bindings.py index e3e83047c1..5411d07b56 100644 --- a/docs/doxygen/scripts/make_bindings.py +++ b/docs/doxygen/scripts/make_bindings.py @@ -1,34 +1,37 @@ -import doxymlparser import optparse import sys import os import string +import types + +import c_tools +import doxymlparser import sip_tools import swig_tools -import types from common import * -option_dict = { - "output_dir" : ("output", "Directory to output bindings to"), - "sip" : (True, "Produce SIP bindings"), - "swig" : (True, "Produce SWIG bindings."), - -} - -parser = optparse.OptionParser(usage="usage: %prog \n" , version="%prog 1.0") - -for opt in option_dict: - default = option_dict[opt][0] +if __name__ == "__main__": + option_dict = { + "output_dir" : ("output", "Directory to output bindings to"), + "sip" : (True, "Produce SIP bindings"), + "swig" : (True, "Produce SWIG bindings."), + "c" : (True, "Produce C wrappers."), + + } - action = "store" - if type(default) == types.BooleanType: - action = "store_true" - parser.add_option("--" + opt, default=default, action=action, dest=opt, help=option_dict[opt][1]) - -options, arguments = parser.parse_args() + parser = optparse.OptionParser(usage="usage: %prog \n" , version="%prog 1.0") + + for opt in option_dict: + default = option_dict[opt][0] + + action = "store" + if type(default) == types.BooleanType: + action = "store_true" + parser.add_option("--" + opt, default=default, action=action, dest=opt, help=option_dict[opt][1]) + + options, arguments = parser.parse_args() -if __name__ == "__main__": if len(arguments) < 1: parser.print_usage() sys.exit(1) @@ -44,3 +47,7 @@ if __name__ == "__main__": if options.swig: builder = swig_tools.SWIGBuilder(doxyparse, options.output_dir) builder.make_bindings() + + if options.c: + builder = c_tools.CBuilder(doxyparse, options.output_dir) + builder.make_bindings()