Source File
scannerc.go
Belonging Package
gopkg.in/yaml.v2
package yaml
import (
)
return .unread >= || yaml_parser_update_buffer(, )
}
func ( *yaml_parser_t) {
.mark.index++
.mark.column++
.unread--
.buffer_pos += width(.buffer[.buffer_pos])
}
func ( *yaml_parser_t) {
if is_crlf(.buffer, .buffer_pos) {
.mark.index += 2
.mark.column = 0
.mark.line++
.unread -= 2
.buffer_pos += 2
} else if is_break(.buffer, .buffer_pos) {
.mark.index++
.mark.column = 0
.mark.line++
.unread--
.buffer_pos += width(.buffer[.buffer_pos])
}
}
func ( *yaml_parser_t, []byte) []byte {
:= width(.buffer[.buffer_pos])
if == 0 {
panic("invalid character sequence")
}
if len() == 0 {
= make([]byte, 0, 32)
}
if == 1 && len()+ <= cap() {
= [:len()+1]
[len()-1] = .buffer[.buffer_pos]
.buffer_pos++
} else {
= append(, .buffer[.buffer_pos:.buffer_pos+]...)
.buffer_pos +=
}
.mark.index++
.mark.column++
.unread--
return
}
func ( *yaml_parser_t, []byte) []byte {
:= .buffer
:= .buffer_pos
switch {
= append(, '\n')
.buffer_pos += 2
.mark.index++
.unread--
= append(, '\n')
.buffer_pos += 1
= append(, '\n')
.buffer_pos += 2
= append(, [.buffer_pos:+3]...)
.buffer_pos += 3
default:
return
}
.mark.index++
.mark.column = 0
.mark.line++
.unread--
return
}
* = yaml_token_t{} // [Go] Is this necessary?
if .stream_end_produced || .error != yaml_NO_ERROR {
return true
}
if !.token_available {
if !yaml_parser_fetch_more_tokens() {
return false
}
}
* = .tokens[.tokens_head]
.tokens_head++
.tokens_parsed++
.token_available = false
if .typ == yaml_STREAM_END_TOKEN {
.stream_end_produced = true
}
return true
}
func ( *yaml_parser_t, string, yaml_mark_t, string) bool {
.error = yaml_SCANNER_ERROR
.context =
.context_mark =
.problem =
.problem_mark = .mark
return false
}
func ( *yaml_parser_t, bool, yaml_mark_t, string) bool {
:= "while parsing a tag"
if {
= "while parsing a %TAG directive"
}
return yaml_parser_set_scanner_error(, , , )
}
func ( ...interface{}) func() {
:= append([]interface{}{"+++"}, ...)
fmt.Println(...)
= append([]interface{}{"---"}, ...)
return func() { fmt.Println(...) }
}
for {
, := .simple_keys_by_tok[.tokens_parsed]
if ! {
break
} else if , := yaml_simple_key_is_valid(, &.simple_keys[]); ! {
return false
} else if ! {
break
}
if !yaml_parser_fetch_next_token() {
return false
}
}
.token_available = true
return true
}
if .unread < 1 && !yaml_parser_update_buffer(, 1) {
return false
}
if !.stream_start_produced {
return yaml_parser_fetch_stream_start()
}
if !yaml_parser_scan_to_next_token() {
return false
}
if !yaml_parser_unroll_indent(, .mark.column) {
return false
}
if .unread < 4 && !yaml_parser_update_buffer(, 4) {
return false
}
if is_z(.buffer, .buffer_pos) {
return yaml_parser_fetch_stream_end()
}
if .mark.column == 0 && .buffer[.buffer_pos] == '%' {
return yaml_parser_fetch_directive()
}
:= .buffer
:= .buffer_pos
if .mark.column == 0 && [] == '-' && [+1] == '-' && [+2] == '-' && is_blankz(, +3) {
return yaml_parser_fetch_document_indicator(, yaml_DOCUMENT_START_TOKEN)
}
if .mark.column == 0 && [] == '.' && [+1] == '.' && [+2] == '.' && is_blankz(, +3) {
return yaml_parser_fetch_document_indicator(, yaml_DOCUMENT_END_TOKEN)
}
if [] == '[' {
return yaml_parser_fetch_flow_collection_start(, yaml_FLOW_SEQUENCE_START_TOKEN)
}
if .buffer[.buffer_pos] == '{' {
return yaml_parser_fetch_flow_collection_start(, yaml_FLOW_MAPPING_START_TOKEN)
}
if .buffer[.buffer_pos] == ']' {
return yaml_parser_fetch_flow_collection_end(,
yaml_FLOW_SEQUENCE_END_TOKEN)
}
if .buffer[.buffer_pos] == '}' {
return yaml_parser_fetch_flow_collection_end(,
yaml_FLOW_MAPPING_END_TOKEN)
}
if .buffer[.buffer_pos] == ',' {
return yaml_parser_fetch_flow_entry()
}
if .buffer[.buffer_pos] == '-' && is_blankz(.buffer, .buffer_pos+1) {
return yaml_parser_fetch_block_entry()
}
if .buffer[.buffer_pos] == '?' && (.flow_level > 0 || is_blankz(.buffer, .buffer_pos+1)) {
return yaml_parser_fetch_key()
}
if .buffer[.buffer_pos] == ':' && (.flow_level > 0 || is_blankz(.buffer, .buffer_pos+1)) {
return yaml_parser_fetch_value()
}
if .buffer[.buffer_pos] == '*' {
return yaml_parser_fetch_anchor(, yaml_ALIAS_TOKEN)
}
if .buffer[.buffer_pos] == '&' {
return yaml_parser_fetch_anchor(, yaml_ANCHOR_TOKEN)
}
if .buffer[.buffer_pos] == '!' {
return yaml_parser_fetch_tag()
}
if .buffer[.buffer_pos] == '|' && .flow_level == 0 {
return yaml_parser_fetch_block_scalar(, true)
}
if .buffer[.buffer_pos] == '>' && .flow_level == 0 {
return yaml_parser_fetch_block_scalar(, false)
}
if .buffer[.buffer_pos] == '\'' {
return yaml_parser_fetch_flow_scalar(, true)
}
if .buffer[.buffer_pos] == '"' {
return yaml_parser_fetch_flow_scalar(, false)
}
if !(is_blankz(.buffer, .buffer_pos) || .buffer[.buffer_pos] == '-' ||
.buffer[.buffer_pos] == '?' || .buffer[.buffer_pos] == ':' ||
.buffer[.buffer_pos] == ',' || .buffer[.buffer_pos] == '[' ||
.buffer[.buffer_pos] == ']' || .buffer[.buffer_pos] == '{' ||
.buffer[.buffer_pos] == '}' || .buffer[.buffer_pos] == '#' ||
.buffer[.buffer_pos] == '&' || .buffer[.buffer_pos] == '*' ||
.buffer[.buffer_pos] == '!' || .buffer[.buffer_pos] == '|' ||
.buffer[.buffer_pos] == '>' || .buffer[.buffer_pos] == '\'' ||
.buffer[.buffer_pos] == '"' || .buffer[.buffer_pos] == '%' ||
.buffer[.buffer_pos] == '@' || .buffer[.buffer_pos] == '`') ||
(.buffer[.buffer_pos] == '-' && !is_blank(.buffer, .buffer_pos+1)) ||
(.flow_level == 0 &&
(.buffer[.buffer_pos] == '?' || .buffer[.buffer_pos] == ':') &&
!is_blankz(.buffer, .buffer_pos+1)) {
return yaml_parser_fetch_plain_scalar()
}
return yaml_parser_set_scanner_error(,
"while scanning for the next token", .mark,
"found character that cannot start any token")
}
func ( *yaml_parser_t, *yaml_simple_key_t) (, bool) {
if !.possible {
return false, true
}
:= .flow_level == 0 && .indent == .mark.column
if .simple_key_allowed {
:= yaml_simple_key_t{
possible: true,
required: ,
token_number: .tokens_parsed + (len(.tokens) - .tokens_head),
mark: .mark,
}
if !yaml_parser_remove_simple_key() {
return false
}
.simple_keys[len(.simple_keys)-1] =
.simple_keys_by_tok[.token_number] = len(.simple_keys) - 1
}
return true
}
func ( *yaml_parser_t) bool {
:= len(.simple_keys) - 1
if .simple_keys[].required {
return yaml_parser_set_scanner_error(,
"while scanning a simple key", .simple_keys[].mark,
"could not find expected ':'")
.simple_keys[].possible = false
delete(.simple_keys_by_tok, .simple_keys[].token_number)
}
return true
}
const max_flow_level = 10000
.simple_keys = append(.simple_keys, yaml_simple_key_t{
possible: false,
required: false,
token_number: .tokens_parsed + (len(.tokens) - .tokens_head),
mark: .mark,
})
.flow_level++
if .flow_level > max_flow_level {
return yaml_parser_set_scanner_error(,
"while increasing flow level", .simple_keys[len(.simple_keys)-1].mark,
fmt.Sprintf("exceeded max depth of %d", max_flow_level))
}
return true
}
func ( *yaml_parser_t) bool {
if .flow_level > 0 {
.flow_level--
:= len(.simple_keys) - 1
delete(.simple_keys_by_tok, .simple_keys[].token_number)
.simple_keys = .simple_keys[:]
}
return true
}
const max_indents = 10000
if .flow_level > 0 {
return true
}
.indents = append(.indents, .indent)
.indent =
if len(.indents) > max_indents {
return yaml_parser_set_scanner_error(,
"while increasing indent level", .simple_keys[len(.simple_keys)-1].mark,
fmt.Sprintf("exceeded max depth of %d", max_indents))
}
:= yaml_token_t{
typ: ,
start_mark: ,
end_mark: ,
}
if > -1 {
-= .tokens_parsed
}
yaml_insert_token(, , &)
}
return true
}
if .flow_level > 0 {
return true
}
:= yaml_token_t{
typ: yaml_BLOCK_END_TOKEN,
start_mark: .mark,
end_mark: .mark,
}
yaml_insert_token(, -1, &)
func ( *yaml_parser_t) bool {
.indent = -1
.simple_keys = append(.simple_keys, yaml_simple_key_t{})
.simple_keys_by_tok = make(map[int]int)
:= yaml_token_t{
typ: yaml_STREAM_START_TOKEN,
start_mark: .mark,
end_mark: .mark,
encoding: .encoding,
}
yaml_insert_token(, -1, &)
return true
}
func ( *yaml_parser_t) bool {
if !yaml_parser_unroll_indent(, -1) {
return false
}
if !yaml_parser_remove_simple_key() {
return false
}
.simple_key_allowed = false
:= yaml_token_t{
typ: yaml_STREAM_END_TOKEN,
start_mark: .mark,
end_mark: .mark,
}
yaml_insert_token(, -1, &)
return true
}
if !yaml_parser_unroll_indent(, -1) {
return false
}
if !yaml_parser_remove_simple_key() {
return false
}
.simple_key_allowed = false
:= yaml_token_t{}
if !yaml_parser_scan_directive(, &) {
return false
yaml_insert_token(, -1, &)
return true
}
if !yaml_parser_unroll_indent(, -1) {
return false
}
if !yaml_parser_remove_simple_key() {
return false
}
.simple_key_allowed = false
:= yaml_token_t{
typ: ,
start_mark: ,
end_mark: ,
yaml_insert_token(, -1, &)
return true
}
if !yaml_parser_save_simple_key() {
return false
}
if !yaml_parser_increase_flow_level() {
return false
}
:= yaml_token_t{
typ: ,
start_mark: ,
end_mark: ,
yaml_insert_token(, -1, &)
return true
}
if !yaml_parser_remove_simple_key() {
return false
}
if !yaml_parser_decrease_flow_level() {
return false
}
:= yaml_token_t{
typ: ,
start_mark: ,
end_mark: ,
yaml_insert_token(, -1, &)
return true
}
if !yaml_parser_remove_simple_key() {
return false
}
:= yaml_token_t{
typ: yaml_FLOW_ENTRY_TOKEN,
start_mark: ,
end_mark: ,
}
yaml_insert_token(, -1, &)
return true
}
if !.simple_key_allowed {
return yaml_parser_set_scanner_error(, "", .mark,
"block sequence entries are not allowed in this context")
if !yaml_parser_roll_indent(, .mark.column, -1, yaml_BLOCK_SEQUENCE_START_TOKEN, .mark) {
return false
}
}
if !yaml_parser_remove_simple_key() {
return false
}
:= yaml_token_t{
typ: yaml_BLOCK_ENTRY_TOKEN,
start_mark: ,
end_mark: ,
}
yaml_insert_token(, -1, &)
return true
}
func ( *yaml_parser_t) bool {
if !.simple_key_allowed {
return yaml_parser_set_scanner_error(, "", .mark,
"mapping keys are not allowed in this context")
if !yaml_parser_roll_indent(, .mark.column, -1, yaml_BLOCK_MAPPING_START_TOKEN, .mark) {
return false
}
}
if !yaml_parser_remove_simple_key() {
return false
}
.simple_key_allowed = .flow_level == 0
:= yaml_token_t{
typ: yaml_KEY_TOKEN,
start_mark: ,
end_mark: ,
}
yaml_insert_token(, -1, &)
return true
}
func ( *yaml_parser_t) bool {
:= &.simple_keys[len(.simple_keys)-1]
if , := yaml_simple_key_is_valid(, ); ! {
return false
} else if {
:= yaml_token_t{
typ: yaml_KEY_TOKEN,
start_mark: .mark,
end_mark: .mark,
}
yaml_insert_token(, .token_number-.tokens_parsed, &)
if !yaml_parser_roll_indent(, .mark.column,
.token_number,
yaml_BLOCK_MAPPING_START_TOKEN, .mark) {
return false
}
if .flow_level == 0 {
if !.simple_key_allowed {
return yaml_parser_set_scanner_error(, "", .mark,
"mapping values are not allowed in this context")
}
if !yaml_parser_roll_indent(, .mark.column, -1, yaml_BLOCK_MAPPING_START_TOKEN, .mark) {
return false
}
}
.simple_key_allowed = .flow_level == 0
}
:= yaml_token_t{
typ: yaml_VALUE_TOKEN,
start_mark: ,
end_mark: ,
}
yaml_insert_token(, -1, &)
return true
}
if !yaml_parser_save_simple_key() {
return false
}
var yaml_token_t
if !yaml_parser_scan_anchor(, &, ) {
return false
}
yaml_insert_token(, -1, &)
return true
}
if !yaml_parser_save_simple_key() {
return false
}
var yaml_token_t
if !yaml_parser_scan_tag(, &) {
return false
}
yaml_insert_token(, -1, &)
return true
}
if !yaml_parser_remove_simple_key() {
return false
}
var yaml_token_t
if !yaml_parser_scan_block_scalar(, &, ) {
return false
}
yaml_insert_token(, -1, &)
return true
}
if !yaml_parser_save_simple_key() {
return false
}
var yaml_token_t
if !yaml_parser_scan_flow_scalar(, &, ) {
return false
}
yaml_insert_token(, -1, &)
return true
}
if !yaml_parser_save_simple_key() {
return false
}
var yaml_token_t
if !yaml_parser_scan_plain_scalar(, &) {
return false
}
yaml_insert_token(, -1, &)
return true
}
func ( *yaml_parser_t) bool {
if .unread < 1 && !yaml_parser_update_buffer(, 1) {
return false
}
if .mark.column == 0 && is_bom(.buffer, .buffer_pos) {
skip()
}
if .unread < 1 && !yaml_parser_update_buffer(, 1) {
return false
}
for .buffer[.buffer_pos] == ' ' || ((.flow_level > 0 || !.simple_key_allowed) && .buffer[.buffer_pos] == '\t') {
skip()
if .unread < 1 && !yaml_parser_update_buffer(, 1) {
return false
}
}
if .buffer[.buffer_pos] == '#' {
for !is_breakz(.buffer, .buffer_pos) {
skip()
if .unread < 1 && !yaml_parser_update_buffer(, 1) {
return false
}
}
}
if is_break(.buffer, .buffer_pos) {
if .unread < 2 && !yaml_parser_update_buffer(, 2) {
return false
}
skip_line()
if .flow_level == 0 {
.simple_key_allowed = true
}
} else {
break // We have found a token.
}
}
return true
}
var []byte
if !yaml_parser_scan_directive_name(, , &) {
return false
}
var , int8
if !yaml_parser_scan_version_directive_value(, , &, &) {
return false
}
:= .mark
* = yaml_token_t{
typ: yaml_VERSION_DIRECTIVE_TOKEN,
start_mark: ,
end_mark: ,
major: ,
minor: ,
}
var , []byte
if !yaml_parser_scan_tag_directive_value(, , &, &) {
return false
}
:= .mark
* = yaml_token_t{
typ: yaml_TAG_DIRECTIVE_TOKEN,
start_mark: ,
end_mark: ,
value: ,
prefix: ,
}
} else {
yaml_parser_set_scanner_error(, "while scanning a directive",
, "found unknown directive name")
return false
}
if .unread < 1 && !yaml_parser_update_buffer(, 1) {
return false
}
for is_blank(.buffer, .buffer_pos) {
skip()
if .unread < 1 && !yaml_parser_update_buffer(, 1) {
return false
}
}
if .buffer[.buffer_pos] == '#' {
for !is_breakz(.buffer, .buffer_pos) {
skip()
if .unread < 1 && !yaml_parser_update_buffer(, 1) {
return false
}
}
}
if !is_breakz(.buffer, .buffer_pos) {
yaml_parser_set_scanner_error(, "while scanning a directive",
, "did not find expected comment or line break")
return false
}
if is_break(.buffer, .buffer_pos) {
if .unread < 2 && !yaml_parser_update_buffer(, 2) {
return false
}
skip_line()
}
return true
}
if .unread < 1 && !yaml_parser_update_buffer(, 1) {
return false
}
var []byte
for is_alpha(.buffer, .buffer_pos) {
= read(, )
if .unread < 1 && !yaml_parser_update_buffer(, 1) {
return false
}
}
if len() == 0 {
yaml_parser_set_scanner_error(, "while scanning a directive",
, "could not find expected directive name")
return false
}
if !is_blankz(.buffer, .buffer_pos) {
yaml_parser_set_scanner_error(, "while scanning a directive",
, "found unexpected non-alphabetical character")
return false
}
* =
return true
}
if .unread < 1 && !yaml_parser_update_buffer(, 1) {
return false
}
for is_blank(.buffer, .buffer_pos) {
skip()
if .unread < 1 && !yaml_parser_update_buffer(, 1) {
return false
}
}
if !yaml_parser_scan_version_directive_number(, , ) {
return false
}
if .buffer[.buffer_pos] != '.' {
return yaml_parser_set_scanner_error(, "while scanning a %YAML directive",
, "did not find expected digit or '.' character")
}
skip()
if !yaml_parser_scan_version_directive_number(, , ) {
return false
}
return true
}
const max_number_length = 2
func ( *yaml_parser_t, yaml_mark_t, *int8) bool {
if .unread < 1 && !yaml_parser_update_buffer(, 1) {
return false
}
var , int8
++
if > max_number_length {
return yaml_parser_set_scanner_error(, "while scanning a %YAML directive",
, "found extremely long version number")
}
= *10 + int8(as_digit(.buffer, .buffer_pos))
skip()
if .unread < 1 && !yaml_parser_update_buffer(, 1) {
return false
}
}
if == 0 {
return yaml_parser_set_scanner_error(, "while scanning a %YAML directive",
, "did not find expected version number")
}
* =
return true
}
func ( *yaml_parser_t, yaml_mark_t, , *[]byte) bool {
var , []byte
if .unread < 1 && !yaml_parser_update_buffer(, 1) {
return false
}
for is_blank(.buffer, .buffer_pos) {
skip()
if .unread < 1 && !yaml_parser_update_buffer(, 1) {
return false
}
}
if !yaml_parser_scan_tag_handle(, true, , &) {
return false
}
if .unread < 1 && !yaml_parser_update_buffer(, 1) {
return false
}
if !is_blank(.buffer, .buffer_pos) {
yaml_parser_set_scanner_error(, "while scanning a %TAG directive",
, "did not find expected whitespace")
return false
}
for is_blank(.buffer, .buffer_pos) {
skip()
if .unread < 1 && !yaml_parser_update_buffer(, 1) {
return false
}
}
if !yaml_parser_scan_tag_uri(, true, nil, , &) {
return false
}
if .unread < 1 && !yaml_parser_update_buffer(, 1) {
return false
}
if !is_blankz(.buffer, .buffer_pos) {
yaml_parser_set_scanner_error(, "while scanning a %TAG directive",
, "did not find expected whitespace or line break")
return false
}
* =
* =
return true
}
func ( *yaml_parser_t, *yaml_token_t, yaml_token_type_t) bool {
var []byte
if .unread < 1 && !yaml_parser_update_buffer(, 1) {
return false
}
for is_alpha(.buffer, .buffer_pos) {
= read(, )
if .unread < 1 && !yaml_parser_update_buffer(, 1) {
return false
}
}
:= .mark
if len() == 0 ||
!(is_blankz(.buffer, .buffer_pos) || .buffer[.buffer_pos] == '?' ||
.buffer[.buffer_pos] == ':' || .buffer[.buffer_pos] == ',' ||
.buffer[.buffer_pos] == ']' || .buffer[.buffer_pos] == '}' ||
.buffer[.buffer_pos] == '%' || .buffer[.buffer_pos] == '@' ||
.buffer[.buffer_pos] == '`') {
:= "while scanning an alias"
if == yaml_ANCHOR_TOKEN {
= "while scanning an anchor"
}
yaml_parser_set_scanner_error(, , ,
"did not find expected alphabetic or numeric character")
return false
}
* = yaml_token_t{
typ: ,
start_mark: ,
end_mark: ,
value: ,
}
return true
}
func ( *yaml_parser_t, *yaml_token_t) bool {
var , []byte
:= .mark
if .unread < 2 && !yaml_parser_update_buffer(, 2) {
return false
}
if !yaml_parser_scan_tag_uri(, false, nil, , &) {
return false
}
if .buffer[.buffer_pos] != '>' {
yaml_parser_set_scanner_error(, "while scanning a tag",
, "did not find the expected '>'")
return false
}
skip()
if !yaml_parser_scan_tag_handle(, false, , &) {
return false
}
if !yaml_parser_scan_tag_uri(, false, nil, , &) {
return false
}
if !yaml_parser_scan_tag_uri(, false, , , &) {
return false
}
= []byte{'!'}
if len() == 0 {
, = ,
}
}
}
if .unread < 1 && !yaml_parser_update_buffer(, 1) {
return false
}
if !is_blankz(.buffer, .buffer_pos) {
yaml_parser_set_scanner_error(, "while scanning a tag",
, "did not find expected whitespace or line break")
return false
}
:= .mark
* = yaml_token_t{
typ: yaml_TAG_TOKEN,
start_mark: ,
end_mark: ,
value: ,
suffix: ,
}
return true
}
if .unread < 1 && !yaml_parser_update_buffer(, 1) {
return false
}
if .buffer[.buffer_pos] != '!' {
yaml_parser_set_scanner_tag_error(, ,
, "did not find expected '!'")
return false
}
var []byte
= read(, )
if .unread < 1 && !yaml_parser_update_buffer(, 1) {
return false
}
for is_alpha(.buffer, .buffer_pos) {
= read(, )
if .unread < 1 && !yaml_parser_update_buffer(, 1) {
return false
}
}
if .buffer[.buffer_pos] == '!' {
= read(, )
if && string() != "!" {
yaml_parser_set_scanner_tag_error(, ,
, "did not find expected '!'")
return false
}
}
* =
return true
}
if .unread < 1 && !yaml_parser_update_buffer(, 1) {
return false
}
for is_alpha(.buffer, .buffer_pos) || .buffer[.buffer_pos] == ';' ||
.buffer[.buffer_pos] == '/' || .buffer[.buffer_pos] == '?' ||
.buffer[.buffer_pos] == ':' || .buffer[.buffer_pos] == '@' ||
.buffer[.buffer_pos] == '&' || .buffer[.buffer_pos] == '=' ||
.buffer[.buffer_pos] == '+' || .buffer[.buffer_pos] == '$' ||
.buffer[.buffer_pos] == ',' || .buffer[.buffer_pos] == '.' ||
.buffer[.buffer_pos] == '!' || .buffer[.buffer_pos] == '~' ||
.buffer[.buffer_pos] == '*' || .buffer[.buffer_pos] == '\'' ||
.buffer[.buffer_pos] == '(' || .buffer[.buffer_pos] == ')' ||
.buffer[.buffer_pos] == '[' || .buffer[.buffer_pos] == ']' ||
if .buffer[.buffer_pos] == '%' {
if !yaml_parser_scan_uri_escapes(, , , &) {
return false
}
} else {
= read(, )
}
if .unread < 1 && !yaml_parser_update_buffer(, 1) {
return false
}
= true
}
if ! {
yaml_parser_set_scanner_tag_error(, ,
, "did not find expected tag URI")
return false
}
* =
return true
}
func ( *yaml_parser_t, bool, yaml_mark_t, *[]byte) bool {
:= 1024
if .unread < 3 && !yaml_parser_update_buffer(, 3) {
return false
}
if !(.buffer[.buffer_pos] == '%' &&
is_hex(.buffer, .buffer_pos+1) &&
is_hex(.buffer, .buffer_pos+2)) {
return yaml_parser_set_scanner_tag_error(, ,
, "did not find URI escaped octet")
}
:= byte((as_hex(.buffer, .buffer_pos+1) << 4) + as_hex(.buffer, .buffer_pos+2))
if == 1024 {
= width()
if == 0 {
return yaml_parser_set_scanner_tag_error(, ,
, "found an incorrect leading UTF-8 octet")
}
if &0xC0 != 0x80 {
return yaml_parser_set_scanner_tag_error(, ,
, "found an incorrect trailing UTF-8 octet")
}
}
if .unread < 1 && !yaml_parser_update_buffer(, 1) {
return false
}
var , int
if .buffer[.buffer_pos] == '+' {
= +1
} else {
= -1
}
skip()
if .unread < 1 && !yaml_parser_update_buffer(, 1) {
return false
}
if .buffer[.buffer_pos] == '0' {
yaml_parser_set_scanner_error(, "while scanning a block scalar",
, "found an indentation indicator equal to 0")
return false
}
= as_digit(.buffer, .buffer_pos)
skip()
}
if .buffer[.buffer_pos] == '0' {
yaml_parser_set_scanner_error(, "while scanning a block scalar",
, "found an indentation indicator equal to 0")
return false
}
= as_digit(.buffer, .buffer_pos)
skip()
if .unread < 1 && !yaml_parser_update_buffer(, 1) {
return false
}
if .buffer[.buffer_pos] == '+' || .buffer[.buffer_pos] == '-' {
if .buffer[.buffer_pos] == '+' {
= +1
} else {
= -1
}
skip()
}
}
if .unread < 1 && !yaml_parser_update_buffer(, 1) {
return false
}
for is_blank(.buffer, .buffer_pos) {
skip()
if .unread < 1 && !yaml_parser_update_buffer(, 1) {
return false
}
}
if .buffer[.buffer_pos] == '#' {
for !is_breakz(.buffer, .buffer_pos) {
skip()
if .unread < 1 && !yaml_parser_update_buffer(, 1) {
return false
}
}
}
if !is_breakz(.buffer, .buffer_pos) {
yaml_parser_set_scanner_error(, "while scanning a block scalar",
, "did not find expected comment or line break")
return false
}
if is_break(.buffer, .buffer_pos) {
if .unread < 2 && !yaml_parser_update_buffer(, 2) {
return false
}
skip_line()
}
:= .mark
var , , []byte
if !yaml_parser_scan_block_scalar_breaks(, &, &, , &) {
return false
}
if .unread < 1 && !yaml_parser_update_buffer(, 1) {
return false
}
var , bool
= is_blank(.buffer, .buffer_pos)
= append(, ...)
= [:0]
= is_blank(.buffer, .buffer_pos)
for !is_breakz(.buffer, .buffer_pos) {
= read(, )
if .unread < 1 && !yaml_parser_update_buffer(, 1) {
return false
}
}
if .unread < 2 && !yaml_parser_update_buffer(, 2) {
return false
}
= read_line(, )
if !yaml_parser_scan_block_scalar_breaks(, &, &, , &) {
return false
}
}
* = yaml_token_t{
typ: yaml_SCALAR_TOKEN,
start_mark: ,
end_mark: ,
value: ,
style: yaml_LITERAL_SCALAR_STYLE,
}
if ! {
.style = yaml_FOLDED_SCALAR_STYLE
}
return true
}
func ( *yaml_parser_t, *int, *[]byte, yaml_mark_t, *yaml_mark_t) bool {
* = .mark
:= 0
if (* == 0 || .mark.column < *) && is_tab(.buffer, .buffer_pos) {
return yaml_parser_set_scanner_error(, "while scanning a block scalar",
, "found a tab character where an indentation space is expected")
}
if !is_break(.buffer, .buffer_pos) {
break
}
if .unread < 2 && !yaml_parser_update_buffer(, 2) {
return false
var , , , []byte
if .unread < 4 && !yaml_parser_update_buffer(, 4) {
return false
}
if .mark.column == 0 &&
((.buffer[.buffer_pos+0] == '-' &&
.buffer[.buffer_pos+1] == '-' &&
.buffer[.buffer_pos+2] == '-') ||
(.buffer[.buffer_pos+0] == '.' &&
.buffer[.buffer_pos+1] == '.' &&
.buffer[.buffer_pos+2] == '.')) &&
is_blankz(.buffer, .buffer_pos+3) {
yaml_parser_set_scanner_error(, "while scanning a quoted scalar",
, "found unexpected document indicator")
return false
}
if is_z(.buffer, .buffer_pos) {
yaml_parser_set_scanner_error(, "while scanning a quoted scalar",
, "found unexpected end of stream")
return false
}
:= false
for !is_blankz(.buffer, .buffer_pos) {
break
break
:= 0
switch .buffer[.buffer_pos+1] {
case '0':
= append(, 0)
case 'a':
= append(, '\x07')
case 'b':
= append(, '\x08')
case 't', '\t':
= append(, '\x09')
case 'n':
= append(, '\x0A')
case 'v':
= append(, '\x0B')
case 'f':
= append(, '\x0C')
case 'r':
= append(, '\x0D')
case 'e':
= append(, '\x1B')
case ' ':
= append(, '\x20')
case '"':
= append(, '"')
case '\'':
= append(, '\'')
case '\\':
= append(, '\\')
case 'N': // NEL (#x85)
= append(, '\xC2')
= append(, '\x85')
case '_': // #xA0
= append(, '\xC2')
= append(, '\xA0')
case 'L': // LS (#x2028)
= append(, '\xE2')
= append(, '\x80')
= append(, '\xA8')
case 'P': // PS (#x2029)
= append(, '\xE2')
= append(, '\x80')
= append(, '\xA9')
case 'x':
= 2
case 'u':
= 4
case 'U':
= 8
default:
yaml_parser_set_scanner_error(, "while parsing a quoted scalar",
, "found unknown escape character")
return false
}
skip()
skip()
if > 0 {
var int
if .unread < && !yaml_parser_update_buffer(, ) {
return false
}
for := 0; < ; ++ {
if !is_hex(.buffer, .buffer_pos+) {
yaml_parser_set_scanner_error(, "while parsing a quoted scalar",
, "did not find expected hexdecimal number")
return false
}
= ( << 4) + as_hex(.buffer, .buffer_pos+)
}
if ( >= 0xD800 && <= 0xDFFF) || > 0x10FFFF {
yaml_parser_set_scanner_error(, "while parsing a quoted scalar",
, "found invalid Unicode character escape code")
return false
}
if <= 0x7F {
= append(, byte())
} else if <= 0x7FF {
= append(, byte(0xC0+(>>6)))
= append(, byte(0x80+(&0x3F)))
} else if <= 0xFFFF {
= append(, byte(0xE0+(>>12)))
= append(, byte(0x80+((>>6)&0x3F)))
= append(, byte(0x80+(&0x3F)))
} else {
= append(, byte(0xF0+(>>18)))
= append(, byte(0x80+((>>12)&0x3F)))
= append(, byte(0x80+((>>6)&0x3F)))
= append(, byte(0x80+(&0x3F)))
}
for := 0; < ; ++ {
skip()
}
}
= read(, )
}
if .unread < 2 && !yaml_parser_update_buffer(, 2) {
return false
}
}
if .unread < 1 && !yaml_parser_update_buffer(, 1) {
return false
}
if {
if .buffer[.buffer_pos] == '\'' {
break
}
} else {
if .buffer[.buffer_pos] == '"' {
break
}
}
for is_blank(.buffer, .buffer_pos) || is_break(.buffer, .buffer_pos) {
if ! {
= read(, )
} else {
skip()
}
} else {
if .unread < 2 && !yaml_parser_update_buffer(, 2) {
return false
}
* = yaml_token_t{
typ: yaml_SCALAR_TOKEN,
start_mark: ,
end_mark: ,
value: ,
style: yaml_SINGLE_QUOTED_SCALAR_STYLE,
}
if ! {
.style = yaml_DOUBLE_QUOTED_SCALAR_STYLE
}
return true
}
func ( *yaml_parser_t, *yaml_token_t) bool {
var , , , []byte
var bool
var = .indent + 1
:= .mark
:= .mark
if .unread < 4 && !yaml_parser_update_buffer(, 4) {
return false
}
if .mark.column == 0 &&
((.buffer[.buffer_pos+0] == '-' &&
.buffer[.buffer_pos+1] == '-' &&
.buffer[.buffer_pos+2] == '-') ||
(.buffer[.buffer_pos+0] == '.' &&
.buffer[.buffer_pos+1] == '.' &&
.buffer[.buffer_pos+2] == '.')) &&
is_blankz(.buffer, .buffer_pos+3) {
break
}
if .buffer[.buffer_pos] == '#' {
break
}
for !is_blankz(.buffer, .buffer_pos) {
if (.buffer[.buffer_pos] == ':' && is_blankz(.buffer, .buffer_pos+1)) ||
(.flow_level > 0 &&
(.buffer[.buffer_pos] == ',' ||
.buffer[.buffer_pos] == '?' || .buffer[.buffer_pos] == '[' ||
.buffer[.buffer_pos] == ']' || .buffer[.buffer_pos] == '{' ||
.buffer[.buffer_pos] == '}')) {
break
}
if || len() > 0 {
= read(, )
= .mark
if .unread < 2 && !yaml_parser_update_buffer(, 2) {
return false
}
}
if !(is_blank(.buffer, .buffer_pos) || is_break(.buffer, .buffer_pos)) {
break
}
if .unread < 1 && !yaml_parser_update_buffer(, 1) {
return false
}
for is_blank(.buffer, .buffer_pos) || is_break(.buffer, .buffer_pos) {
if is_blank(.buffer, .buffer_pos) {
if && .mark.column < && is_tab(.buffer, .buffer_pos) {
yaml_parser_set_scanner_error(, "while scanning a plain scalar",
, "found a tab character that violates indentation")
return false
}
if ! {
= read(, )
} else {
skip()
}
} else {
if .unread < 2 && !yaml_parser_update_buffer(, 2) {
return false
}
if .flow_level == 0 && .mark.column < {
break
}
}
* = yaml_token_t{
typ: yaml_SCALAR_TOKEN,
start_mark: ,
end_mark: ,
value: ,
style: yaml_PLAIN_SCALAR_STYLE,
}
if {
.simple_key_allowed = true
}
return true
![]() |
The pages are generated with Golds v0.3.2-preview. (GOOS=darwin GOARCH=amd64) Golds is a Go 101 project developed by Tapir Liu. PR and bug reports are welcome and can be submitted to the issue list. Please follow @Go100and1 (reachable from the left QR code) to get the latest news of Golds. |