diff options
author | Luke T. Shumaker <lukeshu@lukeshu.com> | 2024-12-26 17:41:32 -0700 |
---|---|---|
committer | Luke T. Shumaker <lukeshu@lukeshu.com> | 2024-12-26 18:18:25 -0700 |
commit | 1aad8aa5947960e26d8efcdabb52babd6b52005b (patch) | |
tree | bb1713fc757d70b1e15b584aea9f7462a19374c2 /lib9p/idl.gen | |
parent | 339e4741a6822fbd4ebd343084ade44cbdb4a86a (diff) |
lib9p: idl.gen: Give bitmasks their own section in .c
Diffstat (limited to 'lib9p/idl.gen')
-rwxr-xr-x | lib9p/idl.gen | 42 |
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 |