blob: 811cb803168be21c78c78ed81c5e310aa9466ec4 [file] [log] [blame]
Ilya Tocar95333ae2015-10-28 18:05:05 +03001// 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.
4
5// +build !amd64
6
7package strings
8
9// TODO: implements short string optimization on non amd64 platforms
10// and get rid of strings_amd64.go
11
12// Index returns the index of the first instance of sep in s, or -1 if sep is not present in s.
13func Index(s, sep string) int {
14 n := len(sep)
15 switch {
16 case n == 0:
17 return 0
18 case n == 1:
19 return IndexByte(s, sep[0])
20 case n == len(s):
21 if sep == s {
22 return 0
23 }
24 return -1
25 case n > len(s):
26 return -1
27 }
28 // Rabin-Karp search
29 hashsep, pow := hashStr(sep)
30 var h uint32
31 for i := 0; i < n; i++ {
32 h = h*primeRK + uint32(s[i])
33 }
34 if h == hashsep && s[:n] == sep {
35 return 0
36 }
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 == hashsep && s[i-n:i] == sep {
43 return i - n
44 }
45 }
46 return -1
47}