summaryrefslogtreecommitdiff
path: root/lib9p/idl.gen
diff options
context:
space:
mode:
Diffstat (limited to 'lib9p/idl.gen')
-rwxr-xr-xlib9p/idl.gen23
1 files changed, 22 insertions, 1 deletions
diff --git a/lib9p/idl.gen b/lib9p/idl.gen
index 31f6527..47ca49a 100755
--- a/lib9p/idl.gen
+++ b/lib9p/idl.gen
@@ -62,7 +62,8 @@ def c_ver_ifdef(versions: set[str]) -> str:
def c_ver_cond(versions: set[str]) -> str:
if len(versions) == 1:
- return f"(ctx->ctx->version=={c_ver_enum(next(v for v in versions))})"
+ v = next(v for v in versions)
+ return f"is_ver(ctx, {v.replace('.', '_')})"
return "( " + (" || ".join(c_ver_cond({v}) for v in sorted(versions))) + " )"
@@ -318,12 +319,32 @@ def gen_c(versions: set[str], typs: list[idl.Type]) -> str:
#include "internal.h"
"""
+ # utilities ################################################################
+ ret += f"""
+/* utilities ******************************************************************/
+"""
+
def used(arg: str) -> str:
return arg
def unused(arg: str) -> str:
return f"LM_UNUSED({arg})"
+ ret += "\n"
+ ret += "/**\n"
+ ret += f" * is_ver(ctx, ver) is essentially `(ctx->ctx->version == {idprefix.upper()}VER_##ver)`,\n"
+ ret += f" * but compiles correctly (to `false`) even if `{idprefix.upper()}VER_##ver` isn't defined\n"
+ ret += " * (because `!CONFIG_9P_ENABLE_##ver`). This is useful when `||`ing\n"
+ ret += " * several version checks together.\n"
+ ret += " */\n"
+ ret += "#define is_ver(ctx, ver) _is_ver_##ver(ctx->ctx->version)\n"
+ for v in sorted(versions):
+ ret += f"#if CONFIG_9P_ENABLE_{v.replace('.', '_')}\n"
+ ret += f"\t#define _is_ver_{v.replace('.', '_')}(v) (v == {c_ver_enum(v)})\n"
+ ret += "#else\n"
+ ret += f"\t#define _is_ver_{v.replace('.', '_')}(v) false\n"
+ ret += "#endif\n"
+
# strings ##################################################################
ret += f"""
/* strings ********************************************************************/