summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRuss Cox <rsc@golang.org>2009-11-20 11:42:28 -0800
committerRuss Cox <rsc@golang.org>2009-11-20 11:42:28 -0800
commit7089e97992d5d6be520dfea787200061992526c8 (patch)
treeb329b9ab575e80431e515e79f0b4dcdc141e906e
parenta355a418e17bfd1b164484b159017776da9351f9 (diff)
downloadgolang-7089e97992d5d6be520dfea787200061992526c8.tar.gz
x[y:] for strings
R=ken2 http://codereview.appspot.com/157114
-rw-r--r--src/cmd/gc/builtin.c.boot1
-rw-r--r--src/cmd/gc/const.c2
-rw-r--r--src/cmd/gc/runtime.go1
-rw-r--r--src/cmd/gc/walk.c14
-rw-r--r--src/pkg/runtime/string.cgo18
-rw-r--r--test/ken/string.go2
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");