Commit aa4c638b authored by Russ Cox's avatar Russ Cox

x[y:] for strings

R=ken2
https://golang.org/cl/157114
parent 3e8bb54c
...@@ -19,6 +19,7 @@ char *runtimeimport = ...@@ -19,6 +19,7 @@ char *runtimeimport =
"func runtime.catstring (? string, ? string) (? string)\n" "func runtime.catstring (? string, ? string) (? string)\n"
"func runtime.cmpstring (? string, ? string) (? int)\n" "func runtime.cmpstring (? string, ? string) (? int)\n"
"func runtime.slicestring (? string, ? int, ? int) (? string)\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.indexstring (? string, ? int) (? uint8)\n"
"func runtime.intstring (? int64) (? string)\n" "func runtime.intstring (? int64) (? string)\n"
"func runtime.slicebytetostring (? []uint8) (? string)\n" "func runtime.slicebytetostring (? []uint8) (? string)\n"
......
...@@ -55,7 +55,7 @@ truncfltlit(Mpflt *oldv, Type *t) ...@@ -55,7 +55,7 @@ truncfltlit(Mpflt *oldv, Type *t)
void void
convlit(Node **np, Type *t) convlit(Node **np, Type *t)
{ {
return convlit1(np, t, 0); convlit1(np, t, 0);
} }
/* /*
......
...@@ -27,6 +27,7 @@ func printsp() ...@@ -27,6 +27,7 @@ func printsp()
func catstring(string, string) string func catstring(string, string) string
func cmpstring(string, string) int func cmpstring(string, string) int
func slicestring(string, int, int) string func slicestring(string, int, int) string
func slicestring1(string, int) string
func indexstring(string, int) byte func indexstring(string, int) byte
func intstring(int64) string func intstring(int64) string
func slicebytetostring([]byte) string func slicebytetostring([]byte) string
......
...@@ -918,10 +918,16 @@ walkexpr(Node **np, NodeList **init) ...@@ -918,10 +918,16 @@ walkexpr(Node **np, NodeList **init)
case OSLICESTR: case OSLICESTR:
// sys_slicestring(s, lb, hb) // sys_slicestring(s, lb, hb)
n = mkcall("slicestring", n->type, init, if(n->right->right) {
conv(n->left, types[TSTRING]), n = mkcall("slicestring", n->type, init,
conv(n->right->left, types[TINT]), conv(n->left, types[TSTRING]),
conv(n->right->right, types[TINT])); 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; goto ret;
case OINDEXSTR: case OINDEXSTR:
......
...@@ -142,6 +142,24 @@ func slicestring(si String, lindex int32, hindex int32) (so String) { ...@@ -142,6 +142,24 @@ func slicestring(si String, lindex int32, hindex int32) (so String) {
// mcpy(so.str, si.str+lindex, l); // 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) { func indexstring(s String, i int32) (b byte) {
if(i < 0 || i >= s.len) { if(i < 0 || i >= s.len) {
runtime·printpc(&s); runtime·printpc(&s);
......
...@@ -64,7 +64,7 @@ main() ...@@ -64,7 +64,7 @@ main()
} }
/* slice strings */ /* slice strings */
print(c[0:3], c[3:6]); print(c[0:3], c[3:]);
print("\n"); print("\n");
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment