@@ -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
7477func 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
0 commit comments