// 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"

pub const DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE : base.u64 = 0

// 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 : array[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 : array[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]

	// 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.available() <= 1 {
			yield? base."$short write"
			continue.outer
		}
		if args.src.available() <= 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.available() > 1,
			{{
			if c_minor == 0x18 {
				if args.src.available() >= 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.available() >= 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.available() >= 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.available() >= 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"
				c_major = 0
				c_minor = 0
				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 == 0x00 {
				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: 1)
				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__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.available() <= 0 {
					yield? base."$short write"
					continue
				}
				n64 = string_length.min(a: args.src.available())
				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.available() < (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 == 0x00 {
				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: 1)
				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__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.available() <= 0 {
					yield? base."$short write"
					continue
				}
				n64 = string_length.min(a: 0xFFFF)
				n64 = args.src.available_valid_utf_8(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.available() >= 4) {
						return "#bad input"
					}
					yield? base."$short read"
					continue
				}
				if args.src.available() < (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__DEFINITELY_ASCII |
					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 {
				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
			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 {
				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
			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)
			}
			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 {
					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 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).
		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.available() <= 0,
				inv depth > 0,
				post args.dst.available() > 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
}
