| #!/usr/bin/env python |
| |
| from argparse import ArgumentParser |
| from logging import basicConfig, DEBUG |
| from pathlib import Path |
| |
| from more_itertools import chunked |
| |
| |
| def generate(out): |
| lst = ["DRS_fail"] * 128 |
| lst[ord("n")] = "DRS_null" |
| lst[ord("t")] = "DRS_true" |
| lst[ord("f")] = "DRS_false" |
| lst[ord("I")] = "DRS_inf" |
| lst[ord("N")] = "DRS_nan" |
| lst[ord('"')] = "DRS_string" |
| lst[ord("'")] = "DRS_string" |
| lst[ord("{")] = "DRS_recursive" |
| lst[ord("[")] = "DRS_recursive" |
| for c in "+-.0123456789": |
| lst[ord(c)] = "DRS_number" |
| |
| print("#ifndef JSON5EncoderCpp_decoder_recursive_select", file=out) |
| print("#define JSON5EncoderCpp_decoder_recursive_select", file=out) |
| print(file=out) |
| print("// GENERATED FILE", file=out) |
| print("// All changes will be lost.", file=out) |
| print(file=out) |
| print("#include <cstdint>", file=out) |
| print(file=out) |
| print("namespace JSON5EncoderCpp {", file=out) |
| print("inline namespace {", file=out) |
| print(file=out) |
| print("enum DrsKind : std::uint8_t {", file=out) |
| print( |
| " DRS_fail, DRS_null, DRS_true, DRS_false, DRS_inf, DRS_nan, DRS_string, DRS_number, DRS_recursive", |
| file=out, |
| ) |
| print("};", file=out) |
| print(file=out) |
| print("static const DrsKind drs_lookup[128] = {", file=out) |
| for chunk in chunked(lst, 8): |
| print(" ", end="", file=out) |
| for t in chunk: |
| print(" ", t, ",", sep="", end="", file=out) |
| print(file=out) |
| print("};", file=out) |
| print(file=out) |
| print("} // anonymous inline namespace", sep="", file=out) |
| print("} // namespace JSON5EncoderCpp", sep="", file=out) |
| print(file=out) |
| print("#endif", sep="", file=out) |
| |
| |
| argparser = ArgumentParser(description="Generate src/_decoder_recursive_select.hpp") |
| argparser.add_argument( |
| "input", nargs="?", type=Path, default=Path("src/_decoder_recursive_select.hpp") |
| ) |
| |
| if __name__ == "__main__": |
| basicConfig(level=DEBUG) |
| args = argparser.parse_args() |
| with open(str(args.input.resolve()), "wt") as out: |
| generate(out) |