| #!/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) | |