summaryrefslogtreecommitdiff
path: root/lib9p
diff options
context:
space:
mode:
authorLuke T. Shumaker <lukeshu@lukeshu.com>2024-09-27 19:00:18 -0600
committerLuke T. Shumaker <lukeshu@lukeshu.com>2024-09-27 19:00:18 -0600
commitd54ddec236bf9bdb8c032cd5fbdb0aa46ffebe86 (patch)
treeb2a4563347f4b91d276f174303e0a7b81c525b34 /lib9p
parentb1fc106b5294d162415ff715c6dece11945efdb2 (diff)
use GNU Make for `generate`
Diffstat (limited to 'lib9p')
-rw-r--r--lib9p/CMakeLists.txt25
-rw-r--r--lib9p/include/lib9p/_types.h2
-rw-r--r--lib9p/include/lib9p/linux-errno.h139
-rwxr-xr-xlib9p/include/lib9p/linux-errno.h.gen20
-rw-r--r--lib9p/types.c2
-rwxr-xr-xlib9p/types.gen101
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))