1
0
mirror of https://github.com/golang/go synced 2024-10-05 04:21:22 -06:00
go/src/lib/strings.go
Russ Cox 839a68469b delete export
TBR=r
OCL=23121
CL=23127
2009-01-20 14:40:40 -08:00

105 lines
2.0 KiB
Go

// 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
import "utf8"
// Split string into array of UTF-8 sequences (still strings)
func Explode(s string) []string {
a := make([]string, utf8.RuneCountInString(s, 0, len(s)));
j := 0;
var size, rune int;
for i := 0; i < len(a); i++ {
rune, size = utf8.DecodeRuneInString(s, j);
a[i] = string(rune);
j += size;
}
return a
}
// Count non-overlapping instances of sep in s.
func Count(s, sep string) int {
if sep == "" {
return utf8.RuneCountInString(s, 0, len(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.
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
func Split(s, sep string) []string {
if sep == "" {
return Explode(s)
}
c := sep[0];
start := 0;
n := Count(s, sep)+1;
a := make([]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.
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 := make([]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)
}