summaryrefslogtreecommitdiff
path: root/lib9p/idl.gen
diff options
context:
space:
mode:
authorLuke T. Shumaker <lukeshu@lukeshu.com>2024-12-26 17:41:32 -0700
committerLuke T. Shumaker <lukeshu@lukeshu.com>2024-12-26 18:18:25 -0700
commit1aad8aa5947960e26d8efcdabb52babd6b52005b (patch)
treebb1713fc757d70b1e15b584aea9f7462a19374c2 /lib9p/idl.gen
parent339e4741a6822fbd4ebd343084ade44cbdb4a86a (diff)
lib9p: idl.gen: Give bitmasks their own section in .c
Diffstat (limited to 'lib9p/idl.gen')
-rwxr-xr-xlib9p/idl.gen42
1 files changed, 25 insertions, 17 deletions
diff --git a/lib9p/idl.gen b/lib9p/idl.gen
index 047ea96..72efb7b 100755
--- a/lib9p/idl.gen
+++ b/lib9p/idl.gen
@@ -318,6 +318,31 @@ const char *{idprefix}version_str(enum {idprefix}version ver) {{
}}
"""
+ # bitmasks #################################################################
+ ret += f"""
+/* bitmasks *******************************************************************/
+"""
+ for typ in typs:
+ if not isinstance(typ, idl.Bitfield):
+ continue
+ ret += "\n"
+ ret += ifdef_push(1, c_ver_ifdef(typ.in_versions))
+ ret += f"static const {c_typename(typ)} {typ.name}_masks[{c_ver_enum('NUM')}] = {{\n"
+ verwidth = max(len(ver) for ver in versions)
+ for ver in sorted(versions):
+ ret += ifdef_push(2, c_ver_ifdef({ver}))
+ ret += (
+ f"\t[{c_ver_enum(ver)}]{' '*(verwidth-len(ver))} = 0b"
+ + "".join(
+ "1" if typ.bit_is_valid(bitname, ver) else "0"
+ for bitname in reversed(typ.bits)
+ )
+ + ",\n"
+ )
+ ret += ifdef_pop(1)
+ ret += "};\n"
+ ret += ifdef_pop(0)
+
# validate_* ###############################################################
ret += """
/* validate_* *****************************************************************/
@@ -361,23 +386,6 @@ LM_ALWAYS_INLINE static bool _validate_list(struct _validate_ctx *ctx,
argfn = unused if (isinstance(typ, idl.Struct) and not typ.members) else used
ret += "\n"
ret += ifdef_push(1, c_ver_ifdef(typ.in_versions))
-
- if isinstance(typ, idl.Bitfield):
- ret += f"static const {c_typename(typ)} {typ.name}_masks[{c_ver_enum('NUM')}] = {{\n"
- verwidth = max(len(ver) for ver in versions)
- for ver in sorted(versions):
- ret += ifdef_push(2, c_ver_ifdef({ver}))
- ret += (
- f"\t[{c_ver_enum(ver)}]{' '*(verwidth-len(ver))} = 0b"
- + "".join(
- "1" if typ.bit_is_valid(bitname, ver) else "0"
- for bitname in reversed(typ.bits)
- )
- + ",\n"
- )
- ret += ifdef_pop(1)
- ret += "};\n"
-
ret += f"{inline} static bool validate_{typ.name}(struct _validate_ctx *{argfn('ctx')}) {{\n"
if typ.name == "d": # SPECIAL