Skip to content

Commit 575d9d6

Browse files
committed
Add Count
1 parent 1882e74 commit 575d9d6

File tree

3 files changed

+65
-2
lines changed

3 files changed

+65
-2
lines changed

go/stringzilla/main.go

Lines changed: 41 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ func Find( str string, pat string ) int64 {
5959
return int64(uintptr(ret)-uintptr(unsafe.Pointer(cstr)))
6060
}
6161

62-
func RFind( str string, pat string ) int64 {
62+
func LastIndex( str string, pat string ) int64 {
6363
cstr := (*C.char)(unsafe.Pointer(unsafe.StringData(str)))
6464
cpat := (*C.char)(unsafe.Pointer(unsafe.StringData(pat)))
6565
strlen := len(str)
@@ -70,6 +70,9 @@ func RFind( str string, pat string ) int64 {
7070
}
7171
return int64(uintptr(ret)-uintptr(unsafe.Pointer(cstr)))
7272
}
73+
func RFind( str string, pat string ) int64 {
74+
return LastIndex(str,pat)
75+
}
7376

7477
func IndexAny( str string, charset string ) int64 {
7578
cstr := (*C.char)(unsafe.Pointer(unsafe.StringData(str)))
@@ -86,5 +89,42 @@ func FindCharFrom( str string, charset string ) int64 {
8689
return IndexAny( str, charset )
8790
}
8891

92+
func Count( str string, pat string, overlap bool ) int64 {
93+
cstr := (*C.char)(unsafe.Pointer(unsafe.StringData(str)))
94+
cpat := (*C.char)(unsafe.Pointer(unsafe.StringData(pat)))
95+
strlen := int64(len(str))
96+
patlen := int64(len(pat))
97+
98+
if strlen == 0 || patlen == 0 || strlen < patlen {
99+
return 0
100+
}
101+
102+
count := int64(0);
103+
if overlap == true {
104+
for strlen > 0 {
105+
ret := unsafe.Pointer(C.sz_find( cstr, C.ulong(strlen), cpat, C.ulong(patlen) ))
106+
if ret == nil {
107+
break
108+
}
109+
count += 1
110+
strlen -= ( 1 + int64(uintptr(ret)-uintptr(unsafe.Pointer(cstr))) )
111+
cstr = (*C.char)(unsafe.Add(ret,1))
112+
}
113+
} else {
114+
for strlen > 0 {
115+
ret := unsafe.Pointer(C.sz_find( cstr, C.ulong(strlen), cpat, C.ulong(patlen) ))
116+
if ret == nil {
117+
break
118+
}
119+
count += 1
120+
strlen -= (patlen+int64(uintptr(ret)-uintptr(unsafe.Pointer(cstr))))
121+
cstr = (*C.char)(unsafe.Add(ret,patlen))
122+
}
123+
}
124+
125+
return count
126+
127+
}
128+
89129

90130

scripts/bench.go

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import (
99

1010
func main() {
1111

12-
str := strings.Repeat("0123456789", 100000) + "something"
12+
str := strings.Repeat("0123456789", 10000) + "something"
1313
pat := "some"
1414

1515
fmt.Println("Contains")
@@ -51,5 +51,21 @@ func main() {
5151
}
5252
fmt.Println( " ", time.Since(t) , "\tsz.IndexAny" )
5353

54+
str = strings.Repeat("0123456789", 100000) + "something"
55+
pat = "123456789"
56+
fmt.Println("Count")
57+
t = time.Now()
58+
for i := 0; i < 1; i++ {
59+
strings.Count( str, pat )
60+
}
61+
fmt.Println( " ", time.Since(t) , "\tstrings.Count" )
62+
63+
t = time.Now()
64+
for i := 0; i < 1; i++ {
65+
sz.Count( str,pat, false )
66+
}
67+
fmt.Println( " ", time.Since(t) , "\tsz.Count" )
68+
69+
5470

5571
}

scripts/test.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,5 +48,12 @@ func main() {
4848
assertEqual( sz.IndexAny( "west east", "ta" ), 3)
4949
fmt.Println("successful")
5050

51+
fmt.Print("Count ... ")
52+
//assertEqual( strings.Count( str, pat ), int(sz.Count( str,pat,false )) )
53+
assertEqual( sz.Count( "aaaaa", "a", false ), 5 )
54+
assertEqual( sz.Count( "aaaaa", "aa", false ), 2 )
55+
assertEqual( sz.Count( "aaaaa", "aa", true ), 4 )
56+
fmt.Println("successful")
57+
5158

5259
}

0 commit comments

Comments
 (0)