import sys

if sys.version_info < (3,):

    def isbasestring(s):
        return isinstance(s, basestring)

    def open_utf8(filename, mode):
        return open(filename, mode)

    def byte_to_str(x):
        return str(ord(x))

    import cStringIO

    def StringIO():
        return cStringIO.StringIO()

    def encode_utf8(x):
        return x

    def decode_utf8(x):
        return x

    def iteritems(d):
        return d.iteritems()

    def itervalues(d):
        return d.itervalues()

    def escape_string(s):
        if isinstance(s, unicode):
            s = s.encode("ascii")
        result = ""
        for c in s:
            if not (32 <= ord(c) < 127) or c in ("\\", '"'):
                result += "\\%03o" % ord(c)
            else:
                result += c
        return result

    def qualname(obj):
        # Not properly equivalent to __qualname__ in py3, but it doesn't matter.
        return obj.__name__


else:

    def isbasestring(s):
        return isinstance(s, (str, bytes))

    def open_utf8(filename, mode):
        return open(filename, mode, encoding="utf-8")

    def byte_to_str(x):
        return str(x)

    import io

    def StringIO():
        return io.StringIO()

    import codecs

    def encode_utf8(x):
        return codecs.utf_8_encode(x)[0]

    def decode_utf8(x):
        return codecs.utf_8_decode(x)[0]

    def iteritems(d):
        return iter(d.items())

    def itervalues(d):
        return iter(d.values())

    def charcode_to_c_escapes(c):
        rev_result = []
        while c >= 256:
            c, low = (c // 256, c % 256)
            rev_result.append("\\%03o" % low)
        rev_result.append("\\%03o" % c)
        return "".join(reversed(rev_result))

    def escape_string(s):
        result = ""
        if isinstance(s, str):
            s = s.encode("utf-8")
        for c in s:
            if not (32 <= c < 127) or c in (ord("\\"), ord('"')):
                result += charcode_to_c_escapes(c)
            else:
                result += chr(c)
        return result

    def qualname(obj):
        return obj.__qualname__