]> www.infradead.org Git - users/dhowells/kafs-utils.git/commitdiff
rxgen: Extract C struct marshal/unmarshal code emitter
authorDavid Howells <dhowells@redhat.com>
Thu, 9 Jan 2014 14:55:10 +0000 (14:55 +0000)
committerDavid Howells <dhowells@redhat.com>
Thu, 9 Jan 2014 14:55:10 +0000 (14:55 +0000)
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 <dhowells@redhat.com>
rxgen/emit_c_struct.pm [new file with mode: 0644]
rxgen/rxgen.pl

diff --git a/rxgen/emit_c_struct.pm b/rxgen/emit_c_struct.pm
new file mode 100644 (file)
index 0000000..825f5c9
--- /dev/null
@@ -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;
index 5a4439bcc21f4491c889590d1a4591640da54e22..22238e439fdb406f7964346360afa9b3718613bb 100755 (executable)
@@ -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 <arpa/inet.h>\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;