summaryrefslogtreecommitdiff
path: root/lib9p
diff options
context:
space:
mode:
authorLuke T. Shumaker <lukeshu@lukeshu.com>2024-12-21 23:12:34 -0700
committerLuke T. Shumaker <lukeshu@lukeshu.com>2024-12-26 18:18:25 -0700
commit339e4741a6822fbd4ebd343084ade44cbdb4a86a (patch)
tree52c585c98fc5fd7ad4492fffcdb242f5cb6ac32e /lib9p
parent93337489aaf8bc337ef70d72c059901867f415ea (diff)
lib9p: idl.gen: Clean up the bitfield code
Diffstat (limited to 'lib9p')
-rwxr-xr-xlib9p/idl.gen54
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) + " {"