cdef enum:
    NO_EXTRA_DATA = 0x0011_0000


cdef void _skip_single_line(ReaderRef reader):
    cdef uint32_t c0
    while _reader_good(reader):
        c0 = _reader_get(reader)
        if _is_line_terminator(c0):
            break


cdef boolean _skip_multiline_comment(ReaderRef reader) except False:
    cdef uint32_t c0
    cdef boolean seen_asterisk = False
    cdef Py_ssize_t comment_start = _reader_tell(reader)

    comment_start = _reader_tell(reader)

    seen_asterisk = False
    while True:
        if expect(not _reader_good(reader), False):
            break

        c0 = _reader_get(reader)
        if c0 == b'*':
            seen_asterisk = True
        elif seen_asterisk:
            if c0 == b'/':
                return True
            seen_asterisk = False

    _raise_unclosed(b'comment', comment_start)
    return False


#     data found
# -1: exhausted
# -2: exception
cdef int32_t _skip_to_data_sub(ReaderRef reader, uint32_t c0) except -2:
    cdef int32_t c1
    cdef boolean seen_slash

    seen_slash = False
    while True:
        if c0 == b'/':
            if seen_slash:
                _skip_single_line(reader)
                seen_slash = False
            else:
                seen_slash = True
        elif c0 == b'*':
            if expect(not seen_slash, False):
                _raise_stray_character('asterisk', _reader_tell(reader))

            _skip_multiline_comment(reader)
            seen_slash = False
        elif not _is_ws_zs(c0):
            c1 = cast_to_int32(c0)
            break
        elif expect(seen_slash, False):
            _raise_stray_character('slash', _reader_tell(reader))

        if not _reader_good(reader):
            c1 = -1
            break

        c0 = _reader_get(reader)

    if expect(seen_slash, False):
        _raise_stray_character('slash', _reader_tell(reader))

    return c1


#    data found
# -1 exhausted
# -2 exception
cdef int32_t _skip_to_data(ReaderRef reader) except -2:
    cdef uint32_t c0
    cdef int32_t c1
    if _reader_good(reader):
        c0 = _reader_get(reader)
        c1 = _skip_to_data_sub(reader, c0)
    else:
        c1 = -1
    return c1


cdef int32_t _get_hex_character(ReaderRef reader, Py_ssize_t length) except -1:
    cdef Py_ssize_t start
    cdef uint32_t c0
    cdef uint32_t result
    cdef Py_ssize_t index

    start = _reader_tell(reader)
    result = 0
    for index in range(length):
        result <<= 4
        if expect(not _reader_good(reader), False):
            _raise_unclosed(b'escape sequence', start)

        c0 = _reader_get(reader)
        if b'0' <= c0 <= b'9':
            result |= c0 - <uint32_t> b'0'
        elif b'a' <= c0 <= b'f':
            result |= c0 - <uint32_t> b'a' + 10
        elif b'A' <= c0 <= b'F':
            result |= c0 - <uint32_t> b'A' + 10
        else:
            _raise_expected_s('hexadecimal character', start, c0)

    if expect(result > 0x10ffff, False):
        _raise_expected_s('Unicode code point', start, result)

    return cast_to_int32(result)


# >=  0: character to append
cdef int32_t _get_escaped_unicode_maybe_surrogate(ReaderRef reader, Py_ssize_t start) except -1:
    cdef uint32_t c0
    cdef uint32_t c1

    c0 = cast_to_uint32(_get_hex_character(reader, 4))
    if expect(Py_UNICODE_IS_LOW_SURROGATE(c0), False):
        _raise_expected_s('high surrogate before low surrogate', start, c0)
    elif not Py_UNICODE_IS_HIGH_SURROGATE(c0):
        return c0

    _accept_string(reader, b'\\u')

    c1 = cast_to_uint32(_get_hex_character(reader, 4))
    if expect(not Py_UNICODE_IS_LOW_SURROGATE(c1), False):
        _raise_expected_s('low surrogate', start, c1)

    return Py_UNICODE_JOIN_SURROGATES(c0, c1)


# >=  0: character to append
#    -1: skip
# <  -1: -(next character + 1)
cdef int32_t _get_escape_sequence(ReaderRef reader,
                                  Py_ssize_t start) except 0x7ffffff:
    cdef uint32_t c0
    cdef uint32_t c1

    c0 = _reader_get(reader)
    if expect(not _reader_good(reader), False):
        _raise_unclosed(b'string', start)

    if c0 == b'b':
        return 0x0008
    elif c0 == b'f':
        return 0x000c
    elif c0 == b'n':
        return 0x000a
    elif c0 == b'r':
        return 0x000d
    elif c0 == b't':
        return 0x0009
    elif c0 == b'v':
        return 0x000b
    elif c0 == b'0':
        return 0x0000
    elif c0 == b'x':
        return _get_hex_character(reader, 2)
    elif c0 == b'u':
        return _get_escaped_unicode_maybe_surrogate(reader, start)
    elif c0 == b'U':
        return _get_hex_character(reader, 8)
    elif expect(b'1' <= c0 <= b'9', False):
        _raise_expected_s('escape sequence', start, c0)
        return -2
    elif _is_line_terminator(c0):
        if c0 != 0x000D:
            return -1

        c0 = _reader_get(reader)
        if c0 == 0x000A:
            return -1

        return -cast_to_int32(c0 + 1)
    else:
        return cast_to_int32(c0)


cdef object _decode_string_sub(ReaderRef reader, uint32_t delim,
                               Py_ssize_t start, uint32_t c0):
    cdef int32_t c1
    cdef StackHeapString[uint32_t] buf

    while True:
        if expect(c0 == delim, False):
            break

        if expect(not _reader_good(reader), False):
            _raise_unclosed(b'string', start)

        if expect(c0 != b'\\', True):
            if expect(c0 in (0xA, 0xD), False):
                _raise_unclosed(b'string', start)

            buf.push_back(c0)
            c0 = _reader_get(reader)
            continue

        c1 = _get_escape_sequence(reader, start)
        if c1 >= -1:
            if expect(not _reader_good(reader), False):
                _raise_unclosed(b'string', start)

            if c1 >= 0:
                c0 = cast_to_uint32(c1)
                buf.push_back(c0)

            c0 = _reader_get(reader)
        else:
            c0 = cast_to_uint32(-(c1 + 1))

    return PyUnicode_FromKindAndData(
        PyUnicode_4BYTE_KIND, buf.data(), buf.size(),
    )


cdef object _decode_string(ReaderRef reader, int32_t *c_in_out):
    cdef uint32_t delim
    cdef uint32_t c0
    cdef int32_t c1
    cdef Py_ssize_t start
    cdef object result

    c1 = c_in_out[0]
    delim = cast_to_uint32(c1)
    start = _reader_tell(reader)

    if expect(not _reader_good(reader), False):
        _raise_unclosed(b'string', start)

    c0 = _reader_get(reader)
    result = _decode_string_sub(reader, delim, start, c0)

    c_in_out[0] = NO_EXTRA_DATA
    return result


cdef object _decode_number_leading_zero(ReaderRef reader, StackHeapString[char] &buf,
                                        int32_t *c_in_out, Py_ssize_t start):
    cdef uint32_t c0
    cdef int32_t c1

    if not _reader_good(reader):
        c_in_out[0] = -1
        return 0

    c0 = _reader_get(reader)
    if _is_x(c0):
        while True:
            if not _reader_good(reader):
                c1 = -1
                break

            c0 = _reader_get(reader)
            if _is_hexadecimal(c0):
                buf.push_back(<char> <unsigned char> c0)
            elif c0 != b'_':
                c1 = cast_to_int32(c0)
                break

        c_in_out[0] = c1

        buf.push_back(b'\0')
        try:
            return PyLong_FromString(buf.data(), NULL, 16)
        except Exception as ex:
            _raise_unclosed('NumericLiteral', start)
    elif c0 == b'.':
        buf.push_back(b'0')
        buf.push_back(b'.')

        while True:
            if not _reader_good(reader):
                c1 = -1
                break

            c0 = _reader_get(reader)
            if _is_in_float_representation(c0):
                buf.push_back(<char> <unsigned char> c0)
            elif c0 != b'_':
                c1 = cast_to_int32(c0)
                break

        c_in_out[0] = c1

        buf.push_back(b'\0')
        try:
            return PyOS_string_to_double(buf.data(), NULL, NULL)
        except Exception as ex:
            _raise_unclosed('NumericLiteral', start)
    elif _is_e(c0):
        while True:
            if not _reader_good(reader):
                c1 = -1
                break

            c0 = _reader_get(reader)
            if _is_in_float_representation(c0):
                pass
            elif c0 == b'_':
                pass
            else:
                c1 = cast_to_int32(c0)
                break

        c_in_out[0] = c1
        return 0.0
    else:
        c1 = cast_to_int32(c0)
        c_in_out[0] = c1
        return 0


cdef object _decode_number_any(ReaderRef reader, StackHeapString[char] &buf,
                               int32_t *c_in_out, Py_ssize_t start):
    cdef uint32_t c0
    cdef int32_t c1
    cdef boolean is_float

    c1 = c_in_out[0]
    c0 = cast_to_uint32(c1)

    is_float = False
    while True:
        if _is_decimal(c0):
            pass
        elif _is_in_float_representation(c0):
            is_float = True
        elif c0 != b'_':
            c1 = cast_to_int32(c0)
            break

        if c0 != b'_':
            buf.push_back(<char> <unsigned char> c0)

        if not _reader_good(reader):
            c1 = -1
            break

        c0 = _reader_get(reader)

    c_in_out[0] = c1

    buf.push_back(b'\0')
    try:
        if is_float:
            return PyOS_string_to_double(buf.data(), NULL, NULL)
        else:
            return PyLong_FromString(buf.data(), NULL, 10)
    except Exception as ex:
        _raise_unclosed('NumericLiteral', start)


cdef object _decode_number(ReaderRef reader, int32_t *c_in_out):
    cdef uint32_t c0
    cdef int32_t c1
    cdef Py_ssize_t start = _reader_tell(reader)
    cdef StackHeapString[char] buf

    c1 = c_in_out[0]
    c0 = cast_to_uint32(c1)

    if c0 == b'+':
        if expect(not _reader_good(reader), False):
            _raise_unclosed(b'number', start)

        c0 = _reader_get(reader)
        if c0 == b'I':
            _accept_string(reader, b'nfinity')
            c_in_out[0] = NO_EXTRA_DATA
            return CONST_POS_INF
        elif c0 == b'N':
            _accept_string(reader, b'aN')
            c_in_out[0] = NO_EXTRA_DATA
            return CONST_POS_NAN
    elif c0 == b'-':
        if expect(not _reader_good(reader), False):
            _raise_unclosed(b'number', start)

        c0 = _reader_get(reader)
        if c0 == b'I':
            _accept_string(reader, b'nfinity')
            c_in_out[0] = NO_EXTRA_DATA
            return CONST_NEG_INF
        elif c0 == b'N':
            _accept_string(reader, b'aN')
            c_in_out[0] = NO_EXTRA_DATA
            return CONST_NEG_NAN

        buf.push_back(b'-')

    if c0 == b'0':
        return _decode_number_leading_zero(reader, buf, c_in_out, start)
    else:
        c1 = cast_to_int32(c0)
        c_in_out[0] = c1
        return _decode_number_any(reader, buf, c_in_out, start)


#  1: done
#  0: data found
# -1: exception (exhausted)
cdef uint32_t _skip_comma(ReaderRef reader, Py_ssize_t start,
                          uint32_t terminator, const char *what,
                          int32_t *c_in_out) except -1:
    cdef int32_t c0
    cdef uint32_t c1
    cdef boolean needs_comma
    cdef uint32_t done

    c0 = c_in_out[0]
    c1 = cast_to_uint32(c0)

    needs_comma = True
    while True:
        c0 = _skip_to_data_sub(reader, c1)
        if c0 < 0:
            break

        c1 = cast_to_uint32(c0)
        if c1 == terminator:
            c_in_out[0] = NO_EXTRA_DATA
            return 1

        if c1 != b',':
            if expect(needs_comma, False):
                _raise_expected_sc(
                    'comma', terminator, _reader_tell(reader), c1,
                )
            c_in_out[0] = c0
            return 0

        if expect(not needs_comma, False):
            _raise_stray_character('comma', _reader_tell(reader))

        if expect(not _reader_good(reader), False):
            break

        c1 = _reader_get(reader)
        needs_comma = False

    _raise_unclosed(what, start)
    return -1


cdef unicode _decode_identifier_name(ReaderRef reader, int32_t *c_in_out):
    cdef int32_t c0
    cdef uint32_t c1
    cdef Py_ssize_t start
    cdef StackHeapString[uint32_t] buf

    start = _reader_tell(reader)

    c0 = c_in_out[0]
    c1 = cast_to_uint32(c0)
    if expect(not _is_identifier_start(c1), False):
        _raise_expected_s('IdentifierStart', _reader_tell(reader), c1)

    while True:
        if expect(c1 == b'\\', False):
            if not _reader_good(reader):
                _raise_unclosed('IdentifierName', start)
                break

            c1 = _reader_get(reader)
            if c1 == b'u':
                c1 = cast_to_uint32(_get_escaped_unicode_maybe_surrogate(reader, _reader_tell(reader)))
            elif c1 == b'U':
                c1 = cast_to_uint32(_get_hex_character(reader, 8))
            else:
                _raise_expected_s('UnicodeEscapeSequence', _reader_tell(reader), c1)

        buf.push_back(c1)

        if not _reader_good(reader):
            c0 = -1
            break

        c1 = _reader_get(reader)
        if not _is_identifier_part(c1):
            c0 = cast_to_int32(c1)
            break

    c_in_out[0] = c0
    return PyUnicode_FromKindAndData(
        PyUnicode_4BYTE_KIND, buf.data(), buf.size(),
    )


cdef boolean _decode_object(ReaderRef reader, dict result) except False:
    cdef int32_t c0
    cdef uint32_t c1
    cdef Py_ssize_t start
    cdef boolean done
    cdef object key
    cdef object value

    start = _reader_tell(reader)

    c0 = _skip_to_data(reader)
    if expect(c0 >= 0, True):
        c1 = cast_to_uint32(c0)
        if c1 == b'}':
            return True

        while True:
            if c1 in b'"\'':
                key = _decode_string(reader, &c0)
            else:
                key = _decode_identifier_name(reader, &c0)
            if expect(c0 < 0, False):
                break

            c1 = cast_to_uint32(c0)
            c0 = _skip_to_data_sub(reader, c1)
            if expect(c0 < 0, False):
                break

            c1 = cast_to_uint32(c0)
            if expect(c1 != b':', False):
                _raise_expected_s('colon', _reader_tell(reader), c1)

            if expect(not _reader_good(reader), False):
                break

            c0 = _skip_to_data(reader)
            if expect(c0 < 0, False):
                break

            try:
                value = _decode_recursive(reader, &c0)
            except _DecoderException as ex:
                PyDict_SetItem(result, key, (<_DecoderException> ex).result)
                raise

            if expect(c0 < 0, False):
                break

            PyDict_SetItem(result, key, value)

            done = _skip_comma(
                reader, start, <unsigned char>b'}', b'object', &c0,
            )
            if done:
                return True

            c1 = cast_to_uint32(c0)

    _raise_unclosed(b'object', start)
    return False


cdef boolean _decode_array(ReaderRef reader, list result) except False:
    cdef int32_t c0
    cdef uint32_t c1
    cdef Py_ssize_t start
    cdef boolean done
    cdef object value

    start = _reader_tell(reader)

    c0 = _skip_to_data(reader)
    if expect(c0 >= 0, True):
        c1 = cast_to_uint32(c0)
        if c1 == b']':
            return True

        while True:
            try:
                value = _decode_recursive(reader, &c0)
            except _DecoderException as ex:
                PyList_Append(result, (<_DecoderException> ex).result)
                raise

            if expect(c0 < 0, False):
                break

            PyList_Append(result, value)

            done = _skip_comma(
                reader, start, <unsigned char>b']', b'array', &c0,
            )
            if done:
                return True

    _raise_unclosed(b'array', start)


cdef boolean _accept_string(ReaderRef reader, const char *string) except False:
    cdef uint32_t c0
    cdef uint32_t c1
    cdef Py_ssize_t start

    start = _reader_tell(reader)
    while True:
        c0 = string[0]
        string += 1
        if not c0:
            break

        if expect(not _reader_good(reader), False):
            _raise_unclosed(b'literal', start)

        c1 = _reader_get(reader)
        if expect(c0 != c1, False):
            _raise_expected_c(c0, start, c1)

    return True


cdef object _decode_literal(ReaderRef reader, int32_t *c_in_out):
    cdef const char *tail
    cdef object result
    cdef uint32_t c0
    cdef int32_t c1

    c0 = cast_to_uint32(c_in_out[0])
    if c0 == b'n':
        tail = b'ull'
        result = None
    elif c0 == b't':
        tail = b'rue'
        result = True
    elif c0 == b'f':
        tail = b'alse'
        result = False
    elif c0 == b'I':
        tail = b'nfinity'
        result = CONST_POS_INF
    else:  # elif c0 == b'N':
        tail = b'aN'
        result = CONST_POS_NAN

    _accept_string(reader, tail)

    c_in_out[0] = NO_EXTRA_DATA
    return result


cdef object _decode_recursive_enter(ReaderRef reader, int32_t *c_in_out):
    cdef object result
    cdef int32_t c0
    cdef uint32_t c1

    c0 = c_in_out[0]
    c1 = cast_to_uint32(c0)

    _reader_enter(reader)
    try:
        if c1 == b'{':
            result = {}
            _decode_object(reader, result)
        else:
            result = []
            _decode_array(reader, result)
    except RecursionError:
        _raise_nesting(_reader_tell(reader), result)
    except _DecoderException as ex:
        (<_DecoderException> ex).result = result
        raise ex
    finally:
        _reader_leave(reader)

    c_in_out[0] = NO_EXTRA_DATA
    return result


cdef object _decoder_unknown(ReaderRef reader, int32_t *c_in_out):
    cdef int32_t c0
    cdef uint32_t c1
    cdef Py_ssize_t start

    c0 = c_in_out[0]
    c1 = cast_to_uint32(c0)
    start = _reader_tell(reader)

    _raise_expected_s('JSON5Value', start, c1)


cdef object _decode_recursive(ReaderRef reader, int32_t *c_in_out):
    cdef object (*decoder)(ReaderRef, int32_t*)
    cdef int32_t c0
    cdef uint32_t c1

    c0 = c_in_out[0]
    c1 = cast_to_uint32(c0)

    decoder = _decoder_unknown
    if c1 in b'ntfIN':
        decoder = _decode_literal
    elif c1 in b'\'"':
        decoder = _decode_string
    elif c1 in b'+-.0123456789':
        decoder = _decode_number
    elif c1 in b'{[':
        decoder = _decode_recursive_enter

    return decoder(reader, c_in_out)


cdef object _decode_all_sub(ReaderRef reader, boolean some):
    cdef Py_ssize_t start
    cdef int32_t c0
    cdef uint32_t c1
    cdef object result

    start = _reader_tell(reader)
    c0 = _skip_to_data(reader)
    if expect(c0 < 0, False):
        _raise_no_data(start)

    result = _decode_recursive(reader, &c0)
    try:
        if c0 < 0:
            pass
        elif not some:
            start = _reader_tell(reader)
            c1 = cast_to_uint32(c0)
            c0 = _skip_to_data_sub(reader, c1)
            if expect(c0 >= 0, False):
                c1 = cast_to_uint32(c0)
                _raise_extra_data(c1, start)
        elif expect(not _is_ws_zs(c0), False):
            start = _reader_tell(reader)
            c1 = cast_to_uint32(c0)
            _raise_unframed_data(c1, start)
    except _DecoderException as ex:
        (<_DecoderException> ex).result = result
        raise ex

    return result


cdef object _decode_all(ReaderRef reader, boolean some):
    cdef Exception ex_result
    cdef _DecoderException ex
    try:
        return _decode_all_sub(reader, some)
    except _DecoderException as e:
        ex = <_DecoderException> e
        ex_result = ex.cls(ex.msg, ex.result, ex.extra)
    raise ex_result


cdef object _decode_ucs1(const void *string, Py_ssize_t length,
                         Py_ssize_t maxdepth, boolean some):
    cdef ReaderUCS1 reader = ReaderUCS1(
        ReaderUCS(length, 0, maxdepth),
        <const Py_UCS1*> string,
    )
    return _decode_all(reader, some)


cdef object _decode_ucs2(const void *string, Py_ssize_t length,
                         Py_ssize_t maxdepth, boolean some):
    cdef ReaderUCS2 reader = ReaderUCS2(
        ReaderUCS(length, 0, maxdepth),
        <const Py_UCS2*> string,
    )
    return _decode_all(reader, some)


cdef object _decode_ucs4(const void *string, Py_ssize_t length,
                         Py_ssize_t maxdepth, boolean some):
    cdef ReaderUCS4 reader = ReaderUCS4(
        ReaderUCS(length, 0, maxdepth),
        <const Py_UCS4*> string,
    )
    return _decode_all(reader, some)


cdef object _decode_unicode(object data, Py_ssize_t maxdepth, boolean some):
    cdef Py_ssize_t length
    cdef int kind

    PyUnicode_READY(data)

    length = PyUnicode_GET_LENGTH(data)
    kind = PyUnicode_KIND(data)

    if kind == PyUnicode_1BYTE_KIND:
        return _decode_ucs1(PyUnicode_1BYTE_DATA(data), length, maxdepth, some)
    elif kind == PyUnicode_2BYTE_KIND:
        return _decode_ucs2(PyUnicode_2BYTE_DATA(data), length, maxdepth, some)
    elif kind == PyUnicode_4BYTE_KIND:
        return _decode_ucs4(PyUnicode_4BYTE_DATA(data), length, maxdepth, some)
    else:
        __builtin_unreachable()


cdef object _decode_buffer(Py_buffer &view, int32_t wordlength,
                           Py_ssize_t maxdepth, boolean some):
    cdef object (*decoder)(const void*, Py_ssize_t, Py_ssize_t, boolean)
    cdef Py_ssize_t length

    if wordlength == 1:
        decoder = _decode_ucs1
        length = view.len // 1
    elif wordlength == 2:
        decoder = _decode_ucs2
        length = view.len // 2
    elif wordlength == 4:
        decoder = _decode_ucs4
        length = view.len // 4
    else:
        _raise_illegal_wordlength(wordlength)
        __builtin_unreachable()

    return decoder(view.buf, length, maxdepth, some)


cdef object _decode_callback(object cb, object args, Py_ssize_t maxdepth,
                             boolean some):
    cdef ReaderCallback reader = ReaderCallback(
        ReaderCallbackBase(0, maxdepth),
        <PyObject*> cb,
        <PyObject*> args,
        -1,
    )
    return _decode_all(reader, some)
