diff options
Diffstat (limited to 'lib9p/idl.gen')
-rwxr-xr-x | lib9p/idl.gen | 23 |
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 ********************************************************************/ |