From 4d33c04f15e60e21a537edd635c9ac130312a3cb Mon Sep 17 00:00:00 2001 From: Christopher Davis Date: Fri, 23 Jun 2006 03:51:52 +0000 Subject: Began work on signal handler/map system. It seems to be working; however, events with varying text aren't handled because it does a straight lookup in the hashtable with the signal name to locate the argument list. Will need to change the system to accomodate the events. The basics for reference arg support is there but not well tested. git-svn-id: http://svn.irssi.org/repos/irssi-python@4289 dbcabf3a-b0e7-0310-adc4-f8d773084564 --- sig2code.py | 124 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 124 insertions(+) create mode 100644 sig2code.py (limited to 'sig2code.py') diff --git a/sig2code.py b/sig2code.py new file mode 100644 index 0000000..48cee71 --- /dev/null +++ b/sig2code.py @@ -0,0 +1,124 @@ +import re +import sys + +code_text = """ + Conversion codes notes + I = int *arg IN/OUT + G = string GList **arg IN/OUT (list must be reconstructed) + L = list of nicks + + Scalars + s -> char * + u -> ulong * + I -> int * + i -> int + + Lists of things (completion.c and massjoin.c) + G -> GList * of char* + L -> GSList of NICK_RECs + + Chat objects + c -> CHATNET_REC + S -> SERVER_REC + C -> CHANNEL_REC + q -> QUERY_REC + n -> NICK_REC + W -> WI_ITEM_REC + + Irssi objects + d -> DCC_REC + + Other objects + r -> RECONNECT_REC + o -> COMMAND_REC + l -> LOG_REC + a -> RAWLOG_REC + g -> IGNORE_REC + ? -> MODULE_REC + b -> BAN_REC + N -> NETSPLIT_REC + e -> NETSPLIT_SERVER_REC + ? -> AUTOIGNORE_REC + O -> NOTIFYLIST_REC + ? -> THEME_REC + ? -> KEYINFO_REC + p -> PROCESS_REC + t -> TEXT_DEST_REC + w -> WINDOW_REC +""" + +#generate body of transcode function from the list of codes above +def prepair(): + lines = code_text.split('\n') + codes = [] + for ln in lines: + m = re.match('^.*([a-zA-Z\?]) -> (.*)$', ln) + if not m: continue + code, match = m.groups() + code = code.strip() + match = match.strip() + + assert code == '?' or code not in codes, "dupe code, " + code + codes.append(code) + + print "if arg.startswith('%s'): return '%s'" % (match, code) + +def transcode(arg): + if arg.startswith('char *'): return 's' + if arg.startswith('ulong *'): return 'u' + if arg.startswith('int *'): return 'I' + if arg.startswith('int'): return 'i' + if arg.startswith('GList * of char*'): return 'G' + if arg.startswith('GSList of NICK_RECs'): return 'L' + if arg.startswith('CHATNET_REC'): return 'c' + if arg.startswith('SERVER_REC'): return 'S' + if arg.startswith('RECONNECT_REC'): return 'r' + if arg.startswith('CHANNEL_REC'): return 'C' + if arg.startswith('QUERY_REC'): return 'q' + if arg.startswith('COMMAND_REC'): return 'o' + if arg.startswith('NICK_REC'): return 'n' + if arg.startswith('LOG_REC'): return 'l' + if arg.startswith('RAWLOG_REC'): return 'a' + if arg.startswith('IGNORE_REC'): return 'g' + if arg.startswith('MODULE_REC'): return '?' + if arg.startswith('BAN_REC'): return 'b' + if arg.startswith('NETSPLIT_REC'): return 'N' + if arg.startswith('NETSPLIT_SERVER_REC'): return 'e' + if arg.startswith('DCC_REC'): return 'd' + if arg.startswith('AUTOIGNORE_REC'): return '?' + if arg.startswith('NOTIFYLIST_REC'): return 'O' + if arg.startswith('THEME_REC'): return '?' + if arg.startswith('KEYINFO_REC'): return '?' + if arg.startswith('PROCESS_REC'): return 'p' + if arg.startswith('TEXT_DEST_REC'): return 't' + if arg.startswith('WINDOW_REC'): return 'w' + if arg.startswith('WI_ITEM_REC'): return 'W' + return '?' + +def main(): + + print "/* Include in your C module */" + print "static PY_SIGNAL_SPEC_REC py_sigmap[] = {" + + for ln in sys.stdin: + ln = ln.strip() + m = re.match('^\"([^\"]+)\",(.*)$', ln) + if not m: continue + + signal, args = m.groups() + + if signal.startswith('script '): continue + + argv = [transcode(a.strip()) for a in args.split(',')] + argv = ''.join(argv) + + print ' {"%s", "%s", 0, 0, 0},' % (signal, argv) + + print " {NULL}" + print "};" + print + print "#define py_sigmap_len() (sizeof(py_sigmap) / sizeof(py_sigmap[0]) - 1)" + +if __name__ == '__main__': + main() + -- cgit