New Upstream Release - golang-github-shenwei356-bwt

Ready changes

Summary

Merged new upstream version: 0.6.1 (was: 0.6.0).

Resulting package

Built on 2022-12-14T04:36 (took 2m56s)

The resulting binary packages can be installed (if you have the apt repository enabled) by running one of:

apt install -t fresh-releases golang-github-shenwei356-bwt-dev

Lintian Result

Diff

diff --git a/bwt.go b/bwt.go
index bfa2fdf..fe2bb67 100644
--- a/bwt.go
+++ b/bwt.go
@@ -13,9 +13,15 @@ var CheckEndSymbol = true
 // ErrEndSymbolExisted means you should choose another EndSymbol
 var ErrEndSymbolExisted = errors.New("bwt: end-symbol existed in string")
 
+// ErrEmptySeq means a empty sequence is given
+var ErrEmptySeq = errors.New("bwt: empty sequence")
+
 // Transform returns Burrows–Wheeler transform of a byte slice.
 // See https://en.wikipedia.org/wiki/Burrows%E2%80%93Wheeler_transform
 func Transform(s []byte, es byte) ([]byte, error) {
+	if len(s) == 0 {
+		return nil, ErrEmptySeq
+	}
 	if CheckEndSymbol {
 		for _, c := range s {
 			if c == es {
@@ -94,6 +100,9 @@ var ErrInvalidSuffixArray = errors.New("bwt: invalid suffix array")
 
 // FromSuffixArray compute BWT from sa
 func FromSuffixArray(s []byte, sa []int, es byte) ([]byte, error) {
+	if len(s) == 0 {
+		return nil, ErrEmptySeq
+	}
 	if len(s)+1 != len(sa) || sa[0] != len(s) {
 		return nil, ErrInvalidSuffixArray
 	}
diff --git a/bwt_test.go b/bwt_test.go
index dd55350..59f2ad2 100644
--- a/bwt_test.go
+++ b/bwt_test.go
@@ -35,6 +35,16 @@ func TestFromSuffixArray(t *testing.T) {
 	}
 }
 
+func TestFromSuffixArrayEmptySeq(t *testing.T) {
+	s := ""
+
+	sa := SuffixArray([]byte(s))
+	_, err := FromSuffixArray([]byte(s), sa, '$')
+	if err == nil || err != ErrEmptySeq {
+		t.Error("Test failed: FromSuffixArray error")
+	}
+}
+
 func TestSA(t *testing.T) {
 	s := "mississippi"
 	sa := SuffixArray([]byte(s))
diff --git a/debian/changelog b/debian/changelog
index 622a78d..ac888d1 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,9 @@
+golang-github-shenwei356-bwt (0.6.1-1) UNRELEASED; urgency=low
+
+  * New upstream release.
+
+ -- Debian Janitor <janitor@jelmer.uk>  Wed, 14 Dec 2022 04:35:00 -0000
+
 golang-github-shenwei356-bwt (0.6.0-2) unstable; urgency=medium
 
   [ Debian Janitor ]
diff --git a/fmi/fmi.go b/fmi/fmi.go
index 6a6867e..44b7c5d 100644
--- a/fmi/fmi.go
+++ b/fmi/fmi.go
@@ -51,6 +51,9 @@ func NewFMIndex() *FMIndex {
 
 // Transform return Burrows-Wheeler-Transform of s
 func (fmi *FMIndex) Transform(s []byte) ([]byte, error) {
+	if len(s) == 0 {
+		return nil, bwt.ErrEmptySeq
+	}
 	var err error
 
 	sa := bwt.SuffixArray(s)
@@ -116,6 +119,9 @@ func (fmi *FMIndex) nextLetterInAlphabet(c byte) byte {
 
 // Locate locates the pattern
 func (fmi *FMIndex) Locate(query []byte, mismatches int) ([]int, error) {
+	if len(query) == 0 {
+		return []int{}, nil
+	}
 	var locations []int
 
 	locationsMap := make(map[int]struct{})
@@ -224,6 +230,9 @@ func (fmi *FMIndex) Locate(query []byte, mismatches int) ([]int, error) {
 
 // Match is a simple version of Locate, which returns immediately for a match.
 func (fmi *FMIndex) Match(query []byte, mismatches int) (bool, error) {
+	if len(query) == 0 {
+		return false, nil
+	}
 	if mismatches == 0 {
 		// letters := byteutil.Alphabet(query)
 		count := make([]int, 128)
@@ -342,20 +351,21 @@ func (fmi *FMIndex) String() string {
 // C[c] is a table that, for each character c in the alphabet,
 // contains the number of occurrences of lexically smaller characters
 // in the text.
-// func ComputeC(L []byte, alphabet []byte) map[byte]int {
-// 	if alphabet == nil {
-// 		alphabet = byteutil.Alphabet(L)
-// 	}
-// 	C := make(map[byte]int, len(alphabet))
-// 	count := 0
-// 	for _, c := range L {
-// 		if _, ok := C[c]; !ok {
-// 			C[c] = count
-// 		}
-// 		count++
-// 	}
-// 	return C
-// }
+//
+//	func ComputeC(L []byte, alphabet []byte) map[byte]int {
+//		if alphabet == nil {
+//			alphabet = byteutil.Alphabet(L)
+//		}
+//		C := make(map[byte]int, len(alphabet))
+//		count := 0
+//		for _, c := range L {
+//			if _, ok := C[c]; !ok {
+//				C[c] = count
+//			}
+//			count++
+//		}
+//		return C
+//	}
 func computeC(L []byte) []int {
 	C := make([]int, 128)
 	count := 0
@@ -370,32 +380,33 @@ func computeC(L []byte) []int {
 
 // ComputeOccurrence returns occurrence information.
 // Occ(c, k) is the number of occurrences of character c in the prefix L[1..k]
-// func ComputeOccurrence(bwt []byte, letters []byte) map[byte]*[]int32 {
-// 	if letters == nil {
-// 		letters = byteutil.Alphabet(bwt)
-// 	}
-// 	occ := make(map[byte]*[]int32, len(letters)-1)
-// 	for _, letter := range letters {
-// 		t := make([]int32, 1, len(bwt))
-// 		t[0] = 0
-// 		occ[letter] = &t
-// 	}
-// 	t := make([]int32, 1, len(bwt))
-// 	t[0] = 1
-// 	occ[bwt[0]] = &t
-// 	var letter, k byte
-// 	var v *[]int32
-// 	for _, letter = range bwt[1:] {
-// 		for k, v = range occ {
-// 			if k == letter {
-// 				*v = append(*v, (*v)[len(*v)-1]+1)
-// 			} else {
-// 				*v = append(*v, (*v)[len(*v)-1])
-// 			}
-// 		}
-// 	}
-// 	return occ
-// }
+//
+//	func ComputeOccurrence(bwt []byte, letters []byte) map[byte]*[]int32 {
+//		if letters == nil {
+//			letters = byteutil.Alphabet(bwt)
+//		}
+//		occ := make(map[byte]*[]int32, len(letters)-1)
+//		for _, letter := range letters {
+//			t := make([]int32, 1, len(bwt))
+//			t[0] = 0
+//			occ[letter] = &t
+//		}
+//		t := make([]int32, 1, len(bwt))
+//		t[0] = 1
+//		occ[bwt[0]] = &t
+//		var letter, k byte
+//		var v *[]int32
+//		for _, letter = range bwt[1:] {
+//			for k, v = range occ {
+//				if k == letter {
+//					*v = append(*v, (*v)[len(*v)-1]+1)
+//				} else {
+//					*v = append(*v, (*v)[len(*v)-1])
+//				}
+//			}
+//		}
+//		return occ
+//	}
 func computeOccurrence(bwt []byte, letters []byte) []*[]int32 {
 	if letters == nil {
 		count := make([]int, 128)
diff --git a/fmi/fmi_test.go b/fmi/fmi_test.go
index c5d3ebd..c994aa6 100644
--- a/fmi/fmi_test.go
+++ b/fmi/fmi_test.go
@@ -2,6 +2,8 @@ package fmi
 
 import (
 	"testing"
+
+	"github.com/shenwei356/bwt"
 )
 
 type Case struct {
@@ -11,6 +13,8 @@ type Case struct {
 }
 
 var cases = []Case{
+	{"", "abc", 0, []int{}},
+	{"mississippi", "", 0, []int{}},
 	{"mississippi", "iss", 0, []int{1, 4}},
 	{"abcabcabc", "abc", 0, []int{0, 3, 6}},
 	{"abcabcabc", "gef", 0, []int{}},
@@ -43,8 +47,12 @@ func TestLocate(t *testing.T) {
 		fmi = NewFMIndex()
 		_, err = fmi.Transform([]byte(c.s))
 		if err != nil {
-			t.Errorf("case #%d: Transform: %s", i+1, err)
-			return
+			if c.s == "" && err == bwt.ErrEmptySeq {
+				continue
+			} else {
+				t.Errorf("case #%d: Transform: %s", i+1, err)
+				return
+			}
 		}
 
 		match, err = fmi.Match([]byte(c.q), c.m)
@@ -70,8 +78,12 @@ func TestMatch(t *testing.T) {
 		fmi = NewFMIndex()
 		_, err = fmi.Transform([]byte(c.s))
 		if err != nil {
-			t.Errorf("case #%d: Transform: %s", i+1, err)
-			return
+			if c.s == "" && err == bwt.ErrEmptySeq {
+				continue
+			} else {
+				t.Errorf("case #%d: Transform: %s", i+1, err)
+				return
+			}
 		}
 
 		loc, err = fmi.Locate([]byte(c.q), c.m)

Debdiff

File lists identical (after any substitutions)

No differences were encountered in the control files

More details

Full run details