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 + }