You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
44 lines
761 B
44 lines
761 B
package jstream
|
|
|
|
import (
|
|
"unicode/utf8"
|
|
)
|
|
|
|
type scratch struct {
|
|
data []byte
|
|
fill int
|
|
}
|
|
|
|
// reset scratch buffer
|
|
func (s *scratch) reset() { s.fill = 0 }
|
|
|
|
// bytes returns the written contents of scratch buffer
|
|
func (s *scratch) bytes() []byte { return s.data[0:s.fill] }
|
|
|
|
// grow scratch buffer
|
|
func (s *scratch) grow() {
|
|
ndata := make([]byte, cap(s.data)*2)
|
|
copy(ndata, s.data[:])
|
|
s.data = ndata
|
|
}
|
|
|
|
// append single byte to scratch buffer
|
|
func (s *scratch) add(c byte) {
|
|
if s.fill+1 >= cap(s.data) {
|
|
s.grow()
|
|
}
|
|
|
|
s.data[s.fill] = c
|
|
s.fill++
|
|
}
|
|
|
|
// append encoded rune to scratch buffer
|
|
func (s *scratch) addRune(r rune) int {
|
|
if s.fill+utf8.UTFMax >= cap(s.data) {
|
|
s.grow()
|
|
}
|
|
|
|
n := utf8.EncodeRune(s.data[s.fill:], r)
|
|
s.fill += n
|
|
return n
|
|
}
|
|
|