mirror of
https://github.com/nkanaev/yarr.git
synced 2025-05-24 00:33:14 +00:00
use bytes.Buffer instead
This commit is contained in:
parent
4c0726412b
commit
18221ef12d
@ -2,11 +2,11 @@ package parser
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"bufio"
|
"bufio"
|
||||||
|
"bytes"
|
||||||
"encoding/xml"
|
"encoding/xml"
|
||||||
"io"
|
"io"
|
||||||
"regexp"
|
"regexp"
|
||||||
"strings"
|
"strings"
|
||||||
"unicode/utf8"
|
|
||||||
|
|
||||||
"golang.org/x/net/html/charset"
|
"golang.org/x/net/html/charset"
|
||||||
)
|
)
|
||||||
@ -38,49 +38,33 @@ func xmlDecoder(r io.Reader) *xml.Decoder {
|
|||||||
|
|
||||||
type safexmlreader struct {
|
type safexmlreader struct {
|
||||||
reader *bufio.Reader
|
reader *bufio.Reader
|
||||||
buffer []byte
|
buffer *bytes.Buffer
|
||||||
isEOF bool
|
|
||||||
runebuf []byte
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewSafeXMLReader(r io.Reader) io.Reader {
|
func NewSafeXMLReader(r io.Reader) io.Reader {
|
||||||
return &safexmlreader{
|
return &safexmlreader{
|
||||||
reader: bufio.NewReader(r),
|
reader: bufio.NewReader(r),
|
||||||
runebuf: make([]byte, 6),
|
buffer: bytes.NewBuffer(make([]byte, 0, 4096)),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (xr *safexmlreader) Read(p []byte) (int, error) {
|
func (xr *safexmlreader) Read(p []byte) (int, error) {
|
||||||
if len(p) == 0 {
|
for xr.buffer.Len() < cap(p) {
|
||||||
return 0, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
for len(xr.buffer) < cap(p) {
|
|
||||||
r, _, err := xr.reader.ReadRune()
|
r, _, err := xr.reader.ReadRune()
|
||||||
if err == io.EOF {
|
if err == io.EOF {
|
||||||
xr.isEOF = true
|
if xr.buffer.Len() == 0 {
|
||||||
|
return 0, io.EOF
|
||||||
|
}
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return 0, err
|
return 0, err
|
||||||
}
|
}
|
||||||
if isInCharacterRange(r) {
|
if isInCharacterRange(r) {
|
||||||
size := utf8.EncodeRune(xr.runebuf, r)
|
xr.buffer.WriteRune(r)
|
||||||
xr.buffer = append(xr.buffer, xr.runebuf[:size]...)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
return xr.buffer.Read(p)
|
||||||
if xr.isEOF && len(xr.buffer) == 0 {
|
|
||||||
return 0, io.EOF
|
|
||||||
}
|
|
||||||
|
|
||||||
n := cap(p)
|
|
||||||
if len(xr.buffer) < n {
|
|
||||||
n = len(xr.buffer)
|
|
||||||
}
|
|
||||||
copy(p, xr.buffer[:n])
|
|
||||||
xr.buffer = xr.buffer[n:]
|
|
||||||
return n, nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// NOTE: copied from "encoding/xml" package
|
// NOTE: copied from "encoding/xml" package
|
||||||
|
Loading…
x
Reference in New Issue
Block a user