def write_names(path, codes): f = lambda c: c.value code_min = min(codes, key=f).value code_max = max(codes, key=f).value + 1 d = {} for c in codes: d[c.value] = c.name with open(path, "w") as fp: p, print_newline = partial_print(fp) p("""\ #define\tCODE_MIN\t{code_min} #define\tCODE_MAX\t{code_max} #define\tCODE_NAMES\t{{ \\ """.format(**locals())) for value in range(code_min, code_max): try: name = d[value] except KeyError: name = "undefined" p("""\ \t\"{name}\", /* {value} */\\ """.format(**locals())) p("""\ }} """.format(**locals())) print_vim_special_comment(p)
def write_cases(path, syscalls, suffix): with open(path, "w") as fp: p, _ = partial_print(fp) for syscall in syscalls: if syscall.name not in SYSCALLS: continue cmd = make_cmd_name(syscall.name) p("""\ \tcase {cmd}_{suffix}: """.format(**locals())) write_c_footer(p)
def write_fslave(dirpath, syscalls): for syscall in [sc for sc in syscalls if sc.name in FSLAVE_SYSCALLS]: name = drop_prefix(syscall.name) path = join(dirpath, "fslave_{name}.c".format(**locals())) with open(path, "w") as fp: p, print_newline = partial_print(fp) print_fslave_head(p, syscall) print_fslave_call(p, print_newline, syscall) print_newline() if 0 < len(syscall.output_args): print_fslave_return(p, print_newline, syscall) print_newline() print_fslave_main(p, print_newline, syscall)
def write_dispatch(dirpath, syscalls): with open(join(dirpath, "dispatch.inc"), "w") as fp: p, _ = partial_print(fp) for syscall in syscalls: if syscall.name not in SYSCALLS: continue cmd = make_cmd_name(syscall.name) name = drop_prefix(syscall.name) p("""\ \t\t\tcase {cmd}_CALL: \t\t\t\tprocess_{name}(slave_thread); \t\t\t\tbreak; """.format(**locals())) write_c_footer(p)
def write_syscall(dirpath, syscall): local_vars = [] for datatype, name in ( ("payload_size_t", "payload_size"), ("int", "error")): local_vars.append(Variable(datatype, name)) if 0 < len(syscall.input_args): for datatyoe, name in (("int", "wfd"), ): local_vars.append(Variable(datatype, name)) for a in syscall.args: if (a.datatype == "void *") or data_of_argument(syscall, a).out: continue if a.datatype == "char *": local_vars.extend(make_string_locals(a.name)) continue if a.datatype == "struct iovec *": local_vars.append(Variable(a.datatype, a.name)) local_vars.append(Variable("u_int", "i")) name = "{name}_payload_size".format(**vars(a)) local_vars.append(Variable("payload_size_t", name)) size = bufsize_of_datatype("size_t") datatype = "char (*)[{size}]".format(**locals()) name = "{name}_iov_len_buf".format(name=a.name) local_vars.append(Variable(datatype, name)) name = "{name}_iov_len_len".format(name=a.name) local_vars.append(Variable("int *", name)) continue for datatype, fmt, size in ( (a.datatype, "{name}", None), ("char", "{name}_buf", bufsize_of_datatype(a.datatype)), ("int", "{name}_len", None)): v = Variable(datatype, fmt.format(name=a.name), size) local_vars.append(v) name = syscall.name with open(join(dirpath, name) + ".c", "w") as fp: p, print_newline = partial_print(fp) print_head(syscall, p, name) print_locals(p, local_vars) print_newline() print_encoding(p, syscall) if 0 < len(syscall.args): print_newline() print_write(p, print_newline, syscall) print_newline() print_tail(p, print_newline, syscall)
def write_proto(dirpath, syscalls): try: mkdir(dirpath) except OSError: pass with open(join(dirpath, "proto.h"), "w") as fp: p, print_newline = partial_print(fp) print_caution(p) p("""\ #if !defined(FSYSCALL_PRIVATE_FSLAVE_PROTO_H_INCLUDED) #define FSYSCALL_PRIVATE_FSLAVE_PROTO_H_INCLUDED """) print_newline() for syscall in syscalls: if syscall.name not in FSLAVE_SYSCALLS: continue p("""\ void process_{name}(struct slave_thread *); """.format(name=drop_prefix(syscall.name))) print_newline() p("""\ #endif """)