1 package parser 2 3 import ( 4 "bufio" 5 "bytes" 6 "unicode/utf8" 7 ) 8 9 type readerParser struct { 10 reader *bufio.Reader 11 buf bytes.Buffer 12 width int 13 } 14 15 func (r *readerParser) next() rune { 16 ru, s, err := r.reader.ReadRune() 17 if err != nil { 18 r.width = 0 19 return -1 20 } 21 if ru == utf8.RuneError && s == 1 { 22 r.reader.UnreadRune() 23 b, _ := r.reader.ReadByte() 24 r.reader.ReadRune() 25 ru = rune(b) 26 } 27 r.width = s 28 r.buf.WriteRune(ru) 29 return ru 30 } 31 32 func (r *readerParser) backup() { 33 if r.width > 0 { 34 r.buf.Truncate(r.buf.Len() - r.width) 35 r.reader.UnreadRune() 36 r.width = 0 37 } 38 } 39 40 func (r *readerParser) get() string { 41 s := r.buf.String() 42 r.buf.Reset() 43 r.width = 0 44 return s 45 } 46 47 func (r *readerParser) length() int { 48 return r.buf.Len() 49 }