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