Source File
readerc.go
Belonging Package
gopkg.in/yaml.v2
package yaml
import (
)
func ( *yaml_parser_t, string, int, int) bool {
.error = yaml_READER_ERROR
.problem =
.problem_offset =
.problem_value =
return false
}
const (
bom_UTF8 = "\xef\xbb\xbf"
bom_UTF16LE = "\xff\xfe"
bom_UTF16BE = "\xfe\xff"
)
for !.eof && len(.raw_buffer)-.raw_buffer_pos < 3 {
if !yaml_parser_update_raw_buffer() {
return false
}
}
:= .raw_buffer
:= .raw_buffer_pos
:= len() -
if >= 2 && [] == bom_UTF16LE[0] && [+1] == bom_UTF16LE[1] {
.encoding = yaml_UTF16LE_ENCODING
.raw_buffer_pos += 2
.offset += 2
} else if >= 2 && [] == bom_UTF16BE[0] && [+1] == bom_UTF16BE[1] {
.encoding = yaml_UTF16BE_ENCODING
.raw_buffer_pos += 2
.offset += 2
} else if >= 3 && [] == bom_UTF8[0] && [+1] == bom_UTF8[1] && [+2] == bom_UTF8[2] {
.encoding = yaml_UTF8_ENCODING
.raw_buffer_pos += 3
.offset += 3
} else {
.encoding = yaml_UTF8_ENCODING
}
return true
}
func ( *yaml_parser_t) bool {
:= 0
if .raw_buffer_pos == 0 && len(.raw_buffer) == cap(.raw_buffer) {
return true
}
if .raw_buffer_pos > 0 && .raw_buffer_pos < len(.raw_buffer) {
copy(.raw_buffer, .raw_buffer[.raw_buffer_pos:])
}
.raw_buffer = .raw_buffer[:len(.raw_buffer)-.raw_buffer_pos]
.raw_buffer_pos = 0
, := .read_handler(, .raw_buffer[len(.raw_buffer):cap(.raw_buffer)])
.raw_buffer = .raw_buffer[:len(.raw_buffer)+]
if == io.EOF {
.eof = true
} else if != nil {
return yaml_parser_set_reader_error(, "input error: "+.Error(), .offset, -1)
}
return true
}
func ( *yaml_parser_t, int) bool {
if .read_handler == nil {
panic("read handler must be set")
}
}
if .encoding == yaml_ANY_ENCODING {
if !yaml_parser_determine_encoding() {
return false
}
}
:= len(.buffer)
if .buffer_pos > 0 && .buffer_pos < {
copy(.buffer, .buffer[.buffer_pos:])
-= .buffer_pos
.buffer_pos = 0
} else if .buffer_pos == {
= 0
.buffer_pos = 0
}
if ! || .raw_buffer_pos == len(.raw_buffer) {
if !yaml_parser_update_raw_buffer() {
.buffer = .buffer[:]
return false
}
}
= false
:
for .raw_buffer_pos != len(.raw_buffer) {
var rune
var int
:= len(.raw_buffer) - .raw_buffer_pos
switch .encoding {
:= .raw_buffer[.raw_buffer_pos]
switch {
case &0x80 == 0x00:
= 1
case &0xE0 == 0xC0:
= 2
case &0xF0 == 0xE0:
= 3
case &0xF8 == 0xF0:
= 4
return yaml_parser_set_reader_error(,
"invalid leading UTF-8 octet",
.offset, int())
}
if > {
if .eof {
return yaml_parser_set_reader_error(,
"incomplete UTF-8 octet sequence",
.offset, -1)
}
break
}
for := 1; < ; ++ {
= .raw_buffer[.raw_buffer_pos+]
if ( & 0xC0) != 0x80 {
return yaml_parser_set_reader_error(,
"invalid trailing UTF-8 octet",
.offset+, int())
}
= ( << 6) + rune(&0x3F)
}
switch {
case == 1:
case == 2 && >= 0x80:
case == 3 && >= 0x800:
case == 4 && >= 0x10000:
default:
return yaml_parser_set_reader_error(,
"invalid length of a UTF-8 sequence",
.offset, -1)
}
if >= 0xD800 && <= 0xDFFF || > 0x10FFFF {
return yaml_parser_set_reader_error(,
"invalid Unicode character",
.offset, int())
}
case yaml_UTF16LE_ENCODING, yaml_UTF16BE_ENCODING:
var , int
if .encoding == yaml_UTF16LE_ENCODING {
, = 0, 1
} else {
, = 1, 0
}
if < 2 {
if .eof {
return yaml_parser_set_reader_error(,
"incomplete UTF-16 character",
.offset, -1)
}
break
}
= rune(.raw_buffer[.raw_buffer_pos+]) +
(rune(.raw_buffer[.raw_buffer_pos+]) << 8)
if &0xFC00 == 0xDC00 {
return yaml_parser_set_reader_error(,
"unexpected low surrogate area",
.offset, int())
}
if &0xFC00 == 0xD800 {
= 4
if < 4 {
if .eof {
return yaml_parser_set_reader_error(,
"incomplete UTF-16 surrogate pair",
.offset, -1)
}
break
}
:= rune(.raw_buffer[.raw_buffer_pos++2]) +
(rune(.raw_buffer[.raw_buffer_pos++2]) << 8)
if &0xFC00 != 0xDC00 {
return yaml_parser_set_reader_error(,
"expected low surrogate area",
.offset+2, int())
}
= 0x10000 + (( & 0x3FF) << 10) + ( & 0x3FF)
} else {
= 2
}
default:
panic("impossible")
}
switch {
case == 0x09:
case == 0x0A:
case == 0x0D:
case >= 0x20 && <= 0x7E:
case == 0x85:
case >= 0xA0 && <= 0xD7FF:
case >= 0xE000 && <= 0xFFFD:
case >= 0x10000 && <= 0x10FFFF:
default:
return yaml_parser_set_reader_error(,
"control characters are not allowed",
.offset, int())
}
.raw_buffer_pos +=
.offset +=
![]() |
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. |