diff options
Diffstat (limited to 'lib9p')
-rw-r--r-- | lib9p/CMakeLists.txt | 25 | ||||
-rw-r--r-- | lib9p/include/lib9p/_types.h | 2 | ||||
-rw-r--r-- | lib9p/include/lib9p/linux-errno.h | 139 | ||||
-rwxr-xr-x | lib9p/include/lib9p/linux-errno.h.gen | 20 | ||||
-rw-r--r-- | lib9p/types.c | 2 | ||||
-rwxr-xr-x | lib9p/types.gen | 101 |
6 files changed, 225 insertions, 64 deletions
diff --git a/lib9p/CMakeLists.txt b/lib9p/CMakeLists.txt index c8cfa23..af73ba9 100644 --- a/lib9p/CMakeLists.txt +++ b/lib9p/CMakeLists.txt @@ -4,31 +4,10 @@ # SPDX-Licence-Identifier: AGPL-3.0-or-later add_library(lib9p INTERFACE) +target_include_directories(lib9p SYSTEM INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}/include) target_sources(lib9p INTERFACE types.c 9p.c srv.c ) -target_include_directories(lib9p SYSTEM INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}/include) - -add_custom_command( - OUTPUT ${CMAKE_SOURCE_DIR}/3rd-party/linux-errno.txt - DEPENDS ${CMAKE_SOURCE_DIR}/3rd-party/linux-errno.txt.gen - COMMAND ${CMAKE_SOURCE_DIR}/3rd-party/linux-errno.txt.gen -) -add_custom_command( - OUTPUT ${CMAKE_CURRENT_SOURCE_DIR}/include/lib9p/linux-errno.h - DEPENDS include/lib9p/linux-errno.h.gen ${CMAKE_SOURCE_DIR}/3rd-party/linux-errno.txt - COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/include/lib9p/linux-errno.h.gen ${CMAKE_SOURCE_DIR}/3rd-party/linux-errno.txt >${CMAKE_CURRENT_SOURCE_DIR}/include/lib9p/linux-errno.h -) -add_custom_command( - OUTPUT ${CMAKE_CURRENT_SOURCE_DIR}/types.c ${CMAKE_CURRENT_SOURCE_DIR}/include/lib9p/_types.h - DEPENDS types.gen 9P2000.txt 9P2000.u.txt 9P2000.e.txt - COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/types.gen 9P2000.txt 9P2000.u.txt 9P2000.e.txt -) -# add_dependencies(generate -# ${CMAKE_SOURCE_DIR}/3rd-party/linux-errno.txt -# ${CMAKE_CURRENT_SOURCE_DIR}/linux-errno.h -# ${CMAKE_CURRENT_SOURCE_DIR}/types.c -# ${CMAKE_CURRENT_SOURCE_DIR}/include/lib9p/_types.h -# ) +set_source_files_properties(types.c PROPERTIES COMPILE_FLAGS -O3) diff --git a/lib9p/include/lib9p/_types.h b/lib9p/include/lib9p/_types.h index 348945d..7dcd8e2 100644 --- a/lib9p/include/lib9p/_types.h +++ b/lib9p/include/lib9p/_types.h @@ -1,4 +1,4 @@ -/* Generated by `./types.gen 9P2000.txt 9P2000.u.txt 9P2000.e.txt`. DO NOT EDIT! */ +/* Generated by `./lib9p/types.gen lib9p/9P2000.txt lib9p/9P2000.u.txt lib9p/9P2000.e.txt`. DO NOT EDIT! */ #ifndef _LIB9P__TYPES_H_ #define _LIB9P__TYPES_H_ diff --git a/lib9p/include/lib9p/linux-errno.h b/lib9p/include/lib9p/linux-errno.h new file mode 100644 index 0000000..160b88b --- /dev/null +++ b/lib9p/include/lib9p/linux-errno.h @@ -0,0 +1,139 @@ +/* lib9p/linux-errno.h - Generated by `./lib9p/include/lib9p/linux-errno.h.gen 3rd-party/linux-errno.txt`. DO NOT EDIT! */ +/* ./3rd-party/linux-errno.txt - Generated from linux.git v6.7. DO NOT EDIT! */ + +#ifndef _LIB9P_LINUX_ERRNO_H_ +#define _LIB9P_LINUX_ERRNO_H_ + +#define LINUX_EPERM 1 /* Operation not permitted */ +#define LINUX_ENOENT 2 /* No such file or directory */ +#define LINUX_ESRCH 3 /* No such process */ +#define LINUX_EINTR 4 /* Interrupted system call */ +#define LINUX_EIO 5 /* I/O error */ +#define LINUX_ENXIO 6 /* No such device or address */ +#define LINUX_E2BIG 7 /* Argument list too long */ +#define LINUX_ENOEXEC 8 /* Exec format error */ +#define LINUX_EBADF 9 /* Bad file number */ +#define LINUX_ECHILD 10 /* No child processes */ +#define LINUX_EAGAIN 11 /* Try again */ +#define LINUX_ENOMEM 12 /* Out of memory */ +#define LINUX_EACCES 13 /* Permission denied */ +#define LINUX_EFAULT 14 /* Bad address */ +#define LINUX_ENOTBLK 15 /* Block device required */ +#define LINUX_EBUSY 16 /* Device or resource busy */ +#define LINUX_EEXIST 17 /* File exists */ +#define LINUX_EXDEV 18 /* Cross-device link */ +#define LINUX_ENODEV 19 /* No such device */ +#define LINUX_ENOTDIR 20 /* Not a directory */ +#define LINUX_EISDIR 21 /* Is a directory */ +#define LINUX_EINVAL 22 /* Invalid argument */ +#define LINUX_ENFILE 23 /* File table overflow */ +#define LINUX_EMFILE 24 /* Too many open files */ +#define LINUX_ENOTTY 25 /* Not a typewriter */ +#define LINUX_ETXTBSY 26 /* Text file busy */ +#define LINUX_EFBIG 27 /* File too large */ +#define LINUX_ENOSPC 28 /* No space left on device */ +#define LINUX_ESPIPE 29 /* Illegal seek */ +#define LINUX_EROFS 30 /* Read-only file system */ +#define LINUX_EMLINK 31 /* Too many links */ +#define LINUX_EPIPE 32 /* Broken pipe */ +#define LINUX_EDOM 33 /* Math argument out of domain of func */ +#define LINUX_ERANGE 34 /* Math result not representable */ +#define LINUX_EDEADLK 35 /* Resource deadlock would occur */ +#define LINUX_ENAMETOOLONG 36 /* File name too long */ +#define LINUX_ENOLCK 37 /* No record locks available */ +#define LINUX_ENOSYS 38 /* Invalid system call number */ +#define LINUX_ENOTEMPTY 39 /* Directory not empty */ +#define LINUX_ELOOP 40 /* Too many symbolic links encountered */ +#define LINUX_ENOMSG 42 /* No message of desired type */ +#define LINUX_EIDRM 43 /* Identifier removed */ +#define LINUX_ECHRNG 44 /* Channel number out of range */ +#define LINUX_EL2NSYNC 45 /* Level 2 not synchronized */ +#define LINUX_EL3HLT 46 /* Level 3 halted */ +#define LINUX_EL3RST 47 /* Level 3 reset */ +#define LINUX_ELNRNG 48 /* Link number out of range */ +#define LINUX_EUNATCH 49 /* Protocol driver not attached */ +#define LINUX_ENOCSI 50 /* No CSI structure available */ +#define LINUX_EL2HLT 51 /* Level 2 halted */ +#define LINUX_EBADE 52 /* Invalid exchange */ +#define LINUX_EBADR 53 /* Invalid request descriptor */ +#define LINUX_EXFULL 54 /* Exchange full */ +#define LINUX_ENOANO 55 /* No anode */ +#define LINUX_EBADRQC 56 /* Invalid request code */ +#define LINUX_EBADSLT 57 /* Invalid slot */ +#define LINUX_EBFONT 59 /* Bad font file format */ +#define LINUX_ENOSTR 60 /* Device not a stream */ +#define LINUX_ENODATA 61 /* No data available */ +#define LINUX_ETIME 62 /* Timer expired */ +#define LINUX_ENOSR 63 /* Out of streams resources */ +#define LINUX_ENONET 64 /* Machine is not on the network */ +#define LINUX_ENOPKG 65 /* Package not installed */ +#define LINUX_EREMOTE 66 /* Object is remote */ +#define LINUX_ENOLINK 67 /* Link has been severed */ +#define LINUX_EADV 68 /* Advertise error */ +#define LINUX_ESRMNT 69 /* Srmount error */ +#define LINUX_ECOMM 70 /* Communication error on send */ +#define LINUX_EPROTO 71 /* Protocol error */ +#define LINUX_EMULTIHOP 72 /* Multihop attempted */ +#define LINUX_EDOTDOT 73 /* RFS specific error */ +#define LINUX_EBADMSG 74 /* Not a data message */ +#define LINUX_EOVERFLOW 75 /* Value too large for defined data type */ +#define LINUX_ENOTUNIQ 76 /* Name not unique on network */ +#define LINUX_EBADFD 77 /* File descriptor in bad state */ +#define LINUX_EREMCHG 78 /* Remote address changed */ +#define LINUX_ELIBACC 79 /* Can not access a needed shared library */ +#define LINUX_ELIBBAD 80 /* Accessing a corrupted shared library */ +#define LINUX_ELIBSCN 81 /* .lib section in a.out corrupted */ +#define LINUX_ELIBMAX 82 /* Attempting to link in too many shared libraries */ +#define LINUX_ELIBEXEC 83 /* Cannot exec a shared library directly */ +#define LINUX_EILSEQ 84 /* Illegal byte sequence */ +#define LINUX_ERESTART 85 /* Interrupted system call should be restarted */ +#define LINUX_ESTRPIPE 86 /* Streams pipe error */ +#define LINUX_EUSERS 87 /* Too many users */ +#define LINUX_ENOTSOCK 88 /* Socket operation on non-socket */ +#define LINUX_EDESTADDRREQ 89 /* Destination address required */ +#define LINUX_EMSGSIZE 90 /* Message too long */ +#define LINUX_EPROTOTYPE 91 /* Protocol wrong type for socket */ +#define LINUX_ENOPROTOOPT 92 /* Protocol not available */ +#define LINUX_EPROTONOSUPPORT 93 /* Protocol not supported */ +#define LINUX_ESOCKTNOSUPPORT 94 /* Socket type not supported */ +#define LINUX_EOPNOTSUPP 95 /* Operation not supported on transport endpoint */ +#define LINUX_EPFNOSUPPORT 96 /* Protocol family not supported */ +#define LINUX_EAFNOSUPPORT 97 /* Address family not supported by protocol */ +#define LINUX_EADDRINUSE 98 /* Address already in use */ +#define LINUX_EADDRNOTAVAIL 99 /* Cannot assign requested address */ +#define LINUX_ENETDOWN 100 /* Network is down */ +#define LINUX_ENETUNREACH 101 /* Network is unreachable */ +#define LINUX_ENETRESET 102 /* Network dropped connection because of reset */ +#define LINUX_ECONNABORTED 103 /* Software caused connection abort */ +#define LINUX_ECONNRESET 104 /* Connection reset by peer */ +#define LINUX_ENOBUFS 105 /* No buffer space available */ +#define LINUX_EISCONN 106 /* Transport endpoint is already connected */ +#define LINUX_ENOTCONN 107 /* Transport endpoint is not connected */ +#define LINUX_ESHUTDOWN 108 /* Cannot send after transport endpoint shutdown */ +#define LINUX_ETOOMANYREFS 109 /* Too many references: cannot splice */ +#define LINUX_ETIMEDOUT 110 /* Connection timed out */ +#define LINUX_ECONNREFUSED 111 /* Connection refused */ +#define LINUX_EHOSTDOWN 112 /* Host is down */ +#define LINUX_EHOSTUNREACH 113 /* No route to host */ +#define LINUX_EALREADY 114 /* Operation already in progress */ +#define LINUX_EINPROGRESS 115 /* Operation now in progress */ +#define LINUX_ESTALE 116 /* Stale file handle */ +#define LINUX_EUCLEAN 117 /* Structure needs cleaning */ +#define LINUX_ENOTNAM 118 /* Not a XENIX named type file */ +#define LINUX_ENAVAIL 119 /* No XENIX semaphores available */ +#define LINUX_EISNAM 120 /* Is a named type file */ +#define LINUX_EREMOTEIO 121 /* Remote I/O error */ +#define LINUX_EDQUOT 122 /* Quota exceeded */ +#define LINUX_ENOMEDIUM 123 /* No medium found */ +#define LINUX_EMEDIUMTYPE 124 /* Wrong medium type */ +#define LINUX_ECANCELED 125 /* Operation Canceled */ +#define LINUX_ENOKEY 126 /* Required key not available */ +#define LINUX_EKEYEXPIRED 127 /* Key has expired */ +#define LINUX_EKEYREVOKED 128 /* Key has been revoked */ +#define LINUX_EKEYREJECTED 129 /* Key was rejected by service */ +#define LINUX_EOWNERDEAD 130 /* Owner died */ +#define LINUX_ENOTRECOVERABLE 131 /* State not recoverable */ +#define LINUX_ERFKILL 132 /* Operation not possible due to RF-kill */ +#define LINUX_EHWPOISON 133 /* Memory page has hardware error */ + +#endif /* _LIB9P_LINUX_ERRNO_H_ */ diff --git a/lib9p/include/lib9p/linux-errno.h.gen b/lib9p/include/lib9p/linux-errno.h.gen index b896384..7f0f67c 100755 --- a/lib9p/include/lib9p/linux-errno.h.gen +++ b/lib9p/include/lib9p/linux-errno.h.gen @@ -1,9 +1,11 @@ #!/usr/bin/env python +import sys -def print_errnos(txtlists: list[str]) -> None: + +def print_errnos() -> None: print( - f"/* 9p/linux-errno.h - Generated by `./9p/linux-errno.h.gen {' '.join(txtlists)}`. DO NOT EDIT! */" + f"/* lib9p/linux-errno.h - Generated by `{' '.join(sys.argv)}`. DO NOT EDIT! */" ) errnos: dict[str, tuple[int, str]] = {} for txtlist in sys.argv[1:]: @@ -17,18 +19,18 @@ def print_errnos(txtlists: list[str]) -> None: desc = desc.strip() errnos[name] = (num, desc) print() - print("#ifndef _9P_LINUX_ERRNO_H_") - print("#define _9P_LINUX_ERRNO_H_") + print("#ifndef _LIB9P_LINUX_ERRNO_H_") + print("#define _LIB9P_LINUX_ERRNO_H_") print() namelen = max(len(name) for name in errnos.keys()) numlen = max(len(str(num)) for (num, desc) in errnos.values()) for name in errnos: - print(f"#define LINUX_{name.ljust(namelen)} {str(errnos[name][0]).rjust(numlen)} /* {errnos[name][1]} */") + print( + f"#define LINUX_{name.ljust(namelen)} {str(errnos[name][0]).rjust(numlen)} /* {errnos[name][1]} */" + ) print() - print("#endif /* _9P_LINUX_ERRNO_H_ */") + print("#endif /* _LIB9P_LINUX_ERRNO_H_ */") if __name__ == "__main__": - import sys - - print_errnos(sys.argv[1:]) + print_errnos() diff --git a/lib9p/types.c b/lib9p/types.c index 73ac28e..c006d69 100644 --- a/lib9p/types.c +++ b/lib9p/types.c @@ -1,4 +1,4 @@ -/* Generated by `./types.gen 9P2000.txt 9P2000.u.txt 9P2000.e.txt`. DO NOT EDIT! */ +/* Generated by `./lib9p/types.gen lib9p/9P2000.txt lib9p/9P2000.u.txt lib9p/9P2000.e.txt`. DO NOT EDIT! */ #include <stdbool.h> diff --git a/lib9p/types.gen b/lib9p/types.gen index 141b591..5eee551 100755 --- a/lib9p/types.gen +++ b/lib9p/types.gen @@ -73,8 +73,7 @@ re_memberspec = ( def parse_members( - ver: str, - env: dict[str, Atom | Struct], existing: list[Member], specs: str + ver: str, env: dict[str, Atom | Struct], existing: list[Member], specs: str ) -> list[Member]: ret = existing for spec in specs.split(): @@ -105,14 +104,16 @@ def parse_members( re_version = r'version\s+"(?P<version>[^"]+)"' -re_import = r'from\s+(?P<file>\S+)\s+import\s+(?P<syms>\S+(?:\s*,\s*\S+)*)\s*' +re_import = r"from\s+(?P<file>\S+)\s+import\s+(?P<syms>\S+(?:\s*,\s*\S+)*)\s*" re_structspec = ( r'(?:(?P<msgid>[0-9]+)/)?(?P<name>\S+)\s*(?P<op>\+?=)\s*"(?P<members>[^"]*)"' ) re_structspec_cont = r'"(?P<members>[^"]*)"' -def parse_file(filename: str, get_include: Callable[[str], tuple[str, list[Struct]]]) -> tuple[str, list[Struct]]: +def parse_file( + filename: str, get_include: Callable[[str], tuple[str, list[Struct]]] +) -> tuple[str, list[Struct]]: version: str | None = None env: dict[str, Atom | Struct] = { "1": Atom.u8, @@ -137,7 +138,7 @@ def parse_file(filename: str, get_include: Callable[[str], tuple[str, list[Struc for symname in m.group("syms").split(sep=","): symname = symname.strip() for struct in other_structs: - if struct.name == symname or symname == '*': + if struct.name == symname or symname == "*": if struct.msgid: struct.msgver.add(version) for member in struct.members: @@ -156,7 +157,9 @@ def parse_file(filename: str, get_include: Callable[[str], tuple[str, list[Struc struct.msgid = int(m.group("msgid")) struct.msgver.add(version) struct.name = m.group("name") - struct.members = parse_members(version, env, [], m.group("members")) + struct.members = parse_members( + version, env, [], m.group("members") + ) env[struct.name] = struct prev = struct case "+=": @@ -168,15 +171,17 @@ def parse_file(filename: str, get_include: Callable[[str], tuple[str, list[Struc f"Type {repr(m.group('name'))} is not a struct" ) struct = _struct - struct.members = parse_members(version, - env, struct.members, m.group("members") + struct.members = parse_members( + version, env, struct.members, m.group("members") ) prev = struct elif m := re.fullmatch(re_structspec_cont, line): if not prev: raise SyntaxError("continuation line must come after a struct line") - assert(version) - prev.members = parse_members(version, env, prev.members, m.group("members")) + assert version + prev.members = parse_members( + version, env, prev.members, m.group("members") + ) else: raise SyntaxError(f"invalid line {repr(line)}") if not version: @@ -184,6 +189,7 @@ def parse_file(filename: str, get_include: Callable[[str], tuple[str, list[Struc structs = [x for x in env.values() if isinstance(x, Struct)] return version, structs + # Generate C ################################################################### @@ -198,14 +204,17 @@ def c_typename(idprefix: str, typ: Atom | Struct) -> str: case _: raise ValueError(f"not a type: {typ.__class__.__name__}") -def c_vercomment(versions: set[str]) -> str|None: + +def c_vercomment(versions: set[str]) -> str | None: if "9P2000" in versions: return None - return "/* "+(", ".join(sorted(versions)))+" */" + return "/* " + (", ".join(sorted(versions))) + " */" + def c_ver(idprefix: str, ver: str) -> str: return f"{idprefix.upper()}VER_{ver.replace('.', '_')}" + def gen_h(idprefix: str, versions: set[str], structs: list[Struct]) -> str: guard = "_LIB9P__TYPES_H_" ret = f"""/* Generated by `{' '.join(sys.argv)}`. DO NOT EDIT! */ @@ -225,7 +234,7 @@ enum {idprefix}version {{ verwidth = max(len(v) for v in versions) for ver in sorted(versions): ret += f"\t{c_ver(idprefix, ver)}," - ret += (" "*(verwidth-len(ver))) + ' /* "' + ver + '" */\n' + ret += (" " * (verwidth - len(ver))) + ' /* "' + ver + '" */\n' ret += f"\t{idprefix.upper()}VER_NUM,\n" ret += "};\n" @@ -236,7 +245,9 @@ enum {idprefix}version {{ if struct.msgid is not None: continue - all_the_same = len(struct.members) == 0 or all(m.ver == struct.members[0].ver for m in struct.members) + all_the_same = len(struct.members) == 0 or all( + m.ver == struct.members[0].ver for m in struct.members + ) typewidth = max(len(c_typename(idprefix, m.typ)) for m in struct.members) if not all_the_same: namewidth = max(len(m.name) for m in struct.members) @@ -246,7 +257,7 @@ enum {idprefix}version {{ for member in struct.members: ret += f"\t{c_typename(idprefix, member.typ).ljust(typewidth)} {'*' if member.cnt else ' '}{member.name};" if (not all_the_same) and (comment := c_vercomment(member.ver)): - ret += (" "*(namewidth-len(member.name))) + " " + comment + ret += (" " * (namewidth - len(member.name))) + " " + comment ret += "\n" ret += "};\n" @@ -260,7 +271,7 @@ enum {idprefix}version {{ if msg.msgid is None: continue ret += f"\t{idprefix.upper()}TYP_{msg.name.ljust(namewidth)} = {msg.msgid}," - if (comment := c_vercomment(msg.msgver)): + if comment := c_vercomment(msg.msgver): ret += " " + comment ret += "\n" ret += "};\n" @@ -270,7 +281,9 @@ enum {idprefix}version {{ for msg in structs: if msg.msgid is None: continue - ret += f", \\\n\t\t{c_typename(idprefix, msg)}: {idprefix.upper()}TYP_{msg.name}" + ret += ( + f", \\\n\t\t{c_typename(idprefix, msg)}: {idprefix.upper()}TYP_{msg.name}" + ) ret += ")\n" for msg in structs: @@ -286,7 +299,9 @@ enum {idprefix}version {{ continue ret += "\n" - all_the_same = len(msg.members) == 0 or all(m.ver == msg.members[0].ver for m in msg.members) + all_the_same = len(msg.members) == 0 or all( + m.ver == msg.members[0].ver for m in msg.members + ) typewidth = max(len(c_typename(idprefix, m.typ)) for m in msg.members) if not all_the_same: namewidth = max(len(m.name) for m in msg.members) @@ -294,11 +309,10 @@ enum {idprefix}version {{ for member in msg.members: ret += f"\t{c_typename(idprefix, member.typ).ljust(typewidth)} {'*' if member.cnt else ' '}{member.name};" if (not all_the_same) and (comment := c_vercomment(member.ver)): - ret += (" "*(namewidth-len(member.name))) + " " + comment + ret += (" " * (namewidth - len(member.name))) + " " + comment ret += "\n" ret += "};\n" - ret += "\n" ret += f"#endif /* {guard} */\n" return ret @@ -358,7 +372,7 @@ static inline bool _checksize_list(struct _checksize_ctx *ctx, #define checksize_8(ctx) _checksize_net(ctx, 8) """ for struct in structs: - inline = ' inline' if struct.msgid is None else '' + inline = " inline" if struct.msgid is None else "" argfn = used if struct.members else unused ret += "\n" ret += f"static{inline} bool checksize_{struct.name}(struct _checksize_ctx *{argfn('ctx')}) {{" @@ -403,7 +417,16 @@ static inline bool _checksize_list(struct _checksize_ctx *ctx, for member in struct.members: ret += f"\n{prefix}" if member.ver != struct_versions: - ret += "( ( " + (" || ".join(f"(ctx->ctx->version=={c_ver(idprefix, v)})" for v in sorted(member.ver))) + " ) && " + ret += ( + "( ( " + + ( + " || ".join( + f"(ctx->ctx->version=={c_ver(idprefix, v)})" + for v in sorted(member.ver) + ) + ) + + " ) && " + ) if member.cnt is not None: assert prev_size ret += f"_checksize_list(ctx, decode_u{prev_size*8}le(&ctx->net_bytes[ctx->net_offset-{prev_size}]), checksize_{member.typ.name}, sizeof({c_typename(idprefix, member.typ)}))" @@ -440,7 +463,7 @@ static inline vold unmarshal_8(struct _unmarshal_ctx *ctx, uint64_t *out) { } """ for struct in structs: - inline = ' inline' if struct.msgid is None else '' + inline = " inline" if struct.msgid is None else "" argfn = used if struct.members else unused ret += "\n" ret += f"static{inline} void unmarshal_{struct.name}(struct _unmarshal_ctx *{argfn('ctx')}, {c_typename(idprefix, struct)} *{argfn('out')}) {{\n" @@ -452,7 +475,16 @@ static inline vold unmarshal_8(struct _unmarshal_ctx *ctx, uint64_t *out) { ret += "\t" prefix = "\t" if member.ver != struct_versions: - ret += "if ( " + (" || ".join(f"(ctx->ctx->version=={c_ver(idprefix, v)})" for v in sorted(member.ver))) + " ) " + ret += ( + "if ( " + + ( + " || ".join( + f"(ctx->ctx->version=={c_ver(idprefix, v)})" + for v in sorted(member.ver) + ) + ) + + " ) " + ) prefix = "\t\t" if member.cnt: if member.ver != struct_versions: @@ -512,7 +544,7 @@ static inline bool marshal_8(struct _marshal_ctx *ctx, uint64_t *val) { } """ for struct in structs: - inline = ' inline' if struct.msgid is None else '' + inline = " inline" if struct.msgid is None else "" argfn = used if struct.members else unused ret += "\n" ret += f"static{inline} bool marshal_{struct.name}(struct _marshal_ctx *{argfn('ctx')}, {c_typename(idprefix, struct)} *{argfn('val')}) {{" @@ -549,6 +581,7 @@ static inline bool marshal_8(struct _marshal_ctx *ctx, uint64_t *val) { ret += f"\t\t\tr.marshal = (_marshal_fn_t)marshal_{msg.name},\n" ret += "\t\t}" return ret + ret += f""" /* vtables ********************************************************************/ @@ -573,18 +606,24 @@ struct _vtable_version _{idprefix}vtables[LIB9P_VER_NUM] = {{ ################################################################################ + class Parser: cache: dict[str, tuple[str, list[Struct]]] = {} def parse_file(self, filename: str) -> tuple[str, list[Struct]]: + filename = os.path.normpath(filename) if filename not in self.cache: - self.cache[filename] = parse_file(filename, self.parse_file) + + def get_include(other_filename: str) -> tuple[str, list[Struct]]: + return self.parse_file(os.path.join(filename, "..", other_filename)) + + self.cache[filename] = parse_file(filename, get_include) return self.cache[filename] - + def all(self) -> tuple[set[str], list[Struct]]: ret_versions: set[str] = set() ret_structs: dict[str, Struct] = {} - for (version, structs) in self.cache.values(): + for version, structs in self.cache.values(): if version in ret_versions: raise ValueError(f"duplicate protocol version {repr(version)}") ret_versions.add(version) @@ -596,6 +635,7 @@ class Parser: ret_structs[struct.name] = struct return ret_versions, list(ret_structs.values()) + if __name__ == "__main__": import sys @@ -605,7 +645,8 @@ if __name__ == "__main__": for txtname in sys.argv[1:]: parser.parse_file(txtname) versions, structs = parser.all() - with open("include/lib9p/_types.h", "w") as fh: + outdir = os.path.normpath(os.path.join(sys.argv[0], "..")) + with open(os.path.join(outdir, "include/lib9p/_types.h"), "w") as fh: fh.write(gen_h("lib9p_", versions, structs)) - with open("types.c", "w") as fh: + with open(os.path.join(outdir, "types.c"), "w") as fh: fh.write(gen_c("lib9p_", versions, structs)) |