// Copyright 2020 The Wuffs Authors.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//    https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

pub status "#bad input"
pub status "#unsupported recursion depth"

pri status "#internal error: inconsistent I/O"
pri status "#internal error: inconsistent token length"

// --------

// DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE is the largest workbuf length that a
// decoder will request.
pub const DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE : base.u64 = 0

// DECODER_DEPTH_MAX_INCL is the maximum supported recursion depth: how deeply
// nested [] arrays and {} maps can be.
//
// The CBOR spec itself does not define a limit, but allows implementations to
// set their own limits.
pub const DECODER_DEPTH_MAX_INCL : base.u64 = 1024

// DECODER_DST_TOKEN_BUFFER_LENGTH_MIN_INCL is the minimum length of the dst
// wuffs_base__token_buffer passed to the decoder.
pub const DECODER_DST_TOKEN_BUFFER_LENGTH_MIN_INCL : base.u64 = 2

// DECODER_SRC_IO_BUFFER_LENGTH_MIN_INCL is the minimum length of the src
// wuffs_base__io_buffer passed to the decoder.
pub const DECODER_SRC_IO_BUFFER_LENGTH_MIN_INCL : base.u64 = 9

// --------

// TOKEN_VALUE_MAJOR is the base-38 encoding of "cbor".
pub const TOKEN_VALUE_MAJOR : base.u32 = 0x0C_061D

// TOKEN_VALUE_MINOR__DETAIL_MASK is a mask for the low 18 bits of a token's
// value_minor. 18 is 64 - base.TOKEN__VALUE_EXTENSION__NUM_BITS.
pub const TOKEN_VALUE_MINOR__DETAIL_MASK : base.u64 = 0x003_FFFF

// TOKEN_VALUE_MINOR__MINUS_1_MINUS_X means that the 9-byte length token holds
// the negative integer (-1 - x), where x is the big-endian unsigned integer in
// the token's final 8 bytes. The most significant bit of x is guaranteed to be
// set, so that (-1 - x) will always underflow an int64_t and its absolute
// value (+1 + x) might also overflow a uint64_t.
pub const TOKEN_VALUE_MINOR__MINUS_1_MINUS_X : base.u32 = 0x100_0000

// TOKEN_VALUE_MINOR__SIMPLE_VALUE means that the low 8 bits (or, equivalently,
// the low 18 bits) of the token's value_minor is a CBOR simple value either in
// the range 0 ..= 19 or in the range 24 ..= 255.
//
// Simple values in the range 20 ..= 23 (which correspond to: false, true, null
// and undefined) are represented by WUFFS_BASE__TOKEN__VBC__LITERAL tokens.
pub const TOKEN_VALUE_MINOR__SIMPLE_VALUE : base.u32 = 0x080_0000

// TOKEN_VALUE_MINOR__TAG means that the low 18 bits of the token's value_minor
// is a CBOR tag. That token may be continued, in which case the following
// token is an extended token whose value_extension holds a further
// base.TOKEN__VALUE_EXTENSION__NUM_BITS bits. The 64-bit CBOR tag is either v
// or ((v << base.TOKEN__VALUE_EXTENSION__NUM_BITS) | value_extension_1) where
// v is (value_minor_0 & TOKEN_VALUE_MINOR__DETAIL_MASK).
//
// When a token chain contains extended tokens like this, all but the last
// token has zero length.
pub const TOKEN_VALUE_MINOR__TAG : base.u32 = 0x040_0000

// --------

pri const LITERALS : roarray[4] base.u32[..= 0x1FF_FFFF] = [
        (base.TOKEN__VBC__LITERAL << 21) | base.TOKEN__VBD__LITERAL__FALSE,
        (base.TOKEN__VBC__LITERAL << 21) | base.TOKEN__VBD__LITERAL__TRUE,
        (base.TOKEN__VBC__LITERAL << 21) | base.TOKEN__VBD__LITERAL__NULL,
        (base.TOKEN__VBC__LITERAL << 21) | base.TOKEN__VBD__LITERAL__UNDEFINED,
]

pri const TOKEN_LENGTHS : roarray[32] base.u8[..= 9] = [
        1, 1, 1, 1, 1, 1, 1, 1,
        1, 1, 1, 1, 1, 1, 1, 1,
        1, 1, 1, 1, 1, 1, 1, 1,
        2, 3, 5, 9, 0, 0, 0, 1,
]

pub struct decoder? implements base.token_decoder(
        end_of_data : base.bool,

        util : base.utility,
) + (
        // stack is conceptually an array of 2-bit integers, implemented as an
        // array of u32. The N'th 2-bit pair is whether we're in an array or
        // object, where N is the recursion depth:
        //  - 0b00 In an array.
        //  - 0b01 In an object, expecting a value.
        //  - 0b10 In an array.
        //  - 0b11 In an object, expecting a key.
        //
        // The maximum recursion depth, 1024, is the same as for std/json.
        stack : array[1024 / 16] base.u32,

        // container_num_remaining[i] is the number of elements remaining in the
        // open containers, for i ranging in 0 .. depth. If (i < depth) and
        // (container_num_remaining[i] == 0) then the i'th open container has
        // indefinite length.
        container_num_remaining : array[1024] base.u64,
)

pub func decoder.set_quirk_enabled!(quirk: base.u32, enabled: base.bool) {
}

pub func decoder.workbuf_len() base.range_ii_u64 {
    return this.util.empty_range_ii_u64()
}

pub func decoder.decode_tokens?(dst: base.token_writer, src: base.io_reader, workbuf: slice base.u8) {
    var string_length : base.u64

    var n64          : base.u64
    var depth        : base.u32[..= 1024]
    var stack_byte   : base.u32[..= (1024 / 16) - 1]
    var stack_bit    : base.u32[..= 30]
    var stack_val    : base.u32[..= 3]
    var token_length : base.u32[..= 0xFFFF]
    var vminor       : base.u32[..= 0x1FF_FFFF]
    var vminor_alt   : base.u32[..= 0x1FF_FFFF]
    var continued    : base.u32[..= 1]
    var c            : base.u8
    var c_major      : base.u8[..= 0x07]
    var c_minor      : base.u8[..= 0x1F]
    var tagged       : base.bool

    // indefinite_string_major_type is 2 or 3 when we are in an
    // indefinite-length byte string or text string. It is 0 otherwise.
    var indefinite_string_major_type : base.u8[..= 3]

    if this.end_of_data {
        return base."@end of data"
    }

    while.outer true {
        while.goto_parsed_a_leaf_value true {{
        while.goto_fail true {{
        if args.dst.length() <= 1 {
            yield? base."$short write"
            continue.outer
        }
        if args.src.length() <= 0 {
            if args.src.is_closed() {
                return "#bad input"
            }
            yield? base."$short read"
            continue.outer
        }
        c = args.src.peek_u8()

        if (indefinite_string_major_type <> 0) and (indefinite_string_major_type <> (c >> 5)) {
            if c <> 0xFF {
                return "#bad input"
            }
            vminor = (base.TOKEN__VBC__STRING << 21) |
                    base.TOKEN__VBD__STRING__CONVERT_0_DST_1_SRC_DROP
            if indefinite_string_major_type == 3 {
                vminor |= base.TOKEN__VBD__STRING__DEFINITELY_UTF_8 |
                        base.TOKEN__VBD__STRING__CHAIN_MUST_BE_UTF_8 |
                        base.TOKEN__VBD__STRING__DEFINITELY_ASCII
            }
            indefinite_string_major_type = 0
            args.src.skip_u32_fast!(actual: 1, worst_case: 1)
            args.dst.write_simple_token_fast!(
                    value_major: 0,
                    value_minor: vminor,
                    continued: 0,
                    length: 1)
            break.goto_parsed_a_leaf_value
        }

        args.src.skip_u32_fast!(actual: 1, worst_case: 1)
        c_major = (c >> 5) as base.u8
        c_minor = c & 0x1F
        if c_minor < 0x18 {
            string_length = c_minor as base.u64
        } else {
            while.goto_have_string_length true,
                    inv args.dst.length() > 1,
            {{
            if c_minor == 0x18 {
                if args.src.length() >= 1 {
                    string_length = args.src.peek_u8_as_u64()
                    args.src.skip_u32_fast!(actual: 1, worst_case: 1)
                    break.goto_have_string_length
                }
            } else if c_minor == 0x19 {
                if args.src.length() >= 2 {
                    string_length = args.src.peek_u16be_as_u64()
                    args.src.skip_u32_fast!(actual: 2, worst_case: 2)
                    break.goto_have_string_length
                }
            } else if c_minor == 0x1A {
                if args.src.length() >= 4 {
                    string_length = args.src.peek_u32be_as_u64()
                    args.src.skip_u32_fast!(actual: 4, worst_case: 4)
                    break.goto_have_string_length
                }
            } else if c_minor == 0x1B {
                if args.src.length() >= 8 {
                    string_length = args.src.peek_u64be()
                    args.src.skip_u32_fast!(actual: 8, worst_case: 8)
                    break.goto_have_string_length
                }
            } else {
                string_length = 0
                break.goto_have_string_length
            }

            if args.src.can_undo_byte() {
                args.src.undo_byte!()
                if args.src.is_closed() {
                    return "#bad input"
                }
                yield? base."$short read"
                continue.outer
            }
            return "#internal error: inconsistent I/O"
            }} endwhile.goto_have_string_length
        }

        if c_major == 0 {
            // -------- BEGIN Major type 0: an unsigned integer.
            if c_minor < 0x1A {
                args.dst.write_simple_token_fast!(
                        value_major: 0,
                        value_minor: (base.TOKEN__VBC__INLINE_INTEGER_UNSIGNED << 21) |
                        ((string_length & 0xFFFF) as base.u32),
                        continued: 0,
                        length: TOKEN_LENGTHS[c_minor] as base.u32)
                break.goto_parsed_a_leaf_value
            } else if c_minor < 0x1C {
                args.dst.write_simple_token_fast!(
                        value_major: 0,
                        value_minor: (base.TOKEN__VBC__INLINE_INTEGER_UNSIGNED << 21) |
                        ((string_length >> base.TOKEN__VALUE_EXTENSION__NUM_BITS) as base.u32),
                        continued: 1,
                        length: 0)
                args.dst.write_extended_token_fast!(
                        value_extension: string_length & 0x3FFF_FFFF_FFFF,
                        continued: 0,
                        length: TOKEN_LENGTHS[c_minor] as base.u32)
                break.goto_parsed_a_leaf_value
            }
            // -------- END   Major type 0: an unsigned integer.

        } else if c_major == 1 {
            // -------- END   Major type 1: a negative integer.
            if c_minor < 0x1A {
                args.dst.write_simple_token_fast!(
                        value_major: 0,
                        value_minor: (base.TOKEN__VBC__INLINE_INTEGER_SIGNED << 21) |
                        (0x1F_FFFF - ((string_length & 0xFFFF) as base.u32)),
                        continued: 0,
                        length: TOKEN_LENGTHS[c_minor] as base.u32)
                break.goto_parsed_a_leaf_value
            } else if c_minor < 0x1C {
                if string_length < 0x8000_0000_0000_0000 {
                    args.dst.write_simple_token_fast!(
                            value_major: 0,
                            value_minor: (base.TOKEN__VBC__INLINE_INTEGER_SIGNED << 21) |
                            (0x1F_FFFF - ((string_length >> base.TOKEN__VALUE_EXTENSION__NUM_BITS) as base.u32)),
                            continued: 1,
                            length: 0)
                    args.dst.write_extended_token_fast!(
                            value_extension: (0xFFFF_FFFF_FFFF_FFFF - string_length) & 0x3FFF_FFFF_FFFF,
                            continued: 0,
                            length: TOKEN_LENGTHS[c_minor] as base.u32)
                } else {
                    args.dst.write_simple_token_fast!(
                            value_major: TOKEN_VALUE_MAJOR,
                            value_minor: TOKEN_VALUE_MINOR__MINUS_1_MINUS_X,
                            continued: 0,
                            length: 9)
                }
                break.goto_parsed_a_leaf_value
            }
            // -------- END   Major type 1: a negative integer.

        } else if c_major == 2 {
            // -------- BEGIN Major type 2: a byte string.
            if c_minor < 0x1C {
                if string_length == 0 {
                    args.dst.write_simple_token_fast!(
                            value_major: 0,
                            value_minor: (base.TOKEN__VBC__STRING << 21) |
                            base.TOKEN__VBD__STRING__CONVERT_0_DST_1_SRC_DROP,
                            continued: 0,
                            length: TOKEN_LENGTHS[c_minor] as base.u32)
                    break.goto_parsed_a_leaf_value
                }
                args.dst.write_simple_token_fast!(
                        value_major: 0,
                        value_minor: (base.TOKEN__VBC__STRING << 21) |
                        base.TOKEN__VBD__STRING__CONVERT_0_DST_1_SRC_DROP,
                        continued: 1,
                        length: TOKEN_LENGTHS[c_minor] as base.u32)
            } else if c_minor == 0x1F {
                if indefinite_string_major_type <> 0 {
                    break.goto_fail
                }
                indefinite_string_major_type = 2
                args.dst.write_simple_token_fast!(
                        value_major: 0,
                        value_minor: (base.TOKEN__VBC__STRING << 21) |
                        base.TOKEN__VBD__STRING__CONVERT_0_DST_1_SRC_DROP,
                        continued: 1,
                        length: 1)
                continue.outer
            } else {
                break.goto_fail
            }

            while true {
                if args.dst.length() <= 0 {
                    yield? base."$short write"
                    continue
                }
                n64 = string_length.min(a: args.src.length())
                token_length = (n64 & 0xFFFF) as base.u32
                if n64 > 0xFFFF {
                    token_length = 0xFFFF
                } else if token_length <= 0 {
                    if args.src.is_closed() {
                        return "#bad input"
                    }
                    yield? base."$short read"
                    continue
                }
                if args.src.length() < (token_length as base.u64) {
                    return "#internal error: inconsistent token length"
                }
                string_length ~mod-= token_length as base.u64
                continued = 0
                if (string_length > 0) or (indefinite_string_major_type > 0) {
                    continued = 1
                }
                args.src.skip_u32_fast!(actual: token_length, worst_case: token_length)
                args.dst.write_simple_token_fast!(
                        value_major: 0,
                        value_minor: (base.TOKEN__VBC__STRING << 21) |
                        base.TOKEN__VBD__STRING__CONVERT_1_DST_1_SRC_COPY,
                        continued: continued,
                        length: token_length)
                if string_length > 0 {
                    continue
                } else if indefinite_string_major_type > 0 {
                    continue.outer
                }
                break.goto_parsed_a_leaf_value
            } endwhile
            // -------- END   Major type 2: a byte string.

        } else if c_major == 3 {
            // -------- BEGIN Major type 3: a text string.
            if c_minor < 0x1C {
                if string_length == 0 {
                    args.dst.write_simple_token_fast!(
                            value_major: 0,
                            value_minor: (base.TOKEN__VBC__STRING << 21) |
                            base.TOKEN__VBD__STRING__DEFINITELY_UTF_8 |
                            base.TOKEN__VBD__STRING__CHAIN_MUST_BE_UTF_8 |
                            base.TOKEN__VBD__STRING__DEFINITELY_ASCII |
                            base.TOKEN__VBD__STRING__CONVERT_0_DST_1_SRC_DROP,
                            continued: 0,
                            length: TOKEN_LENGTHS[c_minor] as base.u32)
                    break.goto_parsed_a_leaf_value
                }
                args.dst.write_simple_token_fast!(
                        value_major: 0,
                        value_minor: (base.TOKEN__VBC__STRING << 21) |
                        base.TOKEN__VBD__STRING__DEFINITELY_UTF_8 |
                        base.TOKEN__VBD__STRING__CHAIN_MUST_BE_UTF_8 |
                        base.TOKEN__VBD__STRING__DEFINITELY_ASCII |
                        base.TOKEN__VBD__STRING__CONVERT_0_DST_1_SRC_DROP,
                        continued: 1,
                        length: TOKEN_LENGTHS[c_minor] as base.u32)
            } else if c_minor == 0x1F {
                if indefinite_string_major_type <> 0 {
                    break.goto_fail
                }
                indefinite_string_major_type = 3
                args.dst.write_simple_token_fast!(
                        value_major: 0,
                        value_minor: (base.TOKEN__VBC__STRING << 21) |
                        base.TOKEN__VBD__STRING__DEFINITELY_UTF_8 |
                        base.TOKEN__VBD__STRING__CHAIN_MUST_BE_UTF_8 |
                        base.TOKEN__VBD__STRING__DEFINITELY_ASCII |
                        base.TOKEN__VBD__STRING__CONVERT_0_DST_1_SRC_DROP,
                        continued: 1,
                        length: 1)
                continue.outer
            } else {
                break.goto_fail
            }

            while true {
                if args.dst.length() <= 0 {
                    yield? base."$short write"
                    continue
                }
                n64 = string_length.min(a: 0xFFFF)
                n64 = args.src.valid_utf_8_length(up_to: n64)
                token_length = (n64 & 0xFFFF) as base.u32
                if token_length <= 0 {
                    // The longest UTF-8 code point is 4 bytes.
                    if args.src.is_closed() or (args.src.length() >= 4) {
                        return "#bad input"
                    }
                    yield? base."$short read"
                    continue
                }
                if args.src.length() < (token_length as base.u64) {
                    return "#internal error: inconsistent token length"
                }
                string_length ~mod-= token_length as base.u64
                continued = 0
                if (string_length > 0) or (indefinite_string_major_type > 0) {
                    continued = 1
                }
                args.src.skip_u32_fast!(actual: token_length, worst_case: token_length)
                args.dst.write_simple_token_fast!(
                        value_major: 0,
                        value_minor: (base.TOKEN__VBC__STRING << 21) |
                        base.TOKEN__VBD__STRING__DEFINITELY_UTF_8 |
                        base.TOKEN__VBD__STRING__CHAIN_MUST_BE_UTF_8 |
                        base.TOKEN__VBD__STRING__CONVERT_1_DST_1_SRC_COPY,
                        continued: continued,
                        length: token_length)
                if string_length > 0 {
                    continue
                } else if indefinite_string_major_type > 0 {
                    continue.outer
                }
                break.goto_parsed_a_leaf_value
            } endwhile
            // -------- END   Major type 3: a text string.

        } else if c_major == 4 {
            // -------- BEGIN Major type 4: an array of data items.
            if TOKEN_LENGTHS[c_minor] == 0 {
                break.goto_fail
            } else if depth >= 1024 {
                token_length = TOKEN_LENGTHS[c_minor] as base.u32
                while (token_length > 0) and (args.src.can_undo_byte()) {
                    args.src.undo_byte!()
                    token_length -= 1
                } endwhile
                return "#unsupported recursion depth"
            }

            vminor = (base.TOKEN__VBC__STRUCTURE << 21) |
                    base.TOKEN__VBD__STRUCTURE__PUSH |
                    base.TOKEN__VBD__STRUCTURE__FROM_NONE |
                    base.TOKEN__VBD__STRUCTURE__TO_LIST
            vminor_alt = (base.TOKEN__VBC__STRUCTURE << 21) |
                    base.TOKEN__VBD__STRUCTURE__POP |
                    base.TOKEN__VBD__STRUCTURE__FROM_LIST |
                    base.TOKEN__VBD__STRUCTURE__TO_NONE
            if depth > 0 {
                stack_byte = (depth - 1) / 16
                stack_bit = ((depth - 1) & 15) * 2
                if 0 == (this.stack[stack_byte] & ((1 as base.u32) << stack_bit)) {
                    vminor = (base.TOKEN__VBC__STRUCTURE << 21) |
                            base.TOKEN__VBD__STRUCTURE__PUSH |
                            base.TOKEN__VBD__STRUCTURE__FROM_LIST |
                            base.TOKEN__VBD__STRUCTURE__TO_LIST
                    vminor_alt = (base.TOKEN__VBC__STRUCTURE << 21) |
                            base.TOKEN__VBD__STRUCTURE__POP |
                            base.TOKEN__VBD__STRUCTURE__FROM_LIST |
                            base.TOKEN__VBD__STRUCTURE__TO_LIST
                } else {
                    vminor = (base.TOKEN__VBC__STRUCTURE << 21) |
                            base.TOKEN__VBD__STRUCTURE__PUSH |
                            base.TOKEN__VBD__STRUCTURE__FROM_DICT |
                            base.TOKEN__VBD__STRUCTURE__TO_LIST
                    vminor_alt = (base.TOKEN__VBC__STRUCTURE << 21) |
                            base.TOKEN__VBD__STRUCTURE__POP |
                            base.TOKEN__VBD__STRUCTURE__FROM_LIST |
                            base.TOKEN__VBD__STRUCTURE__TO_DICT
                }
            }
            args.dst.write_simple_token_fast!(
                    value_major: 0,
                    value_minor: vminor,
                    continued: 0,
                    length: TOKEN_LENGTHS[c_minor] as base.u32)
            if c_minor == 0x00 {
                args.dst.write_simple_token_fast!(
                        value_major: 0,
                        value_minor: vminor_alt,
                        continued: 0,
                        length: 0)
                break.goto_parsed_a_leaf_value
            }

            stack_byte = depth / 16
            stack_bit = (depth & 15) * 2
            this.stack[stack_byte] &= 0xFFFF_FFFF ^ ((3 as base.u32) << stack_bit)
            this.container_num_remaining[depth] = string_length
            depth += 1
            tagged = false
            continue.outer
            // -------- END   Major type 4: an array of data items.

        } else if c_major == 5 {
            // -------- BEGIN Major type 5: a map of pairs of data items.
            if TOKEN_LENGTHS[c_minor] == 0 {
                break.goto_fail
            } else if depth >= 1024 {
                token_length = TOKEN_LENGTHS[c_minor] as base.u32
                while (token_length > 0) and (args.src.can_undo_byte()) {
                    args.src.undo_byte!()
                    token_length -= 1
                } endwhile
                return "#unsupported recursion depth"
            }

            vminor = (base.TOKEN__VBC__STRUCTURE << 21) |
                    base.TOKEN__VBD__STRUCTURE__PUSH |
                    base.TOKEN__VBD__STRUCTURE__FROM_NONE |
                    base.TOKEN__VBD__STRUCTURE__TO_DICT
            vminor_alt = (base.TOKEN__VBC__STRUCTURE << 21) |
                    base.TOKEN__VBD__STRUCTURE__POP |
                    base.TOKEN__VBD__STRUCTURE__FROM_DICT |
                    base.TOKEN__VBD__STRUCTURE__TO_NONE
            if depth > 0 {
                stack_byte = (depth - 1) / 16
                stack_bit = ((depth - 1) & 15) * 2
                if 0 == (this.stack[stack_byte] & ((1 as base.u32) << stack_bit)) {
                    vminor = (base.TOKEN__VBC__STRUCTURE << 21) |
                            base.TOKEN__VBD__STRUCTURE__PUSH |
                            base.TOKEN__VBD__STRUCTURE__FROM_LIST |
                            base.TOKEN__VBD__STRUCTURE__TO_DICT
                    vminor_alt = (base.TOKEN__VBC__STRUCTURE << 21) |
                            base.TOKEN__VBD__STRUCTURE__POP |
                            base.TOKEN__VBD__STRUCTURE__FROM_DICT |
                            base.TOKEN__VBD__STRUCTURE__TO_LIST
                } else {
                    vminor = (base.TOKEN__VBC__STRUCTURE << 21) |
                            base.TOKEN__VBD__STRUCTURE__PUSH |
                            base.TOKEN__VBD__STRUCTURE__FROM_DICT |
                            base.TOKEN__VBD__STRUCTURE__TO_DICT
                    vminor_alt = (base.TOKEN__VBC__STRUCTURE << 21) |
                            base.TOKEN__VBD__STRUCTURE__POP |
                            base.TOKEN__VBD__STRUCTURE__FROM_DICT |
                            base.TOKEN__VBD__STRUCTURE__TO_DICT
                }
            }
            args.dst.write_simple_token_fast!(
                    value_major: 0,
                    value_minor: vminor,
                    continued: 0,
                    length: TOKEN_LENGTHS[c_minor] as base.u32)
            if c_minor == 0x00 {
                args.dst.write_simple_token_fast!(
                        value_major: 0,
                        value_minor: vminor_alt,
                        continued: 0,
                        length: 0)
                break.goto_parsed_a_leaf_value
            }

            stack_byte = depth / 16
            stack_bit = (depth & 15) * 2
            this.stack[stack_byte] |= (3 as base.u32) << stack_bit
            this.container_num_remaining[depth] = string_length
            depth += 1
            tagged = false
            continue.outer
            // -------- END   Major type 5: a map of pairs of data items.

        } else if c_major == 6 {
            // -------- BEGIN Major type 6: tags.
            if c_minor >= 0x1C {
                break.goto_fail
            }
            // Write one token (18 bits) or two tokens (18 + 46 bits).
            if string_length < 0x4_0000 {
                args.dst.write_simple_token_fast!(
                        value_major: TOKEN_VALUE_MAJOR,
                        value_minor: TOKEN_VALUE_MINOR__TAG |
                        (string_length as base.u32),
                        continued: 0,
                        length: TOKEN_LENGTHS[c_minor] as base.u32)
            } else {
                args.dst.write_simple_token_fast!(
                        value_major: TOKEN_VALUE_MAJOR,
                        value_minor: TOKEN_VALUE_MINOR__TAG |
                        ((string_length >> base.TOKEN__VALUE_EXTENSION__NUM_BITS) as base.u32),
                        continued: 1,
                        length: 0)
                args.dst.write_extended_token_fast!(
                        value_extension: string_length & 0x3FFF_FFFF_FFFF,
                        continued: 0,
                        length: TOKEN_LENGTHS[c_minor] as base.u32)
            }
            tagged = true
            continue.outer
            // -------- END   Major type 6: tags.

        } else if c_major == 7 {
            // -------- BEGIN Major type 7: miscellaneous.
            if c_minor < 0x14 {
                args.dst.write_simple_token_fast!(
                        value_major: TOKEN_VALUE_MAJOR,
                        value_minor: TOKEN_VALUE_MINOR__SIMPLE_VALUE |
                        ((string_length & 0xFF) as base.u32),
                        continued: 0,
                        length: 1)
                break.goto_parsed_a_leaf_value

            } else if c_minor < 0x18 {
                args.dst.write_simple_token_fast!(
                        value_major: 0,
                        value_minor: LITERALS[c_minor & 3],
                        continued: 0,
                        length: 1)
                break.goto_parsed_a_leaf_value

            } else if c_minor == 0x18 {
                if string_length < 0x18 {
                    if not args.src.can_undo_byte() {
                        return "#internal error: inconsistent I/O"
                    }
                    args.src.undo_byte!()
                    break.goto_fail
                }
                args.dst.write_simple_token_fast!(
                        value_major: TOKEN_VALUE_MAJOR,
                        value_minor: TOKEN_VALUE_MINOR__SIMPLE_VALUE |
                        ((string_length & 0xFF) as base.u32),
                        continued: 0,
                        length: 2)
                break.goto_parsed_a_leaf_value

            } else if c_minor < 0x1C {
                args.dst.write_simple_token_fast!(
                        value_major: 0,
                        value_minor: (base.TOKEN__VBC__NUMBER << 21) |
                        base.TOKEN__VBD__NUMBER__CONTENT_FLOATING_POINT |
                        base.TOKEN__VBD__NUMBER__FORMAT_BINARY_BIG_ENDIAN |
                        base.TOKEN__VBD__NUMBER__FORMAT_IGNORE_FIRST_BYTE,
                        continued: 0,
                        length: TOKEN_LENGTHS[c_minor] as base.u32)
                break.goto_parsed_a_leaf_value

            } else if c_minor == 0x1F {
                // Indefinite-length strings were dealt with separately, above.
                // Here, we expect to be in an indefinite-length container.
                if tagged or (depth <= 0) {
                    break.goto_fail
                }
                depth -= 1
                if this.container_num_remaining[depth] <> 0 {
                    break.goto_fail
                }

                // Check that, if we're in a map, the map contains an even
                // number of elements.
                stack_byte = depth / 16
                stack_bit = (depth & 15) * 2
                stack_val = 3 & (this.stack[stack_byte] >> stack_bit)
                if stack_val == 1 {
                    break.goto_fail
                }

                // Fill in FROM_ETC.
                if stack_val <> 3 {
                    vminor_alt = (base.TOKEN__VBC__STRUCTURE << 21) |
                            base.TOKEN__VBD__STRUCTURE__POP |
                            base.TOKEN__VBD__STRUCTURE__FROM_LIST
                } else {
                    vminor_alt = (base.TOKEN__VBC__STRUCTURE << 21) |
                            base.TOKEN__VBD__STRUCTURE__POP |
                            base.TOKEN__VBD__STRUCTURE__FROM_DICT
                }

                // Fill in TO_ETC.
                if depth <= 0 {
                    vminor_alt |= base.TOKEN__VBD__STRUCTURE__TO_NONE
                } else {
                    stack_byte = (depth - 1) / 16
                    stack_bit = ((depth - 1) & 15) * 2
                    if 0 == (this.stack[stack_byte] & ((1 as base.u32) << stack_bit)) {
                        vminor_alt |= base.TOKEN__VBD__STRUCTURE__TO_LIST
                    } else {
                        vminor_alt |= base.TOKEN__VBD__STRUCTURE__TO_DICT
                    }
                }

                args.dst.write_simple_token_fast!(
                        value_major: 0,
                        value_minor: vminor_alt,
                        continued: 0,
                        length: 1)
                break.goto_parsed_a_leaf_value
            }
            // -------- END   Major type 7: miscellaneous.
        }
        break.goto_fail
        }} endwhile.goto_fail

        if args.src.can_undo_byte() {
            args.src.undo_byte!()
            return "#bad input"
        }
        return "#internal error: inconsistent I/O"
        }} endwhile.goto_parsed_a_leaf_value

        // We've just parsed a leaf (non-container) value, or the (explicit or
        // implicit) close of a container (array or object).
        tagged = false
        while depth > 0 {
            // Toggle the key/value bit for object containers. This bit is
            // ignored for array containers.
            stack_byte = (depth - 1) / 16
            stack_bit = ((depth - 1) & 15) * 2
            this.stack[stack_byte] ^= (1 as base.u32) << (stack_bit + 1)
            if 1 == (3 & (this.stack[stack_byte] >> stack_bit)) {
                // We just parsed the key of a key-value pair.
                continue.outer
            }

            if this.container_num_remaining[depth - 1] <= 0 {
                // We're in an indefinite-length container.
                continue.outer
            }
            this.container_num_remaining[depth - 1] -= 1
            if this.container_num_remaining[depth - 1] > 0 {
                // We're in a definite-length, non-empty container and have not
                // seen its final value.
                continue.outer
            }

            while args.dst.length() <= 0,
                    inv depth > 0,
                    post args.dst.length() > 0,
            {
                yield? base."$short write"
                continue
            } endwhile
            depth -= 1

            // Fill in FROM_ETC.
            stack_byte = depth / 16
            stack_bit = (depth & 15) * 2
            if 0 == (this.stack[stack_byte] & ((1 as base.u32) << stack_bit)) {
                vminor_alt = (base.TOKEN__VBC__STRUCTURE << 21) |
                        base.TOKEN__VBD__STRUCTURE__POP |
                        base.TOKEN__VBD__STRUCTURE__FROM_LIST
            } else {
                vminor_alt = (base.TOKEN__VBC__STRUCTURE << 21) |
                        base.TOKEN__VBD__STRUCTURE__POP |
                        base.TOKEN__VBD__STRUCTURE__FROM_DICT
            }

            // Fill in TO_ETC.
            if depth <= 0 {
                vminor_alt |= base.TOKEN__VBD__STRUCTURE__TO_NONE
            } else {
                stack_byte = (depth - 1) / 16
                stack_bit = ((depth - 1) & 15) * 2
                if 0 == (this.stack[stack_byte] & ((1 as base.u32) << stack_bit)) {
                    vminor_alt |= base.TOKEN__VBD__STRUCTURE__TO_LIST
                } else {
                    vminor_alt |= base.TOKEN__VBD__STRUCTURE__TO_DICT
                }
            }

            args.dst.write_simple_token_fast!(
                    value_major: 0,
                    value_minor: vminor_alt,
                    continued: 0,
                    length: 0)
        } endwhile

        // We've parsed the top-level value and we're therefore done overall.
        break.outer
    } endwhile.outer

    this.end_of_data = true
}
