f.write("namespace folly {\n"
"namespace detail {\n"
"\n")
+
f.write("extern const char cEscapeTable[] =\n")
escapes = dict((
('"', '\\"'),
else:
c = 'P' # printable
f.write(c)
- f.write("\";\n"
- "\n")
+ f.write("\";\n\n")
f.write("extern const char cUnescapeTable[] =\n")
for i in range(0, 256):
f.write("X") # hex
else:
f.write("I") # invalid
- f.write("\";\n"
- "\n"
- "extern const unsigned char hexTable[] = {")
+ f.write("\";\n\n")
+ f.write("extern const unsigned char hexTable[] = {")
for i in range(0, 256):
if i % 16 == 0:
f.write("\n ")
f.write("{0:2d}, ".format(i - ord('A') + 10))
else:
f.write("16, ")
- f.write("\n};\n"
- "\n")
+ f.write("\n};\n\n")
+
+ # 0 = passthrough
+ # 1 = unused
+ # 2 = safe in path (/)
+ # 3 = space (replace with '+' in query)
+ # 4 = always percent-encode
+ f.write("extern const unsigned char uriEscapeTable[] = {")
+ passthrough = (
+ list(map(ord, '0123456789')) +
+ list(map(ord, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')) +
+ list(map(ord, 'abcdefghijklmnopqrstuvwxyz')) +
+ list(map(ord, '-_.~')))
+ for i in range(0, 256):
+ if i % 16 == 0:
+ f.write("\n ")
+ if i in passthrough:
+ f.write("0, ")
+ elif i == ord('/'):
+ f.write("2, ")
+ elif i == ord(' '):
+ f.write("3, ")
+ else:
+ f.write("4, ")
+ f.write("\n};\n\n")
f.write("} // namespace detail\n"
"} // namespace folly\n")