fix bootstrap on osx
[folly.git] / folly / build / generate_format_tables.py
1 #!/usr/bin/env python
2 #
3 # Generate Format tables
4
5
6 import os
7 from optparse import OptionParser
8
9 OUTPUT_FILE = "FormatTables.cpp"
10
11 def generate_table(f, type_name, name, map):
12     f.write("extern const {0} {1}[] = {{".format(type_name, name))
13     for i in range(0, 256):
14         if i % 2 == 0:
15             f.write("\n  ")
16         f.write("{0}::{1}, ".format(type_name, map.get(chr(i), "INVALID")))
17     f.write("\n};\n\n")
18
19 def generate_conv_table(f, name, values):
20     values = list(values)
21     line = ''
22     for i, v in enumerate(values):
23         if i == 0:
24             f.write("extern const char {0}[{1}][{2}] = {{\n".format(
25                 name, len(values), len(v)))
26         row = "{{{0}}}, ".format(", ".join("'{0}'".format(x) for x in v))
27         if len(line) + len(row) > 79:
28             f.write(line + "\n")
29             line = ''
30         line += row
31     if line:
32         f.write(line + "\n")
33     f.write("};\n\n")
34
35 def octal_values():
36     return (tuple("{0:03o}".format(x)) for x in range(512))
37
38 def hex_values(upper):
39     fmt = "{0:02X}" if upper else "{0:02x}"
40     return (tuple(fmt.format(x)) for x in range(256))
41
42 def binary_values():
43     return (tuple("{0:08b}".format(x)) for x in range(256))
44
45 def generate(f):
46     f.write("#include <folly/FormatArg.h>\n"
47             "\n"
48             "namespace folly {\n"
49             "namespace detail {\n"
50             "\n")
51
52     generate_table(
53         f, "FormatArg::Align", "formatAlignTable",
54         {"<": "LEFT", ">": "RIGHT", "=": "PAD_AFTER_SIGN", "^": "CENTER"})
55
56     generate_table(
57         f, "FormatArg::Sign", "formatSignTable",
58         {"+": "PLUS_OR_MINUS", "-": "MINUS", " ": "SPACE_OR_MINUS"})
59
60     generate_conv_table(f, "formatOctal", octal_values())
61     generate_conv_table(f, "formatHexLower", hex_values(False))
62     generate_conv_table(f, "formatHexUpper", hex_values(True))
63     generate_conv_table(f, "formatBinary", binary_values())
64
65     f.write("}  // namespace detail\n"
66             "}  // namespace folly\n")
67
68 def main():
69     parser = OptionParser()
70     parser.add_option("--install_dir", dest="install_dir", default=".",
71                       help="write output to DIR", metavar="DIR")
72     parser.add_option("--fbcode_dir")
73     (options, args) = parser.parse_args()
74     f = open(os.path.join(options.install_dir, OUTPUT_FILE), "w")
75     generate(f)
76     f.close()
77
78 if __name__ == "__main__":
79     main()