#!/usr/bin/python

alpha_lower = set(
    ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m",
     "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"])

alpha_upper = set(
    ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M",
     "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"])

alpha = alpha_lower | alpha_upper

digit = set(["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"])

class rfc2396(object):
    mark = set(["-", "_", ".", "!", "~", "*", "'", "(", ")"])
    alphanum = alpha | digit
    reserved = set([";", "/", "?", ":", "@", "&", "=", "+", "$", ","])
    unreserved = alphanum | mark
    pchar = unreserved | set([":", "@", "&", "=", "+", "$", ","])
    uric = reserved | unreserved

class rfc3986(object):
    unreserved = alpha | digit | set(["-", ".", "_", "~"])
    gen_delims = set([":", "/", "?", "#", "[", "]", "@"])
    sub_delims = set(["!", "$", "&", "'", "(", ")", "*", "+", ",", ";", "="])
    reserved = gen_delims | sub_delims
    pchar = unreserved | sub_delims | set([":", "@"])

class libxml(object):
    no_escape = rfc2396.unreserved | set(["@"])
    query_no_escape = set(["$", "&", "+", ",", "/", ":", ";", "=", "?", "@"])


#print sorted(libxml.no_escape & rfc3986.pchar)
#print sorted(libxml.no_escape ^ rfc3986.pchar)
#print sorted(libxml.no_escape - rfc3986.pchar)
print "rfc3986.pchar = %s" % sorted(rfc3986.pchar)
#print sorted(rfc3986.pchar - libxml.no_escape)
#print (libxml.no_escape ^ rfc3986.pchar) == (rfc3986.pchar - libxml.no_escape)

no_escape = rfc3986.pchar - libxml.no_escape 

print "libxml.no_escape = %s" % sorted(libxml.no_escape)
print "diff rfc3986.pchar libxml.no_escape = %s" % sorted(rfc3986.pchar ^ libxml.no_escape)
print "libxml.query_no_escape = %s" % sorted(libxml.query_no_escape)
print "diff no_escape libxml.query_no_escape = %s" % sorted(no_escape ^ libxml.query_no_escape)
#print sorted(no_escape)
#print sorted(libxml.query_no_escape ^ no_escape)
#print sorted(libxml.query_no_escape & libxml.no_escape)

