| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288 |
- #!/usr/bin/env python3
- # ex: set filetype=python:
- """Generate code to handle XDR pointer types"""
- from jinja2 import Environment
- from generators import SourceGenerator, kernel_c_type
- from generators import create_jinja2_environment, get_jinja2_template
- from xdr_ast import _XdrBasic, _XdrString
- from xdr_ast import _XdrFixedLengthOpaque, _XdrVariableLengthOpaque
- from xdr_ast import _XdrFixedLengthArray, _XdrVariableLengthArray
- from xdr_ast import _XdrOptionalData, _XdrPointer, _XdrDeclaration
- from xdr_ast import public_apis, get_header_name
- def emit_pointer_declaration(environment: Environment, node: _XdrPointer) -> None:
- """Emit a declaration pair for an XDR pointer type"""
- if node.name in public_apis:
- template = get_jinja2_template(environment, "declaration", "close")
- print(template.render(name=node.name))
- def emit_pointer_member_definition(
- environment: Environment, field: _XdrDeclaration
- ) -> None:
- """Emit a definition for one field in an XDR struct"""
- if isinstance(field, _XdrBasic):
- template = get_jinja2_template(environment, "definition", field.template)
- print(
- template.render(
- name=field.name,
- type=kernel_c_type(field.spec),
- classifier=field.spec.c_classifier,
- )
- )
- elif isinstance(field, _XdrFixedLengthOpaque):
- template = get_jinja2_template(environment, "definition", field.template)
- print(
- template.render(
- name=field.name,
- size=field.size,
- )
- )
- elif isinstance(field, _XdrVariableLengthOpaque):
- template = get_jinja2_template(environment, "definition", field.template)
- print(template.render(name=field.name))
- elif isinstance(field, _XdrString):
- template = get_jinja2_template(environment, "definition", field.template)
- print(template.render(name=field.name))
- elif isinstance(field, _XdrFixedLengthArray):
- template = get_jinja2_template(environment, "definition", field.template)
- print(
- template.render(
- name=field.name,
- type=kernel_c_type(field.spec),
- size=field.size,
- )
- )
- elif isinstance(field, _XdrVariableLengthArray):
- template = get_jinja2_template(environment, "definition", field.template)
- print(
- template.render(
- name=field.name,
- type=kernel_c_type(field.spec),
- classifier=field.spec.c_classifier,
- )
- )
- elif isinstance(field, _XdrOptionalData):
- template = get_jinja2_template(environment, "definition", field.template)
- print(
- template.render(
- name=field.name,
- type=kernel_c_type(field.spec),
- classifier=field.spec.c_classifier,
- )
- )
- def emit_pointer_definition(environment: Environment, node: _XdrPointer) -> None:
- """Emit a definition for an XDR pointer type"""
- template = get_jinja2_template(environment, "definition", "open")
- print(template.render(name=node.name))
- for field in node.fields[0:-1]:
- emit_pointer_member_definition(environment, field)
- template = get_jinja2_template(environment, "definition", "close")
- print(template.render(name=node.name))
- def emit_pointer_member_decoder(
- environment: Environment, field: _XdrDeclaration
- ) -> None:
- """Emit a decoder for one field in an XDR pointer"""
- if isinstance(field, _XdrBasic):
- template = get_jinja2_template(environment, "decoder", field.template)
- print(
- template.render(
- name=field.name,
- type=field.spec.type_name,
- classifier=field.spec.c_classifier,
- )
- )
- elif isinstance(field, _XdrFixedLengthOpaque):
- template = get_jinja2_template(environment, "decoder", field.template)
- print(
- template.render(
- name=field.name,
- size=field.size,
- )
- )
- elif isinstance(field, _XdrVariableLengthOpaque):
- template = get_jinja2_template(environment, "decoder", field.template)
- print(
- template.render(
- name=field.name,
- maxsize=field.maxsize,
- )
- )
- elif isinstance(field, _XdrString):
- template = get_jinja2_template(environment, "decoder", field.template)
- print(
- template.render(
- name=field.name,
- maxsize=field.maxsize,
- )
- )
- elif isinstance(field, _XdrFixedLengthArray):
- template = get_jinja2_template(environment, "decoder", field.template)
- print(
- template.render(
- name=field.name,
- type=field.spec.type_name,
- size=field.size,
- classifier=field.spec.c_classifier,
- )
- )
- elif isinstance(field, _XdrVariableLengthArray):
- template = get_jinja2_template(environment, "decoder", field.template)
- print(
- template.render(
- name=field.name,
- type=field.spec.type_name,
- maxsize=field.maxsize,
- classifier=field.spec.c_classifier,
- )
- )
- elif isinstance(field, _XdrOptionalData):
- template = get_jinja2_template(environment, "decoder", field.template)
- print(
- template.render(
- name=field.name,
- type=field.spec.type_name,
- classifier=field.spec.c_classifier,
- )
- )
- def emit_pointer_decoder(environment: Environment, node: _XdrPointer) -> None:
- """Emit one decoder function for an XDR pointer type"""
- template = get_jinja2_template(environment, "decoder", "open")
- print(template.render(name=node.name))
- for field in node.fields[0:-1]:
- emit_pointer_member_decoder(environment, field)
- template = get_jinja2_template(environment, "decoder", "close")
- print(template.render())
- def emit_pointer_member_encoder(
- environment: Environment, field: _XdrDeclaration
- ) -> None:
- """Emit an encoder for one field in a XDR pointer"""
- if isinstance(field, _XdrBasic):
- template = get_jinja2_template(environment, "encoder", field.template)
- print(
- template.render(
- name=field.name,
- type=field.spec.type_name,
- )
- )
- elif isinstance(field, _XdrFixedLengthOpaque):
- template = get_jinja2_template(environment, "encoder", field.template)
- print(
- template.render(
- name=field.name,
- size=field.size,
- )
- )
- elif isinstance(field, _XdrVariableLengthOpaque):
- template = get_jinja2_template(environment, "encoder", field.template)
- print(
- template.render(
- name=field.name,
- maxsize=field.maxsize,
- )
- )
- elif isinstance(field, _XdrString):
- template = get_jinja2_template(environment, "encoder", field.template)
- print(
- template.render(
- name=field.name,
- maxsize=field.maxsize,
- )
- )
- elif isinstance(field, _XdrFixedLengthArray):
- template = get_jinja2_template(environment, "encoder", field.template)
- print(
- template.render(
- name=field.name,
- type=field.spec.type_name,
- size=field.size,
- )
- )
- elif isinstance(field, _XdrVariableLengthArray):
- template = get_jinja2_template(environment, "encoder", field.template)
- print(
- template.render(
- name=field.name,
- type=field.spec.type_name,
- maxsize=field.maxsize,
- )
- )
- elif isinstance(field, _XdrOptionalData):
- template = get_jinja2_template(environment, "encoder", field.template)
- print(
- template.render(
- name=field.name,
- type=field.spec.type_name,
- classifier=field.spec.c_classifier,
- )
- )
- def emit_pointer_encoder(environment: Environment, node: _XdrPointer) -> None:
- """Emit one encoder function for an XDR pointer type"""
- template = get_jinja2_template(environment, "encoder", "open")
- print(template.render(name=node.name))
- for field in node.fields[0:-1]:
- emit_pointer_member_encoder(environment, field)
- template = get_jinja2_template(environment, "encoder", "close")
- print(template.render())
- def emit_pointer_maxsize(environment: Environment, node: _XdrPointer) -> None:
- """Emit one maxsize macro for an XDR pointer type"""
- macro_name = get_header_name().upper() + "_" + node.name + "_sz"
- template = get_jinja2_template(environment, "maxsize", "pointer")
- print(
- template.render(
- macro=macro_name,
- width=" + ".join(node.symbolic_width()),
- )
- )
- class XdrPointerGenerator(SourceGenerator):
- """Generate source code for XDR pointer"""
- def __init__(self, language: str, peer: str):
- """Initialize an instance of this class"""
- self.environment = create_jinja2_environment(language, "pointer")
- self.peer = peer
- def emit_declaration(self, node: _XdrPointer) -> None:
- """Emit one declaration pair for an XDR pointer type"""
- emit_pointer_declaration(self.environment, node)
- def emit_definition(self, node: _XdrPointer) -> None:
- """Emit one declaration for an XDR pointer type"""
- emit_pointer_definition(self.environment, node)
- def emit_decoder(self, node: _XdrPointer) -> None:
- """Emit one decoder function for an XDR pointer type"""
- emit_pointer_decoder(self.environment, node)
- def emit_encoder(self, node: _XdrPointer) -> None:
- """Emit one encoder function for an XDR pointer type"""
- emit_pointer_encoder(self.environment, node)
- def emit_maxsize(self, node: _XdrPointer) -> None:
- """Emit one maxsize macro for an XDR pointer type"""
- emit_pointer_maxsize(self.environment, node)
|