// Copyright (c) HashiCorp, Inc.
// SPDX-License-Identifier: MPL-2.0

//line scan_string_lit.rl:1

package hclsyntax

// This file is generated from scan_string_lit.rl. DO NOT EDIT.

//line scan_string_lit.go:9
var _hclstrtok_actions []byte = []byte{
	0, 1, 0, 1, 1, 2, 1, 0,
}

var _hclstrtok_key_offsets []byte = []byte{
	0, 0, 2, 4, 6, 10, 14, 18,
	22, 27, 31, 36, 41, 46, 51, 57,
	62, 74, 85, 96, 107, 118, 129, 140,
	151,
}

var _hclstrtok_trans_keys []byte = []byte{
	128, 191, 128, 191, 128, 191, 10, 13,
	36, 37, 10, 13, 36, 37, 10, 13,
	36, 37, 10, 13, 36, 37, 10, 13,
	36, 37, 123, 10, 13, 36, 37, 10,
	13, 36, 37, 92, 10, 13, 36, 37,
	92, 10, 13, 36, 37, 92, 10, 13,
	36, 37, 92, 10, 13, 36, 37, 92,
	123, 10, 13, 36, 37, 92, 85, 117,
	128, 191, 192, 223, 224, 239, 240, 247,
	248, 255, 10, 13, 36, 37, 92, 48,
	57, 65, 70, 97, 102, 10, 13, 36,
	37, 92, 48, 57, 65, 70, 97, 102,
	10, 13, 36, 37, 92, 48, 57, 65,
	70, 97, 102, 10, 13, 36, 37, 92,
	48, 57, 65, 70, 97, 102, 10, 13,
	36, 37, 92, 48, 57, 65, 70, 97,
	102, 10, 13, 36, 37, 92, 48, 57,
	65, 70, 97, 102, 10, 13, 36, 37,
	92, 48, 57, 65, 70, 97, 102, 10,
	13, 36, 37, 92, 48, 57, 65, 70,
	97, 102,
}

var _hclstrtok_single_lengths []byte = []byte{
	0, 0, 0, 0, 4, 4, 4, 4,
	5, 4, 5, 5, 5, 5, 6, 5,
	2, 5, 5, 5, 5, 5, 5, 5,
	5,
}

var _hclstrtok_range_lengths []byte = []byte{
	0, 1, 1, 1, 0, 0, 0, 0,
	0, 0, 0, 0, 0, 0, 0, 0,
	5, 3, 3, 3, 3, 3, 3, 3,
	3,
}

var _hclstrtok_index_offsets []byte = []byte{
	0, 0, 2, 4, 6, 11, 16, 21,
	26, 32, 37, 43, 49, 55, 61, 68,
	74, 82, 91, 100, 109, 118, 127, 136,
	145,
}

var _hclstrtok_indicies []byte = []byte{
	0, 1, 2, 1, 3, 1, 5, 6,
	7, 8, 4, 10, 11, 12, 13, 9,
	14, 11, 12, 13, 9, 10, 11, 15,
	13, 9, 10, 11, 12, 13, 14, 9,
	10, 11, 12, 15, 9, 17, 18, 19,
	20, 21, 16, 23, 24, 25, 26, 27,
	22, 0, 24, 25, 26, 27, 22, 23,
	24, 28, 26, 27, 22, 23, 24, 25,
	26, 27, 0, 22, 23, 24, 25, 28,
	27, 22, 29, 30, 22, 2, 3, 31,
	22, 0, 23, 24, 25, 26, 27, 32,
	32, 32, 22, 23, 24, 25, 26, 27,
	33, 33, 33, 22, 23, 24, 25, 26,
	27, 34, 34, 34, 22, 23, 24, 25,
	26, 27, 30, 30, 30, 22, 23, 24,
	25, 26, 27, 35, 35, 35, 22, 23,
	24, 25, 26, 27, 36, 36, 36, 22,
	23, 24, 25, 26, 27, 37, 37, 37,
	22, 23, 24, 25, 26, 27, 0, 0,
	0, 22,
}

var _hclstrtok_trans_targs []byte = []byte{
	11, 0, 1, 2, 4, 5, 6, 7,
	9, 4, 5, 6, 7, 9, 5, 8,
	10, 11, 12, 13, 15, 16, 10, 11,
	12, 13, 15, 16, 14, 17, 21, 3,
	18, 19, 20, 22, 23, 24,
}

var _hclstrtok_trans_actions []byte = []byte{
	0, 0, 0, 0, 0, 1, 1, 1,
	1, 3, 5, 5, 5, 5, 0, 0,
	0, 1, 1, 1, 1, 1, 3, 5,
	5, 5, 5, 5, 0, 0, 0, 0,
	0, 0, 0, 0, 0, 0,
}

var _hclstrtok_eof_actions []byte = []byte{
	0, 0, 0, 0, 0, 3, 3, 3,
	3, 3, 0, 3, 3, 3, 3, 3,
	3, 3, 3, 3, 3, 3, 3, 3,
	3,
}

const hclstrtok_start int = 4
const hclstrtok_first_final int = 4
const hclstrtok_error int = 0

const hclstrtok_en_quoted int = 10
const hclstrtok_en_unquoted int = 4

//line scan_string_lit.rl:10

func scanStringLit(data []byte, quoted bool) [][]byte {
	var ret [][]byte

//line scan_string_lit.rl:61

	// Ragel state
	p := 0          // "Pointer" into data
	pe := len(data) // End-of-data "pointer"
	ts := 0
	te := 0
	eof := pe

	var cs int // current state
	switch {
	case quoted:
		cs = hclstrtok_en_quoted
	default:
		cs = hclstrtok_en_unquoted
	}

	// Make Go compiler happy
	_ = ts
	_ = eof

	/*token := func () {
	    ret = append(ret, data[ts:te])
	}*/

//line scan_string_lit.go:154
	{
	}

//line scan_string_lit.go:158
	{
		var _klen int
		var _trans int
		var _acts int
		var _nacts uint
		var _keys int
		if p == pe {
			goto _test_eof
		}
		if cs == 0 {
			goto _out
		}
	_resume:
		_keys = int(_hclstrtok_key_offsets[cs])
		_trans = int(_hclstrtok_index_offsets[cs])

		_klen = int(_hclstrtok_single_lengths[cs])
		if _klen > 0 {
			_lower := int(_keys)
			var _mid int
			_upper := int(_keys + _klen - 1)
			for {
				if _upper < _lower {
					break
				}

				_mid = _lower + ((_upper - _lower) >> 1)
				switch {
				case data[p] < _hclstrtok_trans_keys[_mid]:
					_upper = _mid - 1
				case data[p] > _hclstrtok_trans_keys[_mid]:
					_lower = _mid + 1
				default:
					_trans += int(_mid - int(_keys))
					goto _match
				}
			}
			_keys += _klen
			_trans += _klen
		}

		_klen = int(_hclstrtok_range_lengths[cs])
		if _klen > 0 {
			_lower := int(_keys)
			var _mid int
			_upper := int(_keys + (_klen << 1) - 2)
			for {
				if _upper < _lower {
					break
				}

				_mid = _lower + (((_upper - _lower) >> 1) & ^1)
				switch {
				case data[p] < _hclstrtok_trans_keys[_mid]:
					_upper = _mid - 2
				case data[p] > _hclstrtok_trans_keys[_mid+1]:
					_lower = _mid + 2
				default:
					_trans += int((_mid - int(_keys)) >> 1)
					goto _match
				}
			}
			_trans += _klen
		}

	_match:
		_trans = int(_hclstrtok_indicies[_trans])
		cs = int(_hclstrtok_trans_targs[_trans])

		if _hclstrtok_trans_actions[_trans] == 0 {
			goto _again
		}

		_acts = int(_hclstrtok_trans_actions[_trans])
		_nacts = uint(_hclstrtok_actions[_acts])
		_acts++
		for ; _nacts > 0; _nacts-- {
			_acts++
			switch _hclstrtok_actions[_acts-1] {
			case 0:
//line scan_string_lit.rl:40

				// If te is behind p then we've skipped over some literal
				// characters which we must now return.
				if te < p {
					ret = append(ret, data[te:p])
				}
				ts = p

			case 1:
//line scan_string_lit.rl:48

				te = p
				ret = append(ret, data[ts:te])

//line scan_string_lit.go:253
			}
		}

	_again:
		if cs == 0 {
			goto _out
		}
		p++
		if p != pe {
			goto _resume
		}
	_test_eof:
		{
		}
		if p == eof {
			__acts := _hclstrtok_eof_actions[cs]
			__nacts := uint(_hclstrtok_actions[__acts])
			__acts++
			for ; __nacts > 0; __nacts-- {
				__acts++
				switch _hclstrtok_actions[__acts-1] {
				case 1:
//line scan_string_lit.rl:48

					te = p
					ret = append(ret, data[ts:te])

//line scan_string_lit.go:278
				}
			}
		}

	_out:
		{
		}
	}

//line scan_string_lit.rl:89

	if te < p {
		// Collect any leftover literal characters at the end of the input
		ret = append(ret, data[te:p])
	}

	// If we fall out here without being in a final state then we've
	// encountered something that the scanner can't match, which should
	// be impossible (the scanner matches all bytes _somehow_) but we'll
	// tolerate it and let the caller deal with it.
	if cs < hclstrtok_first_final {
		ret = append(ret, data[p:len(data)])
	}

	return ret
}
