diff options
| author | Russ Cox <rsc@golang.org> | 2009-11-20 11:42:28 -0800 |
|---|---|---|
| committer | Russ Cox <rsc@golang.org> | 2009-11-20 11:42:28 -0800 |
| commit | 7089e97992d5d6be520dfea787200061992526c8 (patch) | |
| tree | b329b9ab575e80431e515e79f0b4dcdc141e906e | |
| parent | a355a418e17bfd1b164484b159017776da9351f9 (diff) | |
| download | golang-7089e97992d5d6be520dfea787200061992526c8.tar.gz | |
x[y:] for strings
R=ken2
http://codereview.appspot.com/157114
| -rw-r--r-- | src/cmd/gc/builtin.c.boot | 1 | ||||
| -rw-r--r-- | src/cmd/gc/const.c | 2 | ||||
| -rw-r--r-- | src/cmd/gc/runtime.go | 1 | ||||
| -rw-r--r-- | src/cmd/gc/walk.c | 14 | ||||
| -rw-r--r-- | src/pkg/runtime/string.cgo | 18 | ||||
| -rw-r--r-- | test/ken/string.go | 2 |
6 files changed, 32 insertions, 6 deletions
diff --git a/src/cmd/gc/builtin.c.boot b/src/cmd/gc/builtin.c.boot index 58d6f9e82..d2ff0ff90 100644 --- a/src/cmd/gc/builtin.c.boot +++ b/src/cmd/gc/builtin.c.boot @@ -19,6 +19,7 @@ char *runtimeimport = "func runtime.catstring (? string, ? string) (? string)\n" "func runtime.cmpstring (? string, ? string) (? int)\n" "func runtime.slicestring (? string, ? int, ? int) (? string)\n" + "func runtime.slicestring1 (? string, ? int) (? string)\n" "func runtime.indexstring (? string, ? int) (? uint8)\n" "func runtime.intstring (? int64) (? string)\n" "func runtime.slicebytetostring (? []uint8) (? string)\n" diff --git a/src/cmd/gc/const.c b/src/cmd/gc/const.c index cca13b952..4575ff6da 100644 --- a/src/cmd/gc/const.c +++ b/src/cmd/gc/const.c @@ -55,7 +55,7 @@ truncfltlit(Mpflt *oldv, Type *t) void convlit(Node **np, Type *t) { - return convlit1(np, t, 0); + convlit1(np, t, 0); } /* diff --git a/src/cmd/gc/runtime.go b/src/cmd/gc/runtime.go index ea4084012..6413db5e2 100644 --- a/src/cmd/gc/runtime.go +++ b/src/cmd/gc/runtime.go @@ -27,6 +27,7 @@ func printsp() func catstring(string, string) string func cmpstring(string, string) int func slicestring(string, int, int) string +func slicestring1(string, int) string func indexstring(string, int) byte func intstring(int64) string func slicebytetostring([]byte) string diff --git a/src/cmd/gc/walk.c b/src/cmd/gc/walk.c index bf35b3891..3c3a00cfd 100644 --- a/src/cmd/gc/walk.c +++ b/src/cmd/gc/walk.c @@ -918,10 +918,16 @@ walkexpr(Node **np, NodeList **init) case OSLICESTR: // sys_slicestring(s, lb, hb) - n = mkcall("slicestring", n->type, init, - conv(n->left, types[TSTRING]), - conv(n->right->left, types[TINT]), - conv(n->right->right, types[TINT])); + if(n->right->right) { + n = mkcall("slicestring", n->type, init, + conv(n->left, types[TSTRING]), + conv(n->right->left, types[TINT]), + conv(n->right->right, types[TINT])); + } else { + n = mkcall("slicestring1", n->type, init, + conv(n->left, types[TSTRING]), + conv(n->right->left, types[TINT])); + } goto ret; case OINDEXSTR: diff --git a/src/pkg/runtime/string.cgo b/src/pkg/runtime/string.cgo index bafa6791b..6e380a107 100644 --- a/src/pkg/runtime/string.cgo +++ b/src/pkg/runtime/string.cgo @@ -142,6 +142,24 @@ func slicestring(si String, lindex int32, hindex int32) (so String) { // mcpy(so.str, si.str+lindex, l); } +func slicestring1(si String, lindex int32) (so String) { + int32 l; + + if(lindex < 0 || lindex > si.len) { + runtime·printpc(&si); + prints(" "); + prbounds("slice", lindex, si.len, si.len); + } + + l = si.len-lindex; + so.str = si.str + lindex; + so.len = l; + +// alternate to create a new string +// so = gostringsize(l); +// mcpy(so.str, si.str+lindex, l); +} + func indexstring(s String, i int32) (b byte) { if(i < 0 || i >= s.len) { runtime·printpc(&s); diff --git a/test/ken/string.go b/test/ken/string.go index f7c02822f..03e81a05d 100644 --- a/test/ken/string.go +++ b/test/ken/string.go @@ -64,7 +64,7 @@ main() } /* slice strings */ - print(c[0:3], c[3:6]); + print(c[0:3], c[3:]); print("\n"); |
