Path: blob/master/tools/net/sunrpc/xdrgen/subcmds/definitions.py
26292 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 UnexpectedInput1112from generators.constant import XdrConstantGenerator13from generators.enum import XdrEnumGenerator14from generators.header_bottom import XdrHeaderBottomGenerator15from generators.header_top import XdrHeaderTopGenerator16from generators.pointer import XdrPointerGenerator17from generators.program import XdrProgramGenerator18from generators.typedef import XdrTypedefGenerator19from generators.struct import XdrStructGenerator20from generators.union import XdrUnionGenerator2122from xdr_ast import transform_parse_tree, Specification23from xdr_ast import _RpcProgram, _XdrConstant, _XdrEnum, _XdrPointer24from xdr_ast import _XdrTypedef, _XdrStruct, _XdrUnion25from xdr_parse import xdr_parser, set_xdr_annotate2627logger.setLevel(logging.INFO)282930def emit_header_definitions(root: Specification, language: str, peer: str) -> None:31"""Emit header definitions"""32for definition in root.definitions:33if isinstance(definition.value, _XdrConstant):34gen = XdrConstantGenerator(language, peer)35elif isinstance(definition.value, _XdrEnum):36gen = XdrEnumGenerator(language, peer)37elif isinstance(definition.value, _XdrPointer):38gen = XdrPointerGenerator(language, peer)39elif isinstance(definition.value, _RpcProgram):40gen = XdrProgramGenerator(language, peer)41elif isinstance(definition.value, _XdrTypedef):42gen = XdrTypedefGenerator(language, peer)43elif isinstance(definition.value, _XdrStruct):44gen = XdrStructGenerator(language, peer)45elif isinstance(definition.value, _XdrUnion):46gen = XdrUnionGenerator(language, peer)47else:48continue49gen.emit_definition(definition.value)505152def emit_header_maxsize(root: Specification, language: str, peer: str) -> None:53"""Emit header maxsize macros"""54print("")55for definition in root.definitions:56if isinstance(definition.value, _XdrEnum):57gen = XdrEnumGenerator(language, peer)58elif isinstance(definition.value, _XdrPointer):59gen = XdrPointerGenerator(language, peer)60elif isinstance(definition.value, _XdrTypedef):61gen = XdrTypedefGenerator(language, peer)62elif isinstance(definition.value, _XdrStruct):63gen = XdrStructGenerator(language, peer)64elif isinstance(definition.value, _XdrUnion):65gen = XdrUnionGenerator(language, peer)66else:67continue68gen.emit_maxsize(definition.value)697071def handle_parse_error(e: UnexpectedInput) -> bool:72"""Simple parse error reporting, no recovery attempted"""73print(e)74return True757677def subcmd(args: Namespace) -> int:78"""Generate definitions"""7980set_xdr_annotate(args.annotate)81parser = xdr_parser()82with open(args.filename, encoding="utf-8") as f:83parse_tree = parser.parse(f.read(), on_error=handle_parse_error)84ast = transform_parse_tree(parse_tree)8586gen = XdrHeaderTopGenerator(args.language, args.peer)87gen.emit_definition(args.filename, ast)8889emit_header_definitions(ast, args.language, args.peer)90emit_header_maxsize(ast, args.language, args.peer)9192gen = XdrHeaderBottomGenerator(args.language, args.peer)93gen.emit_definition(args.filename, ast)9495return 0969798