|  | // Copyright 2015 The Go Authors. All rights reserved. | 
|  | // Use of this source code is governed by a BSD-style | 
|  | // license that can be found in the LICENSE file. | 
|  |  | 
|  | // -build !amd64,!s390x | 
|  |  | 
|  | package strings | 
|  |  | 
|  | // TODO: implements short string optimization on non amd64 platforms | 
|  | // and get rid of strings_amd64.go | 
|  |  | 
|  | // Index returns the index of the first instance of sep in s, or -1 if sep is not present in s. | 
|  | func Index(s, sep string) int { | 
|  | n := len(sep) | 
|  | switch { | 
|  | case n == 0: | 
|  | return 0 | 
|  | case n == 1: | 
|  | return IndexByte(s, sep[0]) | 
|  | case n == len(s): | 
|  | if sep == s { | 
|  | return 0 | 
|  | } | 
|  | return -1 | 
|  | case n > len(s): | 
|  | return -1 | 
|  | } | 
|  | // Rabin-Karp search | 
|  | hashsep, pow := hashStr(sep) | 
|  | var h uint32 | 
|  | for i := 0; i < n; i++ { | 
|  | h = h*primeRK + uint32(s[i]) | 
|  | } | 
|  | if h == hashsep && s[:n] == sep { | 
|  | return 0 | 
|  | } | 
|  | for i := n; i < len(s); { | 
|  | h *= primeRK | 
|  | h += uint32(s[i]) | 
|  | h -= pow * uint32(s[i-n]) | 
|  | i++ | 
|  | if h == hashsep && s[i-n:i] == sep { | 
|  | return i - n | 
|  | } | 
|  | } | 
|  | return -1 | 
|  | } |