Add FileContainsAnyBytes
diff --git a/util.go b/util.go
index 84856c4..e757867 100644
--- a/util.go
+++ b/util.go
@@ -173,7 +173,7 @@
return FileContainsBytes(a.Fs, filename, subslice)
}
-// Check if a file contains a specified string.
+// Check if a file contains a specified byte slice.
func FileContainsBytes(fs Fs, filename string, subslice []byte) (bool, error) {
f, err := fs.Open(filename)
if err != nil {
@@ -181,17 +181,44 @@
}
defer f.Close()
- return readerContains(f, subslice), nil
+ return readerContainsAny(f, subslice), nil
}
-// readerContains reports whether subslice is within r.
-func readerContains(r io.Reader, subslice []byte) bool {
+func (a Afero) FileContainsAnyBytes(filename string, subslices [][]byte) (bool, error) {
+ return FileContainsAnyBytes(a.Fs, filename, subslices)
+}
- if r == nil || len(subslice) == 0 {
+// Check if a file contains any of the specified byte slices.
+func FileContainsAnyBytes(fs Fs, filename string, subslices [][]byte) (bool, error) {
+ f, err := fs.Open(filename)
+ if err != nil {
+ return false, err
+ }
+ defer f.Close()
+
+ return readerContainsAny(f, subslices...), nil
+}
+
+// readerContains reports whether any of the subslices is within r.
+func readerContainsAny(r io.Reader, subslices ...[]byte) bool {
+
+ if r == nil || len(subslices) == 0 {
return false
}
- bufflen := len(subslice) * 4
+ largestSlice := 0
+
+ for _, sl := range subslices {
+ if len(sl) > largestSlice {
+ largestSlice = len(sl)
+ }
+ }
+
+ if largestSlice == 0 {
+ return false
+ }
+
+ bufflen := largestSlice * 4
halflen := bufflen / 2
buff := make([]byte, bufflen)
var err error
@@ -209,8 +236,12 @@
n, err = io.ReadAtLeast(r, buff[halflen:], halflen)
}
- if n > 0 && bytes.Contains(buff, subslice) {
- return true
+ if n > 0 {
+ for _, sl := range subslices {
+ if bytes.Contains(buff, sl) {
+ return true
+ }
+ }
}
if err != nil {
diff --git a/util_test.go b/util_test.go
index d3dcdd1..50763df 100644
--- a/util_test.go
+++ b/util_test.go
@@ -142,28 +142,31 @@
func TestReaderContains(t *testing.T) {
for i, this := range []struct {
v1 string
- v2 []byte
+ v2 [][]byte
expect bool
}{
- {"abc", []byte("a"), true},
- {"abc", []byte("b"), true},
- {"abcdefg", []byte("efg"), true},
- {"abc", []byte("d"), false},
+ {"abc", [][]byte{[]byte("a")}, true},
+ {"abc", [][]byte{[]byte("b")}, true},
+ {"abcdefg", [][]byte{[]byte("efg")}, true},
+ {"abc", [][]byte{[]byte("d")}, false},
+ {"abc", [][]byte{[]byte("d"), []byte("e")}, false},
+ {"abc", [][]byte{[]byte("d"), []byte("a")}, true},
+ {"abc", [][]byte{[]byte("b"), []byte("e")}, true},
{"", nil, false},
- {"", []byte("a"), false},
- {"a", []byte(""), false},
- {"", []byte(""), false}} {
- result := readerContains(strings.NewReader(this.v1), this.v2)
+ {"", [][]byte{[]byte("a")}, false},
+ {"a", [][]byte{[]byte("")}, false},
+ {"", [][]byte{[]byte("")}, false}} {
+ result := readerContainsAny(strings.NewReader(this.v1), this.v2...)
if result != this.expect {
t.Errorf("[%d] readerContains: got %t but expected %t", i, result, this.expect)
}
}
- if readerContains(nil, []byte("a")) {
+ if readerContainsAny(nil, []byte("a")) {
t.Error("readerContains with nil reader")
}
- if readerContains(nil, nil) {
+ if readerContainsAny(nil, nil) {
t.Error("readerContains with nil arguments")
}
}