Improve read function a bit.
diff --git a/scanner_c.go b/scanner_c.go index 3589318..467a9e3 100644 --- a/scanner_c.go +++ b/scanner_c.go
@@ -512,8 +512,30 @@ // Copy a character to a string buffer and advance pointers. func read(parser *yaml_parser_t, s *[]byte) bool { - w := width(parser.buffer[0]) - *s = append(*s, parser.buffer[parser.buffer_pos:parser.buffer_pos+w]...) + //w := width(parser.buffer[parser.buffer_pos]) + b := parser.buffer[parser.buffer_pos] + w := 0 + switch { + case b&0x80 == 0x00: + w = 1 + case b&0xE0 == 0xC0: + w = 2 + case b&0xF0 == 0xE0: + w = 3 + case b&0xF8 == 0xF0: + w = 4 + default: + panic("invalid character sequence") + } + if len(*s) == 0 { + *s = make([]byte, 0, 32) + } + if w == 1 && len(*s)+w <= cap(*s) { + *s = (*s)[:len(*s)+1] + (*s)[len(*s)-1] = parser.buffer[parser.buffer_pos] + } else { + *s = append(*s, parser.buffer[parser.buffer_pos:parser.buffer_pos+w]...) + } parser.buffer_pos += w parser.mark.index++ parser.mark.column++ @@ -798,6 +820,9 @@ // // The last rule is more restrictive than the specification requires. // [Go] Make this logic more reasonable. + //switch parser.buffer[parser.buffer_pos] { + //case '-', '?', ':', ',', '?', '-', ',', ':', ']', '[', '}', '{', '&', '#', '!', '*', '>', '|', '"', '\'', '@', '%', '-', '`': + //} if !(is_blankz(parser.buffer, parser.buffer_pos) || parser.buffer[parser.buffer_pos] == '-' || parser.buffer[parser.buffer_pos] == '?' || parser.buffer[parser.buffer_pos] == ':' || parser.buffer[parser.buffer_pos] == ',' || parser.buffer[parser.buffer_pos] == '[' || @@ -2311,7 +2336,7 @@ var s, leading_break, trailing_breaks, whitespaces []byte for { // Check that there are no document indicators at the beginning of the line. - if !cache(parser, 4) { + if !cache(parser, 7) { return false } @@ -2336,9 +2361,9 @@ } // Consume non-blank characters. - if !cache(parser, 2) { - return false - } + //if !cache(parser, 2) { + // return false + //} leading_blanks := false for !is_blankz(parser.buffer, parser.buffer_pos) { if single && parser.buffer[parser.buffer_pos] == '\'' && parser.buffer[parser.buffer_pos+1] == '\'' {