diff options
author | Luke T. Shumaker <lukeshu@lukeshu.com> | 2024-12-21 23:12:34 -0700 |
---|---|---|
committer | Luke T. Shumaker <lukeshu@lukeshu.com> | 2024-12-26 18:18:25 -0700 |
commit | 339e4741a6822fbd4ebd343084ade44cbdb4a86a (patch) | |
tree | 52c585c98fc5fd7ad4492fffcdb242f5cb6ac32e /lib9p | |
parent | 93337489aaf8bc337ef70d72c059901867f415ea (diff) |
lib9p: idl.gen: Clean up the bitfield code
Diffstat (limited to 'lib9p')
-rwxr-xr-x | lib9p/idl.gen | 54 |
1 files changed, 32 insertions, 22 deletions
diff --git a/lib9p/idl.gen b/lib9p/idl.gen index 66161e2..047ea96 100755 --- a/lib9p/idl.gen +++ b/lib9p/idl.gen @@ -29,6 +29,12 @@ def tab_ljust(s: str, width: int) -> str: return s + " " * (width - cur) +def add_prefix(p: str, s: str) -> str: + if s.startswith("_"): + return "_" + p + s[1:] + return p + s + + def join_lines(*args: str) -> str: return "\n".join([a.rstrip() for a in args]).rstrip() + "\n" @@ -206,34 +212,38 @@ enum {idprefix}version {{ "", *[k for k in typ.names if k not in typ.bits], ] - namewidth = max(len(name) for name in names) + prefix = f"{idprefix.upper()}{typ.name.upper()}_" + namewidth = max(len(add_prefix(prefix, name)) for name in names) ret += "\n" for name in names: if name == "": ret += "\n" - elif name.startswith(" "): - ret += ifdef_push(2, c_ver_ifdef(typ.in_versions)) - sp = " " * ( - len("# define ") - + len(idprefix) - + len(typ.name) - + 1 - + namewidth - + 2 - - len("/* unused") - ) - ret += f"/* unused{sp}(({c_typename(typ)})(1<<{name[1:]})) */\n" + continue + + if name.startswith(" "): + vers = typ.in_versions + c_name = "" + c_val = f"1<<{name[1:]}" else: - ret += ifdef_push(2, c_ver_ifdef(typ.names[name].in_versions)) - if name.startswith("_"): - c_name = f"_{idprefix.upper()}{typ.name.upper()}_{name[1:]}" - else: - c_name = f"{idprefix.upper()}{typ.name.upper()}_{name}" - sp1 = " " if _ifdef_stack[-1] else "" - sp2 = " " if _ifdef_stack[-1] else " " - sp3 = " " * (2 + namewidth - len(name)) - ret += f"#{sp1}define{sp2}{c_name}{sp3}(({c_typename(typ)})({typ.names[name].val}))\n" + vers = typ.names[name].in_versions + c_name = add_prefix(prefix, name) + c_val = f"{typ.names[name].val}" + + ret += ifdef_push(2, c_ver_ifdef(vers)) + + # It is important all of the `beg` strings have + # the same length. + end = "" + if name.startswith(" "): + beg = "/* unused" + end = " */" + elif _ifdef_stack[-1]: + beg = "# define" + else: + beg = "#define " + + ret += f"{beg} {c_name.ljust(namewidth)} (({c_typename(typ)})({c_val})){end}\n" ret += ifdef_pop(1) case idl.Struct(): # and idl.Message(): ret += c_typename(typ) + " {" |