sbus_codegen revision b699c4d7f85a5404be1d1ee9450331aea869b886
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein# Stef Walter <stefw@redhat.com>
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein# Copyright (C) 2014 Red Hat
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein# This program is free software; you can redistribute it and/or modify
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein# it under the terms of the GNU General Public License as published by
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein# the Free Software Foundation; either version 3 of the License, or
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein# (at your option) any later version.
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein# This program is distributed in the hope that it will be useful,
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein# but WITHOUT ANY WARRANTY; without even the implied warranty of
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
9011c72c568aedd03709f56f21d639fd55944a74Automatic Updater# GNU General Public License for more details.
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein# You should have received a copy of the GNU General Public License
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein# along with this program. If not, see <http://www.gnu.org/licenses/>.
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein# Some parser code from GLib
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein# Copyright (C) 2008-2011 Red Hat, Inc.
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein# This library is free software; you can redistribute it and/or
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein# modify it under the terms of the GNU Lesser General Public
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein# License as published by the Free Software Foundation; either
71c66a876ecca77923638d3f94cc0783152b2f03Mark Andrews# version 2 of the License, or (at your option) any later version.
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein# This library is distributed in the hope that it will be useful,
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein# but WITHOUT ANY WARRANTY; without even the implied warranty of
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein# Lesser General Public License for more details.
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein# You should have received a copy of the GNU Lesser General
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein# Public License along with this library; if not, write to the
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein# Free Software Foundation, Inc., 59 Temple Place, Suite 330,
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein# Boston, MA 02111-1307, USA.
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein# Portions by: David Zeuthen <davidz@redhat.com>
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein# DBus interfaces are defined here:
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein# http://dbus.freedesktop.org/doc/dbus-specification.html#introspection-format
28b3569d6248168e6c00caab951521cc8141a49dAutomatic Updater# The introspection data format has become the standard way to represent a
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein# DBus interface. For many examples see /usr/share/dbus-1/interfaces/ on a
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein# typical linux machine.
28b3569d6248168e6c00caab951521cc8141a49dAutomatic Updater# A word about annotations. These are extra flags or values that can be
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein# assigned to anything. So far, the codegen supports this annotation:
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein# - An annotation specified in the specification that tells us what C symbol
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein# to generate for a given interface or method. By default the codegen will
28b3569d6248168e6c00caab951521cc8141a49dAutomatic Updater# build up a symbol name from the DBus name.
28b3569d6248168e6c00caab951521cc8141a49dAutomatic Updater# -----------------------------------------------------------------------------
aeb7938001b22e811a910e1b36cdf452f9193865Automatic Updater # Lets us print problems like a compiler would
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein return "%s:%d: %s" % (self.file, self.line, message)
9011c72c568aedd03709f56f21d639fd55944a74Automatic Updater return self.annotations.get("org.freedesktop.DBus.GLib.CSymbol", self.name)
aeb7938001b22e811a910e1b36cdf452f9193865Automatic Updater def __init__(self, method, name, signature):
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein return "%s_%s" % (self.iface.c_name(), self.c_name())
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein return "%s_%s" % (self.iface.c_name(), self.c_name())
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein def __init__(self, iface, name, signature, access):
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein raise DBusXmlException('Invalid access type %s'%self.access)
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein return "%s_%s" % (self.iface.c_name(), self.c_name())
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein return self.annotations.get("org.freedesktop.DBus.GLib.CSymbol",
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein# -----------------------------------------------------------------------------
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein# Code Generation
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein out("/* arguments for %s.%s */", parent.iface.name, parent.name)
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein out("const struct sbus_arg_meta %s%s[] = {", parent.fq_c_name(), suffix)
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein out(" { \"%s\", \"%s\" },", arg.name, arg.signature)
5a4557e8de2951a2796676b5ec4b6a90caa5be14Mark Andrews out("const struct sbus_method_meta %s__methods[] = {", iface.c_name())
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein out("const struct sbus_signal_meta %s__signals[] = {", iface.c_name())
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein out("const struct sbus_property_meta %s__properties[] = {", iface.c_name())
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein out(" SBUS_PROPERTY_READABLE | SBUS_PROPERTY_WRITABLE,")
ceeb18e6907a10547859faa340ecad83bedae90cMark Andrews out("extern const struct sbus_interface_meta %s_meta;", iface.c_name())
ceeb18e6907a10547859faa340ecad83bedae90cMark Andrews out("const struct sbus_interface_meta %s_meta = {", iface.c_name())
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein out("/* The following definitions are auto-generated from %s */", basename)
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein guard = "__%s__" % re.sub(r'([^_A-Z0-9])', "_", basename.upper())
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein out("/* The following declarations are auto-generated from %s */", basename)
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein out("/* ------------------------------------------------------------------------")
ceeb18e6907a10547859faa340ecad83bedae90cMark Andrews out(" * These structure definitions are filled in with the information about")
ceeb18e6907a10547859faa340ecad83bedae90cMark Andrews out(" * the interfaces, methods, properties and so on.")
ceeb18e6907a10547859faa340ecad83bedae90cMark Andrews out(" * The actual definitions are found in the accompanying C file next")
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein# -----------------------------------------------------------------------------
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein# XML Interface Parsing
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein raise DBusXmlException("Missing attribute '%s'" % name)
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein raise DBusXmlException("Empty attribute '%s'" % name)
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein parser.CharacterDataHandler = self.handle_char_data
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein parser.StartElementHandler = self.handle_start_element
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein parser.EndElementHandler = self.handle_end_element
5a4557e8de2951a2796676b5ec4b6a90caa5be14Mark Andrews elif self.cur_object and name == STATE_ANNOTATION:
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein self.cur_object.annotations[expect_attr(attrs, 'name')] = val
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein method = Method(self.cur_object, expect_attr(attrs, 'name'))
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein signal = Signal(self.cur_object, expect_attr(attrs, 'name'))
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein raise DBusXmlException('Invalid direction "%s"' % direction)
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein assert False, 'Unhandled state "%s" while entering element with name "%s"' % (self.state, name)
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein parser = optparse.OptionParser("usage: %prog [options] introspect.xml ...")
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein parser.set_description("sbus_codegen generates sbus interface structures \
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein print >> sys.stderr, "sbus_codegen: no input file specified"
4556ad3a270bf049b3225433a402666aaffe3c36Mark Andrews print >> sys.stderr, "sbus_codegen: specify --mode=header or --mode=source"
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein generate_header(parser.parsed_interfaces, filename)