mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2024-12-22 05:35:25 +00:00
rpcgen: add a C code generator for XDR protocol specs
This implements a C code generator that emits code that is (almost) identical to the classic 'rpcgen' program. The key differences are: - Skip inlining of calls for struct fields - Skip K&R style function prototypes in headers - Use int64_t instead of quad_t for OS portability - Saner whitespace / indentation The tests/demo.c and tests/demo.h files were created using the traditional 'rpcgen' program, and then editted to cut out the leading boilerplate, and the differences mentioned above. Reviewed-by: Michal Privoznik <mprivozn@redhat.com> Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
This commit is contained in:
parent
518af85344
commit
8ec79e5e14
@ -1436,7 +1436,7 @@ exclude_file_name_regexp--sc_prohibit_xmlURI = ^src/util/viruri\.c$$
|
|||||||
exclude_file_name_regexp--sc_prohibit_return_as_function = \.py$$
|
exclude_file_name_regexp--sc_prohibit_return_as_function = \.py$$
|
||||||
|
|
||||||
exclude_file_name_regexp--sc_require_config_h = \
|
exclude_file_name_regexp--sc_require_config_h = \
|
||||||
^(examples/|tools/virsh-edit\.c$$|tests/virmockstathelpers.c)
|
^(examples/c/.*/.*\.c|tools/virsh-edit\.c|tests/virmockstathelpers\.c|scripts/rpcgen/tests/demo\.c)$$
|
||||||
|
|
||||||
exclude_file_name_regexp--sc_require_config_h_first = \
|
exclude_file_name_regexp--sc_require_config_h_first = \
|
||||||
^(examples/|tools/virsh-edit\.c$$|tests/virmockstathelpers.c)
|
^(examples/|tools/virsh-edit\.c$$|tests/virmockstathelpers.c)
|
||||||
@ -1500,6 +1500,8 @@ exclude_file_name_regexp--sc_prohibit_strcmp = \
|
|||||||
exclude_file_name_regexp--sc_prohibit_select = \
|
exclude_file_name_regexp--sc_prohibit_select = \
|
||||||
^build-aux/syntax-check\.mk|src/util/vireventglibwatch\.c|tests/meson\.build$$
|
^build-aux/syntax-check\.mk|src/util/vireventglibwatch\.c|tests/meson\.build$$
|
||||||
|
|
||||||
|
exclude_file_name_regexp--sc_header-ifdef = \
|
||||||
|
^scripts/rpcgen/tests/demo\.[ch]$$
|
||||||
|
|
||||||
exclude_file_name_regexp--sc_black = \
|
exclude_file_name_regexp--sc_black = \
|
||||||
^tools/|src/|tests/|ci/|run\.in|scripts/[^/]*\.py
|
^tools/|src/|tests/|ci/|run\.in|scripts/[^/]*\.py
|
||||||
|
469
scripts/rpcgen/rpcgen/generator.py
Normal file
469
scripts/rpcgen/rpcgen/generator.py
Normal file
@ -0,0 +1,469 @@
|
|||||||
|
# SPDX-License-Identifier: LGPL-2.1-or-later
|
||||||
|
|
||||||
|
import platform
|
||||||
|
|
||||||
|
from .visitor import XDRVisitor
|
||||||
|
from .parser import (
|
||||||
|
XDRTypeString,
|
||||||
|
XDRTypeVoid,
|
||||||
|
XDRTypeOpaque,
|
||||||
|
XDRTypeCustom,
|
||||||
|
XDRDefinitionTypedef,
|
||||||
|
XDRDeclarationFixedArray,
|
||||||
|
XDRDeclarationVariableArray,
|
||||||
|
XDRDeclarationPointer,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
class XDRTypeDeclarationGenerator(XDRVisitor):
|
||||||
|
def visit_definition_cescape(self, obj, indent, context):
|
||||||
|
return obj.code + "\n"
|
||||||
|
|
||||||
|
def visit_definition_constant(self, obj, indent, context):
|
||||||
|
return "#%sdefine %s %s\n" % (indent, obj.name, obj.value)
|
||||||
|
|
||||||
|
def visit_definition_enum(self, obj, indent, context):
|
||||||
|
code = "%senum %s %s;\n" % (
|
||||||
|
indent,
|
||||||
|
obj.name,
|
||||||
|
self.visit_object(obj.body, indent),
|
||||||
|
) + "%stypedef enum %s %s;\n" % (indent, obj.name, obj.name)
|
||||||
|
return code
|
||||||
|
|
||||||
|
def visit_definition_struct(self, obj, indent, context):
|
||||||
|
code = "%sstruct %s %s;\n" % (
|
||||||
|
indent,
|
||||||
|
obj.name,
|
||||||
|
self.visit_object(obj.body, indent),
|
||||||
|
) + "%stypedef struct %s %s;\n" % (indent, obj.name, obj.name)
|
||||||
|
return code
|
||||||
|
|
||||||
|
def visit_definition_union(self, obj, indent, context):
|
||||||
|
code = "%sstruct %s %s;\n" % (
|
||||||
|
indent,
|
||||||
|
obj.name,
|
||||||
|
self.visit_object(obj.body, indent, obj.name),
|
||||||
|
) + "%stypedef struct %s %s;\n" % (indent, obj.name, obj.name)
|
||||||
|
return code
|
||||||
|
|
||||||
|
def visit_definition_typedef(self, obj, indent, context):
|
||||||
|
return "%stypedef %s;\n" % (indent, self.visit_object(obj.decl, indent))
|
||||||
|
|
||||||
|
def visit_declaration_scalar(self, obj, indent, context):
|
||||||
|
return "%s %s" % (self.visit_object(obj.typ, indent), obj.identifier)
|
||||||
|
|
||||||
|
def visit_declaration_pointer(self, obj, indent, context):
|
||||||
|
return "%s *%s" % (self.visit_object(obj.typ, indent), obj.identifier)
|
||||||
|
|
||||||
|
def visit_declaration_fixedarray(self, obj, indent, context):
|
||||||
|
return "%s %s[%s]" % (
|
||||||
|
self.visit_object(obj.typ, indent),
|
||||||
|
obj.identifier,
|
||||||
|
obj.length,
|
||||||
|
)
|
||||||
|
|
||||||
|
def visit_declaration_variablearray(self, obj, indent, context):
|
||||||
|
if type(obj.typ) == XDRTypeString:
|
||||||
|
return "%schar *%s" % (indent, obj.identifier)
|
||||||
|
else:
|
||||||
|
code = (
|
||||||
|
"%sstruct {\n" % indent
|
||||||
|
+ "%s u_int %s_len;\n" % (indent, obj.identifier)
|
||||||
|
+ "%s %s *%s_val;\n"
|
||||||
|
% (indent, self.visit_object(obj.typ, ""), obj.identifier)
|
||||||
|
+ "%s} %s" % (indent, obj.identifier)
|
||||||
|
)
|
||||||
|
return code
|
||||||
|
|
||||||
|
def visit_type_custom(self, obj, indent, context):
|
||||||
|
return "%s%s" % (indent, obj.identifier)
|
||||||
|
|
||||||
|
def visit_type_opaque(self, obj, indent, context):
|
||||||
|
return "%schar" % indent
|
||||||
|
|
||||||
|
def visit_type_string(self, obj, indent, context):
|
||||||
|
return "%sstring" % indent
|
||||||
|
|
||||||
|
def visit_type_void(self, obj, indent, context):
|
||||||
|
return "%svoid" % indent
|
||||||
|
|
||||||
|
def visit_type_char(self, obj, indent, context):
|
||||||
|
return "%schar" % indent
|
||||||
|
|
||||||
|
def visit_type_unsignedchar(self, obj, indent, context):
|
||||||
|
return "%su_char" % indent
|
||||||
|
|
||||||
|
def visit_type_short(self, obj, indent, context):
|
||||||
|
return "%sshort" % indent
|
||||||
|
|
||||||
|
def visit_type_unsignedshort(self, obj, indent, context):
|
||||||
|
return "%su_short" % indent
|
||||||
|
|
||||||
|
def visit_type_int(self, obj, indent, context):
|
||||||
|
return "%sint" % indent
|
||||||
|
|
||||||
|
def visit_type_unsignedint(self, obj, indent, context):
|
||||||
|
return "%su_int" % indent
|
||||||
|
|
||||||
|
def visit_type_hyper(self, obj, indent, context):
|
||||||
|
return "%sint64_t" % indent
|
||||||
|
|
||||||
|
def visit_type_unsignedhyper(self, obj, indent, context):
|
||||||
|
return "%suint64_t" % indent
|
||||||
|
|
||||||
|
def visit_type_bool(self, obj, indent, context):
|
||||||
|
return "%sbool_t" % indent
|
||||||
|
|
||||||
|
def visit_type_float(self, obj, indent, context):
|
||||||
|
return "%sfloat" % indent
|
||||||
|
|
||||||
|
def visit_type_double(self, obj, indent, context):
|
||||||
|
return "%sdouble" % indent
|
||||||
|
|
||||||
|
def visit_type_enum(self, obj, indent, context):
|
||||||
|
return "%senum %s" % (indent, self.visit_object(obj.body.body, indent))
|
||||||
|
|
||||||
|
def visit_type_struct(self, obj, indent, context):
|
||||||
|
return "%sstruct %s" % (indent, self.visit_object(obj.body, indent))
|
||||||
|
|
||||||
|
def visit_type_union(self, obj, indent, context):
|
||||||
|
return "%sstruct %s" % (indent, self.visit_object(obj.body, indent))
|
||||||
|
|
||||||
|
def visit_enum_value(self, obj, indent, context):
|
||||||
|
return "%s%s = %s" % (indent, obj.name, obj.value)
|
||||||
|
|
||||||
|
def visit_enum_body(self, obj, indent, context):
|
||||||
|
code = "{\n"
|
||||||
|
for value in obj.values:
|
||||||
|
code = code + self.visit_object(value, indent + " ") + ",\n"
|
||||||
|
code = code + "%s}" % indent
|
||||||
|
return code
|
||||||
|
|
||||||
|
def visit_struct_body(self, obj, indent, context):
|
||||||
|
code = "{\n"
|
||||||
|
for value in obj.fields:
|
||||||
|
code = code + self.visit_object(value, indent + " ") + ";\n"
|
||||||
|
code = code + "%s}" % indent
|
||||||
|
return code
|
||||||
|
|
||||||
|
def visit_union_case(self, obj, indent, context):
|
||||||
|
return self.visit_object(obj.decl, indent)
|
||||||
|
|
||||||
|
def visit_union_body(self, obj, indent, context):
|
||||||
|
prefix = context
|
||||||
|
if prefix != "":
|
||||||
|
prefix = prefix + "_"
|
||||||
|
|
||||||
|
code = (
|
||||||
|
"%s{\n" % indent
|
||||||
|
+ "%s %s;\n" % (indent, self.visit_object(obj.discriminator))
|
||||||
|
+ "%s union {\n" % indent
|
||||||
|
)
|
||||||
|
for value in obj.cases:
|
||||||
|
if type(value.decl.typ) == XDRTypeVoid:
|
||||||
|
continue
|
||||||
|
code = code + self.visit_object(value, indent + " ") + ";\n"
|
||||||
|
if obj.default is not None and type(obj.default.typ) != XDRTypeVoid:
|
||||||
|
code = code + self.visit_object(obj.default, indent + " ") + ";\n"
|
||||||
|
code = code + "%s } %su;\n" % (indent, prefix) + "%s}" % indent
|
||||||
|
return code
|
||||||
|
|
||||||
|
|
||||||
|
class XDRMarshallDeclarationGenerator(XDRVisitor):
|
||||||
|
def visit_definition_enum(self, obj, indent, context):
|
||||||
|
return "%sextern bool_t xdr_%s(XDR *, %s*);\n" % (indent, obj.name, obj.name)
|
||||||
|
|
||||||
|
def visit_definition_union(self, obj, indent, context):
|
||||||
|
return "%sextern bool_t xdr_%s(XDR *, %s*);\n" % (indent, obj.name, obj.name)
|
||||||
|
|
||||||
|
def visit_definition_struct(self, obj, indent, context):
|
||||||
|
return "%sextern bool_t xdr_%s(XDR *, %s*);\n" % (indent, obj.name, obj.name)
|
||||||
|
|
||||||
|
def visit_definition_typedef(self, obj, indent, context):
|
||||||
|
if isinstance(obj.decl, XDRDeclarationFixedArray):
|
||||||
|
return "%sextern bool_t xdr_%s(XDR *, %s);\n" % (
|
||||||
|
indent,
|
||||||
|
obj.decl.identifier,
|
||||||
|
obj.decl.identifier,
|
||||||
|
)
|
||||||
|
else:
|
||||||
|
return "%sextern bool_t xdr_%s(XDR *, %s*);\n" % (
|
||||||
|
indent,
|
||||||
|
obj.decl.identifier,
|
||||||
|
obj.decl.identifier,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
class XDRMarshallImplementationGenerator(XDRVisitor):
|
||||||
|
def visit_definition_enum(self, obj, indent, context):
|
||||||
|
code = (
|
||||||
|
"%sbool_t\n" % indent
|
||||||
|
+ "%sxdr_%s(XDR *xdrs, %s *objp)\n" % (indent, obj.name, obj.name)
|
||||||
|
+ "%s{\n" % indent
|
||||||
|
+ "%s if (!xdr_enum(xdrs, (enum_t *)objp))\n" % indent
|
||||||
|
+ "%s return FALSE;\n" % indent
|
||||||
|
+ "%s return TRUE;\n" % indent
|
||||||
|
+ "%s}\n" % indent
|
||||||
|
)
|
||||||
|
return code
|
||||||
|
|
||||||
|
def generate_type_call(self, decl, field, typename, embedded=False, indent=""):
|
||||||
|
if type(decl.typ) == XDRTypeVoid:
|
||||||
|
return ""
|
||||||
|
if type(decl) == XDRDeclarationFixedArray:
|
||||||
|
if type(decl.typ) == XDRTypeOpaque:
|
||||||
|
code = "%s if (!xdr_%s(xdrs, %s, %s))\n" % (
|
||||||
|
indent,
|
||||||
|
self.visit_object(decl.typ, context="func"),
|
||||||
|
field,
|
||||||
|
decl.length,
|
||||||
|
)
|
||||||
|
else:
|
||||||
|
code = "%s if (!xdr_vector(xdrs, (char *)%s, %s,\n" % (
|
||||||
|
indent,
|
||||||
|
field,
|
||||||
|
decl.length,
|
||||||
|
) + "%s sizeof(%s), (xdrproc_t)xdr_%s))\n" % (
|
||||||
|
indent,
|
||||||
|
self.visit_object(decl.typ),
|
||||||
|
self.visit_object(decl.typ, context="func"),
|
||||||
|
)
|
||||||
|
elif type(decl) == XDRDeclarationVariableArray:
|
||||||
|
fieldRef = "."
|
||||||
|
pointerStr = ""
|
||||||
|
if embedded:
|
||||||
|
pointerStr = "&"
|
||||||
|
else:
|
||||||
|
fieldRef = "->"
|
||||||
|
|
||||||
|
if type(decl.typ) == XDRTypeString:
|
||||||
|
code = "%s if (!xdr_%s(xdrs, %s%s, %s))\n" % (
|
||||||
|
indent,
|
||||||
|
self.visit_object(decl.typ, context="func"),
|
||||||
|
pointerStr,
|
||||||
|
field,
|
||||||
|
decl.maxlength,
|
||||||
|
)
|
||||||
|
elif type(decl.typ) == XDRTypeOpaque:
|
||||||
|
code = "%s if (!xdr_bytes(xdrs, (char **)&%s%s%s_val, " % (
|
||||||
|
indent,
|
||||||
|
field,
|
||||||
|
fieldRef,
|
||||||
|
typename,
|
||||||
|
) + "(u_int *) &%s%s%s_len, %s))\n" % (
|
||||||
|
field,
|
||||||
|
fieldRef,
|
||||||
|
typename,
|
||||||
|
decl.maxlength,
|
||||||
|
)
|
||||||
|
else:
|
||||||
|
code = (
|
||||||
|
"%s if (!xdr_array(xdrs, (char **)&%s%s%s_val, "
|
||||||
|
% (indent, field, fieldRef, typename)
|
||||||
|
+ "(u_int *) &%s%s%s_len, %s,\n"
|
||||||
|
% (field, fieldRef, typename, decl.maxlength)
|
||||||
|
+ "%s sizeof(%s), (xdrproc_t)xdr_%s))\n"
|
||||||
|
% (
|
||||||
|
indent,
|
||||||
|
self.visit_object(decl.typ),
|
||||||
|
self.visit_object(decl.typ, context="func"),
|
||||||
|
)
|
||||||
|
)
|
||||||
|
elif type(decl) == XDRDeclarationPointer:
|
||||||
|
pointerStr = ""
|
||||||
|
if embedded:
|
||||||
|
pointerStr = "&"
|
||||||
|
|
||||||
|
code = "%s if (!xdr_pointer(xdrs, (char **)%s%s, " % (
|
||||||
|
indent,
|
||||||
|
pointerStr,
|
||||||
|
field,
|
||||||
|
) + "sizeof(%s), (xdrproc_t)xdr_%s))\n" % (
|
||||||
|
self.visit_object(decl.typ, context="func"),
|
||||||
|
self.visit_object(decl.typ, context="func"),
|
||||||
|
)
|
||||||
|
else:
|
||||||
|
pointerStr = ""
|
||||||
|
isFixedArray = (
|
||||||
|
type(decl.typ) == XDRTypeCustom
|
||||||
|
and type(decl.typ.definition) == XDRDefinitionTypedef
|
||||||
|
and type(decl.typ.definition.decl) == XDRDeclarationFixedArray
|
||||||
|
)
|
||||||
|
|
||||||
|
if embedded and not isFixedArray:
|
||||||
|
pointerStr = "&"
|
||||||
|
|
||||||
|
code = "%s if (!xdr_%s(xdrs, %s%s))\n" % (
|
||||||
|
indent,
|
||||||
|
self.visit_object(decl.typ, context="func"),
|
||||||
|
pointerStr,
|
||||||
|
field,
|
||||||
|
)
|
||||||
|
|
||||||
|
code = code + "%s return FALSE;\n" % indent
|
||||||
|
return code
|
||||||
|
|
||||||
|
def visit_definition_union(self, obj, indent, context):
|
||||||
|
code = (
|
||||||
|
"%sbool_t\n" % indent
|
||||||
|
+ "%sxdr_%s(XDR *xdrs, %s *objp)\n" % (indent, obj.name, obj.name)
|
||||||
|
+ "%s{\n" % indent
|
||||||
|
+ self.generate_type_call(
|
||||||
|
obj.body.discriminator,
|
||||||
|
"objp->%s" % obj.body.discriminator.identifier,
|
||||||
|
obj.body.discriminator.identifier,
|
||||||
|
embedded=True,
|
||||||
|
indent=indent,
|
||||||
|
)
|
||||||
|
+ "%s switch (objp->%s) {\n"
|
||||||
|
% (indent, obj.body.discriminator.identifier)
|
||||||
|
)
|
||||||
|
|
||||||
|
for case in obj.body.cases:
|
||||||
|
code = (
|
||||||
|
code
|
||||||
|
+ "%s case %s:\n" % (indent, case.value)
|
||||||
|
+ self.generate_type_call(
|
||||||
|
case.decl,
|
||||||
|
"objp->%s_u.%s" % (obj.name, case.decl.identifier),
|
||||||
|
obj.name,
|
||||||
|
embedded=True,
|
||||||
|
indent=indent + " ",
|
||||||
|
)
|
||||||
|
+ "%s break;\n" % indent
|
||||||
|
)
|
||||||
|
|
||||||
|
code = code + "%s default:\n" % indent
|
||||||
|
|
||||||
|
if obj.body.default is not None:
|
||||||
|
code = (
|
||||||
|
code
|
||||||
|
+ self.generate_type_call(
|
||||||
|
obj.body.default,
|
||||||
|
"objp->%s_u.%s" % (obj.name, obj.body.default.identifier),
|
||||||
|
obj.name,
|
||||||
|
embedded=True,
|
||||||
|
indent=indent + " ",
|
||||||
|
)
|
||||||
|
+ "%s break;\n" % indent
|
||||||
|
)
|
||||||
|
else:
|
||||||
|
code = code + "%s return FALSE;\n" % indent
|
||||||
|
|
||||||
|
code = (
|
||||||
|
code
|
||||||
|
+ "%s }\n" % indent
|
||||||
|
+ "%s return TRUE;\n" % indent
|
||||||
|
+ "%s}\n" % indent
|
||||||
|
)
|
||||||
|
return code
|
||||||
|
|
||||||
|
def visit_definition_struct(self, obj, indent, context):
|
||||||
|
code = (
|
||||||
|
"%sbool_t\n" % indent
|
||||||
|
+ "%sxdr_%s(XDR *xdrs, %s *objp)\n" % (indent, obj.name, obj.name)
|
||||||
|
+ "%s{\n" % indent
|
||||||
|
)
|
||||||
|
for field in obj.body.fields:
|
||||||
|
code = code + self.generate_type_call(
|
||||||
|
field,
|
||||||
|
"objp->%s" % field.identifier,
|
||||||
|
field.identifier,
|
||||||
|
embedded=True,
|
||||||
|
indent=indent,
|
||||||
|
)
|
||||||
|
code = code + "%s return TRUE;\n" % indent + "%s}\n" % indent
|
||||||
|
return code
|
||||||
|
|
||||||
|
def visit_definition_typedef(self, obj, indent, context):
|
||||||
|
code = "%sbool_t\n" % indent
|
||||||
|
if isinstance(obj.decl, XDRDeclarationFixedArray):
|
||||||
|
code = code + "%sxdr_%s(XDR *xdrs, %s objp)\n" % (
|
||||||
|
indent,
|
||||||
|
obj.decl.identifier,
|
||||||
|
obj.decl.identifier,
|
||||||
|
)
|
||||||
|
else:
|
||||||
|
code = code + "%sxdr_%s(XDR *xdrs, %s *objp)\n" % (
|
||||||
|
indent,
|
||||||
|
obj.decl.identifier,
|
||||||
|
obj.decl.identifier,
|
||||||
|
)
|
||||||
|
code = (
|
||||||
|
code
|
||||||
|
+ "%s{\n" % indent
|
||||||
|
+ self.generate_type_call(
|
||||||
|
obj.decl, "objp", obj.decl.identifier, embedded=False, indent=indent
|
||||||
|
)
|
||||||
|
+ "%s return TRUE;\n" % indent
|
||||||
|
+ "%s}\n" % indent
|
||||||
|
)
|
||||||
|
return code
|
||||||
|
|
||||||
|
def visit_declaration_pointer(self, obj, indent, context):
|
||||||
|
return "%s%s *%s" % (indent, self.visit_object(obj.typ), obj.identifier)
|
||||||
|
|
||||||
|
def visit_declaration_fixedarray(self, obj, indent, context):
|
||||||
|
return "%s%s %s[%s]" % (
|
||||||
|
indent,
|
||||||
|
self.visit_object(obj.typ),
|
||||||
|
obj.identifier,
|
||||||
|
obj.length,
|
||||||
|
)
|
||||||
|
|
||||||
|
def visit_declaration_variablearray(self, obj, indent, context):
|
||||||
|
return "%s%s *%s" % (indent, self.visit_object(obj.typ), obj.identifier)
|
||||||
|
|
||||||
|
def visit_type_custom(self, obj, indent, context):
|
||||||
|
return "%s%s" % (indent, obj.identifier)
|
||||||
|
|
||||||
|
def visit_type_opaque(self, obj, indent, context):
|
||||||
|
return "%sopaque" % indent
|
||||||
|
|
||||||
|
def visit_type_string(self, obj, indent, context):
|
||||||
|
return "%sstring" % indent
|
||||||
|
|
||||||
|
def visit_type_char(self, obj, indent, context):
|
||||||
|
return "%schar" % indent
|
||||||
|
|
||||||
|
def visit_type_unsignedchar(self, obj, indent, context):
|
||||||
|
return "%su_char" % indent
|
||||||
|
|
||||||
|
def visit_type_short(self, obj, indent, context):
|
||||||
|
return "%sshort" % indent
|
||||||
|
|
||||||
|
def visit_type_unsignedshort(self, obj, indent, context):
|
||||||
|
return "%su_short" % indent
|
||||||
|
|
||||||
|
def visit_type_int(self, obj, indent, context):
|
||||||
|
return "%sint" % indent
|
||||||
|
|
||||||
|
def visit_type_unsignedint(self, obj, indent, context):
|
||||||
|
return "%su_int" % indent
|
||||||
|
|
||||||
|
def visit_type_hyper(self, obj, indent, context):
|
||||||
|
return "%sint64_t" % indent
|
||||||
|
|
||||||
|
def visit_type_unsignedhyper(self, obj, indent, context):
|
||||||
|
if context == "func" and platform.system() == "Darwin":
|
||||||
|
return "%su_int64_t" % indent
|
||||||
|
else:
|
||||||
|
return "%suint64_t" % indent
|
||||||
|
|
||||||
|
def visit_type_bool(self, obj, indent, context):
|
||||||
|
if context == "func":
|
||||||
|
return "%sbool" % indent
|
||||||
|
else:
|
||||||
|
return "%sbool_t" % indent
|
||||||
|
|
||||||
|
def visit_type_float(self, obj, indent, context):
|
||||||
|
return "%sfloat" % indent
|
||||||
|
|
||||||
|
def visit_type_double(self, obj, indent, context):
|
||||||
|
return "%sdouble" % indent
|
||||||
|
|
||||||
|
def visit_enum_value(self, obj, indent, context):
|
||||||
|
return "%s%s = %s" % (indent, obj.name, obj.value)
|
||||||
|
|
||||||
|
def visit_union_case(self, obj, indent, context):
|
||||||
|
return self.visit_object(obj.value, indent)
|
351
scripts/rpcgen/tests/demo.c
Normal file
351
scripts/rpcgen/tests/demo.c
Normal file
@ -0,0 +1,351 @@
|
|||||||
|
bool_t
|
||||||
|
xdr_TestEnum(XDR *xdrs, TestEnum *objp)
|
||||||
|
{
|
||||||
|
if (!xdr_enum(xdrs, (enum_t *)objp))
|
||||||
|
return FALSE;
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool_t
|
||||||
|
xdr_TestStruct(XDR *xdrs, TestStruct *objp)
|
||||||
|
{
|
||||||
|
if (!xdr_char(xdrs, &objp->c1))
|
||||||
|
return FALSE;
|
||||||
|
if (!xdr_char(xdrs, &objp->c2))
|
||||||
|
return FALSE;
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool_t
|
||||||
|
xdr_TestUnion(XDR *xdrs, TestUnion *objp)
|
||||||
|
{
|
||||||
|
if (!xdr_int(xdrs, &objp->type))
|
||||||
|
return FALSE;
|
||||||
|
switch (objp->type) {
|
||||||
|
case 20:
|
||||||
|
if (!xdr_int(xdrs, &objp->TestUnion_u.i1))
|
||||||
|
return FALSE;
|
||||||
|
break;
|
||||||
|
case 30:
|
||||||
|
if (!xdr_int(xdrs, &objp->TestUnion_u.i2))
|
||||||
|
return FALSE;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
if (!xdr_int(xdrs, &objp->TestUnion_u.i3))
|
||||||
|
return FALSE;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool_t
|
||||||
|
xdr_TestUnionVoidDefault(XDR *xdrs, TestUnionVoidDefault *objp)
|
||||||
|
{
|
||||||
|
if (!xdr_int(xdrs, &objp->type))
|
||||||
|
return FALSE;
|
||||||
|
switch (objp->type) {
|
||||||
|
case 21:
|
||||||
|
if (!xdr_int(xdrs, &objp->TestUnionVoidDefault_u.i1))
|
||||||
|
return FALSE;
|
||||||
|
break;
|
||||||
|
case 31:
|
||||||
|
if (!xdr_int(xdrs, &objp->TestUnionVoidDefault_u.i2))
|
||||||
|
return FALSE;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool_t
|
||||||
|
xdr_TestUnionNoDefault(XDR *xdrs, TestUnionNoDefault *objp)
|
||||||
|
{
|
||||||
|
if (!xdr_int(xdrs, &objp->type))
|
||||||
|
return FALSE;
|
||||||
|
switch (objp->type) {
|
||||||
|
case 22:
|
||||||
|
if (!xdr_int(xdrs, &objp->TestUnionNoDefault_u.i1))
|
||||||
|
return FALSE;
|
||||||
|
break;
|
||||||
|
case 32:
|
||||||
|
if (!xdr_int(xdrs, &objp->TestUnionNoDefault_u.i2))
|
||||||
|
return FALSE;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool_t
|
||||||
|
xdr_TestIntScalar(XDR *xdrs, TestIntScalar *objp)
|
||||||
|
{
|
||||||
|
if (!xdr_int(xdrs, objp))
|
||||||
|
return FALSE;
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool_t
|
||||||
|
xdr_TestIntPointer(XDR *xdrs, TestIntPointer *objp)
|
||||||
|
{
|
||||||
|
if (!xdr_pointer(xdrs, (char **)objp, sizeof(int), (xdrproc_t)xdr_int))
|
||||||
|
return FALSE;
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool_t
|
||||||
|
xdr_TestIntFixedArray(XDR *xdrs, TestIntFixedArray objp)
|
||||||
|
{
|
||||||
|
if (!xdr_vector(xdrs, (char *)objp, 3,
|
||||||
|
sizeof(int), (xdrproc_t)xdr_int))
|
||||||
|
return FALSE;
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool_t
|
||||||
|
xdr_TestIntVariableArray(XDR *xdrs, TestIntVariableArray *objp)
|
||||||
|
{
|
||||||
|
if (!xdr_array(xdrs, (char **)&objp->TestIntVariableArray_val, (u_int *) &objp->TestIntVariableArray_len, 5,
|
||||||
|
sizeof(int), (xdrproc_t)xdr_int))
|
||||||
|
return FALSE;
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool_t
|
||||||
|
xdr_TestStringVariableArray(XDR *xdrs, TestStringVariableArray *objp)
|
||||||
|
{
|
||||||
|
if (!xdr_string(xdrs, objp, 7))
|
||||||
|
return FALSE;
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool_t
|
||||||
|
xdr_TestOpaqueFixedArray(XDR *xdrs, TestOpaqueFixedArray objp)
|
||||||
|
{
|
||||||
|
if (!xdr_opaque(xdrs, objp, 9))
|
||||||
|
return FALSE;
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool_t
|
||||||
|
xdr_TestOpaqueVariableArray(XDR *xdrs, TestOpaqueVariableArray *objp)
|
||||||
|
{
|
||||||
|
if (!xdr_bytes(xdrs, (char **)&objp->TestOpaqueVariableArray_val, (u_int *) &objp->TestOpaqueVariableArray_len, 11))
|
||||||
|
return FALSE;
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool_t
|
||||||
|
xdr_TestEnumScalar(XDR *xdrs, TestEnumScalar *objp)
|
||||||
|
{
|
||||||
|
if (!xdr_TestEnum(xdrs, objp))
|
||||||
|
return FALSE;
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool_t
|
||||||
|
xdr_TestEnumPointer(XDR *xdrs, TestEnumPointer *objp)
|
||||||
|
{
|
||||||
|
if (!xdr_pointer(xdrs, (char **)objp, sizeof(TestEnum), (xdrproc_t)xdr_TestEnum))
|
||||||
|
return FALSE;
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool_t
|
||||||
|
xdr_TestEnumFixedArray(XDR *xdrs, TestEnumFixedArray objp)
|
||||||
|
{
|
||||||
|
if (!xdr_vector(xdrs, (char *)objp, 13,
|
||||||
|
sizeof(TestEnum), (xdrproc_t)xdr_TestEnum))
|
||||||
|
return FALSE;
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool_t
|
||||||
|
xdr_TestEnumVariableArray(XDR *xdrs, TestEnumVariableArray *objp)
|
||||||
|
{
|
||||||
|
if (!xdr_array(xdrs, (char **)&objp->TestEnumVariableArray_val, (u_int *) &objp->TestEnumVariableArray_len, 15,
|
||||||
|
sizeof(TestEnum), (xdrproc_t)xdr_TestEnum))
|
||||||
|
return FALSE;
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool_t
|
||||||
|
xdr_TestStructScalar(XDR *xdrs, TestStructScalar *objp)
|
||||||
|
{
|
||||||
|
if (!xdr_TestStruct(xdrs, objp))
|
||||||
|
return FALSE;
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool_t
|
||||||
|
xdr_TestStructPointer(XDR *xdrs, TestStructPointer *objp)
|
||||||
|
{
|
||||||
|
if (!xdr_pointer(xdrs, (char **)objp, sizeof(TestStruct), (xdrproc_t)xdr_TestStruct))
|
||||||
|
return FALSE;
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool_t
|
||||||
|
xdr_TestStructFixedArray(XDR *xdrs, TestStructFixedArray objp)
|
||||||
|
{
|
||||||
|
if (!xdr_vector(xdrs, (char *)objp, 17,
|
||||||
|
sizeof(TestStruct), (xdrproc_t)xdr_TestStruct))
|
||||||
|
return FALSE;
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool_t
|
||||||
|
xdr_TestStructVariableArray(XDR *xdrs, TestStructVariableArray *objp)
|
||||||
|
{
|
||||||
|
if (!xdr_array(xdrs, (char **)&objp->TestStructVariableArray_val, (u_int *) &objp->TestStructVariableArray_len, 19,
|
||||||
|
sizeof(TestStruct), (xdrproc_t)xdr_TestStruct))
|
||||||
|
return FALSE;
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool_t
|
||||||
|
xdr_TestUnionScalar(XDR *xdrs, TestUnionScalar *objp)
|
||||||
|
{
|
||||||
|
if (!xdr_TestUnion(xdrs, objp))
|
||||||
|
return FALSE;
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool_t
|
||||||
|
xdr_TestUnionPointer(XDR *xdrs, TestUnionPointer *objp)
|
||||||
|
{
|
||||||
|
if (!xdr_pointer(xdrs, (char **)objp, sizeof(TestUnion), (xdrproc_t)xdr_TestUnion))
|
||||||
|
return FALSE;
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool_t
|
||||||
|
xdr_TestUnionFixedArray(XDR *xdrs, TestUnionFixedArray objp)
|
||||||
|
{
|
||||||
|
if (!xdr_vector(xdrs, (char *)objp, 21,
|
||||||
|
sizeof(TestUnion), (xdrproc_t)xdr_TestUnion))
|
||||||
|
return FALSE;
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool_t
|
||||||
|
xdr_TestUnionVariableArray(XDR *xdrs, TestUnionVariableArray *objp)
|
||||||
|
{
|
||||||
|
if (!xdr_array(xdrs, (char **)&objp->TestUnionVariableArray_val, (u_int *) &objp->TestUnionVariableArray_len, 23,
|
||||||
|
sizeof(TestUnion), (xdrproc_t)xdr_TestUnion))
|
||||||
|
return FALSE;
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool_t
|
||||||
|
xdr_TestStructAllTypes(XDR *xdrs, TestStructAllTypes *objp)
|
||||||
|
{
|
||||||
|
if (!xdr_char(xdrs, &objp->sc))
|
||||||
|
return FALSE;
|
||||||
|
if (!xdr_u_char(xdrs, &objp->suc))
|
||||||
|
return FALSE;
|
||||||
|
if (!xdr_short(xdrs, &objp->ss))
|
||||||
|
return FALSE;
|
||||||
|
if (!xdr_u_short(xdrs, &objp->sus))
|
||||||
|
return FALSE;
|
||||||
|
if (!xdr_int(xdrs, &objp->si))
|
||||||
|
return FALSE;
|
||||||
|
if (!xdr_u_int(xdrs, &objp->sui))
|
||||||
|
return FALSE;
|
||||||
|
if (!xdr_int64_t(xdrs, &objp->sh))
|
||||||
|
return FALSE;
|
||||||
|
if (!xdr_uint64_t(xdrs, &objp->suh))
|
||||||
|
return FALSE;
|
||||||
|
if (!xdr_bool(xdrs, &objp->sb))
|
||||||
|
return FALSE;
|
||||||
|
if (!xdr_float(xdrs, &objp->sf))
|
||||||
|
return FALSE;
|
||||||
|
if (!xdr_double(xdrs, &objp->sd))
|
||||||
|
return FALSE;
|
||||||
|
if (!xdr_pointer(xdrs, (char **)&objp->ip, sizeof(int), (xdrproc_t)xdr_int))
|
||||||
|
return FALSE;
|
||||||
|
if (!xdr_vector(xdrs, (char *)objp->ifa, TestConstDec,
|
||||||
|
sizeof(int), (xdrproc_t)xdr_int))
|
||||||
|
return FALSE;
|
||||||
|
if (!xdr_array(xdrs, (char **)&objp->iva.iva_val, (u_int *) &objp->iva.iva_len, TestConstHex,
|
||||||
|
sizeof(int), (xdrproc_t)xdr_int))
|
||||||
|
return FALSE;
|
||||||
|
if (!xdr_string(xdrs, &objp->stva, TestConstOct))
|
||||||
|
return FALSE;
|
||||||
|
if (!xdr_opaque(xdrs, objp->ofa, 33))
|
||||||
|
return FALSE;
|
||||||
|
if (!xdr_bytes(xdrs, (char **)&objp->ova.ova_val, (u_int *) &objp->ova.ova_len, 35))
|
||||||
|
return FALSE;
|
||||||
|
if (!xdr_TestEnum(xdrs, &objp->e1))
|
||||||
|
return FALSE;
|
||||||
|
if (!xdr_TestEnum(xdrs, &objp->e2))
|
||||||
|
return FALSE;
|
||||||
|
if (!xdr_pointer(xdrs, (char **)&objp->ep, sizeof(TestEnum), (xdrproc_t)xdr_TestEnum))
|
||||||
|
return FALSE;
|
||||||
|
if (!xdr_vector(xdrs, (char *)objp->efa, 37,
|
||||||
|
sizeof(TestEnum), (xdrproc_t)xdr_TestEnum))
|
||||||
|
return FALSE;
|
||||||
|
if (!xdr_array(xdrs, (char **)&objp->eva.eva_val, (u_int *) &objp->eva.eva_len, 39,
|
||||||
|
sizeof(TestEnum), (xdrproc_t)xdr_TestEnum))
|
||||||
|
return FALSE;
|
||||||
|
if (!xdr_TestStruct(xdrs, &objp->s))
|
||||||
|
return FALSE;
|
||||||
|
if (!xdr_pointer(xdrs, (char **)&objp->sp, sizeof(TestStruct), (xdrproc_t)xdr_TestStruct))
|
||||||
|
return FALSE;
|
||||||
|
if (!xdr_vector(xdrs, (char *)objp->sfa, 41,
|
||||||
|
sizeof(TestStruct), (xdrproc_t)xdr_TestStruct))
|
||||||
|
return FALSE;
|
||||||
|
if (!xdr_array(xdrs, (char **)&objp->sva.sva_val, (u_int *) &objp->sva.sva_len, 43,
|
||||||
|
sizeof(TestStruct), (xdrproc_t)xdr_TestStruct))
|
||||||
|
return FALSE;
|
||||||
|
if (!xdr_TestUnion(xdrs, &objp->u))
|
||||||
|
return FALSE;
|
||||||
|
if (!xdr_pointer(xdrs, (char **)&objp->up, sizeof(TestUnion), (xdrproc_t)xdr_TestUnion))
|
||||||
|
return FALSE;
|
||||||
|
if (!xdr_vector(xdrs, (char *)objp->ufa, 45,
|
||||||
|
sizeof(TestUnion), (xdrproc_t)xdr_TestUnion))
|
||||||
|
return FALSE;
|
||||||
|
if (!xdr_array(xdrs, (char **)&objp->uva.uva_val, (u_int *) &objp->uva.uva_len, 47,
|
||||||
|
sizeof(TestUnion), (xdrproc_t)xdr_TestUnion))
|
||||||
|
return FALSE;
|
||||||
|
if (!xdr_TestIntScalar(xdrs, &objp->tis))
|
||||||
|
return FALSE;
|
||||||
|
if (!xdr_TestIntPointer(xdrs, &objp->tip))
|
||||||
|
return FALSE;
|
||||||
|
if (!xdr_TestIntFixedArray(xdrs, objp->tifa))
|
||||||
|
return FALSE;
|
||||||
|
if (!xdr_TestIntVariableArray(xdrs, &objp->tiva))
|
||||||
|
return FALSE;
|
||||||
|
if (!xdr_TestStringVariableArray(xdrs, &objp->tstva))
|
||||||
|
return FALSE;
|
||||||
|
if (!xdr_TestOpaqueFixedArray(xdrs, objp->tofa))
|
||||||
|
return FALSE;
|
||||||
|
if (!xdr_TestOpaqueVariableArray(xdrs, &objp->tova))
|
||||||
|
return FALSE;
|
||||||
|
if (!xdr_TestEnumScalar(xdrs, &objp->tes))
|
||||||
|
return FALSE;
|
||||||
|
if (!xdr_TestEnumPointer(xdrs, &objp->tep))
|
||||||
|
return FALSE;
|
||||||
|
if (!xdr_TestEnumFixedArray(xdrs, objp->tefa))
|
||||||
|
return FALSE;
|
||||||
|
if (!xdr_TestEnumVariableArray(xdrs, &objp->teva))
|
||||||
|
return FALSE;
|
||||||
|
if (!xdr_TestStructScalar(xdrs, &objp->tss))
|
||||||
|
return FALSE;
|
||||||
|
if (!xdr_TestStructPointer(xdrs, &objp->tsp))
|
||||||
|
return FALSE;
|
||||||
|
if (!xdr_TestStructFixedArray(xdrs, objp->tsfa))
|
||||||
|
return FALSE;
|
||||||
|
if (!xdr_TestStructVariableArray(xdrs, &objp->tsva))
|
||||||
|
return FALSE;
|
||||||
|
if (!xdr_TestUnionScalar(xdrs, &objp->tu))
|
||||||
|
return FALSE;
|
||||||
|
if (!xdr_TestUnionPointer(xdrs, &objp->tup))
|
||||||
|
return FALSE;
|
||||||
|
if (!xdr_TestUnionFixedArray(xdrs, objp->tufa))
|
||||||
|
return FALSE;
|
||||||
|
if (!xdr_TestUnionVariableArray(xdrs, &objp->tuva))
|
||||||
|
return FALSE;
|
||||||
|
return TRUE;
|
||||||
|
}
|
216
scripts/rpcgen/tests/demo.h
Normal file
216
scripts/rpcgen/tests/demo.h
Normal file
@ -0,0 +1,216 @@
|
|||||||
|
enum TestEnum {
|
||||||
|
TEST_ENUM_ONE = 1,
|
||||||
|
TEST_ENUM_TWO = 2,
|
||||||
|
};
|
||||||
|
typedef enum TestEnum TestEnum;
|
||||||
|
|
||||||
|
struct TestStruct {
|
||||||
|
char c1;
|
||||||
|
char c2;
|
||||||
|
};
|
||||||
|
typedef struct TestStruct TestStruct;
|
||||||
|
|
||||||
|
struct TestUnion {
|
||||||
|
int type;
|
||||||
|
union {
|
||||||
|
int i1;
|
||||||
|
int i2;
|
||||||
|
int i3;
|
||||||
|
} TestUnion_u;
|
||||||
|
};
|
||||||
|
typedef struct TestUnion TestUnion;
|
||||||
|
|
||||||
|
struct TestUnionVoidDefault {
|
||||||
|
int type;
|
||||||
|
union {
|
||||||
|
int i1;
|
||||||
|
int i2;
|
||||||
|
} TestUnionVoidDefault_u;
|
||||||
|
};
|
||||||
|
typedef struct TestUnionVoidDefault TestUnionVoidDefault;
|
||||||
|
|
||||||
|
struct TestUnionNoDefault {
|
||||||
|
int type;
|
||||||
|
union {
|
||||||
|
int i1;
|
||||||
|
int i2;
|
||||||
|
} TestUnionNoDefault_u;
|
||||||
|
};
|
||||||
|
typedef struct TestUnionNoDefault TestUnionNoDefault;
|
||||||
|
|
||||||
|
typedef int TestIntScalar;
|
||||||
|
|
||||||
|
typedef int *TestIntPointer;
|
||||||
|
|
||||||
|
typedef int TestIntFixedArray[3];
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
u_int TestIntVariableArray_len;
|
||||||
|
int *TestIntVariableArray_val;
|
||||||
|
} TestIntVariableArray;
|
||||||
|
|
||||||
|
typedef char *TestStringVariableArray;
|
||||||
|
|
||||||
|
typedef char TestOpaqueFixedArray[9];
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
u_int TestOpaqueVariableArray_len;
|
||||||
|
char *TestOpaqueVariableArray_val;
|
||||||
|
} TestOpaqueVariableArray;
|
||||||
|
|
||||||
|
typedef TestEnum TestEnumScalar;
|
||||||
|
|
||||||
|
typedef TestEnum *TestEnumPointer;
|
||||||
|
|
||||||
|
typedef TestEnum TestEnumFixedArray[13];
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
u_int TestEnumVariableArray_len;
|
||||||
|
TestEnum *TestEnumVariableArray_val;
|
||||||
|
} TestEnumVariableArray;
|
||||||
|
|
||||||
|
typedef TestStruct TestStructScalar;
|
||||||
|
|
||||||
|
typedef TestStruct *TestStructPointer;
|
||||||
|
|
||||||
|
typedef TestStruct TestStructFixedArray[17];
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
u_int TestStructVariableArray_len;
|
||||||
|
TestStruct *TestStructVariableArray_val;
|
||||||
|
} TestStructVariableArray;
|
||||||
|
|
||||||
|
typedef TestUnion TestUnionScalar;
|
||||||
|
|
||||||
|
typedef TestUnion *TestUnionPointer;
|
||||||
|
|
||||||
|
typedef TestUnion TestUnionFixedArray[21];
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
u_int TestUnionVariableArray_len;
|
||||||
|
TestUnion *TestUnionVariableArray_val;
|
||||||
|
} TestUnionVariableArray;
|
||||||
|
|
||||||
|
#define TestConstDec 25
|
||||||
|
|
||||||
|
#define TestConstHex 0x27
|
||||||
|
|
||||||
|
#define TestConstOct 031
|
||||||
|
|
||||||
|
struct TestStructAllTypes {
|
||||||
|
char sc;
|
||||||
|
u_char suc;
|
||||||
|
short ss;
|
||||||
|
u_short sus;
|
||||||
|
int si;
|
||||||
|
u_int sui;
|
||||||
|
int64_t sh;
|
||||||
|
uint64_t suh;
|
||||||
|
bool_t sb;
|
||||||
|
float sf;
|
||||||
|
double sd;
|
||||||
|
int *ip;
|
||||||
|
int ifa[TestConstDec];
|
||||||
|
struct {
|
||||||
|
u_int iva_len;
|
||||||
|
int *iva_val;
|
||||||
|
} iva;
|
||||||
|
char *stva;
|
||||||
|
char ofa[33];
|
||||||
|
struct {
|
||||||
|
u_int ova_len;
|
||||||
|
char *ova_val;
|
||||||
|
} ova;
|
||||||
|
TestEnum e1;
|
||||||
|
TestEnum e2;
|
||||||
|
TestEnum *ep;
|
||||||
|
TestEnum efa[37];
|
||||||
|
struct {
|
||||||
|
u_int eva_len;
|
||||||
|
TestEnum *eva_val;
|
||||||
|
} eva;
|
||||||
|
TestStruct s;
|
||||||
|
TestStruct *sp;
|
||||||
|
TestStruct sfa[41];
|
||||||
|
struct {
|
||||||
|
u_int sva_len;
|
||||||
|
TestStruct *sva_val;
|
||||||
|
} sva;
|
||||||
|
TestUnion u;
|
||||||
|
TestUnion *up;
|
||||||
|
TestUnion ufa[45];
|
||||||
|
struct {
|
||||||
|
u_int uva_len;
|
||||||
|
TestUnion *uva_val;
|
||||||
|
} uva;
|
||||||
|
TestIntScalar tis;
|
||||||
|
TestIntPointer tip;
|
||||||
|
TestIntFixedArray tifa;
|
||||||
|
TestIntVariableArray tiva;
|
||||||
|
TestStringVariableArray tstva;
|
||||||
|
TestOpaqueFixedArray tofa;
|
||||||
|
TestOpaqueVariableArray tova;
|
||||||
|
TestEnumScalar tes;
|
||||||
|
TestEnumPointer tep;
|
||||||
|
TestEnumFixedArray tefa;
|
||||||
|
TestEnumVariableArray teva;
|
||||||
|
TestStructScalar tss;
|
||||||
|
TestStructPointer tsp;
|
||||||
|
TestStructFixedArray tsfa;
|
||||||
|
TestStructVariableArray tsva;
|
||||||
|
TestUnionScalar tu;
|
||||||
|
TestUnionPointer tup;
|
||||||
|
TestUnionFixedArray tufa;
|
||||||
|
TestUnionVariableArray tuva;
|
||||||
|
};
|
||||||
|
typedef struct TestStructAllTypes TestStructAllTypes;
|
||||||
|
|
||||||
|
extern bool_t xdr_TestEnum(XDR *, TestEnum*);
|
||||||
|
|
||||||
|
extern bool_t xdr_TestStruct(XDR *, TestStruct*);
|
||||||
|
|
||||||
|
extern bool_t xdr_TestUnion(XDR *, TestUnion*);
|
||||||
|
|
||||||
|
extern bool_t xdr_TestUnionVoidDefault(XDR *, TestUnionVoidDefault*);
|
||||||
|
|
||||||
|
extern bool_t xdr_TestUnionNoDefault(XDR *, TestUnionNoDefault*);
|
||||||
|
|
||||||
|
extern bool_t xdr_TestIntScalar(XDR *, TestIntScalar*);
|
||||||
|
|
||||||
|
extern bool_t xdr_TestIntPointer(XDR *, TestIntPointer*);
|
||||||
|
|
||||||
|
extern bool_t xdr_TestIntFixedArray(XDR *, TestIntFixedArray);
|
||||||
|
|
||||||
|
extern bool_t xdr_TestIntVariableArray(XDR *, TestIntVariableArray*);
|
||||||
|
|
||||||
|
extern bool_t xdr_TestStringVariableArray(XDR *, TestStringVariableArray*);
|
||||||
|
|
||||||
|
extern bool_t xdr_TestOpaqueFixedArray(XDR *, TestOpaqueFixedArray);
|
||||||
|
|
||||||
|
extern bool_t xdr_TestOpaqueVariableArray(XDR *, TestOpaqueVariableArray*);
|
||||||
|
|
||||||
|
extern bool_t xdr_TestEnumScalar(XDR *, TestEnumScalar*);
|
||||||
|
|
||||||
|
extern bool_t xdr_TestEnumPointer(XDR *, TestEnumPointer*);
|
||||||
|
|
||||||
|
extern bool_t xdr_TestEnumFixedArray(XDR *, TestEnumFixedArray);
|
||||||
|
|
||||||
|
extern bool_t xdr_TestEnumVariableArray(XDR *, TestEnumVariableArray*);
|
||||||
|
|
||||||
|
extern bool_t xdr_TestStructScalar(XDR *, TestStructScalar*);
|
||||||
|
|
||||||
|
extern bool_t xdr_TestStructPointer(XDR *, TestStructPointer*);
|
||||||
|
|
||||||
|
extern bool_t xdr_TestStructFixedArray(XDR *, TestStructFixedArray);
|
||||||
|
|
||||||
|
extern bool_t xdr_TestStructVariableArray(XDR *, TestStructVariableArray*);
|
||||||
|
|
||||||
|
extern bool_t xdr_TestUnionScalar(XDR *, TestUnionScalar*);
|
||||||
|
|
||||||
|
extern bool_t xdr_TestUnionPointer(XDR *, TestUnionPointer*);
|
||||||
|
|
||||||
|
extern bool_t xdr_TestUnionFixedArray(XDR *, TestUnionFixedArray);
|
||||||
|
|
||||||
|
extern bool_t xdr_TestUnionVariableArray(XDR *, TestUnionVariableArray*);
|
||||||
|
|
||||||
|
extern bool_t xdr_TestStructAllTypes(XDR *, TestStructAllTypes*);
|
128
scripts/rpcgen/tests/demo.x
Normal file
128
scripts/rpcgen/tests/demo.x
Normal file
@ -0,0 +1,128 @@
|
|||||||
|
enum TestEnum {
|
||||||
|
TEST_ENUM_ONE = 1,
|
||||||
|
TEST_ENUM_TWO = 2
|
||||||
|
};
|
||||||
|
|
||||||
|
struct TestStruct {
|
||||||
|
char c1;
|
||||||
|
char c2;
|
||||||
|
};
|
||||||
|
|
||||||
|
union TestUnion switch (int type) {
|
||||||
|
case 20:
|
||||||
|
int i1;
|
||||||
|
case 30:
|
||||||
|
int i2;
|
||||||
|
default:
|
||||||
|
int i3;
|
||||||
|
};
|
||||||
|
|
||||||
|
union TestUnionVoidDefault switch (int type) {
|
||||||
|
case 21:
|
||||||
|
int i1;
|
||||||
|
case 31:
|
||||||
|
int i2;
|
||||||
|
default:
|
||||||
|
void;
|
||||||
|
};
|
||||||
|
|
||||||
|
union TestUnionNoDefault switch (int type) {
|
||||||
|
case 22:
|
||||||
|
int i1;
|
||||||
|
case 32:
|
||||||
|
int i2;
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef int TestIntScalar;
|
||||||
|
typedef int *TestIntPointer;
|
||||||
|
typedef int TestIntFixedArray[3];
|
||||||
|
typedef int TestIntVariableArray<5>;
|
||||||
|
|
||||||
|
typedef string TestStringVariableArray<7>;
|
||||||
|
|
||||||
|
typedef opaque TestOpaqueFixedArray[9];
|
||||||
|
typedef opaque TestOpaqueVariableArray<11>;
|
||||||
|
|
||||||
|
typedef TestEnum TestEnumScalar;
|
||||||
|
typedef TestEnum *TestEnumPointer;
|
||||||
|
typedef TestEnum TestEnumFixedArray[13];
|
||||||
|
typedef TestEnum TestEnumVariableArray<15>;
|
||||||
|
|
||||||
|
typedef TestStruct TestStructScalar;
|
||||||
|
typedef TestStruct *TestStructPointer;
|
||||||
|
typedef TestStruct TestStructFixedArray[17];
|
||||||
|
typedef TestStruct TestStructVariableArray<19>;
|
||||||
|
|
||||||
|
typedef TestUnion TestUnionScalar;
|
||||||
|
typedef TestUnion *TestUnionPointer;
|
||||||
|
typedef TestUnion TestUnionFixedArray[21];
|
||||||
|
typedef TestUnion TestUnionVariableArray<23>;
|
||||||
|
|
||||||
|
const TestConstDec = 25;
|
||||||
|
const TestConstHex = 0x27;
|
||||||
|
const TestConstOct = 031;
|
||||||
|
|
||||||
|
struct TestStructAllTypes {
|
||||||
|
char sc;
|
||||||
|
unsigned char suc;
|
||||||
|
short ss;
|
||||||
|
unsigned short sus;
|
||||||
|
int si;
|
||||||
|
unsigned int sui;
|
||||||
|
hyper sh;
|
||||||
|
unsigned hyper suh;
|
||||||
|
bool sb;
|
||||||
|
float sf;
|
||||||
|
double sd;
|
||||||
|
/* quadruple sq; */
|
||||||
|
|
||||||
|
int *ip;
|
||||||
|
int ifa[TestConstDec];
|
||||||
|
int iva<TestConstHex>;
|
||||||
|
|
||||||
|
string stva<TestConstOct>;
|
||||||
|
|
||||||
|
opaque ofa[33];
|
||||||
|
opaque ova<35>;
|
||||||
|
|
||||||
|
TestEnum e1;
|
||||||
|
TestEnum e2;
|
||||||
|
TestEnum *ep;
|
||||||
|
TestEnum efa[37];
|
||||||
|
TestEnum eva<39>;
|
||||||
|
|
||||||
|
TestStruct s;
|
||||||
|
TestStruct *sp;
|
||||||
|
TestStruct sfa[41];
|
||||||
|
TestStruct sva<43>;
|
||||||
|
|
||||||
|
TestUnion u;
|
||||||
|
TestUnion *up;
|
||||||
|
TestUnion ufa[45];
|
||||||
|
TestUnion uva<47>;
|
||||||
|
|
||||||
|
TestIntScalar tis;
|
||||||
|
TestIntPointer tip;
|
||||||
|
TestIntFixedArray tifa;
|
||||||
|
TestIntVariableArray tiva;
|
||||||
|
|
||||||
|
TestStringVariableArray tstva;
|
||||||
|
|
||||||
|
TestOpaqueFixedArray tofa;
|
||||||
|
TestOpaqueVariableArray tova;
|
||||||
|
|
||||||
|
TestEnumScalar tes;
|
||||||
|
TestEnumPointer tep;
|
||||||
|
TestEnumFixedArray tefa;
|
||||||
|
TestEnumVariableArray teva;
|
||||||
|
|
||||||
|
TestStructScalar tss;
|
||||||
|
TestStructPointer tsp;
|
||||||
|
TestStructFixedArray tsfa;
|
||||||
|
TestStructVariableArray tsva;
|
||||||
|
|
||||||
|
TestUnionScalar tu;
|
||||||
|
TestUnionPointer tup;
|
||||||
|
TestUnionFixedArray tufa;
|
||||||
|
TestUnionVariableArray tuva;
|
||||||
|
};
|
@ -1,4 +1,5 @@
|
|||||||
rpcgen_tests = files([
|
rpcgen_tests = files([
|
||||||
|
'test_generator.py',
|
||||||
'test_lexer.py',
|
'test_lexer.py',
|
||||||
'test_parser.py',
|
'test_parser.py',
|
||||||
])
|
])
|
||||||
|
55
scripts/rpcgen/tests/test_generator.py
Normal file
55
scripts/rpcgen/tests/test_generator.py
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
# SPDX-License-Identifier: LGPL-2.1-or-later
|
||||||
|
|
||||||
|
import os
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
|
from rpcgen.parser import XDRParser
|
||||||
|
from rpcgen.generator import (
|
||||||
|
XDRTypeDeclarationGenerator,
|
||||||
|
XDRMarshallDeclarationGenerator,
|
||||||
|
XDRMarshallImplementationGenerator,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def test_generate_header():
|
||||||
|
x = Path(Path(__file__).parent, "demo.x")
|
||||||
|
h = Path(Path(__file__).parent, "demo.h")
|
||||||
|
with x.open("r") as fp:
|
||||||
|
parser = XDRParser(fp)
|
||||||
|
spec = parser.parse()
|
||||||
|
|
||||||
|
got = (
|
||||||
|
XDRTypeDeclarationGenerator(spec).visit()
|
||||||
|
+ "\n"
|
||||||
|
+ XDRMarshallDeclarationGenerator(spec).visit()
|
||||||
|
)
|
||||||
|
|
||||||
|
with h.open("r") as fp:
|
||||||
|
want = fp.read()
|
||||||
|
|
||||||
|
if "VIR_TEST_REGENERATE_OUTPUT" in os.environ:
|
||||||
|
want = got
|
||||||
|
with h.open("w") as fp:
|
||||||
|
fp.write(want)
|
||||||
|
|
||||||
|
assert got == want
|
||||||
|
|
||||||
|
|
||||||
|
def test_generate_source():
|
||||||
|
x = Path(Path(__file__).parent, "demo.x")
|
||||||
|
h = Path(Path(__file__).parent, "demo.c")
|
||||||
|
with x.open("r") as fp:
|
||||||
|
parser = XDRParser(fp)
|
||||||
|
spec = parser.parse()
|
||||||
|
|
||||||
|
got = XDRMarshallImplementationGenerator(spec).visit()
|
||||||
|
|
||||||
|
with h.open("r") as fp:
|
||||||
|
want = fp.read()
|
||||||
|
|
||||||
|
if "VIR_TEST_REGENERATE_OUTPUT" in os.environ:
|
||||||
|
want = got
|
||||||
|
with h.open("w") as fp:
|
||||||
|
fp.write(want)
|
||||||
|
|
||||||
|
assert got == want
|
Loading…
Reference in New Issue
Block a user