GapstrReader for encodings/binary

This commit is contained in:
Neale Pickett 2014-08-20 17:07:09 -06:00
parent 44d3c5dc6b
commit 262462af53
2 changed files with 55 additions and 1 deletions

View File

@ -143,3 +143,25 @@ func (g *Gapstr) Slice(beg, end int) *Gapstr {
return &Gapstr{chunks} return &Gapstr{chunks}
} }
type GapstrReader struct {
g *Gapstr
pos int
GapRead bool
}
func NewGapstrReader(g *Gapstr) (*GapstrReader) {
return &GapstrReader{g, 0, false}
}
func (gr *GapstrReader) Read(p []byte) (n int, err error) {
gs := gr.g.Slice(gr.pos, gr.pos + len(p))
if gs.HasGaps() {
gr.GapRead = true
}
s := []byte(gs.String())
nread := copy(p, s)
gr.pos += nread
return nread, nil
}

View File

@ -1,12 +1,21 @@
package netarch package netarch
import ( import (
"fmt"
"runtime"
"testing" "testing"
) )
func DUMP(a ...interface{}) {
_, file, line, _ := runtime.Caller(1)
fmt.Printf("%s:%d ", file, line)
fmt.Println(a...)
}
func AssertEqual(t *testing.T, a, b interface{}) { func AssertEqual(t *testing.T, a, b interface{}) {
_, file, line, _ := runtime.Caller(1)
if a != b { if a != b {
t.Errorf("Not equal: %#v, %#v", a, b) t.Errorf("%s:%d Not equal: %#v, %#v", file, line, a, b)
} }
} }
@ -41,3 +50,26 @@ func TestGapstr(t *testing.T) {
AssertEqual(t, g.Slice(0, 12).String(), gs[0:12]) AssertEqual(t, g.Slice(0, 12).String(), gs[0:12])
} }
func TestGapstrReader(t *testing.T) {
g := new(Gapstr)
g = g.AppendString("\xff\xff")
g = g.AppendGap(8)
g = g.AppendString("\xff\xff\xff")
gs := g.String()
gr := NewGapstrReader(g)
b := make([]byte, 4)
for i := 0; i < 4; i += 1 {
beg := i*4
end := min((i+1) * 4, len(gs))
truth := gs[beg:end]
nread, err := gr.Read(b)
AssertEqual(t, nread, len(truth))
AssertEqual(t, err, nil)
AssertEqual(t, string(b[:nread]), truth)
}
}