Sun, 21 Aug 2016 05:32:19 -0400
Refactor DBus Python scripts to avoid redirection.
# This program takes a C source as the input and produces the list of # all signals registered. # # Output is: # <signal name="Changed"> # <arg name="new_value" type="b"/> # </signal> from __future__ import print_function import argparse import fileinput import re import sys # List "excluded" contains signals that shouldn't be exported via # DBus. If you remove a signal from this list, please make sure # that it does not break "make" with the configure option # "--enable-dbus" turned on. excluded = [\ # purple_dbus_signal_emit_purple prevents our "dbus-method-called" # signal from being propagated to dbus. "dbus-method-called", ] registerregex = re.compile("purple_signal_register[^;]+\"([\w\-]+)\"[^;]+(purple_marshal_\w+)[^;]+;") nameregex = re.compile('[-_][a-z]') parser = argparse.ArgumentParser() parser.add_argument('input', nargs='*', help='Input files (or stdin if not specified)') parser.add_argument('-o', '--output', type=argparse.FileType('w'), help='Output to file instead of stdout') cmd_args = parser.parse_args() print("/* Generated by %s. Do not edit! */" % sys.argv[0], file=cmd_args.output) print("const char *dbus_signals = ", file=cmd_args.output) input = ''.join(list(fileinput.input(cmd_args.input))) for match in registerregex.finditer(input): signal = match.group(1) marshal = match.group(2) if signal in excluded: continue signal = nameregex.sub(lambda x:x.group()[1].upper(), '-'+signal) print("\" <signal name='%s'>\\n\"" % signal, file=cmd_args.output) args = marshal.split('_') # ['purple', 'marshal', <return type>, '', args...] if len(args) > 4: for arg in args[4:]: if arg == "POINTER": type = 'p' elif arg == "ENUM": type = 'i' elif arg == "INT": type = 'i' elif arg == "UINT": type = 'u' elif arg == "INT64": type = 'x' elif arg == "UINT64": type = 't' elif arg == "BOOLEAN": type = 'b' print("\" <arg type='%s'/>\\n\"" % type, file=cmd_args.output) print("\" </signal>\\n\"", file=cmd_args.output) print(";", file=cmd_args.output)