From 77249bb45c44ec88c96cd00da0805e1a58a1bfd6 Mon Sep 17 00:00:00 2001 From: "Luke T. Shumaker" Date: Sun, 23 Mar 2025 01:22:27 -0600 Subject: lib9p: protogen: pull c9util.py out of __init__.py --- lib9p/protogen/c9util.py | 109 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 109 insertions(+) create mode 100644 lib9p/protogen/c9util.py (limited to 'lib9p/protogen/c9util.py') diff --git a/lib9p/protogen/c9util.py b/lib9p/protogen/c9util.py new file mode 100644 index 0000000..e7ad999 --- /dev/null +++ b/lib9p/protogen/c9util.py @@ -0,0 +1,109 @@ +# lib9p/protogen/c9util.py - Utilities for generating lib9p-specific C +# +# Copyright (C) 2024-2025 Luke T. Shumaker +# SPDX-License-Identifier: AGPL-3.0-or-later + +import typing + +import idl + +# This strives to be "general-purpose" in that it just acts on the +# *.9p inputs; but (unfortunately?) there are a few special-cases in +# this script, marked with "SPECIAL". + +# pylint: disable=unused-variable +__all__ = [ + "add_prefix", + "ident", + "Ident", + "IDENT", + "ver_enum", + "ver_ifdef", + "ver_cond", + "typename", + "idl_expr", +] + +# idents ####################################################################### + + +def add_prefix(p: str, s: str) -> str: + if s.startswith("_"): + return "_" + p + s[1:] + return p + s + + +def _ident(p: str, s: str) -> str: + return add_prefix(p, s.replace(".", "_")) + + +def ident(s: str) -> str: + return _ident("lib9p_", s) + + +def Ident(s: str) -> str: + return _ident("lib9p_".upper(), s) + + +def IDENT(s: str) -> str: + return _ident("lib9p_", s).upper() + + +# versions ##################################################################### + + +def ver_enum(ver: str) -> str: + return Ident("VER_" + ver) + + +def ver_ifdef(versions: typing.Collection[str]) -> str: + return " || ".join( + f"CONFIG_9P_ENABLE_{v.replace('.', '_')}" for v in sorted(versions) + ) + + +def ver_cond(versions: typing.Collection[str]) -> str: + if len(versions) == 1: + v = next(v for v in versions) + return f"is_ver(ctx, {v.replace('.', '_')})" + return "( " + (" || ".join(ver_cond({v}) for v in sorted(versions))) + " )" + + +# misc ######################################################################### + + +def typename(typ: idl.Type, parent: idl.StructMember | None = None) -> str: + match typ: + case idl.Primitive(): + if typ.value == 1 and parent and parent.cnt: # SPECIAL (string) + return "[[gnu::nonstring]] char" + return f"uint{typ.value*8}_t" + case idl.Number(): + return ident(f"{typ.typname}_t") + case idl.Bitfield(): + return ident(f"{typ.typname}_t") + case idl.Message(): + return f"struct {ident(f'msg_{typ.typname}')}" + case idl.Struct(): + return f"struct {ident(typ.typname)}" + case _: + raise ValueError(f"not a type: {typ.__class__.__name__}") + + +def idl_expr(expr: idl.Expr, lookup_sym: typing.Callable[[str], str]) -> str: + ret: list[str] = [] + for tok in expr.tokens: + match tok: + case idl.ExprOp(): + ret.append(tok.op) + case idl.ExprLit(): + ret.append(str(tok.val)) + case idl.ExprSym(symname="s32_max"): + ret.append("INT32_MAX") + case idl.ExprSym(symname="s64_max"): + ret.append("INT64_MAX") + case idl.ExprSym(): + ret.append(lookup_sym(tok.symname)) + case _: + assert False + return " ".join(ret) -- cgit v1.2.3-2-g168b From 82b733e4f8b3febc3b51c133a52fb62b54180b4b Mon Sep 17 00:00:00 2001 From: "Luke T. Shumaker" Date: Sun, 23 Mar 2025 02:26:08 -0600 Subject: lib9p: protogen: pull c.py and c_*.py out of __init__.py --- lib9p/protogen/c9util.py | 8 ++++++++ 1 file changed, 8 insertions(+) (limited to 'lib9p/protogen/c9util.py') diff --git a/lib9p/protogen/c9util.py b/lib9p/protogen/c9util.py index e7ad999..f9c49fc 100644 --- a/lib9p/protogen/c9util.py +++ b/lib9p/protogen/c9util.py @@ -107,3 +107,11 @@ def idl_expr(expr: idl.Expr, lookup_sym: typing.Callable[[str], str]) -> str: case _: assert False return " ".join(ret) + + +def arg_used(arg: str) -> str: + return arg + + +def arg_unused(arg: str) -> str: + return f"LM_UNUSED({arg})" -- cgit v1.2.3-2-g168b