diff options
Diffstat (limited to 'lib9p/idl.gen')
-rwxr-xr-x | lib9p/idl.gen | 56 |
1 files changed, 26 insertions, 30 deletions
diff --git a/lib9p/idl.gen b/lib9p/idl.gen index e911ed7..a353a86 100755 --- a/lib9p/idl.gen +++ b/lib9p/idl.gen @@ -636,8 +636,6 @@ enum {idprefix}version {{ ret += f"\t{idprefix.upper()}TYP_{msg.name.ljust(namewidth)} = {msg.msgid},\n" ret += ifdef_pop(0) ret += "};\n" - ret += "\n" - ret += f"const char *{idprefix}msg_type_str(enum {idprefix}msg_type);\n" for msg in [msg for msg in typs if isinstance(msg, Message)]: ret += "\n" @@ -717,20 +715,6 @@ const char *{idprefix}version_str(enum {idprefix}version ver) {{ assert(0 <= ver && ver < {c_ver_enum('NUM')}); return version_strs[ver]; }} - -static const char *msg_type_strs[0x100] = {{ -""" - id2name: dict[int, str] = {} - for msg in [msg for msg in typs if isinstance(msg, Message)]: - id2name[msg.msgid] = msg.name - for n in range(0, 0x100): - ret += '\t[0x{:02X}] = "{}",\n'.format(n, id2name.get(n, "0x{:02X}".format(n))) - ret += "};\n" - ret += f""" -const char *{idprefix}msg_type_str(enum {idprefix}msg_type typ) {{ - assert(0 <= typ && typ <= 0xFF); - return msg_type_strs[typ]; -}} """ # validate_* ############################################################### @@ -1093,33 +1077,45 @@ static ALWAYS_INLINE bool marshal_8(struct _marshal_ctx *ctx, uint64_t *val) { ret += "}\n" ret += ifdef_pop(0) - # vtables / exports ######################################################## + # tables / exports ######################################################### ret += f""" -/* vtables / exports **********************************************************/ +/* tables / exports ***********************************************************/ #define _MSG(typ) [{idprefix.upper()}TYP_##typ] = {{ \\ + .name = #typ, \\ .basesize = sizeof(struct {idprefix}msg_##typ), \\ .validate = validate_##typ, \\ .unmarshal = (_unmarshal_fn_t)unmarshal_##typ, \\ .marshal = (_marshal_fn_t)marshal_##typ, \\ }} +#define _NONMSG(num) [num] = {{ \\ + .name = #num, \\ + }} -struct _vtable_version _{idprefix}vtables[{c_ver_enum('NUM')}] = {{ +struct _table_version _{idprefix}versions[{c_ver_enum('NUM')}] = {{ """ - - ret += f"\t[{c_ver_enum('unknown')}] = {{ .msgs = {{\n" + id2typ: dict[int, Message] = {} for msg in [msg for msg in typs if isinstance(msg, Message)]: - if msg.name in ["Tversion", "Rversion", "Rerror"]: # SPECIAL - ret += f"\t\t_MSG({msg.name}),\n" - ret += "\t}},\n" + id2typ[msg.msgid] = msg - for ver in sorted(versions): - ret += ifdef_push(1, c_ver_ifdef({ver})) + for ver in ["unknown", *sorted(versions)]: + if ver != "unknown": + ret += ifdef_push(1, c_ver_ifdef({ver})) ret += f"\t[{c_ver_enum(ver)}] = {{ .msgs = {{\n" - for msg in [msg for msg in typs if isinstance(msg, Message)]: - if ver not in msg.in_versions: - continue - ret += f"\t\t_MSG({msg.name}),\n" + + for n in range(0, 0x100): + xmsg: Message | None = id2typ.get(n, None) + if xmsg: + if ver == "unknown": # SPECIAL + if xmsg.name not in ["Tversion", "Rversion", "Rerror"]: + xmsg = None + else: + if ver not in xmsg.in_versions: + xmsg = None + if xmsg: + ret += f"\t\t_MSG({xmsg.name}),\n" + else: + ret += "\t\t_NONMSG(0x{:02X}),\n".format(n) ret += "\t}},\n" ret += ifdef_pop(0) ret += "};\n" |