Path: blob/master/tools/net/sunrpc/xdrgen/generators/enum.py
26292 views
#!/usr/bin/env python31# ex: set filetype=python:23"""Generate code to handle XDR enum types"""45from generators import SourceGenerator, create_jinja2_environment6from xdr_ast import _XdrEnum, public_apis, big_endian, get_header_name789class XdrEnumGenerator(SourceGenerator):10"""Generate source code for XDR enum types"""1112def __init__(self, language: str, peer: str):13"""Initialize an instance of this class"""14self.environment = create_jinja2_environment(language, "enum")15self.peer = peer1617def emit_declaration(self, node: _XdrEnum) -> None:18"""Emit one declaration pair for an XDR enum type"""19if node.name in public_apis:20template = self.environment.get_template("declaration/enum.j2")21print(template.render(name=node.name))2223def emit_definition(self, node: _XdrEnum) -> None:24"""Emit one definition for an XDR enum type"""25template = self.environment.get_template("definition/open.j2")26print(template.render(name=node.name))2728template = self.environment.get_template("definition/enumerator.j2")29for enumerator in node.enumerators:30print(template.render(name=enumerator.name, value=enumerator.value))3132if node.name in big_endian:33template = self.environment.get_template("definition/close_be.j2")34else:35template = self.environment.get_template("definition/close.j2")36print(template.render(name=node.name))3738def emit_decoder(self, node: _XdrEnum) -> None:39"""Emit one decoder function for an XDR enum type"""40if node.name in big_endian:41template = self.environment.get_template("decoder/enum_be.j2")42else:43template = self.environment.get_template("decoder/enum.j2")44print(template.render(name=node.name))4546def emit_encoder(self, node: _XdrEnum) -> None:47"""Emit one encoder function for an XDR enum type"""48if node.name in big_endian:49template = self.environment.get_template("encoder/enum_be.j2")50else:51template = self.environment.get_template("encoder/enum.j2")52print(template.render(name=node.name))5354def emit_maxsize(self, node: _XdrEnum) -> None:55"""Emit one maxsize macro for an XDR enum type"""56macro_name = get_header_name().upper() + "_" + node.name + "_sz"57template = self.environment.get_template("maxsize/enum.j2")58print(59template.render(60macro=macro_name,61width=" + ".join(node.symbolic_width()),62)63)646566