libgo: update to go1.9
[official-gcc.git] / libgo / go / strings / strings_generic.go
blob9844201db308153556911f77c3476935e8ffd5b4
1 // Copyright 2015 The Go Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style
3 // license that can be found in the LICENSE file.
5 // -build !amd64,!s390x
7 package strings
9 // TODO: implements short string optimization on non amd64 platforms
10 // and get rid of strings_amd64.go
12 // Index returns the index of the first instance of substr in s, or -1 if substr is not present in s.
13 func Index(s, substr string) int {
14 n := len(substr)
15 switch {
16 case n == 0:
17 return 0
18 case n == 1:
19 return IndexByte(s, substr[0])
20 case n == len(s):
21 if substr == s {
22 return 0
24 return -1
25 case n > len(s):
26 return -1
28 // Rabin-Karp search
29 hashss, pow := hashStr(substr)
30 var h uint32
31 for i := 0; i < n; i++ {
32 h = h*primeRK + uint32(s[i])
34 if h == hashss && s[:n] == substr {
35 return 0
37 for i := n; i < len(s); {
38 h *= primeRK
39 h += uint32(s[i])
40 h -= pow * uint32(s[i-n])
41 i++
42 if h == hashss && s[i-n:i] == substr {
43 return i - n
46 return -1
49 // Count counts the number of non-overlapping instances of substr in s.
50 // If substr is an empty string, Count returns 1 + the number of Unicode code points in s.
51 func Count(s, substr string) int {
52 return countGeneric(s, substr)