From 0bedb5b646f582c024f062cdc7d5ff07f1826a7b Mon Sep 17 00:00:00 2001 From: David Howells Date: Thu, 9 Jan 2014 14:55:10 +0000 Subject: [PATCH] rxgen: Extract C struct marshal/unmarshal code emitter Extract the code to emit the code to marshal/unmarshal C structures from the main rxgen script and put into its own perl module. Signed-off-by: David Howells --- rxgen/emit_c_struct.pm | 77 ++++++++++++++++++++++++++++++++++++++++++ rxgen/rxgen.pl | 67 +----------------------------------- 2 files changed, 78 insertions(+), 66 deletions(-) create mode 100644 rxgen/emit_c_struct.pm diff --git a/rxgen/emit_c_struct.pm b/rxgen/emit_c_struct.pm new file mode 100644 index 0000000..825f5c9 --- /dev/null +++ b/rxgen/emit_c_struct.pm @@ -0,0 +1,77 @@ +# +# 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 structure encoders and decoders +# +############################################################################### +sub emit_struct_encdec ($@) { + my ($struct, @members) = @_; + + # Dump the banner comment block + print RXOUT "\n"; + print RXOUT @{shift @members}; + + # Write an encoding function + print RXOUT "static net_xdr_t *rxgen_encode_", $struct, "(net_xdr_t *xdr, const struct $struct *p)\n"; + print RXOUT "{\n"; + + foreach my $m (@members) { + my ($type, $name, $array_size, $max_size) = @{$m}; + if ($array_size != -1) { + print RXOUT "\tint i;\n\n"; + last; + } + } + + foreach my $m (@members) { + my ($type, $name, $array_size, $max_size) = @{$m}; + if ($array_size != -1) { + print RXOUT "\tfor (i = 0; i < ", $array_size, "; i++)\n"; + print RXOUT "\t\t*xdr++ = htonl(p->", $name, "[i]);\n"; + } else { + print RXOUT "\t*xdr++ = htonl(p->", $name, ");\n"; + } + } + + print RXOUT "\treturn xdr;\n"; + print RXOUT "}\n"; + print RXOUT "\n"; + + # Write a decoding function + print RXOUT "static const net_xdr_t *rxgen_decode_", $struct, "(struct $struct *p, const net_xdr_t *xdr)\n"; + print RXOUT "{\n"; + + foreach my $m (@members) { + my ($type, $name, $array_size, $max_size) = @{$m}; + if ($array_size != -1) { + print RXOUT "\tint i;\n\n"; + last; + } + } + + foreach my $m (@members) { + my ($type, $name, $array_size, $max_size) = @{$m}; + if ($array_size != -1) { + print RXOUT "\tfor (i = 0; i < ", $array_size, "; i++)\n"; + print RXOUT "\t\tp->", $name, "[i] = ntohl(*xdr++);\n"; + } else { + print RXOUT "\tp->", $name, " = ntohl(*xdr++);\n"; + } + } + + print RXOUT "\treturn xdr;\n"; + print RXOUT "}\n"; + print RXOUT "\n"; + print RXOUT "/* XDR size ", $struct_sizes{$struct}, " */\n" +} + +1; diff --git a/rxgen/rxgen.pl b/rxgen/rxgen.pl index 5a4439b..22238e4 100755 --- a/rxgen/rxgen.pl +++ b/rxgen/rxgen.pl @@ -18,6 +18,7 @@ use strict; use lib "rxgen"; +use emit_c_struct; use emit_py_types; use emit_py_sync_funcs; use emit_py_module; @@ -231,72 +232,6 @@ print PYOUT "#include \"afs_py.h\"\n"; print PYOUT "#include \n"; print PYOUT "#include \"py_rxgen.h\"\n"; -############################################################################### -# -# Emit structure encoders and decoders -# -############################################################################### -sub emit_struct_encdec ($@) { - my ($struct, @members) = @_; - - # Dump the banner comment block - print RXOUT "\n"; - print RXOUT @{shift @members}; - - # Write an encoding function - print RXOUT "static net_xdr_t *rxgen_encode_", $struct, "(net_xdr_t *xdr, const struct $struct *p)\n"; - print RXOUT "{\n"; - - foreach my $m (@members) { - my ($type, $name, $array_size, $max_size) = @{$m}; - if ($array_size != -1) { - print RXOUT "\tint i;\n\n"; - last; - } - } - - foreach my $m (@members) { - my ($type, $name, $array_size, $max_size) = @{$m}; - if ($array_size != -1) { - print RXOUT "\tfor (i = 0; i < ", $array_size, "; i++)\n"; - print RXOUT "\t\t*xdr++ = htonl(p->", $name, "[i]);\n"; - } else { - print RXOUT "\t*xdr++ = htonl(p->", $name, ");\n"; - } - } - - print RXOUT "\treturn xdr;\n"; - print RXOUT "}\n"; - print RXOUT "\n"; - - # Write a decoding function - print RXOUT "static const net_xdr_t *rxgen_decode_", $struct, "(struct $struct *p, const net_xdr_t *xdr)\n"; - print RXOUT "{\n"; - - foreach my $m (@members) { - my ($type, $name, $array_size, $max_size) = @{$m}; - if ($array_size != -1) { - print RXOUT "\tint i;\n\n"; - last; - } - } - - foreach my $m (@members) { - my ($type, $name, $array_size, $max_size) = @{$m}; - if ($array_size != -1) { - print RXOUT "\tfor (i = 0; i < ", $array_size, "; i++)\n"; - print RXOUT "\t\tp->", $name, "[i] = ntohl(*xdr++);\n"; - } else { - print RXOUT "\tp->", $name, " = ntohl(*xdr++);\n"; - } - } - - print RXOUT "\treturn xdr;\n"; - print RXOUT "}\n"; - print RXOUT "\n"; - print RXOUT "/* XDR size ", $struct_sizes{$struct}, " */\n" -} - foreach my $s (@structs) { my @members = @{$s}; my $struct = shift @members; -- 2.49.0