import sys
def generate_lookup_table(name, func, n=256, align=16):
assert(isinstance(n, int))
FIRST_LINE = 'static {}: [bool; {}] = byte_map!['.format(name, n)
LAST_LINE = '];'
print(FIRST_LINE, end='')
for i in range(n):
if i % align == 0: print('\n ', end='')
print(' {},'.format(1 if func(i) else 0), end='')
print('\n' + LAST_LINE + '\n')
def is_alphanum(b):
return (ord(b'a') <= b <= ord(b'z')) or \
(ord(b'A') <= b <= ord(b'Z')) or \
(ord(b'0') <= b <= ord(b'9'))
def is_token(b):
return is_alphanum(b) or \
(b in b"!%'*+-._`~")
def is_request_uri(b):
return is_alphanum(b) or \
(b in b"!$%&'()*+,-./:;=?@_~")
def is_reason_phrase(b):
return is_alphanum(b) or \
(b in b"!$%&'()*+,-./:;=?@_~") or \
(b in b"\xff") or \
(b in b" \t")
def is_TEXT_UTF8char(b):
return (ord(b'\x21') <= b <= ord(b'\x7E')) or \
is_UTF8_NONASCII(b)
def is_UTF8_NONASCII(b):
return (ord(b'\xC0') <= b <= ord(b'\xDF')) or \
(ord(b'\xE0') <= b <= ord(b'\xEF')) or \
(ord(b'\xF0') <= b <= ord(b'\xF7')) or \
(ord(b'\xF8') <= b <= ord(b'\xFb')) or \
(ord(b'\xFC') <= b <= ord(b'\xFD'))
def is_UTF8_CONT(b):
return (ord(b'\x80') <= b <= ord(b'\xBF'))
def is_LWS(b):
return (b in b'\x20\x09\r\n')
def is_header_value(b):
return is_TEXT_UTF8char(b) or \
is_UTF8_CONT(b) or \
is_LWS(b) or \
(b in b'\x00\x07\x7F')
GENERATORS = {
'TOKEN_MAP': is_token,
'REQUEST_URI_MAP': is_request_uri,
'REASON_PHRASE_MAP': is_reason_phrase,
'HEADER_VALUE_MAP': is_header_value,
}
def main(args):
for arg in args:
func = GENERATORS[arg]
generate_lookup_table(arg, func)
main(sys.argv[1:])