Tweak width so it can be inlined.
diff --git a/scannerc.go b/scannerc.go
index a7ae55c..1066c4d 100644
--- a/scannerc.go
+++ b/scannerc.go
@@ -513,19 +513,8 @@
// Copy a character to a string buffer and advance pointers.
func read(parser *yaml_parser_t, s *[]byte) bool {
- //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:
+ w := width(parser.buffer[parser.buffer_pos])
+ if w == 0 {
panic("invalid character sequence")
}
if len(*s) == 0 {
@@ -534,10 +523,11 @@
if w == 1 && len(*s)+w <= cap(*s) {
*s = (*s)[:len(*s)+1]
(*s)[len(*s)-1] = parser.buffer[parser.buffer_pos]
+ parser.buffer_pos++
} else {
*s = append(*s, parser.buffer[parser.buffer_pos:parser.buffer_pos+w]...)
+ parser.buffer_pos += w
}
- parser.buffer_pos += w
parser.mark.index++
parser.mark.column++
parser.unread--
diff --git a/yamlprivateh.go b/yamlprivateh.go
index f5325a6..fd8414b 100644
--- a/yamlprivateh.go
+++ b/yamlprivateh.go
@@ -154,15 +154,20 @@
// Determine the width of the character.
func width(b byte) int {
- switch {
- case b&0x80 == 0x00:
+ // Don't replace these by a switch without first
+ // confirming that it is being inlined.
+ if b&0x80 == 0x00 {
return 1
- case b&0xE0 == 0xC0:
+ }
+ if b&0xE0 == 0xC0 {
return 2
- case b&0xF0 == 0xE0:
+ }
+ if b&0xF0 == 0xE0 {
return 3
- case b&0xF8 == 0xF0:
+ }
+ if b&0xF8 == 0xF0 {
return 4
}
return 0
+
}