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] == '\'' {