Pull from FB rev 63ce89e2f2301e6bba44a111cc7d4218022156f6
[folly.git] / folly / build / generate_escape_tables.py
1 #!/usr/bin/env python
2 #
3 # Generate Escape tables.
4 # Copyright 2011 Facebook
5 #
6 # @author Tudor Bosman (tudorb@fb.com)
7 #
8 import os
9 from optparse import OptionParser
10
11 OUTPUT_FILE = "EscapeTables.cpp"
12
13 def generate(f):
14     f.write("namespace folly {\n"
15             "namespace detail {\n"
16             "\n")
17     f.write("extern const char cEscapeTable[] =\n")
18     escapes = dict((
19         ('"', '\\"'),
20         ('\\', '\\\\'),
21         ('?', '?'),
22         ('\n', 'n'),
23         ('\r', 'r'),
24         ('\t', 't'),
25     ))
26     for i in range(0, 256):
27         if i % 64 == 0:
28             if i != 0:
29                 f.write("\"\n")
30             f.write("  \"")
31         c = chr(i)
32         if c in escapes:
33             c = escapes[c]
34         elif i < 32 or i > 126:
35             c = 'O'  # octal
36         else:
37             c = 'P'  # printable
38         f.write(c)
39     f.write("\";\n"
40             "\n")
41
42     f.write("extern const char cUnescapeTable[] =\n")
43     for i in range(0, 256):
44         if i % 64 == 0:
45             if i != 0:
46                 f.write("\"\n")
47             f.write("  \"")
48         c = chr(i)
49         if c in '\'?':
50             f.write(c)
51         elif c in '"\\abfnrtv':
52             f.write("\\" + c)
53         elif i >= ord('0') and i <= ord('7'):
54             f.write("O")  # octal
55         elif c == "x":
56             f.write("X")  # hex
57         else:
58             f.write("I")  # invalid
59     f.write("\";\n"
60             "\n"
61             "extern const unsigned char hexTable[] = {")
62
63     for i in range(0, 256):
64         if i % 16 == 0:
65             f.write("\n  ")
66         if i >= ord('0') and i <= ord('9'):
67             f.write("{0:2d}, ".format(i - ord('0')))
68         elif i >= ord('a') and i <= ord('f'):
69             f.write("{0:2d}, ".format(i - ord('a') + 10))
70         elif i >= ord('A') and i <= ord('F'):
71             f.write("{0:2d}, ".format(i - ord('A') + 10))
72         else:
73             f.write("16, ")
74     f.write("\n};\n"
75             "\n")
76
77     f.write("}  // namespace detail\n"
78             "}  // namespace folly\n")
79
80 def main():
81     parser = OptionParser()
82     parser.add_option("--install_dir", dest="install_dir", default=".",
83                       help="write output to DIR", metavar="DIR")
84     parser.add_option("--fbcode_dir")
85     (options, args) = parser.parse_args()
86     f = open(os.path.join(options.install_dir, OUTPUT_FILE), "w")
87     generate(f)
88     f.close()
89
90 if __name__ == "__main__":
91     main()