Path: blob/master/tools/net/sunrpc/xdrgen/subcmds/definitions.py
51759 views
#!/usr/bin/env python31# ex: set filetype=python:23"""Translate an XDR specification into executable code that4can be compiled for the Linux kernel."""56import logging78from argparse import Namespace9from lark import logger10from lark.exceptions import VisitError1112from generators.constant import XdrConstantGenerator13from generators.enum import XdrEnumGenerator14from generators.header_bottom import XdrHeaderBottomGenerator15from generators.header_top import XdrHeaderTopGenerator16from generators.passthru import XdrPassthruGenerator17from generators.pointer import XdrPointerGenerator18from generators.program import XdrProgramGenerator19from generators.typedef import XdrTypedefGenerator20from generators.struct import XdrStructGenerator21from generators.union import XdrUnionGenerator2223from xdr_ast import transform_parse_tree, Specification24from xdr_ast import _RpcProgram, _XdrConstant, _XdrEnum, _XdrPassthru, _XdrPointer25from xdr_ast import _XdrTypedef, _XdrStruct, _XdrUnion26from xdr_parse import xdr_parser, set_xdr_annotate27from xdr_parse import make_error_handler, XdrParseError28from xdr_parse import handle_transform_error2930logger.setLevel(logging.INFO)313233def emit_header_definitions(root: Specification, language: str, peer: str) -> None:34"""Emit header definitions"""35for definition in root.definitions:36if isinstance(definition.value, _XdrConstant):37gen = XdrConstantGenerator(language, peer)38elif isinstance(definition.value, _XdrEnum):39gen = XdrEnumGenerator(language, peer)40elif isinstance(definition.value, _XdrPointer):41gen = XdrPointerGenerator(language, peer)42elif isinstance(definition.value, _RpcProgram):43gen = XdrProgramGenerator(language, peer)44elif isinstance(definition.value, _XdrTypedef):45gen = XdrTypedefGenerator(language, peer)46elif isinstance(definition.value, _XdrStruct):47gen = XdrStructGenerator(language, peer)48elif isinstance(definition.value, _XdrUnion):49gen = XdrUnionGenerator(language, peer)50elif isinstance(definition.value, _XdrPassthru):51gen = XdrPassthruGenerator(language, peer)52else:53continue54gen.emit_definition(definition.value)555657def emit_header_maxsize(root: Specification, language: str, peer: str) -> None:58"""Emit header maxsize macros"""59print("")60for definition in root.definitions:61if isinstance(definition.value, _XdrEnum):62gen = XdrEnumGenerator(language, peer)63elif isinstance(definition.value, _XdrPointer):64gen = XdrPointerGenerator(language, peer)65elif isinstance(definition.value, _XdrTypedef):66gen = XdrTypedefGenerator(language, peer)67elif isinstance(definition.value, _XdrStruct):68gen = XdrStructGenerator(language, peer)69elif isinstance(definition.value, _XdrUnion):70gen = XdrUnionGenerator(language, peer)71elif isinstance(definition.value, _RpcProgram):72gen = XdrProgramGenerator(language, peer)73else:74continue75gen.emit_maxsize(definition.value)767778def subcmd(args: Namespace) -> int:79"""Generate definitions"""8081set_xdr_annotate(args.annotate)82parser = xdr_parser()83with open(args.filename, encoding="utf-8") as f:84source = f.read()85try:86parse_tree = parser.parse(87source, on_error=make_error_handler(source, args.filename)88)89except XdrParseError:90return 191try:92ast = transform_parse_tree(parse_tree)93except VisitError as e:94handle_transform_error(e, source, args.filename)95return 19697gen = XdrHeaderTopGenerator(args.language, args.peer)98gen.emit_definition(args.filename, ast)99100emit_header_definitions(ast, args.language, args.peer)101emit_header_maxsize(ast, args.language, args.peer)102103gen = XdrHeaderBottomGenerator(args.language, args.peer)104gen.emit_definition(args.filename, ast)105106return 0107108109