summaryrefslogtreecommitdiff
path: root/lib9p/types.gen
diff options
context:
space:
mode:
Diffstat (limited to 'lib9p/types.gen')
-rwxr-xr-xlib9p/types.gen36
1 files changed, 27 insertions, 9 deletions
diff --git a/lib9p/types.gen b/lib9p/types.gen
index 3e800e8..da99c36 100755
--- a/lib9p/types.gen
+++ b/lib9p/types.gen
@@ -50,6 +50,16 @@ class Bitfield:
def static_size(self) -> int:
return int((len(self.bits) + 7) / 8)
+ def bitname_is_valid(self, bitname: str, ver: str | None = None) -> bool:
+ assert bitname in self.bits
+ if not bitname:
+ return False
+ if bitname.startswith("_"):
+ return False
+ if ver and (ver not in self.names[bitname].ver):
+ return False
+ return True
+
# `msgid/structname = "member1 member2..."`
# `structname = "member1 member2..."`
@@ -137,7 +147,9 @@ re_structspec = (
re_structspec_cont = r'\s+"(?P<members>[^"]*)"'
re_bitfieldspec = r"bitfield\s+(?P<name>\S+)\s+(?P<size>[0-9]+)"
re_bitfieldspec_bit = r"(?:\s+|(?P<bitfield>\S+)\s*\+=\s*)(?P<bit>[0-9]+)/(?P<name>\S+)"
-re_bitfieldspec_alias = r"(?:\s+|(?P<bitfield>\S+)\s*\+=\s*)(?P<name>\S+)\s*=\s*(?P<val>.*)"
+re_bitfieldspec_alias = (
+ r"(?:\s+|(?P<bitfield>\S+)\s*\+=\s*)(?P<name>\S+)\s*=\s*(?P<val>.*)"
+)
def parse_file(
@@ -595,7 +607,11 @@ static ALWAYS_INLINE bool _validate_list(struct _validate_ctx *ctx,
val.ver == [*typ.names.values()][0].ver
for val in typ.names.values()
)
- if all_the_same and all(not bit for bit in typ.bits):
+ if (
+ all_the_same
+ and (len(typ.bits) == typ.static_size * 8)
+ and all(typ.bitname_is_valid(bitname) for bitname in typ.bits)
+ ):
ret += f"\treturn validate_{typ.static_size}(ctx));\n"
else:
ret += f"\t if (validate_{typ.static_size}(ctx))\n"
@@ -603,19 +619,21 @@ static ALWAYS_INLINE bool _validate_list(struct _validate_ctx *ctx,
if all_the_same:
ret += (
f"\tstatic const {c_typename(idprefix, typ)} mask = 0b"
- + ("".join("1" if b else "0" for b in reversed(typ.bits)))
+ + "".join(
+ "1" if typ.bitname_is_valid(bitname) else "0"
+ for bitname in reversed(typ.bits)
+ )
+ ";\n"
)
else:
ret += f"\tstatic const {c_typename(idprefix, typ)} masks[{c_verenum(idprefix, 'NUM')}] = {{\n"
+ verwidth = max(len(ver) for ver in versions)
for ver in sorted(versions):
ret += (
- f"\t\t[{c_verenum(idprefix, ver)}] = 0b"
- + (
- "".join(
- "1" if (b and ver in typ.names[b].ver) else "0"
- for b in reversed(typ.bits)
- )
+ f"\t\t[{c_verenum(idprefix, ver)}]{' '*(verwidth-len(ver))} = 0b"
+ + "".join(
+ "1" if typ.bitname_is_valid(bitname, ver) else "0"
+ for bitname in reversed(typ.bits)
)
+ ",\n"
)