// Copyright 2009 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. package strings // Count UTF-8 sequences in s. // Assumes s is well-formed. export func utflen(s string) int { n := 0; for i := 0; i < len(s); i++ { if s[i]&0xC0 != 0x80 { n++ } } return n } // Split string into array of UTF-8 sequences (still strings) export func explode(s string) *[]string { a := new([]string, utflen(s)); j := 0; for i := 0; i < len(a); i++ { ej := j; ej++; for ej < len(s) && (s[ej]&0xC0) == 0x80 { ej++ } a[i] = s[j:ej]; j = ej } return a } // Count non-overlapping instances of sep in s. export func count(s, sep string) int { if sep == "" { return utflen(s)+1 } c := sep[0]; n := 0; for i := 0; i+len(sep) <= len(s); i++ { if s[i] == c && (len(sep) == 1 || s[i:i+len(sep)] == sep) { n++; i += len(sep)-1 } } return n } // Return index of first instance of sep in s. export func index(s, sep string) int { if sep == "" { return 0 } c := sep[0]; for i := 0; i+len(sep) <= len(s); i++ { if s[i] == c && (len(sep) == 1 || s[i:i+len(sep)] == sep) { return i } } return -1 } // Split string into list of strings at separators export func split(s, sep string) *[]string { if sep == "" { return explode(s) } c := sep[0]; start := 0; n := count(s, sep)+1; a := new([]string, n); na := 0; for i := 0; i+len(sep) <= len(s); i++ { if s[i] == c && (len(sep) == 1 || s[i:i+len(sep)] == sep) { a[na] = s[start:i]; na++; start = i+len(sep); i += len(sep)-1 } } a[na] = s[start:len(s)]; return a } // Join list of strings with separators between them. export func join(a *[]string, sep string) string { if len(a) == 0 { return "" } if len(a) == 1 { return a[0] } n := len(sep) * (len(a)-1); for i := 0; i < len(a); i++ { n += len(a[i]) } b := new([]byte, n); bp := 0; for i := 0; i < len(a); i++ { s := a[i]; for j := 0; j < len(s); j++ { b[bp] = s[j]; bp++ } if i + 1 < len(a) { s = sep; for j := 0; j < len(s); j++ { b[bp] = s[j]; bp++ } } } return string(b) }