3 # Generate Escape tables.
4 # Copyright 2011 Facebook
6 # @author Tudor Bosman (tudorb@fb.com)
9 from optparse import OptionParser
11 OUTPUT_FILE = "EscapeTables.cpp"
14 f.write("namespace folly {\n"
15 "namespace detail {\n"
18 f.write("extern const char cEscapeTable[] =\n")
27 for i in range(0, 256):
35 elif i < 32 or i > 126:
42 f.write("extern const char cUnescapeTable[] =\n")
43 for i in range(0, 256):
51 elif c in '"\\abfnrtv':
53 elif i >= ord('0') and i <= ord('7'):
58 f.write("I") # invalid
61 f.write("extern const unsigned char hexTable[] = {")
62 for i in range(0, 256):
65 if i >= ord('0') and i <= ord('9'):
66 f.write("{0:2d}, ".format(i - ord('0')))
67 elif i >= ord('a') and i <= ord('f'):
68 f.write("{0:2d}, ".format(i - ord('a') + 10))
69 elif i >= ord('A') and i <= ord('F'):
70 f.write("{0:2d}, ".format(i - ord('A') + 10))
77 # 2 = safe in path (/)
78 # 3 = space (replace with '+' in query)
79 # 4 = always percent-encode
80 f.write("extern const unsigned char uriEscapeTable[] = {")
82 list(map(ord, '0123456789')) +
83 list(map(ord, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')) +
84 list(map(ord, 'abcdefghijklmnopqrstuvwxyz')) +
85 list(map(ord, '-_.~')))
86 for i in range(0, 256):
99 f.write("} // namespace detail\n"
100 "} // namespace folly\n")
103 parser = OptionParser()
104 parser.add_option("--install_dir", dest="install_dir", default=".",
105 help="write output to DIR", metavar="DIR")
106 parser.add_option("--fbcode_dir")
107 (options, args) = parser.parse_args()
108 f = open(os.path.join(options.install_dir, OUTPUT_FILE), "w")
112 if __name__ == "__main__":