From: David Howells Date: Thu, 9 Jan 2014 14:44:55 +0000 (+0000) Subject: rxgen: Extract py module emitter X-Git-Url: https://www.infradead.org/git/?a=commitdiff_plain;h=8082b119b898789cf158b5ab363298b0173e11e3;p=users%2Fdhowells%2Fkafs-utils.git rxgen: Extract py module emitter Extract the code to emit the python module creation code from the main rxgen script and put into its own perl module. Signed-off-by: David Howells --- diff --git a/rxgen/emit_py_module.pm b/rxgen/emit_py_module.pm new file mode 100644 index 0000000..de31f76 --- /dev/null +++ b/rxgen/emit_py_module.pm @@ -0,0 +1,105 @@ +# +# Copyright (C) 2014 Red Hat, Inc. All Rights Reserved. +# Written by David Howells (dhowells@redhat.com) +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public Licence +# as published by the Free Software Foundation; either version +# 2 of the Licence, or (at your option) any later version. +# + +############################################################################### +# +# Emit python module definition. +# +############################################################################### +sub emit_py_module() { + # Emit python structure wrapper static method table + print PYOUT "\n"; + print PYOUT "/*\n"; + print PYOUT " * The static methods.\n"; + print PYOUT " */\n"; + print PYOUT "static PyMethodDef module_methods[] = {\n"; + + foreach my $s (@structs) { + my $struct = @{$s}[0]; + print PYOUT "\t{\"new_$struct\", (PyCFunction)kafs_new_py_$struct, METH_NOARGS,\n"; + print PYOUT "\t \"Create a new $struct record.\"\n"; + print PYOUT "\t},\n"; + } + + foreach $func (sort keys %funcs) { + my @params = @{$funcs{$func}}; + print PYOUT "\t{\"$func\", (PyCFunction)kafs_$func, METH_VARARGS, \"\" },\n"; + } + + print PYOUT "\t{\"rx_new_connection\", (PyCFunction)kafs_py_rx_new_connection, METH_VARARGS,\n"; + print PYOUT "\t\"\" },\n"; + + print PYOUT "\t{}\n"; + print PYOUT "};\n"; + + # Emit python structure wrapper loader + print PYOUT "\n"; + + print PYOUT "static PyModuleDef kafs_module = {\n"; + print PYOUT "\t.m_base = PyModuleDef_HEAD_INIT,\n"; + print PYOUT "\t.m_name = \"kafs\",\n"; + print PYOUT "\t.m_doc = \"AFS stuff.\",\n"; + print PYOUT "\t.m_size = -1,\n"; + print PYOUT "\t.m_methods = module_methods,\n"; + print PYOUT "};\n"; + + print PYHDR "\n"; + print PYHDR "extern PyObject *pykafs_load_wrappers(void);\n"; + + print PYOUT "\n"; + print PYOUT "PyObject *pykafs_load_wrappers(void)\n"; + print PYOUT "{\n"; + print PYOUT "\tPyObject *m;\n"; + + # Load types + if (@structs) { + print PYOUT "\tif ("; + print PYOUT "PyType_Ready(&py_rx_connectionType) < 0"; + my $first = 0; + foreach my $s (@structs) { + my @members = @{$s}; + my $struct = $members[0]; + print PYOUT " ||\n\t " unless ($first); + print PYOUT "PyType_Ready(&py_", $struct, "Type) < 0"; + $first = 0; + } + print PYOUT ")\n"; + print PYOUT "\t\treturn NULL;\n"; + } + + print PYOUT "\n"; + print PYOUT "\tm = PyModule_Create(&kafs_module);\n"; + print PYOUT "\tif (!m)\n"; + print PYOUT "\t\treturn NULL;\n"; + + if (%constants) { + print PYOUT "\n"; + foreach my $c (sort keys %constants) { + print PYOUT "\tPyModule_AddIntConstant(m, \"$c\", $c);\n"; + } + } + + if (@structs) { + print PYOUT "\n"; + foreach my $s (@structs) { + my @members = @{$s}; + my $struct = $members[0]; + print PYOUT "\tPy_INCREF(&py_", $struct, "Type);\n"; + print PYOUT "\tPyModule_AddObject(m, \"$struct\", (PyObject *)&py_", $struct, "Type);\n"; + } + + print PYOUT "\n"; + print PYOUT "\treturn m;\n"; + } + + print PYOUT "}\n"; +} + +1; diff --git a/rxgen/rxgen.pl b/rxgen/rxgen.pl index c5e00c8..5a4439b 100755 --- a/rxgen/rxgen.pl +++ b/rxgen/rxgen.pl @@ -20,6 +20,7 @@ use strict; use lib "rxgen"; use emit_py_types; use emit_py_sync_funcs; +use emit_py_module; die "Need list of sources\n" if ($#ARGV < 0); @@ -579,98 +580,4 @@ foreach $func (sort keys %funcs) { emit_py_func_simple_sync_call($func, \@request, \@reply, @params); } -############################################################################### -# -# Emit python module definition. -# -############################################################################### -sub emit_py_module() { - # Emit python structure wrapper static method table - print PYOUT "\n"; - print PYOUT "/*\n"; - print PYOUT " * The static methods.\n"; - print PYOUT " */\n"; - print PYOUT "static PyMethodDef module_methods[] = {\n"; - - foreach my $s (@structs) { - my $struct = @{$s}[0]; - print PYOUT "\t{\"new_$struct\", (PyCFunction)kafs_new_py_$struct, METH_NOARGS,\n"; - print PYOUT "\t \"Create a new $struct record.\"\n"; - print PYOUT "\t},\n"; - } - - foreach $func (sort keys %funcs) { - my @params = @{$funcs{$func}}; - print PYOUT "\t{\"$func\", (PyCFunction)kafs_$func, METH_VARARGS, \"\" },\n"; - } - - print PYOUT "\t{\"rx_new_connection\", (PyCFunction)kafs_py_rx_new_connection, METH_VARARGS,\n"; - print PYOUT "\t\"\" },\n"; - - print PYOUT "\t{}\n"; - print PYOUT "};\n"; - - # Emit python structure wrapper loader - print PYOUT "\n"; - - print PYOUT "static PyModuleDef kafs_module = {\n"; - print PYOUT "\t.m_base = PyModuleDef_HEAD_INIT,\n"; - print PYOUT "\t.m_name = \"kafs\",\n"; - print PYOUT "\t.m_doc = \"AFS stuff.\",\n"; - print PYOUT "\t.m_size = -1,\n"; - print PYOUT "\t.m_methods = module_methods,\n"; - print PYOUT "};\n"; - - print PYHDR "\n"; - print PYHDR "extern PyObject *pykafs_load_wrappers(void);\n"; - - print PYOUT "\n"; - print PYOUT "PyObject *pykafs_load_wrappers(void)\n"; - print PYOUT "{\n"; - print PYOUT "\tPyObject *m;\n"; - - # Load types - if (@structs) { - print PYOUT "\tif ("; - print PYOUT "PyType_Ready(&py_rx_connectionType) < 0"; - my $first = 0; - foreach my $s (@structs) { - my @members = @{$s}; - my $struct = $members[0]; - print PYOUT " ||\n\t " unless ($first); - print PYOUT "PyType_Ready(&py_", $struct, "Type) < 0"; - $first = 0; - } - print PYOUT ")\n"; - print PYOUT "\t\treturn NULL;\n"; - } - - print PYOUT "\n"; - print PYOUT "\tm = PyModule_Create(&kafs_module);\n"; - print PYOUT "\tif (!m)\n"; - print PYOUT "\t\treturn NULL;\n"; - - if (%constants) { - print PYOUT "\n"; - foreach my $c (sort keys %constants) { - print PYOUT "\tPyModule_AddIntConstant(m, \"$c\", $c);\n"; - } - } - - if (@structs) { - print PYOUT "\n"; - foreach my $s (@structs) { - my @members = @{$s}; - my $struct = $members[0]; - print PYOUT "\tPy_INCREF(&py_", $struct, "Type);\n"; - print PYOUT "\tPyModule_AddObject(m, \"$struct\", (PyObject *)&py_", $struct, "Type);\n"; - } - - print PYOUT "\n"; - print PYOUT "\treturn m;\n"; - } - - print PYOUT "}\n"; -} - emit_py_module();